URI: 
       listen1.c - 9base - revived minimalist port of Plan 9 userland to Unix
  HTML git clone git://git.suckless.org/9base
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       listen1.c (1652B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <auth.h>
            4 
            5 int verbose;
            6 int trusted;
            7 
            8 void
            9 usage(void)
           10 {
           11         fprint(2, "usage: listen1 [-v] address cmd args...\n");
           12         exits("usage");
           13 }
           14 
           15 char*
           16 remoteaddr(char *dir)
           17 {
           18         static char buf[128];
           19         char *p;
           20         int n, fd;
           21 
           22         snprint(buf, sizeof buf, "%s/remote", dir);
           23         fd = open(buf, OREAD);
           24         if(fd < 0)
           25                 return "";
           26         n = read(fd, buf, sizeof(buf));
           27         close(fd);
           28         if(n > 0){
           29                 buf[n] = 0;
           30                 p = strchr(buf, '!');
           31                 if(p)
           32                         *p = 0;
           33                 return buf;
           34         }
           35         return "";
           36 }
           37 
           38 void
           39 main(int argc, char **argv)
           40 {
           41         char dir[40], ndir[40];
           42         int ctl, nctl, fd;
           43 
           44         ARGBEGIN{
           45         default:
           46                 usage();
           47         case 't':
           48                 trusted = 1;
           49                 break;
           50         case 'v':
           51                 verbose = 1;
           52                 break;
           53         }ARGEND
           54 
           55         if(argc < 2)
           56                 usage();
           57 
           58         if(!verbose){
           59                 close(1);
           60                 fd = open("/dev/null", OWRITE);
           61                 if(fd != 1){
           62                         dup(fd, 1);
           63                         close(fd);
           64                 }
           65         }
           66 
           67         print("listen started\n");
           68         ctl = announce(argv[0], dir);
           69         if(ctl < 0)
           70                 sysfatal("announce %s: %r", argv[0]);
           71 
           72         for(;;){
           73                 nctl = listen(dir, ndir);
           74                 if(nctl < 0)
           75                         sysfatal("listen %s: %r", argv[0]);
           76 
           77                 switch(rfork(RFFDG|RFPROC|RFNOWAIT|RFNOTEG)){
           78                 case -1:
           79                         close(nctl);
           80                         continue;
           81                 case 0:
           82                         fd = accept(nctl, ndir);
           83                         if(fd < 0){
           84                                 fprint(2, "accept %s: can't open  %s/data: %r", argv[0], ndir);
           85                                 _exits(0);
           86                         }
           87                         print("incoming call for %s from %s in %s\n", argv[0], remoteaddr(ndir), ndir);
           88                         close(ctl);
           89                         close(nctl);
           90                         /*putenv("net", ndir); */
           91                         /*sprint(data, "%s/data", ndir); */
           92                         /*bind(data, "/dev/cons", MREPL); */
           93                         dup(fd, 0);
           94                         dup(fd, 1);
           95                         dup(fd, 2);
           96                         close(fd);
           97                         exec(argv[1], argv+1);
           98                         fprint(2, "exec: %r");
           99                         exits(nil);
          100                 default:
          101                         close(nctl);
          102                         break;
          103                 }
          104         }
          105 }