ようするにこれは 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);
}