int wtmp_logout(const char *line) { int fd; int len; struct stat st; uw_tmp ut; if ((fd = open_append(UW_TMP_WFILE)) == -1) strerr_die4sys(111, FATAL, "unable to open ", UW_TMP_WFILE, ": "); if (lock_ex(fd) == -1) strerr_die4sys(111, FATAL, "unable to lock ", UW_TMP_WFILE, ": "); if (fstat(fd, &st) == -1) { close(fd); return(-1); } memset(&ut, 0, sizeof(uw_tmp)); if ((len =str_len(line)) > sizeof ut.ut_line) len =sizeof ut.ut_line -2; byte_copy(ut.ut_line, len, line); if (time(&ut.ut_time) == -1) { close(fd); return(-1); } #ifdef DEAD_PROCESS ut.ut_type =DEAD_PROCESS; #endif if (write(fd, &ut, sizeof(uw_tmp)) != sizeof(uw_tmp)) { ftruncate(fd, st.st_size); close(fd); return(-1); } close(fd); return(1); }
void f_init(char **script) { int i; int fd; for (i = 0;script[i];++i) ; f = (int *) alloc(i * sizeof(*f)); if (!f) strerr_die2x(111,FATAL,"out of memory"); for (i = 0;script[i];++i) { fd = -1; if (script[i][0] == '=') { if (fchdir(fdstartdir) == -1) strerr_die2sys(111,FATAL,"unable to switch to starting directory: "); fd = open_append(script[i] + 1); if (fd == -1) strerr_die4sys(111,FATAL,"unable to create ",script[i] + 1,": "); close(fd); fd = open_write(script[i] + 1); if (fd == -1) strerr_die4sys(111,FATAL,"unable to write ",script[i] + 1,": "); coe(fd); } f[i] = fd; } }
int utmp_logout(const char *line) { int fd; uw_tmp ut; int ok =-1; if ((fd =open(UW_TMP_UFILE, O_RDWR, 0)) < 0) strerr_die4sys(111, FATAL, "unable to open ", UW_TMP_UFILE, ": "); if (lock_ex(fd) == -1) strerr_die4sys(111, FATAL, "unable to lock: ", UW_TMP_UFILE, ": "); while (read(fd, &ut, sizeof(uw_tmp)) == sizeof(uw_tmp)) { if (!ut.ut_name[0] || (str_diff(ut.ut_line, line) != 0)) continue; memset(ut.ut_name, 0, sizeof ut.ut_name); memset(ut.ut_host, 0, sizeof ut.ut_host); if (time(&ut.ut_time) == -1) break; #ifdef DEAD_PROCESS ut.ut_type =DEAD_PROCESS; #endif if (lseek(fd, -(off_t)sizeof(uw_tmp), SEEK_CUR) == -1) break; if (write(fd, &ut, sizeof(uw_tmp)) != sizeof(uw_tmp)) break; ok =1; break; } close(fd); return(ok); }
int lockfile(const char *path) { int fd; fd = open_append(path); if (fd == -1) strerr_die4sys(111,FATAL,ERR_OPEN,path,": "); if (lock_ex(fd) == -1) strerr_die4sys(111,FATAL,ERR_OBTAIN,path,": "); return fd; }
void init(const char *d,const char *f) { dir = d; fatal = f; umask(022); if (mkdir(dir,0700) == -1) strerr_die4sys(111,fatal,"unable to create ",dir,": "); if (chmod(dir,03755) == -1) strerr_die4sys(111,fatal,"unable to set mode of ",dir,": "); if (chdir(dir) == -1) strerr_die4sys(111,fatal,"unable to switch to ",dir,": "); }
int main(int argc,char *argv[]) { const char* dir; int fd; int match; unsigned long msgsize = 0L; int opt; while ((opt = getopt(argc,argv,"vV")) != opteof) { switch(opt) { case 'v': case 'V': strerr_die2x(0, "ezmlm-import version: ",auto_version); default: die_usage(); } } if (argc - optind != 2) die_usage(); if ((fd = open_read(argv[optind+1])) == -1) strerr_die4sys(111,FATAL,ERR_OPEN,argv[optind+1],": "); substdio_fdbuf(&ssin,read,fd,inputbuf,sizeof inputbuf); startup(dir = argv[optind]); lockfile("lock"); getconf_ulong2(&msgnum,&cumsize,"num",0,dir); fd = 0; while (getln(&ssin,&line,&match,'\n') == 0 && match) { if (line.len > 5 && byte_diff(line.s,5,"From ") == 0) { if (fd > 0) { if (substdio_flush(&ssarchive) == -1 || fchmod(fd,MODE_ARCHIVE|0700) == -1 || close(fd) == -1) strerr_die4sys(111,FATAL,ERR_WRITE,fnaf.s,": "); fd = 0; } ++msgnum; cumsize += (msgsize + 128L) >> 8; msgsize = 0L; fd = openone(msgnum); } else if (fd > 0) { substdio_put(&ssarchive,line.s,line.len); msgsize += line.len; } }
int main(int argc,const char * const *argv,const char * const *envp) { if (!argv[1]) strerr_die1x(100,"pgrphack: usage: pgrphack child"); setsid(); /* shouldn't fail; if it does, too bad */ pathexec_run(argv[1],argv + 1,envp); strerr_die4sys(111,"pgrphack: fatal: ","unable to run ",argv[1],": "); }
int main(int argc,char **argv) { int i; dns_random_init(seed); if (*argv) ++argv; while (*argv) { if (!stralloc_copys(&fqdn,*argv)) strerr_die2x(111,FATAL,"out of memory"); if (dns_ip4(&out,&fqdn) == -1) strerr_die4sys(111,FATAL,"unable to find IP address for ",*argv,": "); for (i = 0; i + 4 <= out.len; i += 4) { buffer_put(buffer_1,str,ip4_fmt(str,out.s + i)); buffer_puts(buffer_1," "); } buffer_puts(buffer_1,"\n"); ++argv; } buffer_flush(buffer_1); _exit(0); }
int main (int argc, const char * const *argv, const char * const *envp) { int opt; int wtmp =0; progname =*argv; while ((opt =getopt(argc, argv, "wV")) != opteof) { switch(opt) { case 'w': wtmp =1; break; case 'V': strerr_warn1("$Id: cb399098f794012a7f5e6a3a7090b2d53b86c08c $", 0); case '?': usage(); } } argv +=optind; if (! argv || ! *argv) usage(); if (utmp_logout(*argv) == -1) strerr_die4x(111, WARNING, "unable to logout line ", *argv, " in utmp: no such entry"); if (wtmp) if (wtmp_logout(*argv) == -1) strerr_die4sys(111, WARNING, "unable to logout line ", *argv, " in wtmp: "); _exit(0); }
void didentd_init() { char *x; unsigned long id; x = env_get("ROOT"); if (!x) strerr_die2x(111,FATAL,"$ROOT not set"); if (chdir(x) == -1) strerr_die4sys(111,FATAL,"unable to chdir to ",x,": "); x = env_get("GID"); if (!x) strerr_die2x(111,FATAL,"$GID not set"); scan_ulong(x,&id); if (prot_gid((int) id) == -1) strerr_die2sys(111,FATAL,"unable to setgid: "); x = env_get("UID"); if (!x) strerr_die2x(111,FATAL,"$UID not set"); scan_ulong(x,&id); if (prot_uid((int) id) == -1) strerr_die2sys(111,FATAL,"unable to setuid: "); }
int main(int argc,char **argv,char **envp) { int piin[2]; int piout[2]; pid[fmt_ulong(pid,getpid())] = 0; if (argc < 2) strerr_die1x(100,"recordio: usage: recordio program [ arg ... ]"); if (pipe(piin) == -1) strerr_die2sys(111,FATAL,"unable to create pipe: "); if (pipe(piout) == -1) strerr_die2sys(111,FATAL,"unable to create pipe: "); switch(fork()) { case -1: strerr_die2sys(111,FATAL,"unable to fork: "); case 0: sig_ignore(sig_pipe); close(piin[0]); close(piout[1]); doit(piin[1],piout[0]); } close(piin[1]); close(piout[0]); if (fd_move(0,piin[0]) == -1) strerr_die2sys(111,FATAL,"unable to move descriptors: "); if (fd_move(1,piout[1]) == -1) strerr_die2sys(111,FATAL,"unable to move descriptors: "); pathexec_run(argv[1],argv + 1,envp); strerr_die4sys(111,FATAL,"unable to run ",argv[1],": "); }
int main(int argc,char **argv) { umask(077); if (!argv[1]) strerr_die1x(100,"maildirmake: usage: maildirmake name"); if (mkdir(argv[1],0700) == -1) strerr_die4sys(111,FATL,"unable to mkdir ",argv[1],": "); if (chdir(argv[1]) == -1) strerr_die4sys(111,FATL,"unable to chdir to ",argv[1],": "); if (mkdir("tmp",0700) == -1) strerr_die4sys(111,FATL,"unable to mkdir ",argv[1],"/tmp: "); if (mkdir("new",0700) == -1) strerr_die4sys(111,FATL,"unable to mkdir ",argv[1],"/new: "); if (mkdir("cur",0700) == -1) strerr_die4sys(111,FATL,"unable to mkdir ",argv[1],"/cur: "); return(0); }
int main(int argc,char **argv) { struct stat st; dir = argv[1]; if (!dir || argv[2]) strerr_die1x(100,"supervise: usage: supervise dir"); if (pipe(selfpipe) == -1) strerr_die4sys(111,FATAL,"unable to create pipe for ",dir,": "); coe(selfpipe[0]); coe(selfpipe[1]); ndelay_on(selfpipe[0]); ndelay_on(selfpipe[1]); sig_block(sig_child); sig_catch(sig_child,trigger); if (chdir(dir) == -1) strerr_die4sys(111,FATAL,"unable to chdir to ",dir,": "); if (stat("down",&st) != -1) flagwantup = 0; else if (errno != error_noent) strerr_die4sys(111,FATAL,"unable to stat ",dir,"/down: "); mkdir("supervise",0700); fdlock = open_append("supervise/lock"); if ((fdlock == -1) || (lock_exnb(fdlock) == -1)) strerr_die4sys(111,FATAL,"unable to acquire ",dir,"/supervise/lock: "); coe(fdlock); fifo_make("supervise/control",0600); fdcontrol = open_read("supervise/control"); if (fdcontrol == -1) strerr_die4sys(111,FATAL,"unable to read ",dir,"/supervise/control: "); coe(fdcontrol); ndelay_on(fdcontrol); /* shouldn't be necessary */ fdcontrolwrite = open_write("supervise/control"); if (fdcontrolwrite == -1) strerr_die4sys(111,FATAL,"unable to write ",dir,"/supervise/control: "); coe(fdcontrolwrite); pidchange(); announce(); fifo_make("supervise/ok",0600); fdok = open_read("supervise/ok"); if (fdok == -1) strerr_die4sys(111,FATAL,"unable to read ",dir,"/supervise/ok: "); coe(fdok); if (!flagwant || flagwantup) trystart(); doit(); announce(); _exit(0); }
void load_config(const char *dir) { load_flags(dir); switch(slurp("key",&key,512)) { case -1: strerr_die4sys(111,FATAL,ERR_READ,dir,"/key: "); case 0: strerr_die4x(100,FATAL,dir,"/key",ERR_NOEXIST); } /* There are problems with using getconf_line to fetch the ezmlmrc * pointer, since the alt location for "ezmlmrc" turns out to be the * whole ezmlmrc file itself. */ switch (slurp("ezmlmrc",&ezmlmrc,64)) { case -1: strerr_die4sys(111,FATAL,ERR_READ,dir,"/ezmlmrc: "); case 0: ezmlmrc.len = 0; } ezmlmrc.len = byte_chr(ezmlmrc.s,ezmlmrc.len,'\n'); getconf_line(&outhost,"outhost",1,dir); getconf_line(&outlocal,"outlocal",1,dir); if (!stralloc_copy(&local,&outlocal)) die_nomem(); getconf_line(&listid,"listid",0,dir); if (getconf_line(&charset,"charset",0,dir)) { if (charset.len >= 2 && charset.s[charset.len - 2] == ':') { if (charset.s[charset.len - 1] == 'B' || charset.s[charset.len - 1] == 'Q') { flagcd = charset.s[charset.len - 1]; charset.s[charset.len - 2] = '\0'; } } } else if (!stralloc_copys(&charset,TXT_DEF_CHARSET)) die_nomem(); if (!stralloc_0(&charset)) die_nomem(); // FIXME: need to handle escapes in mailinglist getconf_line(&mailinglist,"mailinglist",1,dir); }
int main(int argc,char * const *argv) { int r; int fd; const char *file; file = *++argv; if (!file) usage(); fd = open_append(file); if (fd == -1) strerr_die4sys(111,FATAL,"cannot open ",file,": "); if (ndelay_on(fd) == -1) strerr_die4sys(111,FATAL,"cannot control ",file,": "); sig_ignore(sig_pipe); r = write(fd,"",1); if (r != -1) _exit(0); if (errno == error_again) _exit(0); if (errno == error_pipe) _exit(0); strerr_die4sys(111,FATAL,"cannot write ",file,": "); }
int main() { int fd; int i; if (chdir(auto_qmail) == -1) strerr_die4sys(111,FATAL,"unable to chdir to ",auto_qmail,": "); if (chdir("queue/lock") == -1) strerr_die4sys(111,FATAL,"unable to chdir to ",auto_qmail,"/queue/lock: "); fd = open_write("tcpto"); if (fd == -1) strerr_die4sys(111,FATAL,"unable to write ",auto_qmail,"/queue/lock/tcpto: "); if (lock_ex(fd) == -1) strerr_die4sys(111,FATAL,"unable to lock ",auto_qmail,"/queue/lock/tcpto: "); substdio_fdbuf(&ss,write,fd,buf,sizeof buf); for (i = 0;i < sizeof buf;++i) substdio_put(&ss,"",1); if (substdio_flush(&ss) == -1) strerr_die4sys(111,FATAL,"unable to clear ",auto_qmail,"/queue/lock/tcpto: "); _exit(0); }
int openone(unsigned long outnum) { int fd; if (!stralloc_copys(&fnadir,"archive/")) die_nomem(); if (!stralloc_catb(&fnadir,strnum, fmt_ulong(strnum,outnum / 100))) die_nomem(); if (!stralloc_copy(&fnaf,&fnadir)) die_nomem(); if (!stralloc_cats(&fnaf,"/")) die_nomem(); if (!stralloc_catb(&fnaf,strnum, fmt_uint0(strnum,(unsigned int)(outnum % 100),2))) die_nomem(); if (!stralloc_0(&fnadir)) die_nomem(); if (!stralloc_0(&fnaf)) die_nomem(); if (mkdir(fnadir.s,0755) == -1) if (errno != error_exist) strerr_die4sys(111,FATAL,ERR_CREATE,fnadir.s,": "); if ((fd = open_trunc(fnaf.s)) == -1) strerr_die4sys(111,FATAL,ERR_WRITE,fnaf.s,": "); substdio_fdbuf(&ssarchive,write,fd,archivebuf,sizeof archivebuf); return fd; }
int main(int argc,const char *const *argv,const char *const *envp) { account = *++argv; if (!account || !*++argv) strerr_die1x(100,"setuidgid: usage: setuidgid account child"); pw = getpwnam(account); if (!pw) strerr_die3x(111,FATAL,"unknown account ",account); if (prot_gid(pw->pw_gid) == -1) strerr_die2sys(111,FATAL,"unable to setgid: "); if (prot_uid(pw->pw_uid) == -1) strerr_die2sys(111,FATAL,"unable to setuid: "); pathexec_run(*argv,argv,envp); strerr_die4sys(111,FATAL,"unable to run ",*argv,": "); }
int main(int argc,char **argv) { dns_random_init(seed); if (*argv) ++argv; while (*argv) { if (!ip4_scan(*argv,ip)) strerr_die3x(111,FATAL,"unable to parse IP address ",*argv); if (dns_name4(&out,ip) == -1) strerr_die4sys(111,FATAL,"unable to find host name for ",*argv,": "); buffer_put(buffer_1,out.s,out.len); buffer_puts(buffer_1,"\n"); ++argv; } buffer_flush(buffer_1); _exit(0); }
int main(int argc,const char * const *argv,const char * const *envp) { char ch; int wstat; int pi[2]; int i; int ignored; if (!argv[1]) strerr_die1x(100,"fghack: usage: fghack child"); if (pipe(pi) == -1) strerr_die2sys(111,FATAL,"unable to create pipe: "); switch(pid = fork()) { case -1: strerr_die2sys(111,FATAL,"unable to fork: "); case 0: close(pi[0]); for (i = 0;i < 30;++i) ignored = dup(pi[1]); pathexec_run(argv[1],argv + 1,envp); strerr_die4sys(111,FATAL,"unable to run ",argv[1],": "); } close(pi[1]); for (;;) { i = buffer_unixread(pi[0],&ch,1); if ((i == -1) && (errno == error_intr)) continue; if (i == 1) continue; break; } if (wait_pid(&wstat,pid) == -1) strerr_die2sys(111,FATAL,"wait failed: "); if (wait_crashed(wstat)) strerr_die2x(111,FATAL,"child crashed"); _exit(wait_exitcode(wstat)); }
int main() { umask(033); if (chdir(auto_qmail) == -1) strerr_die4sys(111,FATAL,"unable to chdir to ",auto_qmail,": "); fd = open_read("control/morercpthosts"); if (fd == -1) die_read(); substdio_fdbuf(&ssin,read,fd,inbuf,sizeof inbuf); fdtemp = open_trunc("control/morercpthosts.tmp"); if (fdtemp == -1) die_write(); if (cdbmss_start(&cdbmss,fdtemp) == -1) die_write(); for (;;) { if (getln(&ssin,&line,&match,'\n') != 0) die_read(); case_lowerb(line.s,line.len); while (line.len) { if (line.s[line.len - 1] == ' ') { --line.len; continue; } if (line.s[line.len - 1] == '\n') { --line.len; continue; } if (line.s[line.len - 1] == '\t') { --line.len; continue; } if (line.s[0] != '#') if (cdbmss_add(&cdbmss,line.s,line.len,"",0) == -1) die_write(); break; } if (!match) break; } if (cdbmss_finish(&cdbmss) == -1) die_write(); if (fsync(fdtemp) == -1) die_write(); if (close(fdtemp) == -1) die_write(); /* NFS stupidity */ if (rename("control/morercpthosts.tmp","control/morercpthosts.cdb") == -1) strerr_die2sys(111,FATAL,"unable to move control/morercpthosts.tmp to control/morercpthosts.cdb"); _exit(0); }
void trystart(void) { int f; switch(f = fork()) { case -1: strerr_warn4(WARNING,"unable to fork for ",dir,", sleeping 60 seconds: ",&strerr_sys); deepsleep(60); trigger(); return; case 0: sig_uncatch(sig_child); sig_unblock(sig_child); execve(*run,run,environ); strerr_die4sys(111,FATAL,"unable to start ",dir,"/run: "); } flagpaused = 0; pid = f; pidchange(); announce(); deepsleep(1); }
int main (int argc, const char * const *argv, char * const *envp) { const char * prog[2]; int pid, pid2; int wstat; int st; iopause_fd x; #ifndef IOPAUSE_POLL fd_set rfds; struct timeval t; #endif char ch; int ttyfd; struct stat s; if (getpid() != 1) strerr_die2x(111, FATAL, "must be run as process no 1."); setsid(); sig_block(sig_alarm); sig_block(sig_child); sig_catch(sig_child, sig_child_handler); sig_block(sig_cont); sig_catch(sig_cont, sig_cont_handler); sig_block(sig_hangup); sig_block(sig_int); sig_catch(sig_int, sig_int_handler); sig_block(sig_pipe); sig_block(sig_term); /* console */ if ((ttyfd =open_write("/dev/console")) != -1) { dup2(ttyfd, 0); dup2(ttyfd, 1); dup2(ttyfd, 2); if (ttyfd > 2) close(ttyfd); } /* create selfpipe */ while (pipe(selfpipe) == -1) { strerr_warn2(FATAL, "unable to create selfpipe, pausing: ", &strerr_sys); sleep(5); } coe(selfpipe[0]); coe(selfpipe[1]); ndelay_on(selfpipe[0]); ndelay_on(selfpipe[1]); #ifdef RB_DISABLE_CAD /* activate ctrlaltdel handling, glibc, dietlibc */ if (RB_DISABLE_CAD == 0) reboot_system(0); #endif strerr_warn3(INFO, "$Id: 25da3b86f7bed4038b8a039d2f8e8c9bbcf0822b $", ": booting.", 0); /* runit */ for (st =0; st < 3; st++) { /* if (st == 2) logwtmp("~", "reboot", ""); */ while ((pid =fork()) == -1) { strerr_warn4(FATAL, "unable to fork for \"", stage[st], "\" pausing: ", &strerr_sys); sleep(5); } if (!pid) { /* child */ prog[0] =stage[st]; prog[1] =0; /* stage 1 gets full control of console */ if (st == 0) { if ((ttyfd =open("/dev/console", O_RDWR)) != -1) { #ifdef TIOCSCTTY ioctl(ttyfd, TIOCSCTTY, (char *)0); #endif dup2(ttyfd, 0); if (ttyfd > 2) close(ttyfd); } else strerr_warn2(WARNING, "unable to open /dev/console: ", &strerr_sys); } else setsid(); sig_unblock(sig_alarm); sig_unblock(sig_child); sig_uncatch(sig_child); sig_unblock(sig_cont); sig_ignore(sig_cont); sig_unblock(sig_hangup); sig_unblock(sig_int); sig_uncatch(sig_int); sig_unblock(sig_pipe); sig_unblock(sig_term); strerr_warn3(INFO, "enter stage: ", stage[st], 0); execve(*prog, (char *const *)prog, envp); strerr_die4sys(0, FATAL, "unable to start child: ", stage[st], ": "); } x.fd =selfpipe[0]; x.events =IOPAUSE_READ; for (;;) { int child; sig_unblock(sig_child); sig_unblock(sig_cont); sig_unblock(sig_int); #ifdef IOPAUSE_POLL poll(&x, 1, 14000); #else t.tv_sec =14; t.tv_usec =0; FD_ZERO(&rfds); FD_SET(x.fd, &rfds); select(x.fd +1, &rfds, (fd_set*)0, (fd_set*)0, &t); #endif sig_block(sig_cont); sig_block(sig_child); sig_block(sig_int); while (read(selfpipe[0], &ch, 1) == 1) {} while ((child =wait_nohang(&wstat)) > 0) if (child == pid) break; if (child == -1) { strerr_warn2(WARNING, "wait_nohang, pausing: ", &strerr_sys); sleep(5); } /* reget stderr */ if ((ttyfd =open_write("/dev/console")) != -1) { dup2(ttyfd, 2); if (ttyfd > 2) close(ttyfd); } if (child == pid) { if (wait_exitcode(wstat) != 0) { if (wait_crashed(wstat)) strerr_warn3(WARNING, "child crashed: ", stage[st], 0); else strerr_warn3(WARNING, "child failed: ", stage[st], 0); if (st == 0) /* this is stage 1 */ if (wait_crashed(wstat) || (wait_exitcode(wstat) == 100)) { strerr_warn3(INFO, "leave stage: ", stage[st], 0); strerr_warn2(WARNING, "skipping stage 2...", 0); st++; break; } if (st == 1) /* this is stage 2 */ if (wait_crashed(wstat) || (wait_exitcode(wstat) == 111)) { strerr_warn2(WARNING, "killing all processes in stage 2...", 0); kill(-pid, 9); sleep(5); strerr_warn2(WARNING, "restarting.", 0); st--; break; } } strerr_warn3(INFO, "leave stage: ", stage[st], 0); break; } if (child != 0) { /* collect terminated children */ write(selfpipe[1], "", 1); continue; } /* sig? */ if (!sigc && !sigi) { #ifdef DEBUG strerr_warn2(WARNING, "poll: ", &strerr_sys); #endif continue; } if (st != 1) { strerr_warn2(WARNING, "signals only work in stage 2.", 0); sigc =sigi =0; continue; } if (sigi && (stat(CTRLALTDEL, &s) != -1) && (s.st_mode & S_IXUSR)) { strerr_warn2(INFO, "ctrl-alt-del request...", 0); prog[0] =CTRLALTDEL; prog[1] =0; while ((pid2 =fork()) == -1) { strerr_warn4(FATAL, "unable to fork for \"", CTRLALTDEL, "\" pausing: ", &strerr_sys); sleep(5); } if (!pid2) { /* child */ strerr_warn3(INFO, "enter stage: ", prog[0], 0); execve(*prog, (char *const *) prog, envp); strerr_die4sys(0, FATAL, "unable to start child: ", prog[0], ": "); } if (wait_pid(&wstat, pid2) == -1) strerr_warn2(FATAL, "wait_pid: ", &strerr_sys); if (wait_crashed(wstat)) strerr_warn3(WARNING, "child crashed: ", CTRLALTDEL, 0); strerr_warn3(INFO, "leave stage: ", prog[0], 0); sigi =0; sigc++; } if (sigc && (stat(STOPIT, &s) != -1) && (s.st_mode & S_IXUSR)) { int i; /* unlink(STOPIT); */ chmod(STOPIT, 0); /* kill stage 2 */ #ifdef DEBUG strerr_warn2(WARNING, "sending sigterm...", 0); #endif kill(pid, sig_term); i =0; while (i < 5) { if ((child =wait_nohang(&wstat)) == pid) { #ifdef DEBUG strerr_warn2(WARNING, "stage 2 terminated.", 0); #endif pid =0; break; } if (child) continue; if (child == -1) strerr_warn2(WARNING, "wait_nohang: ", &strerr_sys); #ifdef DEBUG strerr_warn2(WARNING, "waiting...", 0); #endif sleep(1); i++; } if (pid) { /* still there */ strerr_warn2(WARNING, "stage 2 not terminated, sending sigkill...", 0); kill(pid, 9); if (wait_pid(&wstat, pid) == -1) strerr_warn2(WARNING, "wait_pid: ", &strerr_sys); } sigc =0; strerr_warn3(INFO, "leave stage: ", stage[st], 0); /* enter stage 3 */ break; } sigc =sigi =0; #ifdef DEBUG strerr_warn2(WARNING, "no request.", 0); #endif } } /* reget stderr */ if ((ttyfd =open_write("/dev/console")) != -1) { dup2(ttyfd, 2); if (ttyfd > 2) close(ttyfd); } #ifdef RB_AUTOBOOT /* fallthrough stage 3 */ strerr_warn2(INFO, "sending KILL signal to all processes...", 0); kill(-1, SIGKILL); pid =fork(); switch (pid) { case 0: case -1: if ((stat(REBOOT, &s) != -1) && (s.st_mode & S_IXUSR)) { strerr_warn2(INFO, "system reboot.", 0); sync(); reboot_system(RB_AUTOBOOT); } else { #ifdef RB_POWER_OFF strerr_warn2(INFO, "power off...", 0); sync(); reboot_system(RB_POWER_OFF); sleep(2); #endif #ifdef RB_HALT_SYSTEM strerr_warn2(INFO, "system halt.", 0); sync(); reboot_system(RB_HALT_SYSTEM); #else #ifdef RB_HALT strerr_warn2(INFO, "system halt.", 0); sync(); reboot_system(RB_HALT); #else strerr_warn2(INFO, "system reboot.", 0); sync(); reboot_system(RB_AUTOBOOT); #endif #endif } if (pid == 0) _exit(0); break; default: sig_unblock(sig_child); while (wait_pid(0, pid) == -1); } #endif for (;;) sig_pause(); /* not reached */ strerr_die2x(0, INFO, "exit."); return(0); }
void restart(struct cyclog *d) { struct stat st; int fd; int flagprocessed; if (fchdir(fdstartdir) == -1) strerr_die2sys(111,FATAL,"unable to switch to starting directory: "); mkdir(d->dir,0700); d->fddir = open_read(d->dir); if ((d->fddir == -1) || (fchdir(d->fddir) == -1)) strerr_die4sys(111,FATAL,"unable to open directory ",d->dir,": "); coe(d->fddir); d->fdlock = open_append("lock"); if ((d->fdlock == -1) || (lock_exnb(d->fdlock) == -1)) strerr_die4sys(111,FATAL,"unable to lock directory ",d->dir,": "); coe(d->fdlock); if (stat("current",&st) == -1) { if (errno != error_noent) strerr_die4sys(111,FATAL,"unable to stat ",d->dir,"/current: "); } else if (st.st_mode & 0100) { fd = open_append("current"); if (fd == -1) strerr_die4sys(111,FATAL,"unable to append to ",d->dir,"/current: "); if (fchmod(fd,0644) == -1) strerr_die4sys(111,FATAL,"unable to set mode of ",d->dir,"/current: "); coe(fd); d->fdcurrent = fd; d->bytes = st.st_size; return; } unlink("state"); unlink("newstate"); flagprocessed = 0; if (stat("processed",&st) == -1) { if (errno != error_noent) strerr_die4sys(111,FATAL,"unable to stat ",d->dir,"/processed: "); } else if (st.st_mode & 0100) flagprocessed = 1; if (flagprocessed) { unlink("previous"); finish(d,"processed","s"); } else { unlink("processed"); finish(d,"previous","u"); } finish(d,"current","u"); fd = open_trunc("state"); if (fd == -1) strerr_die4sys(111,FATAL,"unable to write to ",d->dir,"/state: "); close(fd); fd = open_append("current"); if (fd == -1) strerr_die4sys(111,FATAL,"unable to write to ",d->dir,"/current: "); if (fchmod(fd,0644) == -1) strerr_die4sys(111,FATAL,"unable to set mode of ",d->dir,"/current: "); coe(fd); d->fdcurrent = fd; d->bytes = 0; }
void fullcurrent(struct cyclog *d) { int fd; int pid; int wstat; while (fchdir(d->fddir) == -1) pause3("unable to switch to ",d->dir,", pausing: "); while (fsync(d->fdcurrent) == -1) pause3("unable to write ",d->dir,"/current to disk, pausing: "); close(d->fdcurrent); while (rename("current","previous") == -1) pause3("unable to rename current to previous in directory ",d->dir,", pausing: "); while ((d->fdcurrent = open_append("current")) == -1) pause3("unable to create ",d->dir,"/current, pausing: "); coe(d->fdcurrent); d->bytes = 0; while (fchmod(d->fdcurrent,0644) == -1) pause3("unable to set mode of ",d->dir,"/current, pausing: "); while (chmod("previous",0744) == -1) pause3("unable to set mode of ",d->dir,"/previous, pausing: "); if (!d->processor) finish(d,"previous","s"); else { for (;;) { while ((pid = fork()) == -1) pause3("unable to fork for processor in ",d->dir,", pausing: "); if (!pid) { startprocessor(d); strerr_die4sys(111,FATAL,"unable to run ",d->processor,": "); } if (wait_pid(&wstat,pid) == -1) pause3("wait failed for processor in ",d->dir,", pausing: "); else if (wait_crashed(wstat)) pause3("processor crashed in ",d->dir,", pausing: "); else if (!wait_exitcode(wstat)) break; strerr_warn4(WARNING,"processor failed in ",d->dir,", pausing",0); deepsleep(5); } while ((fd = open_append("processed")) == -1) pause3("unable to create ",d->dir,"/processed, pausing: "); while (fsync(fd) == -1) pause3("unable to write ",d->dir,"/processed to disk, pausing: "); while (fchmod(fd,0744) == -1) pause3("unable to set mode of ",d->dir,"/processed, pausing: "); close(fd); while ((fd = open_append("newstate")) == -1) pause3("unable to create ",d->dir,"/newstate, pausing: "); while (fsync(fd) == -1) pause3("unable to write ",d->dir,"/newstate to disk, pausing: "); close(fd); while (unlink("previous") == -1) pause3("unable to remove ",d->dir,"/previous, pausing: "); while (rename("newstate","state") == -1) pause3("unable to rename newstate to state in directory ",d->dir,", pausing: "); finish(d,"processed","s"); } }
static void err_write(const char *file) { strerr_die4sys(111,FATAL,"failed to write to file '",file,"': "); }
static void err_open(const char *file) { strerr_die4sys(111,FATAL,"failed to open file '",file,"': "); }
void die_write(void) { strerr_die4sys(111,FATAL,ERR_WRITE,fnnew.s,": "); }
void die_read(void) { strerr_die4sys(111,FATAL,ERR_READ,fn.s,": "); }
void die_write(const char *f) { strerr_die4sys(111,FATAL,"unable to write to ", f, ": "); }