]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/import.c
togif: -E flag to read animation from stdin
[plan9front.git] / sys / src / cmd / import.c
index 9ffe2e2d0eff66099e4d21d2a0387f4d98ab5d27..5162f6037268fec54f800fe4e8d8c39744a057c0 100644 (file)
@@ -21,15 +21,15 @@ char                *filterp;
 char           *ealgs = "rc4_256 sha1";
 int            encproto = Encnone;
 char           *aan = "/bin/aan";
+char           *anstring  = "tcp!*!0";
 AuthInfo       *ai;
 int            debug;
 int            doauth = 1;
 int            timedout;
 int            skiptree;
 
-int    connect(char*, char*, int);
+int    connect(char*, char*);
 int    passive(void);
-int    old9p(int);
 void   catcher(void*, char*);
 void   sysfatal(char*, ...);
 void   usage(void);
@@ -93,11 +93,10 @@ void
 main(int argc, char **argv)
 {
        char *mntpt, *srvpost, srvfile[64];
-       int backwards = 0, fd, mntflags, oldserver;
+       int backwards = 0, fd, mntflags;
 
        quotefmtinstall();
        srvpost = nil;
-       oldserver = 0;
        mntflags = MREPL;
        ARGBEGIN{
        case 'A':
@@ -121,10 +120,6 @@ main(int argc, char **argv)
        case 'f':
                /* ignored but allowed for compatibility */
                break;
-       case 'O':
-       case 'o':
-               oldserver = 1;
-               break;
        case 'E':
                if ((encproto = lookup(EARGF(usage()), encprotos)) < 0)
                        usage();
@@ -140,6 +135,9 @@ main(int argc, char **argv)
        case 'p':
                filterp = aan;
                break;
+       case 'n':
+               anstring = EARGF(usage());
+               break;
        case 's':
                srvpost = EARGF(usage());
                break;
@@ -181,14 +179,12 @@ main(int argc, char **argv)
        notify(catcher);
        alarm(60*1000);
 
-       if(backwards)
+       if (backwards)
                fd = passive();
        else
-               fd = connect(argv[0], argv[1], oldserver);
+               fd = connect(argv[0], argv[1]);
 
-       if (!oldserver)
-               fprint(fd, "impo %s %s\n", filterp? "aan": "nofilter",
-                       encprotos[encproto]);
+       fprint(fd, "impo %s %s\n", filterp? "aan": "nofilter", encprotos[encproto]);
 
        if (encproto != Encnone && ealgs && ai) {
                uchar key[16], digest[SHA1dlen];
@@ -196,8 +192,9 @@ main(int argc, char **argv)
                char fromserversecret[21];
                int i;
 
-               assert(ai->nsecret <= sizeof(key)-4);
-               memmove(key+4, ai->secret, ai->nsecret);
+               if(ai->nsecret < 8)
+                       sysfatal("secret too small to ssl");
+               memmove(key+4, ai->secret, 8);
 
                /* exchange random numbers */
                srand(truerand());
@@ -214,7 +211,7 @@ main(int argc, char **argv)
                mksecret(fromserversecret, digest+10);
 
                if (filterp)
-                       fd = filter(fd, filterp, argv[0]);
+                       fd = filter(fd, filterp, backwards ? nil : argv[0]);
 
                /* set up encryption */
                procsetname("pushssl");
@@ -223,7 +220,7 @@ main(int argc, char **argv)
                        sysfatal("can't establish ssl connection: %r");
        }
        else if (filterp)
-               fd = filter(fd, filterp, argv[0]);
+               fd = filter(fd, filterp, backwards ? nil : argv[0]);
 
        if(ai)
                auth_freeAI(ai);
@@ -255,50 +252,10 @@ catcher(void*, char *msg)
 }
 
 int
-old9p(int fd)
-{
-       int p[2];
-
-       procsetname("old9p");
-       if(pipe(p) < 0)
-               sysfatal("pipe: %r");
-
-       switch(rfork(RFPROC|RFMEM|RFFDG|RFNAMEG)) {
-       case -1:
-               sysfatal("rfork srvold9p: %r");
-       case 0:
-               if(fd != 1){
-                       dup(fd, 1);
-                       close(fd);
-               }
-               if(p[0] != 0){
-                       dup(p[0], 0);
-                       close(p[0]);
-               }
-               close(p[1]);
-               if(0){
-                       fd = open("/sys/log/cpu", OWRITE);
-                       if(fd != 2){
-                               dup(fd, 2);
-                               close(fd);
-                       }
-                       execl("/bin/srvold9p", "srvold9p", "-ds", nil);
-               } else
-                       execl("/bin/srvold9p", "srvold9p", "-s", nil);
-               sysfatal("exec srvold9p: %r");
-       default:
-               close(fd);
-               close(p[0]);
-       }
-       return p[1];
-}
-
-int
-connect(char *system, char *tree, int oldserver)
+connect(char *system, char *tree)
 {
        char buf[ERRMAX], dir[128], *na;
        int fd, n;
-       char *authp;
 
        na = netmkaddr(system, 0, "exportfs");
        procsetname("dial %s", na);
@@ -306,15 +263,8 @@ connect(char *system, char *tree, int oldserver)
                sysfatal("can't dial %s: %r", system);
 
        if(doauth){
-               if(oldserver)
-                       authp = "p9sk2";
-               else
-                       authp = "p9any";
-
-               procsetname("auth_proxy auth_getkey proto=%q role=client %s",
-                       authp, keyspec);
-               ai = auth_proxy(fd, auth_getkey, "proto=%q role=client %s",
-                       authp, keyspec);
+               procsetname("auth_proxy auth_getkey proto=p9any role=client %s", keyspec);
+               ai = auth_proxy(fd, auth_getkey, "proto=p9any role=client %s", keyspec);
                if(ai == nil)
                        sysfatal("%r: %s", system);
        }
@@ -336,9 +286,6 @@ connect(char *system, char *tree, int oldserver)
                        sysfatal("bad remote tree: %s", buf);
                }
        }
-
-       if(oldserver)
-               return old9p(fd);
        return fd;
 }
 
@@ -372,58 +319,83 @@ void
 usage(void)
 {
        fprint(2, "usage: import [-abcC] [-A] [-E clear|ssl|tls] "
-"[-e 'crypt auth'|clear] [-k keypattern] [-p] [-z] host remotefs [mountpoint]\n");
+"[-e 'crypt auth'|clear] [-k keypattern] [-p] [-n address ] [-z] host remotefs [mountpoint]\n");
        exits("usage");
 }
 
-/* Network on fd1, mount driver on fd0 */
 int
 filter(int fd, char *cmd, char *host)
 {
        char addr[128], buf[256], *s, *file, *argv[16];
-       int p[2], len, argc;
-
-       if ((len = read(fd, buf, sizeof buf - 1)) < 0)
-               sysfatal("filter: cannot write port; %r");
-       buf[len] = '\0';
-
-       if ((s = strrchr(buf, '!')) == nil)
-               sysfatal("filter: illegally formatted port %s", buf);
-       strecpy(addr, addr+sizeof(addr), netmkaddr(host, "tcp", s+1));
-       strecpy(strrchr(addr, '!'), addr+sizeof(addr), s);
+       int lfd, p[2], len, argc;
+
+       if(host == nil){
+               /* Get a free port and post it to the client. */
+               if (announce(anstring, addr) < 0)
+                       sysfatal("filter: Cannot announce %s: %r", anstring);
+
+               snprint(buf, sizeof(buf), "%s/local", addr);
+               if ((lfd = open(buf, OREAD)) < 0)
+                       sysfatal("filter: Cannot open %s: %r", buf);
+               if ((len = read(lfd, buf, sizeof buf - 1)) < 0)
+                       sysfatal("filter: Cannot read %s: %r", buf);
+               close(lfd);
+               buf[len] = '\0';
+               if ((s = strchr(buf, '\n')) != nil)
+                       len = s - buf;
+               if (write(fd, buf, len) != len) 
+                       sysfatal("filter: cannot write port; %r");
+       } else {
+               /* Read address string from connection */
+               if ((len = read(fd, buf, sizeof buf - 1)) < 0)
+                       sysfatal("filter: cannot write port; %r");
+               buf[len] = '\0';
+
+               if ((s = strrchr(buf, '!')) == nil)
+                       sysfatal("filter: illegally formatted port %s", buf);
+               strecpy(addr, addr+sizeof(addr), netmkaddr(host, "tcp", s+1));
+               strecpy(strrchr(addr, '!'), addr+sizeof(addr), s);
+       }
 
        if(debug)
-               fprint(2, "filter: remote %s\n", addr);
+               fprint(2, "filter: %s\n", addr);
 
        snprint(buf, sizeof(buf), "%s", cmd);
-       argc = tokenize(buf, argv, nelem(argv)-2);
+       argc = tokenize(buf, argv, nelem(argv)-3);
        if (argc == 0)
                sysfatal("filter: empty command");
-       argv[argc++] = "-c";
+
+       if(host != nil)
+               argv[argc++] = "-c";
        argv[argc++] = addr;
        argv[argc] = nil;
+
        file = argv[0];
-       if (s = strrchr(argv[0], '/'))
+       if((s = strrchr(argv[0], '/')) != nil)
                argv[0] = s+1;
 
        if(pipe(p) < 0)
                sysfatal("pipe: %r");
 
-       switch(rfork(RFNOWAIT|RFPROC|RFMEM|RFFDG)) {
+       switch(rfork(RFNOWAIT|RFPROC|RFMEM|RFFDG|RFREND)) {
        case -1:
-               sysfatal("filter: rfork; %r");
+               sysfatal("filter: rfork; %r\n");
        case 0:
-               dup(p[0], 1);
-               dup(p[0], 0);
+               close(fd);
+               if (dup(p[0], 1) < 0)
+                       sysfatal("filter: Cannot dup to 1; %r");
+               if (dup(p[0], 0) < 0)
+                       sysfatal("filter: Cannot dup to 0; %r");
                close(p[0]);
                close(p[1]);
                exec(file, argv);
                sysfatal("filter: exec; %r");
        default:
-               close(fd);
+               dup(p[1], fd);
                close(p[0]);
+               close(p[1]);
        }
-       return p[1];
+       return fd;
 }
 
 static void