2 #include "../port/lib.h"
6 #include "../port/error.h"
10 static Chan* call(char*, char*, DS*);
11 static void _dial_string_parse(char*, DS*);
20 char buf[Maxstring]; /* dist string */
24 char *local; /* other args */
30 * the dialstring is of the form '[/net/]proto!dest'
33 chandial(char *dest, char *local, char *dir, Chan **ctlp)
42 _dial_string_parse(dest, &ds);
46 /* no connection server, don't translate */
47 snprint(clone, sizeof(clone), "%s/%s/clone", ds.netdir, ds.proto);
48 return call(clone, ds.rem, &ds);
52 call(char *clone, char *dest, DS *ds)
56 char name[Maxpath], data[Maxpath], *p;
58 cchan = namec(clone, Aopen, ORDWR, 0);
60 /* get directory name */
65 n = devtab[cchan->type]->read(cchan, name, sizeof(name)-1, 0);
67 for(p = name; *p == ' '; p++)
69 sprint(name, "%lud", strtoul(p, 0, 0));
70 p = strrchr(clone, '/');
73 snprint(ds->dir, Maxpath, "%s/%s", clone, name);
74 snprint(data, sizeof(data), "%s/%s/data", clone, name);
78 snprint(name, sizeof(name), "connect %s %s", dest, ds->local);
80 snprint(name, sizeof(name), "connect %s", dest);
81 devtab[cchan->type]->write(cchan, name, strlen(name), 0);
83 /* open data connection */
84 dchan = namec(data, Aopen, ORDWR, 0);
98 _dial_string_parse(char *str, DS *ds)
102 strncpy(ds->buf, str, Maxstring);
103 ds->buf[Maxstring-1] = 0;
105 p = strchr(ds->buf, '!');
111 if(*ds->buf != '/' && *ds->buf != '#'){
115 for(p2 = p; *p2 != '/' && p2 != ds->buf; p2--)
120 ds->netdir = ds->buf;