Blame


1 6f4d00ee 2013-09-23 0intro #include "stdinc.h"
2 6f4d00ee 2013-09-23 0intro
3 6f4d00ee 2013-09-23 0intro #include "9.h"
4 6f4d00ee 2013-09-23 0intro
5 6f4d00ee 2013-09-23 0intro static struct {
6 4b576658 2013-09-23 0intro QLock lock;
7 6f4d00ee 2013-09-23 0intro
8 6f4d00ee 2013-09-23 0intro Con* con;
9 6f4d00ee 2013-09-23 0intro int confd[2];
10 6f4d00ee 2013-09-23 0intro ushort tag;
11 6f4d00ee 2013-09-23 0intro } cbox;
12 6f4d00ee 2013-09-23 0intro
13 6f4d00ee 2013-09-23 0intro static ulong
14 6f4d00ee 2013-09-23 0intro cmd9pStrtoul(char* s)
15 6f4d00ee 2013-09-23 0intro {
16 6f4d00ee 2013-09-23 0intro if(strcmp(s, "~0") == 0)
17 6f4d00ee 2013-09-23 0intro return ~0UL;
18 6f4d00ee 2013-09-23 0intro return strtoul(s, 0, 0);
19 6f4d00ee 2013-09-23 0intro }
20 6f4d00ee 2013-09-23 0intro
21 6f4d00ee 2013-09-23 0intro static uvlong
22 6f4d00ee 2013-09-23 0intro cmd9pStrtoull(char* s)
23 6f4d00ee 2013-09-23 0intro {
24 6f4d00ee 2013-09-23 0intro if(strcmp(s, "~0") == 0)
25 6f4d00ee 2013-09-23 0intro return ~0ULL;
26 6f4d00ee 2013-09-23 0intro return strtoull(s, 0, 0);
27 6f4d00ee 2013-09-23 0intro }
28 6f4d00ee 2013-09-23 0intro
29 6f4d00ee 2013-09-23 0intro static int
30 b32de4ae 2013-09-26 0intro cmd9pTag(Fcall* f, int i, char **argv)
31 6f4d00ee 2013-09-23 0intro {
32 b32de4ae 2013-09-26 0intro USED(f);
33 b32de4ae 2013-09-26 0intro USED(i);
34 6f4d00ee 2013-09-23 0intro cbox.tag = strtoul(argv[0], 0, 0)-1;
35 6f4d00ee 2013-09-23 0intro
36 6f4d00ee 2013-09-23 0intro return 1;
37 6f4d00ee 2013-09-23 0intro }
38 6f4d00ee 2013-09-23 0intro
39 6f4d00ee 2013-09-23 0intro static int
40 b32de4ae 2013-09-26 0intro cmd9pTwstat(Fcall* f, int i, char **argv)
41 6f4d00ee 2013-09-23 0intro {
42 6f4d00ee 2013-09-23 0intro Dir d;
43 6f4d00ee 2013-09-23 0intro static uchar buf[DIRMAX];
44 6f4d00ee 2013-09-23 0intro
45 b32de4ae 2013-09-26 0intro USED(i);
46 6f4d00ee 2013-09-23 0intro memset(&d, 0, sizeof d);
47 6f4d00ee 2013-09-23 0intro nulldir(&d);
48 6f4d00ee 2013-09-23 0intro d.name = argv[1];
49 6f4d00ee 2013-09-23 0intro d.uid = argv[2];
50 6f4d00ee 2013-09-23 0intro d.gid = argv[3];
51 6f4d00ee 2013-09-23 0intro d.mode = cmd9pStrtoul(argv[4]);
52 6f4d00ee 2013-09-23 0intro d.mtime = cmd9pStrtoul(argv[5]);
53 6f4d00ee 2013-09-23 0intro d.length = cmd9pStrtoull(argv[6]);
54 6f4d00ee 2013-09-23 0intro
55 6f4d00ee 2013-09-23 0intro f->fid = strtol(argv[0], 0, 0);
56 6f4d00ee 2013-09-23 0intro f->stat = buf;
57 6f4d00ee 2013-09-23 0intro f->nstat = convD2M(&d, buf, sizeof buf);
58 6f4d00ee 2013-09-23 0intro if(f->nstat < BIT16SZ){
59 4b576658 2013-09-23 0intro werrstr("Twstat: convD2M failed (internal error)");
60 6f4d00ee 2013-09-23 0intro return 0;
61 6f4d00ee 2013-09-23 0intro }
62 6f4d00ee 2013-09-23 0intro
63 6f4d00ee 2013-09-23 0intro return 1;
64 6f4d00ee 2013-09-23 0intro }
65 6f4d00ee 2013-09-23 0intro
66 6f4d00ee 2013-09-23 0intro static int
67 b32de4ae 2013-09-26 0intro cmd9pTstat(Fcall* f, int i, char** argv)
68 6f4d00ee 2013-09-23 0intro {
69 b32de4ae 2013-09-26 0intro USED(i);
70 6f4d00ee 2013-09-23 0intro f->fid = strtol(argv[0], 0, 0);
71 6f4d00ee 2013-09-23 0intro
72 6f4d00ee 2013-09-23 0intro return 1;
73 6f4d00ee 2013-09-23 0intro }
74 6f4d00ee 2013-09-23 0intro
75 6f4d00ee 2013-09-23 0intro static int
76 b32de4ae 2013-09-26 0intro cmd9pTremove(Fcall* f, int i, char** argv)
77 6f4d00ee 2013-09-23 0intro {
78 b32de4ae 2013-09-26 0intro USED(i);
79 6f4d00ee 2013-09-23 0intro f->fid = strtol(argv[0], 0, 0);
80 6f4d00ee 2013-09-23 0intro
81 6f4d00ee 2013-09-23 0intro return 1;
82 6f4d00ee 2013-09-23 0intro }
83 6f4d00ee 2013-09-23 0intro
84 6f4d00ee 2013-09-23 0intro static int
85 b32de4ae 2013-09-26 0intro cmd9pTclunk(Fcall* f, int i, char** argv)
86 6f4d00ee 2013-09-23 0intro {
87 b32de4ae 2013-09-26 0intro USED(i);
88 6f4d00ee 2013-09-23 0intro f->fid = strtol(argv[0], 0, 0);
89 6f4d00ee 2013-09-23 0intro
90 6f4d00ee 2013-09-23 0intro return 1;
91 6f4d00ee 2013-09-23 0intro }
92 6f4d00ee 2013-09-23 0intro
93 6f4d00ee 2013-09-23 0intro static int
94 b32de4ae 2013-09-26 0intro cmd9pTwrite(Fcall* f, int i, char** argv)
95 6f4d00ee 2013-09-23 0intro {
96 b32de4ae 2013-09-26 0intro USED(i);
97 6f4d00ee 2013-09-23 0intro f->fid = strtol(argv[0], 0, 0);
98 6f4d00ee 2013-09-23 0intro f->offset = strtoll(argv[1], 0, 0);
99 6f4d00ee 2013-09-23 0intro f->data = argv[2];
100 6f4d00ee 2013-09-23 0intro f->count = strlen(argv[2]);
101 6f4d00ee 2013-09-23 0intro
102 6f4d00ee 2013-09-23 0intro return 1;
103 6f4d00ee 2013-09-23 0intro }
104 6f4d00ee 2013-09-23 0intro
105 6f4d00ee 2013-09-23 0intro static int
106 b32de4ae 2013-09-26 0intro cmd9pTread(Fcall* f, int i, char** argv)
107 6f4d00ee 2013-09-23 0intro {
108 b32de4ae 2013-09-26 0intro USED(i);
109 6f4d00ee 2013-09-23 0intro f->fid = strtol(argv[0], 0, 0);
110 6f4d00ee 2013-09-23 0intro f->offset = strtoll(argv[1], 0, 0);
111 6f4d00ee 2013-09-23 0intro f->count = strtol(argv[2], 0, 0);
112 6f4d00ee 2013-09-23 0intro
113 6f4d00ee 2013-09-23 0intro return 1;
114 6f4d00ee 2013-09-23 0intro }
115 6f4d00ee 2013-09-23 0intro
116 6f4d00ee 2013-09-23 0intro static int
117 b32de4ae 2013-09-26 0intro cmd9pTcreate(Fcall* f, int i, char** argv)
118 6f4d00ee 2013-09-23 0intro {
119 b32de4ae 2013-09-26 0intro USED(i);
120 6f4d00ee 2013-09-23 0intro f->fid = strtol(argv[0], 0, 0);
121 6f4d00ee 2013-09-23 0intro f->name = argv[1];
122 6f4d00ee 2013-09-23 0intro f->perm = strtol(argv[2], 0, 8);
123 6f4d00ee 2013-09-23 0intro f->mode = strtol(argv[3], 0, 0);
124 6f4d00ee 2013-09-23 0intro
125 6f4d00ee 2013-09-23 0intro return 1;
126 6f4d00ee 2013-09-23 0intro }
127 6f4d00ee 2013-09-23 0intro
128 6f4d00ee 2013-09-23 0intro static int
129 b32de4ae 2013-09-26 0intro cmd9pTopen(Fcall* f, int i, char** argv)
130 6f4d00ee 2013-09-23 0intro {
131 b32de4ae 2013-09-26 0intro USED(i);
132 6f4d00ee 2013-09-23 0intro f->fid = strtol(argv[0], 0, 0);
133 6f4d00ee 2013-09-23 0intro f->mode = strtol(argv[1], 0, 0);
134 6f4d00ee 2013-09-23 0intro
135 6f4d00ee 2013-09-23 0intro return 1;
136 6f4d00ee 2013-09-23 0intro }
137 6f4d00ee 2013-09-23 0intro
138 6f4d00ee 2013-09-23 0intro static int
139 6f4d00ee 2013-09-23 0intro cmd9pTwalk(Fcall* f, int argc, char** argv)
140 6f4d00ee 2013-09-23 0intro {
141 6f4d00ee 2013-09-23 0intro int i;
142 6f4d00ee 2013-09-23 0intro
143 6f4d00ee 2013-09-23 0intro if(argc < 2){
144 4b576658 2013-09-23 0intro werrstr("usage: Twalk tag fid newfid [name...]");
145 6f4d00ee 2013-09-23 0intro return 0;
146 6f4d00ee 2013-09-23 0intro }
147 6f4d00ee 2013-09-23 0intro f->fid = strtol(argv[0], 0, 0);
148 6f4d00ee 2013-09-23 0intro f->newfid = strtol(argv[1], 0, 0);
149 6f4d00ee 2013-09-23 0intro f->nwname = argc-2;
150 6f4d00ee 2013-09-23 0intro if(f->nwname > MAXWELEM){
151 4b576658 2013-09-23 0intro werrstr("Twalk: too many names");
152 6f4d00ee 2013-09-23 0intro return 0;
153 6f4d00ee 2013-09-23 0intro }
154 6f4d00ee 2013-09-23 0intro for(i = 0; i < argc-2; i++)
155 6f4d00ee 2013-09-23 0intro f->wname[i] = argv[2+i];
156 6f4d00ee 2013-09-23 0intro
157 6f4d00ee 2013-09-23 0intro return 1;
158 6f4d00ee 2013-09-23 0intro }
159 6f4d00ee 2013-09-23 0intro
160 6f4d00ee 2013-09-23 0intro static int
161 b32de4ae 2013-09-26 0intro cmd9pTflush(Fcall* f, int i, char** argv)
162 6f4d00ee 2013-09-23 0intro {
163 b32de4ae 2013-09-26 0intro USED(i);
164 6f4d00ee 2013-09-23 0intro f->oldtag = strtol(argv[0], 0, 0);
165 6f4d00ee 2013-09-23 0intro
166 6f4d00ee 2013-09-23 0intro return 1;
167 6f4d00ee 2013-09-23 0intro }
168 6f4d00ee 2013-09-23 0intro
169 6f4d00ee 2013-09-23 0intro static int
170 b32de4ae 2013-09-26 0intro cmd9pTattach(Fcall* f, int i, char** argv)
171 6f4d00ee 2013-09-23 0intro {
172 b32de4ae 2013-09-26 0intro USED(i);
173 6f4d00ee 2013-09-23 0intro f->fid = strtol(argv[0], 0, 0);
174 6f4d00ee 2013-09-23 0intro f->afid = strtol(argv[1], 0, 0);
175 6f4d00ee 2013-09-23 0intro f->uname = argv[2];
176 6f4d00ee 2013-09-23 0intro f->aname = argv[3];
177 6f4d00ee 2013-09-23 0intro
178 6f4d00ee 2013-09-23 0intro return 1;
179 6f4d00ee 2013-09-23 0intro }
180 6f4d00ee 2013-09-23 0intro
181 6f4d00ee 2013-09-23 0intro static int
182 b32de4ae 2013-09-26 0intro cmd9pTauth(Fcall* f, int i, char** argv)
183 6f4d00ee 2013-09-23 0intro {
184 b32de4ae 2013-09-26 0intro USED(i);
185 6f4d00ee 2013-09-23 0intro f->afid = strtol(argv[0], 0, 0);
186 6f4d00ee 2013-09-23 0intro f->uname = argv[1];
187 6f4d00ee 2013-09-23 0intro f->aname = argv[2];
188 6f4d00ee 2013-09-23 0intro
189 6f4d00ee 2013-09-23 0intro return 1;
190 6f4d00ee 2013-09-23 0intro }
191 6f4d00ee 2013-09-23 0intro
192 6f4d00ee 2013-09-23 0intro static int
193 b32de4ae 2013-09-26 0intro cmd9pTversion(Fcall* f, int i, char** argv)
194 6f4d00ee 2013-09-23 0intro {
195 b32de4ae 2013-09-26 0intro USED(i);
196 6f4d00ee 2013-09-23 0intro f->msize = strtoul(argv[0], 0, 0);
197 6f4d00ee 2013-09-23 0intro if(f->msize > cbox.con->msize){
198 4b576658 2013-09-23 0intro werrstr("msize too big");
199 6f4d00ee 2013-09-23 0intro return 0;
200 6f4d00ee 2013-09-23 0intro }
201 6f4d00ee 2013-09-23 0intro f->version = argv[1];
202 6f4d00ee 2013-09-23 0intro
203 6f4d00ee 2013-09-23 0intro return 1;
204 6f4d00ee 2013-09-23 0intro }
205 6f4d00ee 2013-09-23 0intro
206 6f4d00ee 2013-09-23 0intro typedef struct Cmd9p Cmd9p;
207 6f4d00ee 2013-09-23 0intro struct Cmd9p {
208 6f4d00ee 2013-09-23 0intro char* name;
209 6f4d00ee 2013-09-23 0intro int type;
210 6f4d00ee 2013-09-23 0intro int argc;
211 6f4d00ee 2013-09-23 0intro char* usage;
212 6f4d00ee 2013-09-23 0intro int (*f)(Fcall*, int, char**);
213 6f4d00ee 2013-09-23 0intro };
214 6f4d00ee 2013-09-23 0intro
215 6f4d00ee 2013-09-23 0intro static Cmd9p cmd9pTmsg[] = {
216 6f4d00ee 2013-09-23 0intro "Tversion", Tversion, 2, "msize version", cmd9pTversion,
217 6f4d00ee 2013-09-23 0intro "Tauth", Tauth, 3, "afid uname aname", cmd9pTauth,
218 6f4d00ee 2013-09-23 0intro "Tflush", Tflush, 1, "oldtag", cmd9pTflush,
219 6f4d00ee 2013-09-23 0intro "Tattach", Tattach, 4, "fid afid uname aname", cmd9pTattach,
220 6f4d00ee 2013-09-23 0intro "Twalk", Twalk, 0, "fid newfid [name...]", cmd9pTwalk,
221 6f4d00ee 2013-09-23 0intro "Topen", Topen, 2, "fid mode", cmd9pTopen,
222 6f4d00ee 2013-09-23 0intro "Tcreate", Tcreate, 4, "fid name perm mode", cmd9pTcreate,
223 6f4d00ee 2013-09-23 0intro "Tread", Tread, 3, "fid offset count", cmd9pTread,
224 6f4d00ee 2013-09-23 0intro "Twrite", Twrite, 3, "fid offset data", cmd9pTwrite,
225 6f4d00ee 2013-09-23 0intro "Tclunk", Tclunk, 1, "fid", cmd9pTclunk,
226 6f4d00ee 2013-09-23 0intro "Tremove", Tremove, 1, "fid", cmd9pTremove,
227 6f4d00ee 2013-09-23 0intro "Tstat", Tstat, 1, "fid", cmd9pTstat,
228 6f4d00ee 2013-09-23 0intro "Twstat", Twstat, 7, "fid name uid gid mode mtime length", cmd9pTwstat,
229 6f4d00ee 2013-09-23 0intro "nexttag", 0, 0, "", cmd9pTag,
230 6f4d00ee 2013-09-23 0intro };
231 6f4d00ee 2013-09-23 0intro
232 6f4d00ee 2013-09-23 0intro static int
233 6f4d00ee 2013-09-23 0intro cmd9p(int argc, char* argv[])
234 6f4d00ee 2013-09-23 0intro {
235 6f4d00ee 2013-09-23 0intro int i, n;
236 6f4d00ee 2013-09-23 0intro Fcall f, t;
237 6f4d00ee 2013-09-23 0intro uchar *buf;
238 6f4d00ee 2013-09-23 0intro char *usage;
239 6f4d00ee 2013-09-23 0intro u32int msize;
240 6f4d00ee 2013-09-23 0intro
241 6f4d00ee 2013-09-23 0intro usage = "usage: 9p T-message ...";
242 6f4d00ee 2013-09-23 0intro
243 6f4d00ee 2013-09-23 0intro ARGBEGIN{
244 6f4d00ee 2013-09-23 0intro default:
245 6f4d00ee 2013-09-23 0intro return cliError(usage);
246 6f4d00ee 2013-09-23 0intro }ARGEND
247 6f4d00ee 2013-09-23 0intro if(argc < 1)
248 6f4d00ee 2013-09-23 0intro return cliError(usage);
249 6f4d00ee 2013-09-23 0intro
250 6f4d00ee 2013-09-23 0intro for(i = 0; i < nelem(cmd9pTmsg); i++){
251 6f4d00ee 2013-09-23 0intro if(strcmp(cmd9pTmsg[i].name, argv[0]) == 0)
252 6f4d00ee 2013-09-23 0intro break;
253 6f4d00ee 2013-09-23 0intro }
254 6f4d00ee 2013-09-23 0intro if(i == nelem(cmd9pTmsg))
255 6f4d00ee 2013-09-23 0intro return cliError(usage);
256 6f4d00ee 2013-09-23 0intro argc--;
257 6f4d00ee 2013-09-23 0intro argv++;
258 6f4d00ee 2013-09-23 0intro if(cmd9pTmsg[i].argc && argc != cmd9pTmsg[i].argc){
259 4b576658 2013-09-23 0intro werrstr("usage: %s %s",
260 6f4d00ee 2013-09-23 0intro cmd9pTmsg[i].name, cmd9pTmsg[i].usage);
261 6f4d00ee 2013-09-23 0intro return 0;
262 6f4d00ee 2013-09-23 0intro }
263 6f4d00ee 2013-09-23 0intro
264 6f4d00ee 2013-09-23 0intro memset(&t, 0, sizeof(t));
265 6f4d00ee 2013-09-23 0intro t.type = cmd9pTmsg[i].type;
266 6f4d00ee 2013-09-23 0intro if(t.type == Tversion)
267 6f4d00ee 2013-09-23 0intro t.tag = NOTAG;
268 6f4d00ee 2013-09-23 0intro else
269 6f4d00ee 2013-09-23 0intro t.tag = ++cbox.tag;
270 6f4d00ee 2013-09-23 0intro msize = cbox.con->msize;
271 6f4d00ee 2013-09-23 0intro if(!cmd9pTmsg[i].f(&t, argc, argv))
272 6f4d00ee 2013-09-23 0intro return 0;
273 4b576658 2013-09-23 0intro buf = vtmalloc(msize);
274 6f4d00ee 2013-09-23 0intro n = convS2M(&t, buf, msize);
275 6f4d00ee 2013-09-23 0intro if(n <= BIT16SZ){
276 4b576658 2013-09-23 0intro werrstr("%s: convS2M error", cmd9pTmsg[i].name);
277 4b576658 2013-09-23 0intro vtfree(buf);
278 6f4d00ee 2013-09-23 0intro return 0;
279 6f4d00ee 2013-09-23 0intro }
280 6f4d00ee 2013-09-23 0intro if(write(cbox.confd[0], buf, n) != n){
281 4b576658 2013-09-23 0intro werrstr("%s: write error: %r", cmd9pTmsg[i].name);
282 4b576658 2013-09-23 0intro vtfree(buf);
283 6f4d00ee 2013-09-23 0intro return 0;
284 6f4d00ee 2013-09-23 0intro }
285 6f4d00ee 2013-09-23 0intro consPrint("\t-> %F\n", &t);
286 6f4d00ee 2013-09-23 0intro
287 6f4d00ee 2013-09-23 0intro if((n = read9pmsg(cbox.confd[0], buf, msize)) <= 0){
288 4b576658 2013-09-23 0intro werrstr("%s: read error: %r", cmd9pTmsg[i].name);
289 4b576658 2013-09-23 0intro vtfree(buf);
290 6f4d00ee 2013-09-23 0intro return 0;
291 6f4d00ee 2013-09-23 0intro }
292 6f4d00ee 2013-09-23 0intro if(convM2S(buf, n, &f) == 0){
293 4b576658 2013-09-23 0intro werrstr("%s: convM2S error", cmd9pTmsg[i].name);
294 4b576658 2013-09-23 0intro vtfree(buf);
295 6f4d00ee 2013-09-23 0intro return 0;
296 6f4d00ee 2013-09-23 0intro }
297 6f4d00ee 2013-09-23 0intro consPrint("\t<- %F\n", &f);
298 6f4d00ee 2013-09-23 0intro
299 4b576658 2013-09-23 0intro vtfree(buf);
300 6f4d00ee 2013-09-23 0intro return 1;
301 6f4d00ee 2013-09-23 0intro }
302 6f4d00ee 2013-09-23 0intro
303 6f4d00ee 2013-09-23 0intro static int
304 6f4d00ee 2013-09-23 0intro cmdDot(int argc, char* argv[])
305 6f4d00ee 2013-09-23 0intro {
306 6f4d00ee 2013-09-23 0intro long l;
307 6f4d00ee 2013-09-23 0intro Dir *dir;
308 6f4d00ee 2013-09-23 0intro int fd, r;
309 6f4d00ee 2013-09-23 0intro vlong length;
310 6f4d00ee 2013-09-23 0intro char *f, *p, *s, *usage;
311 6f4d00ee 2013-09-23 0intro
312 6f4d00ee 2013-09-23 0intro usage = "usage: . file";
313 6f4d00ee 2013-09-23 0intro
314 6f4d00ee 2013-09-23 0intro ARGBEGIN{
315 6f4d00ee 2013-09-23 0intro default:
316 6f4d00ee 2013-09-23 0intro return cliError(usage);
317 6f4d00ee 2013-09-23 0intro }ARGEND
318 6f4d00ee 2013-09-23 0intro if(argc != 1)
319 6f4d00ee 2013-09-23 0intro return cliError(usage);
320 6f4d00ee 2013-09-23 0intro
321 6f4d00ee 2013-09-23 0intro if((dir = dirstat(argv[0])) == nil)
322 6f4d00ee 2013-09-23 0intro return cliError(". dirstat %s: %r", argv[0]);
323 6f4d00ee 2013-09-23 0intro length = dir->length;
324 6f4d00ee 2013-09-23 0intro free(dir);
325 6f4d00ee 2013-09-23 0intro
326 6f4d00ee 2013-09-23 0intro r = 1;
327 6f4d00ee 2013-09-23 0intro if(length != 0){
328 6f4d00ee 2013-09-23 0intro /*
329 6f4d00ee 2013-09-23 0intro * Read the whole file in.
330 6f4d00ee 2013-09-23 0intro */
331 6f4d00ee 2013-09-23 0intro if((fd = open(argv[0], OREAD)) < 0)
332 6f4d00ee 2013-09-23 0intro return cliError(". open %s: %r", argv[0]);
333 4b576658 2013-09-23 0intro f = vtmalloc(dir->length+1);
334 6f4d00ee 2013-09-23 0intro if((l = read(fd, f, length)) < 0){
335 4b576658 2013-09-23 0intro vtfree(f);
336 6f4d00ee 2013-09-23 0intro close(fd);
337 6f4d00ee 2013-09-23 0intro return cliError(". read %s: %r", argv[0]);
338 6f4d00ee 2013-09-23 0intro }
339 6f4d00ee 2013-09-23 0intro close(fd);
340 6f4d00ee 2013-09-23 0intro f[l] = '\0';
341 6f4d00ee 2013-09-23 0intro
342 6f4d00ee 2013-09-23 0intro /*
343 6f4d00ee 2013-09-23 0intro * Call cliExec() for each line.
344 6f4d00ee 2013-09-23 0intro */
345 6f4d00ee 2013-09-23 0intro for(p = s = f; *p != '\0'; p++){
346 6f4d00ee 2013-09-23 0intro if(*p == '\n'){
347 6f4d00ee 2013-09-23 0intro *p = '\0';
348 6f4d00ee 2013-09-23 0intro if(cliExec(s) == 0){
349 6f4d00ee 2013-09-23 0intro r = 0;
350 4b576658 2013-09-23 0intro consPrint("%s: %r\n", s);
351 6f4d00ee 2013-09-23 0intro }
352 6f4d00ee 2013-09-23 0intro s = p+1;
353 6f4d00ee 2013-09-23 0intro }
354 6f4d00ee 2013-09-23 0intro }
355 4b576658 2013-09-23 0intro vtfree(f);
356 6f4d00ee 2013-09-23 0intro }
357 6f4d00ee 2013-09-23 0intro
358 6f4d00ee 2013-09-23 0intro if(r == 0)
359 4b576658 2013-09-23 0intro werrstr("errors in . %#q", argv[0]);
360 6f4d00ee 2013-09-23 0intro return r;
361 6f4d00ee 2013-09-23 0intro }
362 6f4d00ee 2013-09-23 0intro
363 6f4d00ee 2013-09-23 0intro static int
364 6f4d00ee 2013-09-23 0intro cmdDflag(int argc, char* argv[])
365 6f4d00ee 2013-09-23 0intro {
366 6f4d00ee 2013-09-23 0intro char *usage;
367 6f4d00ee 2013-09-23 0intro
368 6f4d00ee 2013-09-23 0intro usage = "usage: dflag";
369 6f4d00ee 2013-09-23 0intro
370 6f4d00ee 2013-09-23 0intro ARGBEGIN{
371 6f4d00ee 2013-09-23 0intro default:
372 6f4d00ee 2013-09-23 0intro return cliError(usage);
373 6f4d00ee 2013-09-23 0intro }ARGEND
374 6f4d00ee 2013-09-23 0intro if(argc)
375 6f4d00ee 2013-09-23 0intro return cliError(usage);
376 6f4d00ee 2013-09-23 0intro
377 6f4d00ee 2013-09-23 0intro Dflag ^= 1;
378 6f4d00ee 2013-09-23 0intro consPrint("dflag %d\n", Dflag);
379 6f4d00ee 2013-09-23 0intro
380 6f4d00ee 2013-09-23 0intro return 1;
381 6f4d00ee 2013-09-23 0intro }
382 6f4d00ee 2013-09-23 0intro
383 6f4d00ee 2013-09-23 0intro static int
384 6f4d00ee 2013-09-23 0intro cmdEcho(int argc, char* argv[])
385 6f4d00ee 2013-09-23 0intro {
386 6f4d00ee 2013-09-23 0intro char *usage;
387 6f4d00ee 2013-09-23 0intro int i, nflag;
388 6f4d00ee 2013-09-23 0intro
389 6f4d00ee 2013-09-23 0intro nflag = 0;
390 6f4d00ee 2013-09-23 0intro usage = "usage: echo [-n] ...";
391 6f4d00ee 2013-09-23 0intro
392 6f4d00ee 2013-09-23 0intro ARGBEGIN{
393 6f4d00ee 2013-09-23 0intro default:
394 6f4d00ee 2013-09-23 0intro return cliError(usage);
395 6f4d00ee 2013-09-23 0intro case 'n':
396 6f4d00ee 2013-09-23 0intro nflag = 1;
397 6f4d00ee 2013-09-23 0intro break;
398 6f4d00ee 2013-09-23 0intro }ARGEND
399 6f4d00ee 2013-09-23 0intro
400 6f4d00ee 2013-09-23 0intro for(i = 0; i < argc; i++){
401 6f4d00ee 2013-09-23 0intro if(i != 0)
402 6f4d00ee 2013-09-23 0intro consPrint(" %s", argv[i]);
403 6f4d00ee 2013-09-23 0intro else
404 6f4d00ee 2013-09-23 0intro consPrint(argv[i]);
405 6f4d00ee 2013-09-23 0intro }
406 6f4d00ee 2013-09-23 0intro if(!nflag)
407 6f4d00ee 2013-09-23 0intro consPrint("\n");
408 6f4d00ee 2013-09-23 0intro
409 6f4d00ee 2013-09-23 0intro return 1;
410 6f4d00ee 2013-09-23 0intro }
411 6f4d00ee 2013-09-23 0intro
412 6f4d00ee 2013-09-23 0intro static int
413 6f4d00ee 2013-09-23 0intro cmdBind(int argc, char* argv[])
414 6f4d00ee 2013-09-23 0intro {
415 6f4d00ee 2013-09-23 0intro ulong flag = 0;
416 6f4d00ee 2013-09-23 0intro char *usage;
417 6f4d00ee 2013-09-23 0intro
418 6f4d00ee 2013-09-23 0intro usage = "usage: bind [-b|-a|-c|-bc|-ac] new old";
419 6f4d00ee 2013-09-23 0intro
420 6f4d00ee 2013-09-23 0intro ARGBEGIN{
421 6f4d00ee 2013-09-23 0intro case 'a':
422 6f4d00ee 2013-09-23 0intro flag |= MAFTER;
423 6f4d00ee 2013-09-23 0intro break;
424 6f4d00ee 2013-09-23 0intro case 'b':
425 6f4d00ee 2013-09-23 0intro flag |= MBEFORE;
426 6f4d00ee 2013-09-23 0intro break;
427 6f4d00ee 2013-09-23 0intro case 'c':
428 6f4d00ee 2013-09-23 0intro flag |= MCREATE;
429 6f4d00ee 2013-09-23 0intro break;
430 6f4d00ee 2013-09-23 0intro default:
431 6f4d00ee 2013-09-23 0intro return cliError(usage);
432 6f4d00ee 2013-09-23 0intro }ARGEND
433 6f4d00ee 2013-09-23 0intro
434 6f4d00ee 2013-09-23 0intro if(argc != 2 || (flag&MAFTER)&&(flag&MBEFORE))
435 6f4d00ee 2013-09-23 0intro return cliError(usage);
436 6f4d00ee 2013-09-23 0intro
437 b32de4ae 2013-09-26 0intro #ifndef PLAN9PORT
438 6f4d00ee 2013-09-23 0intro if(bind(argv[0], argv[1], flag) < 0){
439 6f4d00ee 2013-09-23 0intro /* try to give a less confusing error than the default */
440 6f4d00ee 2013-09-23 0intro if(access(argv[0], 0) < 0)
441 6f4d00ee 2013-09-23 0intro return cliError("bind: %s: %r", argv[0]);
442 6f4d00ee 2013-09-23 0intro else if(access(argv[1], 0) < 0)
443 6f4d00ee 2013-09-23 0intro return cliError("bind: %s: %r", argv[1]);
444 6f4d00ee 2013-09-23 0intro else
445 6f4d00ee 2013-09-23 0intro return cliError("bind %s %s: %r", argv[0], argv[1]);
446 6f4d00ee 2013-09-23 0intro }
447 b32de4ae 2013-09-26 0intro #endif
448 6f4d00ee 2013-09-23 0intro return 1;
449 6f4d00ee 2013-09-23 0intro }
450 6f4d00ee 2013-09-23 0intro
451 6f4d00ee 2013-09-23 0intro int
452 6f4d00ee 2013-09-23 0intro cmdInit(void)
453 6f4d00ee 2013-09-23 0intro {
454 6f4d00ee 2013-09-23 0intro cbox.confd[0] = cbox.confd[1] = -1;
455 6f4d00ee 2013-09-23 0intro
456 6f4d00ee 2013-09-23 0intro cliAddCmd(".", cmdDot);
457 6f4d00ee 2013-09-23 0intro cliAddCmd("9p", cmd9p);
458 6f4d00ee 2013-09-23 0intro cliAddCmd("dflag", cmdDflag);
459 6f4d00ee 2013-09-23 0intro cliAddCmd("echo", cmdEcho);
460 6f4d00ee 2013-09-23 0intro cliAddCmd("bind", cmdBind);
461 6f4d00ee 2013-09-23 0intro
462 6f4d00ee 2013-09-23 0intro if(pipe(cbox.confd) < 0)
463 6f4d00ee 2013-09-23 0intro return 0;
464 6f4d00ee 2013-09-23 0intro if((cbox.con = conAlloc(cbox.confd[1], "console", 0)) == nil){
465 6f4d00ee 2013-09-23 0intro close(cbox.confd[0]);
466 6f4d00ee 2013-09-23 0intro close(cbox.confd[1]);
467 6f4d00ee 2013-09-23 0intro cbox.confd[0] = cbox.confd[1] = -1;
468 6f4d00ee 2013-09-23 0intro return 0;
469 6f4d00ee 2013-09-23 0intro
470 6f4d00ee 2013-09-23 0intro }
471 6f4d00ee 2013-09-23 0intro cbox.con->isconsole = 1;
472 6f4d00ee 2013-09-23 0intro
473 6f4d00ee 2013-09-23 0intro return 1;
474 6f4d00ee 2013-09-23 0intro }