+static void logfile(const char *name)
+{
+ FILE *fp;
+
+ if ((fp = fopen(name, "a")) != 0) {
+ if (logfp)
+ fclose(logfp);
+ logfp = fp;
+ setvbuf(logfp, 0, _IOLBF, BUFSIZ);
+ } else {
+ dstr d = DSTR_INIT;
+ dstr_putf(&d, "error opening logfile `%s': %s", name, strerror(errno));
+ if (logfp)
+ writelog("error", d.buf);
+ else if (logname)
+ die(EXIT_FAILURE, d.buf);
+ if (f & f_syslog)
+ syslog(LOG_ERR, d.buf);
+ dstr_destroy(&d);
+ }
+}
+
+static void sighup(int sig, void *v)
+{
+ logfile(logname);
+}
+
+static void cleanup(void)
+{
+ if (pidfile)
+ unlink(pidfile);
+}
+
+static void sigdie(int sig)
+{
+ cleanup();
+ signal(sig, SIG_DFL);
+ raise(sig);
+}
+