s6

Mirror/fork of https://skarnet.org/software/s6/
git clone https://ccx.te2000.cz/git/s6
Log | Files | Refs | README | LICENSE

s6-instance-control.c (2061B)


      1 /* ISC license. */
      2 
      3 #include <string.h>
      4 
      5 #include <skalibs/bytestr.h>
      6 #include <skalibs/types.h>
      7 #include <skalibs/strerr.h>
      8 #include <skalibs/sgetopt.h>
      9 #include <skalibs/exec.h>
     10 
     11 #include <s6/config.h>
     12 
     13 #define USAGE "s6-instance-control [ -wu | -wU | -wd | -wD | -wr | -wR ] [ -T timeout ] [ -abqhkti12pcyroduDUxO ] service instancename"
     14 #define dieusage() strerr_dieusage(100, USAGE)
     15 
     16 #define DATASIZE 63
     17 
     18 int main (int argc, char const **argv)
     19 {
     20   char const **fullargv = argv ;
     21   size_t namelen ;
     22   PROG = "s6-instance-control" ;
     23 
     24   {
     25     subgetopt l = SUBGETOPT_ZERO ;
     26     unsigned int datalen = 1 ;
     27     unsigned int timeout = 0 ;
     28     for (;;)
     29     {
     30       int opt = subgetopt_r(argc, argv, "abqhkti12pcyroduDUxOT:w:", &l) ;
     31       if (opt == -1) break ;
     32       switch (opt)
     33       {
     34         case 'a' :
     35         case 'b' :
     36         case 'q' :
     37         case 'h' :
     38         case 'k' :
     39         case 't' :
     40         case 'i' :
     41         case '1' :
     42         case '2' :
     43         case 'p' :
     44         case 'c' :
     45         case 'y' :
     46         case 'r' :
     47         case 'o' :
     48         case 'd' :
     49         case 'u' :
     50         case 'D' :
     51         case 'U' :
     52         case 'x' :
     53         case 'O' : if (datalen++ >= DATASIZE) strerr_dief1x(100, "too many commands") ; break ;
     54         case 'T' : if (!uint0_scan(l.arg, &timeout)) dieusage() ; break ;
     55         case 'w' : if (!memchr("dDuUrR", l.arg[0], 6)) dieusage() ; break ;
     56         default : dieusage() ;
     57       }
     58     }
     59     argc -= l.ind ; argv += l.ind ;
     60   }
     61 
     62   if (argc < 2) dieusage() ;
     63   namelen = strlen(argv[1]) ;
     64   if (!argv[0][0]) strerr_dief1x(100, "invalid service name") ;
     65   if (!argv[1][0] || argv[1][0] == '.' || byte_in(argv[1], namelen, " \t\f\r\n", 5) < namelen)
     66     strerr_dief1x(100, "invalid instance name") ;
     67 
     68   {
     69     size_t svlen = strlen(argv[0]) ;
     70     char fn[svlen + 11 + namelen] ;
     71     memcpy(fn, argv[0], svlen) ;
     72     memcpy(fn + svlen, "/instance/", 10) ;
     73     memcpy(fn + svlen + 10, argv[1], namelen + 1) ;
     74     argv[0] = fn ;
     75     argv[1] = 0 ;
     76     fullargv[0] = S6_BINPREFIX "s6-svc" ;
     77     xexec(fullargv) ;
     78   }
     79 }