ようするにこれは supervise がつくった FIFO に文字を書きこむだけの プログラムである。echo で代用できる。
/* #include は省略 */ /* svc -オプション文字列 dir1 dir2 ... */ #define FATAL "svc: fatal: " #define WARNING "svc: warning: " /* data: supervise/control に書きこむ文字列。 datalen: その長さ。 */ int datalen = 0; char data[20]; /* fdorigdir: 謎の用途のファイル記述子 */ int fdorigdir; main(int argc,char **argv) { int opt; int fd; char *dir; sig_ignore(sig_pipe); /* コマンドラインオプションを取得、ぜんぶ data[] に入れる。 */ while ((opt = getopt(argc,argv,"udopchaitkx")) != opteof) if (opt == '?') strerr_die1x(100,"svc options: u up, d down, o once, x exit, p pause, c continue, h hup, a alarm, i interrupt, t term, k kill"); else if (datalen < sizeof data) if (byte_chr(data,datalen,opt) == datalen) data[datalen++] = opt; argv += optind; /* なぜかカレントディレクトリをオープン。 こうすると何かがロックされるのだろうか? 4/28: 河野さんより、これは 以下で chdir するときに 元いたディレクトリを保存しておくためのものだというご指摘。感謝。 */ fdorigdir = open_read("."); if (fdorigdir == -1) strerr_die2sys(111,FATAL,"unable to open current directory: "); /* getopt の後なので、argv にはサービスディレクトリのリストが入っている。 各ディレクトリ dirに対して… */ while (dir = *argv++) { /* 4/28: なるほど、ここで毎回 chdir してしまっているわけね。 */ if (chdir(dir) == -1) strerr_warn4(WARNING,"unable to chdir to ",dir,": ",&strerr_sys); else { /* dir/supervise/control を書きこみオープン。 */ fd = open_write("supervise/control"); if (fd == -1) if (errno == error_nodevice) strerr_warn4(WARNING,"unable to control ",dir,": supervise not running",0); else strerr_warn4(WARNING,"unable to control ",dir,": ",&strerr_sys); else { /* buffer 構造体をつかうと指定された関数 (ここでは write) で バッファにアクセスできる。このルーチンは書きこみ専用。 cf. buffer_put.c */ buffer b; char bspace[1]; ndelay_off(fd); buffer_init(&b,write,fd,bspace,sizeof bspace); /* オープンできたら、そのパイプに書きこんでフラッシュするだけ。 */ if (buffer_putflush(&b,data,datalen) == -1) strerr_warn4(WARNING,"error writing commands to ",dir,": ",&strerr_sys); close(fd); } } /* この動作が謎。何をするのか? 4/28: これは上の chdir で変更したディレクトリを戻すため(河野さん)。 */ if (fchdir(fdorigdir) == -1) strerr_die2sys(111,FATAL,"unable to set directory: "); } _exit(0); }