X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/16efd15b675c87d22a4fd9fb12d7bb26f2a36031..2685767a6125c1620719c7de6234aedf41857b7e:/pixie.c diff --git a/pixie.c b/pixie.c index d4aefdf..363f833 100644 --- a/pixie.c +++ b/pixie.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: pixie.c,v 1.7 2000/12/06 20:33:27 mdw Exp $ + * $Id: pixie.c,v 1.10 2001/02/21 20:03:54 mdw Exp $ * * Passphrase pixie for Catacomb * @@ -30,6 +30,16 @@ /*----- Revision history --------------------------------------------------* * * $Log: pixie.c,v $ + * Revision 1.10 2001/02/21 20:03:54 mdw + * Handle select errors (by bombing out). Cosmetic tweak. + * + * Revision 1.9 2001/02/03 16:06:44 mdw + * Don't set a handler for @SIGINT@ if it's ignored at startup. Add some + * error handling for the @select@ loop. + * + * Revision 1.8 2001/01/25 22:19:31 mdw + * Make flags be unsigned. + * * Revision 1.7 2000/12/06 20:33:27 mdw * Make flags be macros rather than enumerations, to ensure that they're * unsigned. @@ -603,7 +613,7 @@ typedef struct pixserv { unsigned f; } pixserv; -enum { px_stdin = 1 }; +#define px_stdin 1u #define PIXSERV_TIMEOUT 30 @@ -1068,7 +1078,9 @@ static void pix_setup(struct sockaddr_un *sun, size_t sz) static selbuf c_server, c_client; static unsigned c_flags = 0; -enum { cf_uclose = 1, cf_sclose = 2 }; + +#define cf_uclose 1u +#define cf_sclose 2u /* --- Line handler functions --- */ @@ -1095,8 +1107,8 @@ static void c_sline(char *s, void *p) selbuf_destroy(&c_client); } exit(0); - } else - puts(s); + } + puts(s); } /* --- @pix_client@ --- * @@ -1146,8 +1158,10 @@ static void pix_client(struct sockaddr_un *sun, size_t sz, char *argv[]) /* --- And repeat --- */ - for (;;) - sel_select(&sel); + for (;;) { + if (sel_select(&sel)) + die(EXIT_FAILURE, "select error: %s", strerror(errno)); + } } /*----- Main code ---------------------------------------------------------*/ @@ -1384,8 +1398,11 @@ int main(int argc, char *argv[]) { static sig sigint, sigterm, sigquit, sighup; + struct sigaction sa; sig_init(&sel); - sig_add(&sigint, SIGINT, pix_sigdie, 0); + sigaction(SIGINT, 0, &sa); + if (sa.sa_handler != SIG_IGN) + sig_add(&sigint, SIGINT, pix_sigdie, 0); sig_add(&sigterm, SIGTERM, pix_sigdie, 0); sig_add(&sigquit, SIGQUIT, pix_sigflush, 0); sig_add(&sighup, SIGHUP, pix_sigflush, 0); @@ -1426,14 +1443,28 @@ int main(int argc, char *argv[]) chdir("/"); setsid(); - if (fork() > 0) + if (fork() >= 0) _exit(0); } if (verbose) log("initialized ok"); - for (;;) - sel_select(&sel); + + { + int selerr = 0; + for (;;) { + if (!sel_select(&sel)) + selerr = 0; + else if (errno != EINTR && errno != EAGAIN) { + log("error from select: %s", strerror(errno)); + selerr++; + if (selerr > 8) { + log("too many consecutive select errors: bailing out"); + exit(EXIT_FAILURE); + } + } + } + } return (0); }