/* -*-c-*-
*
- * $Id: pixie.c,v 1.5 2000/07/29 22:05:22 mdw Exp $
+ * $Id: pixie.c,v 1.11 2002/01/13 13:43:05 mdw Exp $
*
* Passphrase pixie for Catacomb
*
/*----- Revision history --------------------------------------------------*
*
* $Log: pixie.c,v $
+ * 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:
*
static lmem lm;
static unsigned flags = 0;
-enum {
- F_SYSLOG = 1,
- F_FETCH = 2
-};
+#define F_SYSLOG 1u
+#define F_FETCH 2u
/*----- Event logging -----------------------------------------------------*/
unsigned f;
} pixserv;
-enum { px_stdin = 1 };
+#define px_stdin 1u
#define PIXSERV_TIMEOUT 30
{
int nfd;
struct sockaddr_un sun;
- int sunsz = sizeof(sun);
+ size_t sunsz = sizeof(sun);
if (mode != SEL_READ)
return;
/* --- 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 --- */
selbuf_destroy(&c_client);
}
exit(0);
- } else
- puts(s);
+ }
+ puts(s);
}
/* --- @pix_client@ --- *
/* --- And repeat --- */
- for (;;)
- sel_select(&sel);
+ for (;;) {
+ if (sel_select(&sel))
+ die(EXIT_FAILURE, "select error: %s", strerror(errno));
+ }
}
/*----- Main code ---------------------------------------------------------*/
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 --- */
{
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);
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);
}