From: Ian Jackson Date: Wed, 30 Mar 2016 00:02:24 +0000 (+0100) Subject: cgi-fcgi-interp: Remove use of err.h (preparation for syslog) X-Git-Tag: archive/debian/5.0.0~26 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=commitdiff_plain;h=b0fae5171b2acd23e10bdc61f12004ab7105cda7 cgi-fcgi-interp: Remove use of err.h (preparation for syslog) --- diff --git a/cprogs/cgi-fcgi-interp.c b/cprogs/cgi-fcgi-interp.c index 0cafb10..89b3f5d 100644 --- a/cprogs/cgi-fcgi-interp.c +++ b/cprogs/cgi-fcgi-interp.c @@ -142,7 +142,6 @@ #include #include #include -#include #include #include #include @@ -151,9 +150,6 @@ #include "myopt.h" -#define die common_die -#define diee common_diee - #define MINHEXHASH 33 #define STAGE2_VAR "CHIARKUTILS_CGIFCGIINTERP_STAGE2" @@ -165,10 +161,36 @@ static struct sha256_ctx identsc; const char *stage2; -void diee(const char *m) { - err(127, "error: %s failed", m); +static void vmsgcore(int estatus, int errnoval, const char *fmt, va_list al) { + fputs("cgi-fcgi-interp: ",stderr); + vfprintf(stderr,fmt,al); + if (errnoval!=-1) fprintf(stderr,": %s",strerror(errnoval)); + fputc('\n',stderr); + if (estatus) exit(estatus); } +#define DEF_MSG(func, attrs, estatus, errnoval, after) \ + static void func(const char *fmt, ...) \ + __attribute__((format(printf,1,2))) attrs; \ + static void func(const char *fmt, ...) { \ + va_list al; \ + va_start(al,fmt); \ + vmsgcore(estatus,errnoval,fmt,al); \ + after \ + } + +DEF_MSG(warninge, /*empty*/, 0, errno, { }); +DEF_MSG(warning , /*empty*/, 0, 0, { }); + +#define DEF_DIE(func, errnoval) \ + DEF_MSG(func, __attribute__((noreturn)), 127, errnoval, { abort(); }) + +DEF_DIE(diee, errno) +DEF_DIE(die, 0) + +void common_diee(const char *m) { diee("%s", m); } +void common_die (const char *m) { die ("%s", m); } + static void fusagemessage(FILE *f) { fprintf(f, "usage: #!/usr/bin/cgi-fcgi-interp []\n"); } @@ -240,16 +262,16 @@ static bool find_run_base_var_run(void) { diee("stat /var/run/user/UID"); } if (!S_ISDIR(stab.st_mode)) { - warnx("%s not a directory, falling back to ~\n", try); + warning("%s not a directory, falling back to ~\n", try); return 0; } if (stab.st_uid != us) { - warnx("%s not owned by uid %lu, falling back to ~\n", try, - (unsigned long)us); + warning("%s not owned by uid %lu, falling back to ~\n", try, + (unsigned long)us); return 0; } if (stab.st_mode & 0077) { - warnx("%s writeable by group or other, falling back to ~\n", try); + warning("%s writeable by group or other, falling back to ~\n", try); return 0; } run_base = m_asprintf("%s/%s", try, "cgi-fcgi-interp"); @@ -290,10 +312,10 @@ static void find_socket_path(void) { if (!ident) { if (maxidentlen < MINHEXHASH) - errx(127,"base directory `%s'" - " leaves only %d characters for id hash" - " which is too little (<%d)", - run_base, maxidentlen, MINHEXHASH); + die("base directory `%s'" + " leaves only %d characters for id hash" + " which is too little (<%d)", + run_base, maxidentlen, MINHEXHASH); int identlen = maxidentlen > 64 ? 64 : maxidentlen; char *hexident = xmalloc(identlen + 2); @@ -312,19 +334,19 @@ static void find_socket_path(void) { } if (strlen(ident) > maxidentlen) - errx(127, "base directory `%s' plus ident `%s' too long" - " (with spare) for socket (max ident %d)\n", - run_base, ident, maxidentlen); + die("base directory `%s' plus ident `%s' too long" + " (with spare) for socket (max ident %d)\n", + run_base, ident, maxidentlen); r = mkdir(run_base, 0700); if (r && errno==ENOENT && run_base_mkdir_p) { r = mkdir(run_base_mkdir_p, 0700); - if (r) err(127,"mkdir %s (since %s was ENOENT)",run_base_mkdir_p,run_base); + if (r) diee("mkdir %s (since %s was ENOENT)",run_base_mkdir_p,run_base); r = mkdir(run_base, 0700); } if (r) { if (!(errno == EEXIST)) - err(127,"mkdir %s",run_base); + diee("mkdir %s",run_base); } socket_path = m_asprintf("%s/s%s",run_base,ident); @@ -386,7 +408,7 @@ static bool stab_isnewer(const struct stat *a, const struct stat *b) { static void stab_mtimenow(struct stat *out) { int r = clock_gettime(CLOCK_REALTIME, &out->st_mtim); - if (r) err(127,"(stage2) clock_gettime"); + if (r) diee("(stage2) clock_gettime"); if (debugmode) fprintf(stderr,"stab_mtimenow mtim %lu.%06lu\n", (unsigned long)out->st_mtim.tv_sec, @@ -405,7 +427,7 @@ static bool stab_isnewer(const struct stat *a, const struct stat *b) { static void stab_mtimenow(struct stat *out) { out->st_mtime = time(NULL); - if (baseline_time.st_mtime == (time_t)-1) err(127,"(stage2) time()"); + if (baseline_time.st_mtime == (time_t)-1) diee("(stage2) time()"); if (debugmode) fprintf(stderr,"stab_mtimenow mtime %lu\n", (unsigned long)out->st_mtime); @@ -418,14 +440,14 @@ static bool check_garbage_vs(const struct stat *started) { int r; r = lstat(script, &script_stab); - if (r) err(127,"lstat script (%s)",script); + if (r) diee("lstat script (%s)",script); if (stab_isnewer(&script_stab, started)) return 1; if (S_ISLNK(script_stab.st_mode)) { r = stat(script, &script_stab); - if (r) err(127,"stat script (%s0",script); + if (r) diee("stat script (%s0",script); if (stab_isnewer(&script_stab, started)) return 1; @@ -442,7 +464,7 @@ static bool check_garbage(void) { if (r) { if ((errno == ENOENT)) return 0; /* well, no garbage then */ - err(127,"stat socket (%s)",socket_path); + diee("stat socket (%s)",socket_path); } return check_garbage_vs(&sock_stab); @@ -459,26 +481,26 @@ static void tidy_garbage(void) { const char *lock_path = m_asprintf("%s/l%s",run_base,ident); lockfd = open(lock_path, O_CREAT|O_RDWR, 0600); - if (lockfd<0) err(127,"create lock (%s)", lock_path); + if (lockfd<0) diee("create lock (%s)", lock_path); r = flock(lockfd, LOCK_EX); - if (r) err(127,"lock lock (%s)", lock_path); + if (r) diee("lock lock (%s)", lock_path); if (check_garbage()) { r = unlink(socket_path); if (r) { if (!(errno == ENOENT)) - err(127,"remove out-of-date socket (%s)", socket_path); + diee("remove out-of-date socket (%s)", socket_path); } } r = close(lockfd); - if (r) errx(127,"close lock (%s)", lock_path); + if (r) diee("close lock (%s)", lock_path); } static void make_stderr_copy(void) { stderr_copy = dup(2); - if (stderr_copy < 0) err(127,"dup stderr (for copy for stage2)"); + if (stderr_copy < 0) diee("dup stderr (for copy for stage2)"); } static void prep_stage2(void) { @@ -486,7 +508,7 @@ static void prep_stage2(void) { const char *stage2_val = m_asprintf("%d", stderr_copy); r = setenv(STAGE2_VAR, stage2_val, 1); - if (r) err(127,"set %s (to announce to stage2)", STAGE2_VAR); + if (r) diee("set %s (to announce to stage2)", STAGE2_VAR); } static void shbang_opts(const char *const **argv_io, @@ -494,7 +516,7 @@ static void shbang_opts(const char *const **argv_io, myopt(argv_io, cmdinfos); interp = *(*argv_io)++; - if (!interp) errx(127,"need interpreter argument"); + if (!interp) badusage("need interpreter argument"); } /* stage2 predeclarations */ @@ -518,9 +540,9 @@ int main(int argc, const char *const *argv) { assert(r==2); r = open("/dev/null",O_WRONLY); - if (r<0) err(127,"open /dev/null as stdout"); + if (r<0) diee("open /dev/null as stdout"); if (r>=3) close(r); - else if (r!=1) errx(127,"open /dev/null for stdout gave bad fd %d",r); + else if (r!=1) die("open /dev/null for stdout gave bad fd %d",r); } sha256_init(&identsc); @@ -535,14 +557,13 @@ int main(int argc, const char *const *argv) { int split_argc = 0; split_args[split_argc++] = argv[0]; for (;;) { - if (split_argc >= MAX_OPTS) errx(127,"too many options in combined arg"); + if (split_argc >= MAX_OPTS) die("too many options in combined arg"); split_args[split_argc++] = smashedopt; if (smashedopt[0] != '-') /* never true on first iteration */ break; char *delim = strchr(smashedopt,' '); if (!delim) delim = strchr(smashedopt,','); - if (!delim) - errx(127,"combined arg lacks "); + if (!delim) badusage("combined arg lacks "); *delim = 0; smashedopt = delim+1; } @@ -553,14 +574,14 @@ int main(int argc, const char *const *argv) { shbang_opts(&split_argv, cmdinfos); /* sets interp */ - if (!split_argv) errx(127,"combined arg too many non-option arguments"); + if (!split_argv) badusage("combined arg too many non-option arguments"); } else { shbang_opts(&argv, cmdinfos); } script = *argv++; - if (!script) errx(127,"need script argument"); - if (*argv) errx(127,"too many arguments"); + if (!script) badusage("need script argument"); + if (*argv) badusage("too many arguments"); if (!stage2) { @@ -587,7 +608,7 @@ int main(int argc, const char *const *argv) { script, m_asprintf("%d", numservers), (char*)0); - err(127,"exec cgi-fcgi"); + diee("exec cgi-fcgi"); } else { /*stage2*/ @@ -623,17 +644,17 @@ static void become_pgrp(void) { stage2_pgrp = getpid(); r = setpgid(0,0); - if (r) err(127,"(stage2) setpgid"); + if (r) diee("(stage2) setpgid"); } static void atexit_handler(void) { int r; sighandler_t sigr = signal(SIGTERM,SIG_IGN); - if (sigr == SIG_ERR) warn("(stage2) signal(SIGTERM,SIG_IGN)"); + if (sigr == SIG_ERR) warninge("(stage2) signal(SIGTERM,SIG_IGN)"); r = killpg(stage2_pgrp,SIGTERM); - if (r) warn("(stage) killpg failed"); + if (r) warninge("(stage) killpg failed"); } static void alarm_handler(int dummy) { @@ -649,22 +670,24 @@ static void child_handler(int dummy) { for (;;) { int status; pid_t got = waitpid(-1, &status, WNOHANG); - if (got == (pid_t)-1) err(127,"(stage2) waitpid"); + if (got == (pid_t)-1) diee("(stage2) waitpid"); if (got != script_child) { - warn("(stage2) waitpid got status %d for unknown child [%lu]", - status, (unsigned long)got); + warning("(stage2) waitpid got status %d for unknown child [%lu]", + status, (unsigned long)got); continue; } if (WIFEXITED(status)) { int v = WEXITSTATUS(status); - if (v) warn("program failed with error exit status %d", v); + if (v) warning("program failed with error exit status %d", v); exit(status); } else if (WIFSIGNALED(status)) { int s = WTERMSIG(status); - err(status & 0xff, "program died due to fatal signal %s%s", - strsignal(s), WCOREDUMP(status) ? " (core dumped" : ""); + warning("program died due to fatal signal %s%s", + strsignal(s), WCOREDUMP(status) ? " (core dumped" : ""); + assert(status & 0xff); + exit(status & 0xff); } else { - err(127, "program failed with crazy wait status %#x", status); + die("program failed with crazy wait status %#x", status); } } exit(127); @@ -675,7 +698,7 @@ static void setup_handlers(void) { int r; r = atexit(atexit_handler); - if (r) err(127,"(stage2) atexit"); + if (r) diee("(stage2) atexit"); sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask, SIGALRM); @@ -683,25 +706,25 @@ static void setup_handlers(void) { sa.sa_flags = 0; r = sigprocmask(SIG_BLOCK, &sa.sa_mask, 0); - if (r) err(127,"(stage2) sigprocmask(SIG_BLOCK,)"); + if (r) diee("(stage2) sigprocmask(SIG_BLOCK,)"); sa.sa_handler = alarm_handler; r = sigaction(SIGALRM, &sa, 0); - if (r) err(127,"(stage2) sigaction SIGALRM"); + if (r) diee("(stage2) sigaction SIGALRM"); sa.sa_flags |= SA_NOCLDSTOP; sa.sa_handler = child_handler; r = sigaction(SIGCHLD, &sa, 0); - if (r) err(127,"(stage2) sigaction SIGCHLD"); + if (r) diee("(stage2) sigaction SIGCHLD"); } static void spawn_script(void) { script_child = fork(); - if (script_child == (pid_t)-1) err(127,"(stage2) fork"); + if (script_child == (pid_t)-1) diee("(stage2) fork"); if (!script_child) { execlp(interp, interp, script, (char*)0); - err(127,"(stage2) exec interpreter (`%s', for `%s')\n",interp,script); + diee("(stage2) exec interpreter (`%s', for `%s')\n",interp,script); } } @@ -717,6 +740,6 @@ static void await_something(void) { for (;;) { r = sigsuspend(&mask); assert(r==-1); - if (errno != EINTR) err(127,"(stage2) sigsuspend"); + if (errno != EINTR) diee("(stage2) sigsuspend"); } }