X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/4cb04adbd7653fc4d4674efce22293854d2d6e0b..962dd3329d51f1d18313a17eb0cb4695ee4421a0:/pixie.c diff --git a/pixie.c b/pixie.c index 441b732..ba1285a 100644 --- a/pixie.c +++ b/pixie.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: pixie.c,v 1.5 2000/07/29 22:05:22 mdw Exp $ + * $Id: pixie.c,v 1.13 2004/03/21 22:43:05 mdw Exp $ * * Passphrase pixie for Catacomb * @@ -30,6 +30,33 @@ /*----- Revision history --------------------------------------------------* * * $Log: pixie.c,v $ + * Revision 1.13 2004/03/21 22:43:05 mdw + * Keep quiet about expected errors on incoming connections. + * + * Revision 1.12 2002/01/13 13:50:42 mdw + * Various fixes tracking mLib changes. + * + * Revision 1.11 2002/01/13 13:43:05 mdw + * Fix bug in daemon mode. + * + * 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. + * + * Revision 1.6 2000/10/08 12:06:46 mdw + * Change size passed to socket function to be a @size_t@. Insert missing + * type name for flag declaration. + * * Revision 1.5 2000/07/29 22:05:22 mdw * Miscellaneous tidyings: * @@ -124,10 +151,8 @@ static const char *command = 0; static lmem lm; static unsigned flags = 0; -enum { - F_SYSLOG = 1, - F_FETCH = 2 -}; +#define F_SYSLOG 1u +#define F_FETCH 2u /*----- Event logging -----------------------------------------------------*/ @@ -153,7 +178,7 @@ static void log(const char *p, ...) d.len += strftime(d.buf, d.sz, "%Y-%m-%d %H:%M:%S ", tm); } va_start(ap, p); - dstr_vputf(&d, p, ap); + dstr_vputf(&d, p, &ap); va_end(ap); if (flags & F_SYSLOG) @@ -597,7 +622,7 @@ typedef struct pixserv { unsigned f; } pixserv; -enum { px_stdin = 1 }; +#define px_stdin 1u #define PIXSERV_TIMEOUT 30 @@ -639,7 +664,7 @@ static void pixserv_write(pixserv *px, const char *p, ...) va_list ap; va_start(ap, p); - dstr_vputf(&d, p, ap); + dstr_vputf(&d, p, &ap); write(px->fd, d.buf, d.len); va_end(ap); dstr_destroy(&d); @@ -677,6 +702,7 @@ static unsigned long pixserv_timeout(const char *p) /* --- @pixserv_line@ --- * * * Arguments: @char *s@ = pointer to the line read + * @size_t len@ = length of the line * @void *p@ = pointer to server block * * Returns: --- @@ -684,7 +710,7 @@ static unsigned long pixserv_timeout(const char *p) * Use: Handles a line read from the client. */ -static void pixserv_line(char *s, void *p) +static void pixserv_line(char *s, size_t len, void *p) { pixserv *px = p; char *q, *qq; @@ -874,12 +900,13 @@ static void pixserv_accept(int fd, unsigned mode, void *p) { int nfd; struct sockaddr_un sun; - int sunsz = sizeof(sun); + size_t sunsz = sizeof(sun); if (mode != SEL_READ) return; if ((nfd = accept(fd, (struct sockaddr *)&sun, &sunsz)) < 0) { - if (verbose) + if (verbose && errno != EAGAIN && errno != EWOULDBLOCK && + errno != ECONNABORTED && errno != EPROTO && errno != EINTR) log("new connection failed: %s", strerror(errno)); return; } @@ -1061,26 +1088,26 @@ static void pix_setup(struct sockaddr_un *sun, size_t sz) /* --- Variables --- */ static selbuf c_server, c_client; -static c_flags = 0; -enum { cf_uclose = 1, cf_sclose = 2 }; +static unsigned c_flags = 0; + +#define cf_uclose 1u +#define cf_sclose 2u /* --- Line handler functions --- */ -static void c_uline(char *s, void *p) +static void c_uline(char *s, size_t len, void *p) { - size_t sz; if (!s) { selbuf_destroy(&c_client); shutdown(c_server.reader.fd, 1); c_flags |= cf_uclose; } else { - sz = strlen(s); - s[sz++] = '\n'; - write(c_server.reader.fd, s, sz); + s[len++] = '\n'; + write(c_server.reader.fd, s, len); } } -static void c_sline(char *s, void *p) +static void c_sline(char *s, size_t len, void *p) { if (!s) { selbuf_destroy(&c_server); @@ -1089,8 +1116,8 @@ static void c_sline(char *s, void *p) selbuf_destroy(&c_client); } exit(0); - } else - puts(s); + } + puts(s); } /* --- @pix_client@ --- * @@ -1140,8 +1167,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 ---------------------------------------------------------*/ @@ -1224,13 +1253,11 @@ int main(int argc, char *argv[]) size_t sz; unsigned f = 0; - enum { - f_bogus = 1, - f_client = 2, - f_stdin = 4, - f_daemon = 8, - f_syslog = 16 - }; +#define f_bogus 1u +#define f_client 2u +#define f_stdin 4u +#define f_daemon 8u +#define f_syslog 16u /* --- Initialize libraries --- */ @@ -1380,8 +1407,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); @@ -1422,14 +1452,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); }