# # http://www.gluelogic.com/code/ # diff -ru daemontools-0.76/src/error.h daemontools-0.76.new/src/error.h --- daemontools-0.76/src/error.h 2001-07-12 12:49:49.000000000 -0400 +++ daemontools-0.76.new/src/error.h 2004-01-10 06:50:37.000000000 -0500 @@ -3,7 +3,7 @@ #ifndef ERROR_H #define ERROR_H -extern int errno; +#include extern int error_intr; extern int error_nomem; diff -ru daemontools-0.76/src/svscan.c daemontools-0.76.new/src/svscan.c --- daemontools-0.76/src/svscan.c 2001-07-12 12:49:49.000000000 -0400 +++ daemontools-0.76.new/src/svscan.c 2004-02-08 01:50:27.000000000 -0500 @@ -1,6 +1,7 @@ #include #include #include +#include #include "direntry.h" #include "strerr.h" #include "error.h" @@ -14,6 +15,11 @@ #define SERVICES 1000 +#ifndef SVSCANINFO +#define SVSCANINFO ".svscan" /* must begin with dot ('.') */ +#endif + +#define INFO "svscan: info: " #define WARNING "svscan: warning: " #define FATAL "svscan: fatal: " @@ -38,7 +44,7 @@ int i; const char *args[3]; - if (fn[0] == '.') return; + if (fn[0] == '.' && str_diff(fn,SVSCANINFO)) return; if (stat(fn,&st) == -1) { strerr_warn4(WARNING,"unable to stat ",fn,": ",&strerr_sys); @@ -59,7 +65,8 @@ } x[i].ino = st.st_ino; x[i].dev = st.st_dev; - x[i].pid = 0; + /*(fn[0]=='.' here only if SVSCANINFO; if so only supervise log/ subdir)*/ + x[i].pid = (fn[0] != '.') ? 0 : -1; x[i].pidlog = 0; x[i].flaglog = 0; @@ -190,12 +197,39 @@ } } +static void open_svscan_log(void) +{ + const int i = numx; + struct stat st; + static char fn[] = SVSCANINFO; /* avoid compiler warning on const string */ + + /* (semi-paranoid; could be moreso) */ + if (fstat(STDIN_FILENO,&st) != 0 && errno == EBADF) + (void) open("/dev/null", O_RDONLY); + if (fstat(STDOUT_FILENO,&st) != 0 && errno == EBADF) + (void) open("/dev/null", O_WRONLY); + if (fstat(STDERR_FILENO,&st) != 0 && errno == EBADF) + (void) open("/dev/null", O_WRONLY); + + if (stat(fn,&st) == 0) { + start(fn); + if (i+1 == numx && x[i].pidlog != 0) { + (void) dup2(x[i].pi[1], STDOUT_FILENO); + (void) dup2(x[i].pi[1], STDERR_FILENO); + strerr_warn1("",0); + strerr_warn2(INFO,"*** Starting svscan",0); + } + } +} + int main(int argc,char **argv) { if (argv[0] && argv[1]) if (chdir(argv[1]) == -1) strerr_die4sys(111,FATAL,"unable to chdir to ",argv[1],": "); + open_svscan_log(); + for (;;) { doit(); sleep(5);