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);
static void mksecret(char *, uchar *);
-/*
- * based on libthread's threadsetname, but drags in less library code.
- * actually just sets the arguments displayed.
- */
-void
-procsetname(char *fmt, ...)
-{
- int fd;
- char *cmdname;
- char buf[128];
- va_list arg;
-
- va_start(arg, fmt);
- cmdname = vsmprint(fmt, arg);
- va_end(arg);
- if (cmdname == nil)
- return;
- snprint(buf, sizeof buf, "#p/%d/args", getpid());
- if((fd = open(buf, OWRITE)) >= 0){
- write(fd, cmdname, strlen(cmdname)+1);
- close(fd);
- }
- free(cmdname);
-}
-
void
post(char *name, char *envname, int srvfd)
{
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':
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();
case 'p':
filterp = aan;
break;
+ case 'n':
+ anstring = EARGF(usage());
+ break;
case 's':
srvpost = EARGF(usage());
break;
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];
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());
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");
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);
}
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);
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);
}
sysfatal("bad remote tree: %s", buf);
}
}
-
- if(oldserver)
- return old9p(fd);
return fd;
}
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);
- snprint(addr, sizeof(addr), "%s", netmkaddr(host, "tcp", s+1));
+ 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