/* This file is in the public domain. */ #include #include #include #include extern const char *__progname; #include "vars.h" #include "config.h" #include "pollloop.h" /* * Main program for scd, the daemon. * * This is fairly simple: crack the arglist, set up variables, reload * the config, and drop in the main polling loop. (Reloading the * config will establish polling fds and block functions as * appropriate.) * * Usage: $0 [-config configfile] * * Default configfile name is set in vars.c. */ static void handleargs(int ac, char **av) { int skip; int errs; skip = 0; errs = 0; for (ac--,av++;ac;ac--,av++) { if (skip > 0) { skip --; continue; } if (**av != '-') { fprintf(stderr,"%s: extra argument `%s'\n",__progname,*av); errs = 1; continue; } if (0) { needarg:; fprintf(stderr,"%s: %s needs a following argument\n",__progname,*av); errs = 1; continue; } #define WANTARG() do { if (++skip >= ac) goto needarg; } while (0) if (!strcmp(*av,"-config")) { WANTARG(); configfile = av[skip]; continue; } #undef WANTARG fprintf(stderr,"%s: unrecognized option `%s'\n",__progname,*av); errs = 1; } if (errs) exit(1); } static void init(void) { conf = 0; init_polling(); } int main(int, char **); int main(int ac, char **av) { handleargs(ac,av); init(); reload_config(); if (! conf) exit(1); while (1) { pre_poll(); if (do_poll() < 0) { if (errno == EINTR) continue; fprintf(stderr,"%s: poll: %s",__progname,strerror(errno)); exit(1); } post_poll(); } }