-/* $Log: secnet.c,v $
- * Revision 1.1 1996/03/13 22:27:41 sde1000
- * Initial revision
- *
- */
-
extern char version[];
#include "secnet.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;
{"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;
switch(c) {
case 2:
/* Help */
- fprintf(stderr,
- "Usage: secnet [OPTION]...\n\n"
- " -f, --silent, --quiet suppress error messages\n"
- " -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"
- " -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"
+ printf("Usage: secnet [OPTION]...\n\n"
+ " -f, --silent, --quiet suppress error messages\n"
+ " -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 "
+ "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"
);
exit(0);
break;
case 1:
/* Version */
- fprintf(stderr,"%s\n",version);
+ printf("%s\n",version);
exit(0);
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;
l=dict_lookup(config,"system");
if (!l || list_elem(l,0)->type!=t_dict) {
- fatal("configuration does not include a \"system\" dictionary\n");
+ fatal("configuration does not include a \"system\" dictionary");
}
system=list_elem(l,0)->data.dict;
loc=list_elem(l,0)->loc;
/* Arrange systemwide log facility */
l=dict_lookup(system,"log");
if (!l) {
- fatal("configuration does not include a system/log facility\n");
+ fatal("configuration does not include a system/log facility");
}
system_log=init_log(l);
} while(pw);
endpwent();
if (uid==0) {
- fatal("userid \"%s\" not found\n",userid);
+ fatal("userid \"%s\" not found",userid);
}
}
/* Check whether we need root privileges */
if (require_root_privileges && uid!=0) {
- fatal("the following configured feature (\"%s\") requires "
- "that secnet retain root privileges while running.\n",
+ fatal("the configured feature \"%s\" requires "
+ "that secnet retain root privileges while running.",
require_root_privileges_explanation);
}
/* 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++))) {
fds=alloca(sizeof(*fds)*total_nfds);
if (!fds) {
- fatal("run: couldn't alloca\n");
+ fatal("run: couldn't alloca");
}
Message(M_NOTICE,"%s [%d]: starting\n",version,secnet_pid);
if (gettimeofday(&tv_now, NULL)!=0) {
fatal_perror("main loop: gettimeofday");
}
- now=(tv_now.tv_sec*1000)+(tv_now.tv_usec/1000);
+ now=((uint64_t)tv_now.tv_sec*(uint64_t)1000)+
+ ((uint64_t)tv_now.tv_usec/(uint64_t)1000);
idx=0;
for (i=reg; i; i=i->next) {
i->after(i->state, fds+idx, i->nfds, &tv_now, &now);
if (rv!=0) {
/* XXX we need to handle this properly: increase the
nfds available */
- fatal("run: beforepoll_fn (%s) returns %d\n",i->desc,rv);
+ fatal("run: beforepoll_fn (%s) returns %d",i->desc,rv);
}
if (timeout<-1) {
- fatal("run: beforepoll_fn (%s) set timeout to %d\n",timeout);
+ fatal("run: beforepoll_fn (%s) set timeout to %d",timeout);
}
idx+=nfds;
remain-=nfds;
/* Child process - all done, just carry on */
if (pf) fclose(pf);
/* Close stdin, stdout and stderr; we don't need them any more */
+ /* XXX we must leave stderr pointing to something useful -
+ a pipe to a log destination, for example, or just leave
+ it alone. */
close(0);
close(1);
- close(2);
+ /* XXX close(2); */
secnet_is_daemon=True;
+ setsid();
} else {
/* Error */
fatal_perror("cannot fork");