URI:
       tipcopen.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tipcopen.c (1606B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 
            4 int ppid;
            5 
            6 /*
            7  * predefined
            8  */
            9 void pass(int from, int to);
           10 
           11 
           12 /*
           13  *  Connect to given datakit port
           14  */
           15 main(int argc, char *argv[])
           16 {
           17         int fd0, fd1;
           18         int cpid;
           19         char c;
           20         char *cp, *devdir, *buf;
           21 
           22         if (argc != 4) {
           23                 fprint(2, "usage: %s destination network service\n", argv[0]);
           24                 exits("incorrect number of arguments");
           25         }
           26         if(!(cp = malloc((long)(strlen(argv[1])+strlen(argv[2])+strlen(argv[3])+8)))) {
           27                 perror("malloc");
           28                 exits("malloc failed");
           29         }
           30         sprint(cp, "%s!%s!%s", argv[2], argv[1], argv[3]);
           31         if (dial(cp, &devdir, 0) < 0) {
           32                 fprint(2, "dialing %s\n", cp);
           33                 perror("dial");
           34                 exits("can't dial");
           35         }
           36 
           37         /*
           38          * Initialize the input fd, and copy bytes.
           39          */
           40 
           41         if(!(buf = malloc((long)(strlen(devdir)+6)))) {
           42                 perror("malloc");
           43                 exits("malloc failed");
           44         }
           45         sprint(buf, "%s/data", devdir);
           46         fd0=open(buf, OREAD);
           47         fd1=open(buf, OWRITE);
           48         if(fd0<0 || fd1<0) {
           49                 print("can't open", buf);
           50                 exits("can't open port");
           51         }
           52         ppid = getpid();
           53         switch(cpid = fork()){
           54         case -1:
           55                 perror("fork failed");
           56                 exits("fork failed");
           57         case 0:
           58                 close(0);
           59                 close(fd1);
           60                 pass(fd0, 1);        /* from remote */
           61                 hangup(fd0);
           62                 close(1);
           63                 close(fd0);
           64                 exits("");
           65         default:
           66                 close(1);
           67                 close(fd0);
           68                 pass(0, fd1);        /* to remote */
           69                 hangup(fd1);
           70                 close(0);
           71                 close(fd1);
           72                 exits("");
           73         }
           74 }
           75 
           76 void
           77 pass(int from, int to)
           78 {
           79         char buf[1024];
           80         int ppid, cpid;
           81         int n, tot = 0;
           82 
           83         while ((n=read(from, buf, sizeof(buf))) > 0) {
           84                 if (n==1 && tot==0 && *buf=='\0')
           85                         break;
           86                 tot += n;
           87                 if (write(to, buf, n)!=n) {
           88                         perror("pass write error");
           89                         exits("pass write error");
           90                 }
           91         }
           92 }