#include "util.h"
#include "conffile.h"
+#include "process.h"
/* XXX should be from autoconf */
static char *configfile="/etc/secnet/secnet.conf";
+static char *sites_key="sites";
bool_t just_check_config=False;
static char *userid=NULL;
static uid_t uid=0;
bool_t require_root_privileges=False;
string_t require_root_privileges_explanation=NULL;
+static pid_t secnet_pid;
+
+/* from log.c */
+extern uint32_t message_level;
+extern bool_t secnet_is_daemon;
+extern struct log_if *system_log;
+
+/* from process.c */
+extern void start_signal_handling(void);
+
/* Structures dealing with poll() call */
struct poll_interest {
beforepoll_fn *before;
{"debug", 1, 0, 'd'},
{"config", 1, 0, 'c'},
{"just-check-config", 0, 0, 'j'},
+ {"sites-key", 1, 0, 's'},
{0,0,0,0}
};
- c=getopt_long(argc, argv, "vwdnjc:ft:",
+ c=getopt_long(argc, argv, "vwdnjc:ft:s:",
long_options, &option_index);
if (c==-1)
break;
" -w, --nowarnings suppress warnings\n"
" -v, --verbose output extra diagnostics\n"
" -c, --config=filename specify a configuration file\n"
- " -j, --just-check-config stop after reading configfile\n"
+ " -j, --just-check-config stop after reading "
+ "configuration file\n"
+ " -s, --sites-key=name configuration key that "
+ "specifies active sites\n"
" -n, --nodetach do not run in background\n"
" -d, --debug=item,... set debug options\n"
" --help display this help and exit\n"
- " --version output version information and exit\n"
+ " --version output version information "
+ "and exit\n"
);
exit(0);
break;
break;
case 'v':
- message_level|=M_INFO|M_NOTICE|M_WARNING|M_ERROR|M_SECURITY|
+ message_level|=M_INFO|M_NOTICE|M_WARNING|M_ERR|M_SECURITY|
M_FATAL;
break;
just_check_config=True;
break;
+ case 's':
+ if (optarg)
+ sites_key=safe_strdup(optarg,"sites-key");
+ else
+ fatal("secnet: no sites key specified");
+ break;
+
case '?':
break;
default:
- Message(M_ERROR,"secnet: Unknown getopt code %c\n",c);
+ Message(M_ERR,"secnet: Unknown getopt code %c\n",c);
}
}
if (argc-optind != 0) {
- Message(M_ERROR,"secnet: You gave extra command line parameters, "
+ Message(M_ERR,"secnet: You gave extra command line parameters, "
"which were ignored.\n");
}
}
}
/* Go along site list, starting sites */
- l=dict_lookup(config,"sites");
+ l=dict_lookup(config,sites_key);
if (!l) {
- Message(M_WARNING,"secnet: configuration did not define any "
- "remote sites\n");
+ Message(M_WARNING,"secnet: configuration key \"%s\" is missing; no "
+ "remote sites are defined\n",sites_key);
} else {
i=0;
while ((site=list_elem(l, i++))) {
fatal("run: couldn't alloca\n");
}
- Message(M_NOTICE,"%s: starting\n",version);
+ Message(M_NOTICE,"%s [%d]: starting\n",version,secnet_pid);
- while (!finished) {
+ do {
if (gettimeofday(&tv_now, NULL)!=0) {
fatal_perror("main loop: gettimeofday");
}
i->nfds=nfds;
}
do {
+ if (finished) break;
rv=poll(fds, idx, timeout);
if (rv<0) {
if (errno!=EINTR) {
}
}
} while (rv<0);
- }
+ } while (!finished);
}
static void droppriv(void)
} else if (p==0) {
/* Child process - all done, just carry on */
if (pf) fclose(pf);
+ /* Close stdin, stdout and stderr; we don't need them any more */
+ close(0);
+ close(1);
+ close(2);
secnet_is_daemon=True;
} else {
/* Error */
exit(1);
}
}
+ secnet_pid=getpid();
+}
+static signal_notify_fn finish,ignore_hup;
+static void finish(void *st, int signum)
+{
+ finished=True;
+ Message(M_NOTICE,"%s [%d]: received %s\n",version,secnet_pid,(string_t)st);
+}
+static void ignore_hup(void *st, int signum)
+{
+ Message(M_INFO,"%s [%d]: received SIGHUP\n",version,secnet_pid);
+ return;
}
int main(int argc, char **argv)
enter_phase(PHASE_DROPPRIV);
droppriv();
+ start_signal_handling();
+ request_signal_notification(SIGTERM,finish,"SIGTERM");
+ if (!background) request_signal_notification(SIGINT,finish,"SIGINT");
+ request_signal_notification(SIGHUP,ignore_hup,NULL);
enter_phase(PHASE_RUN);
run();
enter_phase(PHASE_SHUTDOWN);
+ Message(M_NOTICE,"%s [%d]: finished\n",version,secnet_pid);
return 0;
}
-