Blame


1 ac3ba726 2012-09-24 rsc #include <u.h>
2 ac3ba726 2012-09-24 rsc #include <libc.h>
3 ac3ba726 2012-09-24 rsc #include <auth.h>
4 ac3ba726 2012-09-24 rsc #include <thread.h>
5 ac3ba726 2012-09-24 rsc
6 ac3ba726 2012-09-24 rsc enum {
7 ac3ba726 2012-09-24 rsc Encnone,
8 ac3ba726 2012-09-24 rsc Encssl,
9 ac3ba726 2012-09-24 rsc Enctls,
10 ac3ba726 2012-09-24 rsc };
11 ac3ba726 2012-09-24 rsc
12 ac3ba726 2012-09-24 rsc static char *encprotos[] = {
13 ac3ba726 2012-09-24 rsc [Encnone] = "clear",
14 ac3ba726 2012-09-24 rsc [Encssl] = "ssl",
15 ac3ba726 2012-09-24 rsc [Enctls] = "tls",
16 ac3ba726 2012-09-24 rsc nil,
17 ac3ba726 2012-09-24 rsc };
18 ac3ba726 2012-09-24 rsc
19 ac3ba726 2012-09-24 rsc char *keyspec = "";
20 ac3ba726 2012-09-24 rsc char *filterp;
21 ac3ba726 2012-09-24 rsc char *ealgs = "rc4_256 sha1";
22 ac3ba726 2012-09-24 rsc int encproto = Encnone;
23 ac3ba726 2012-09-24 rsc AuthInfo *ai;
24 ac3ba726 2012-09-24 rsc int debug;
25 ac3ba726 2012-09-24 rsc int doauth = 1;
26 ac3ba726 2012-09-24 rsc int timedout;
27 ac3ba726 2012-09-24 rsc
28 ac3ba726 2012-09-24 rsc int connectez(char*, char*);
29 ac3ba726 2012-09-24 rsc void sysfatal(char*, ...);
30 ac3ba726 2012-09-24 rsc void usage(void);
31 ac3ba726 2012-09-24 rsc int filter(int, char *, char *);
32 ac3ba726 2012-09-24 rsc
33 ac3ba726 2012-09-24 rsc int
34 ac3ba726 2012-09-24 rsc catcher(void *v, char *msg)
35 ac3ba726 2012-09-24 rsc {
36 ac3ba726 2012-09-24 rsc timedout = 1;
37 ac3ba726 2012-09-24 rsc if(strcmp(msg, "alarm") == 0)
38 ac3ba726 2012-09-24 rsc return 1;
39 ac3ba726 2012-09-24 rsc return 0;
40 ac3ba726 2012-09-24 rsc }
41 ac3ba726 2012-09-24 rsc
42 ac3ba726 2012-09-24 rsc static int
43 ac3ba726 2012-09-24 rsc lookup(char *s, char *l[])
44 ac3ba726 2012-09-24 rsc {
45 ac3ba726 2012-09-24 rsc int i;
46 ac3ba726 2012-09-24 rsc
47 ac3ba726 2012-09-24 rsc for (i = 0; l[i] != 0; i++)
48 ac3ba726 2012-09-24 rsc if (strcmp(l[i], s) == 0)
49 ac3ba726 2012-09-24 rsc return i;
50 ac3ba726 2012-09-24 rsc return -1;
51 ac3ba726 2012-09-24 rsc }
52 ac3ba726 2012-09-24 rsc
53 ac3ba726 2012-09-24 rsc static char*
54 ac3ba726 2012-09-24 rsc srvname(char *addr)
55 ac3ba726 2012-09-24 rsc {
56 ac3ba726 2012-09-24 rsc int i;
57 ac3ba726 2012-09-24 rsc
58 ac3ba726 2012-09-24 rsc for(i=0; i<strlen(addr); i++){
59 ac3ba726 2012-09-24 rsc if(addr[i] == '!')
60 ac3ba726 2012-09-24 rsc addr[i] = ':';
61 ac3ba726 2012-09-24 rsc }
62 ac3ba726 2012-09-24 rsc return addr;
63 ac3ba726 2012-09-24 rsc }
64 ac3ba726 2012-09-24 rsc
65 ac3ba726 2012-09-24 rsc void
66 ac3ba726 2012-09-24 rsc threadmain(int argc, char **argv)
67 ac3ba726 2012-09-24 rsc {
68 ac3ba726 2012-09-24 rsc char *mntpt, *srvpost, srvfile[64];
69 ac3ba726 2012-09-24 rsc int fd;
70 ac3ba726 2012-09-24 rsc
71 ac3ba726 2012-09-24 rsc quotefmtinstall();
72 ac3ba726 2012-09-24 rsc srvpost = nil;
73 ac3ba726 2012-09-24 rsc ARGBEGIN{
74 ac3ba726 2012-09-24 rsc case 'A':
75 ac3ba726 2012-09-24 rsc doauth = 0;
76 ac3ba726 2012-09-24 rsc break;
77 ac3ba726 2012-09-24 rsc case 'd':
78 ac3ba726 2012-09-24 rsc debug++;
79 ac3ba726 2012-09-24 rsc break;
80 ac3ba726 2012-09-24 rsc case 'E':
81 ac3ba726 2012-09-24 rsc if ((encproto = lookup(EARGF(usage()), encprotos)) < 0)
82 ac3ba726 2012-09-24 rsc usage();
83 ac3ba726 2012-09-24 rsc break;
84 ac3ba726 2012-09-24 rsc case 'e':
85 ac3ba726 2012-09-24 rsc ealgs = EARGF(usage());
86 ac3ba726 2012-09-24 rsc if(*ealgs == 0 || strcmp(ealgs, "clear") == 0)
87 ac3ba726 2012-09-24 rsc ealgs = nil;
88 ac3ba726 2012-09-24 rsc break;
89 ac3ba726 2012-09-24 rsc case 'k':
90 ac3ba726 2012-09-24 rsc keyspec = EARGF(usage());
91 ac3ba726 2012-09-24 rsc break;
92 ac3ba726 2012-09-24 rsc case 'p':
93 ac3ba726 2012-09-24 rsc filterp = unsharp("#9/bin/aan");
94 ac3ba726 2012-09-24 rsc break;
95 ac3ba726 2012-09-24 rsc case 's':
96 ac3ba726 2012-09-24 rsc srvpost = EARGF(usage());
97 ac3ba726 2012-09-24 rsc break;
98 ac3ba726 2012-09-24 rsc default:
99 ac3ba726 2012-09-24 rsc usage();
100 ac3ba726 2012-09-24 rsc }ARGEND;
101 ac3ba726 2012-09-24 rsc
102 ac3ba726 2012-09-24 rsc mntpt = 0; /* to shut up compiler */
103 ac3ba726 2012-09-24 rsc switch(argc) {
104 ac3ba726 2012-09-24 rsc case 2:
105 ac3ba726 2012-09-24 rsc mntpt = argv[1];
106 ac3ba726 2012-09-24 rsc break;
107 ac3ba726 2012-09-24 rsc case 3:
108 ac3ba726 2012-09-24 rsc mntpt = argv[2];
109 ac3ba726 2012-09-24 rsc break;
110 ac3ba726 2012-09-24 rsc default:
111 ac3ba726 2012-09-24 rsc usage();
112 ac3ba726 2012-09-24 rsc }
113 ac3ba726 2012-09-24 rsc
114 ac3ba726 2012-09-24 rsc if(encproto != Encnone)
115 ac3ba726 2012-09-24 rsc sysfatal("%s: tls and ssl have not yet been implemented", argv[0]);
116 ac3ba726 2012-09-24 rsc
117 ac3ba726 2012-09-24 rsc threadnotify(catcher, 1);
118 ac3ba726 2012-09-24 rsc alarm(60*1000);
119 ac3ba726 2012-09-24 rsc
120 ac3ba726 2012-09-24 rsc fd = connectez(argv[0], argv[1]);
121 ac3ba726 2012-09-24 rsc
122 ac3ba726 2012-09-24 rsc fprint(fd, "impo %s %s\n", filterp? "aan": "nofilter",
123 ac3ba726 2012-09-24 rsc encprotos[encproto]);
124 ac3ba726 2012-09-24 rsc
125 ac3ba726 2012-09-24 rsc if (filterp)
126 ac3ba726 2012-09-24 rsc fd = filter(fd, filterp, argv[0]);
127 ac3ba726 2012-09-24 rsc
128 ac3ba726 2012-09-24 rsc if(srvpost == nil)
129 ac3ba726 2012-09-24 rsc srvpost = srvname(argv[0]);
130 ac3ba726 2012-09-24 rsc sprint(srvfile, "%s", srvpost);
131 ac3ba726 2012-09-24 rsc
132 ac3ba726 2012-09-24 rsc if(post9pservice(fd, srvfile, mntpt) < 0)
133 ac3ba726 2012-09-24 rsc sysfatal("can't post %s: %r", argv[1]);
134 ac3ba726 2012-09-24 rsc alarm(0);
135 ac3ba726 2012-09-24 rsc
136 ac3ba726 2012-09-24 rsc threadexitsall(0);
137 ac3ba726 2012-09-24 rsc }
138 ac3ba726 2012-09-24 rsc
139 ac3ba726 2012-09-24 rsc /* the name "connect" is special */
140 ac3ba726 2012-09-24 rsc int
141 ac3ba726 2012-09-24 rsc connectez(char *system, char *tree)
142 ac3ba726 2012-09-24 rsc {
143 ac3ba726 2012-09-24 rsc char buf[ERRMAX], *na;
144 ac3ba726 2012-09-24 rsc int fd, n;
145 ac3ba726 2012-09-24 rsc char *authp;
146 ac3ba726 2012-09-24 rsc
147 ac3ba726 2012-09-24 rsc na = netmkaddr(system, "tcp", "exportfs");
148 ac3ba726 2012-09-24 rsc threadsetname("dial %s", na);
149 ac3ba726 2012-09-24 rsc if((fd = dial(na, nil, nil, nil)) < 0)
150 ac3ba726 2012-09-24 rsc sysfatal("can't dial %s: %r", system);
151 ac3ba726 2012-09-24 rsc
152 ac3ba726 2012-09-24 rsc if(doauth){
153 ac3ba726 2012-09-24 rsc authp = "p9any";
154 ac3ba726 2012-09-24 rsc threadsetname("auth_proxy auth_getkey proto=%q role=client %s",
155 ac3ba726 2012-09-24 rsc authp, keyspec);
156 ac3ba726 2012-09-24 rsc ai = auth_proxy(fd, auth_getkey, "proto=%q role=client %s",
157 ac3ba726 2012-09-24 rsc authp, keyspec);
158 ac3ba726 2012-09-24 rsc if(ai == nil)
159 ac3ba726 2012-09-24 rsc sysfatal("%r: %s", system);
160 ac3ba726 2012-09-24 rsc }
161 ac3ba726 2012-09-24 rsc
162 ac3ba726 2012-09-24 rsc threadsetname("writing tree name %s", tree);
163 ac3ba726 2012-09-24 rsc n = write(fd, tree, strlen(tree));
164 ac3ba726 2012-09-24 rsc if(n < 0)
165 ac3ba726 2012-09-24 rsc sysfatal("can't write tree: %r");
166 ac3ba726 2012-09-24 rsc
167 ac3ba726 2012-09-24 rsc strcpy(buf, "can't read tree");
168 ac3ba726 2012-09-24 rsc
169 ac3ba726 2012-09-24 rsc threadsetname("awaiting OK for %s", tree);
170 ac3ba726 2012-09-24 rsc n = read(fd, buf, sizeof buf - 1);
171 ac3ba726 2012-09-24 rsc if(n!=2 || buf[0]!='O' || buf[1]!='K'){
172 ac3ba726 2012-09-24 rsc if (timedout)
173 ac3ba726 2012-09-24 rsc sysfatal("timed out connecting to %s", na);
174 ac3ba726 2012-09-24 rsc buf[sizeof buf - 1] = '\0';
175 ac3ba726 2012-09-24 rsc sysfatal("bad remote tree: %s", buf);
176 ac3ba726 2012-09-24 rsc }
177 ac3ba726 2012-09-24 rsc
178 ac3ba726 2012-09-24 rsc return fd;
179 ac3ba726 2012-09-24 rsc }
180 ac3ba726 2012-09-24 rsc
181 ac3ba726 2012-09-24 rsc void
182 ac3ba726 2012-09-24 rsc usage(void)
183 ac3ba726 2012-09-24 rsc {
184 ac3ba726 2012-09-24 rsc fprint(2, "usage: 9import [-A] [-E clear|ssl|tls] "
185 ac3ba726 2012-09-24 rsc "[-e 'crypt auth'|clear] [-k keypattern] [-p] [-s srv] host remotefs [mountpoint]\n");
186 ac3ba726 2012-09-24 rsc threadexitsall("usage");
187 ac3ba726 2012-09-24 rsc }
188 ac3ba726 2012-09-24 rsc
189 ac3ba726 2012-09-24 rsc /* Network on fd1, mount driver on fd0 */
190 ac3ba726 2012-09-24 rsc int
191 ac3ba726 2012-09-24 rsc filter(int fd, char *cmd, char *host)
192 ac3ba726 2012-09-24 rsc {
193 ac3ba726 2012-09-24 rsc int p[2], len, argc;
194 ac3ba726 2012-09-24 rsc char newport[256], buf[256], *s;
195 ac3ba726 2012-09-24 rsc char *argv[16], *file, *pbuf;
196 ac3ba726 2012-09-24 rsc
197 ac3ba726 2012-09-24 rsc if ((len = read(fd, newport, sizeof newport - 1)) < 0)
198 ac3ba726 2012-09-24 rsc sysfatal("filter: cannot write port; %r");
199 ac3ba726 2012-09-24 rsc newport[len] = '\0';
200 ac3ba726 2012-09-24 rsc
201 ac3ba726 2012-09-24 rsc if ((s = strchr(newport, '!')) == nil)
202 ac3ba726 2012-09-24 rsc sysfatal("filter: illegally formatted port %s", newport);
203 ac3ba726 2012-09-24 rsc
204 ac3ba726 2012-09-24 rsc strecpy(buf, buf+sizeof buf, netmkaddr(host, "tcp", "0"));
205 ac3ba726 2012-09-24 rsc pbuf = strrchr(buf, '!');
206 ac3ba726 2012-09-24 rsc strecpy(pbuf, buf+sizeof buf, s);
207 ac3ba726 2012-09-24 rsc
208 ac3ba726 2012-09-24 rsc if(debug)
209 ac3ba726 2012-09-24 rsc fprint(2, "filter: remote port %s\n", newport);
210 ac3ba726 2012-09-24 rsc
211 ac3ba726 2012-09-24 rsc argc = tokenize(cmd, argv, nelem(argv)-2);
212 ac3ba726 2012-09-24 rsc if (argc == 0)
213 ac3ba726 2012-09-24 rsc sysfatal("filter: empty command");
214 ac3ba726 2012-09-24 rsc argv[argc++] = "-c";
215 ac3ba726 2012-09-24 rsc argv[argc++] = buf;
216 ac3ba726 2012-09-24 rsc argv[argc] = nil;
217 ac3ba726 2012-09-24 rsc file = argv[0];
218 ac3ba726 2012-09-24 rsc if (s = strrchr(argv[0], '/'))
219 ac3ba726 2012-09-24 rsc argv[0] = s+1;
220 ac3ba726 2012-09-24 rsc
221 ac3ba726 2012-09-24 rsc if(pipe(p) < 0)
222 ac3ba726 2012-09-24 rsc sysfatal("pipe: %r");
223 ac3ba726 2012-09-24 rsc
224 ac3ba726 2012-09-24 rsc switch(rfork(RFNOWAIT|RFPROC|RFFDG)) {
225 ac3ba726 2012-09-24 rsc case -1:
226 ac3ba726 2012-09-24 rsc sysfatal("rfork record module: %r");
227 ac3ba726 2012-09-24 rsc case 0:
228 ac3ba726 2012-09-24 rsc dup(p[0], 1);
229 ac3ba726 2012-09-24 rsc dup(p[0], 0);
230 ac3ba726 2012-09-24 rsc close(p[0]);
231 ac3ba726 2012-09-24 rsc close(p[1]);
232 ac3ba726 2012-09-24 rsc exec(file, argv);
233 ac3ba726 2012-09-24 rsc sysfatal("exec record module: %r");
234 ac3ba726 2012-09-24 rsc default:
235 ac3ba726 2012-09-24 rsc close(fd);
236 ac3ba726 2012-09-24 rsc close(p[0]);
237 ac3ba726 2012-09-24 rsc }
238 ac3ba726 2012-09-24 rsc return p[1];
239 ac3ba726 2012-09-24 rsc }