svc.c

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