Blame


1 d0cda8c4 2005-07-28 devnull #include <u.h>
2 d0cda8c4 2005-07-28 devnull #include <libc.h>
3 d0cda8c4 2005-07-28 devnull #include <bio.h>
4 d0cda8c4 2005-07-28 devnull #include <thread.h>
5 d0cda8c4 2005-07-28 devnull #include <venti.h>
6 d0cda8c4 2005-07-28 devnull #include <sunrpc.h>
7 d0cda8c4 2005-07-28 devnull #include <nfs3.h>
8 d0cda8c4 2005-07-28 devnull #include <diskfs.h>
9 d0cda8c4 2005-07-28 devnull
10 d0cda8c4 2005-07-28 devnull uchar *buf;
11 d0cda8c4 2005-07-28 devnull uint bufsize;
12 d0cda8c4 2005-07-28 devnull Nfs3Handle cwd, root;
13 d0cda8c4 2005-07-28 devnull Biobuf bin, bout;
14 d0cda8c4 2005-07-28 devnull char pwd[1000];
15 d0cda8c4 2005-07-28 devnull Fsys *fsys;
16 d0cda8c4 2005-07-28 devnull SunAuthUnix *auth;
17 d0cda8c4 2005-07-28 devnull VtConn *z;
18 d0cda8c4 2005-07-28 devnull VtCache *c;
19 d0cda8c4 2005-07-28 devnull Disk *disk;
20 d0cda8c4 2005-07-28 devnull
21 d0cda8c4 2005-07-28 devnull char *cmdhelp(int, char**);
22 d0cda8c4 2005-07-28 devnull char *cmdcd(int, char**);
23 d0cda8c4 2005-07-28 devnull char *cmdpwd(int, char**);
24 d0cda8c4 2005-07-28 devnull char *cmdls(int, char**);
25 8ecefa41 2005-08-11 devnull char *cmdget(int, char**);
26 d0cda8c4 2005-07-28 devnull char *cmdblock(int, char**);
27 d0cda8c4 2005-07-28 devnull char *cmddisk(int, char**);
28 d0cda8c4 2005-07-28 devnull
29 d0cda8c4 2005-07-28 devnull typedef struct Cmd Cmd;
30 d0cda8c4 2005-07-28 devnull struct Cmd
31 d0cda8c4 2005-07-28 devnull {
32 d0cda8c4 2005-07-28 devnull char *s;
33 d0cda8c4 2005-07-28 devnull char *(*fn)(int, char**);
34 d0cda8c4 2005-07-28 devnull char *help;
35 d0cda8c4 2005-07-28 devnull };
36 d0cda8c4 2005-07-28 devnull
37 d0cda8c4 2005-07-28 devnull Cmd cmdtab[] =
38 d0cda8c4 2005-07-28 devnull {
39 d0cda8c4 2005-07-28 devnull "cd", cmdcd, "cd dir - change directory",
40 d0cda8c4 2005-07-28 devnull "ls", cmdls, "ls [-d] path... - list file",
41 8ecefa41 2005-08-11 devnull "get", cmdget, "get path [lpath] - copy file to local directory",
42 d0cda8c4 2005-07-28 devnull "pwd", cmdpwd, "pwd - print working directory",
43 d0cda8c4 2005-07-28 devnull "help", cmdhelp, "help - print usage summaries",
44 d0cda8c4 2005-07-28 devnull "block", cmdblock, "block path offset - print disk offset of path's byte offset",
45 cbeb0b26 2006-04-01 devnull "disk", cmddisk, "disk offset count - dump disk contents"
46 d0cda8c4 2005-07-28 devnull };
47 d0cda8c4 2005-07-28 devnull
48 d0cda8c4 2005-07-28 devnull char*
49 d0cda8c4 2005-07-28 devnull ebuf(void)
50 d0cda8c4 2005-07-28 devnull {
51 d0cda8c4 2005-07-28 devnull static char buf[ERRMAX];
52 d0cda8c4 2005-07-28 devnull
53 d0cda8c4 2005-07-28 devnull rerrstr(buf, sizeof buf);
54 d0cda8c4 2005-07-28 devnull return buf;
55 d0cda8c4 2005-07-28 devnull }
56 d0cda8c4 2005-07-28 devnull
57 d0cda8c4 2005-07-28 devnull char*
58 d0cda8c4 2005-07-28 devnull walk(char *path, Nfs3Handle *ph)
59 d0cda8c4 2005-07-28 devnull {
60 d0cda8c4 2005-07-28 devnull char *p, *q;
61 d0cda8c4 2005-07-28 devnull Nfs3Handle h;
62 d0cda8c4 2005-07-28 devnull Nfs3Status ok;
63 d0cda8c4 2005-07-28 devnull
64 d0cda8c4 2005-07-28 devnull if(path[0] == '/')
65 d0cda8c4 2005-07-28 devnull h = root;
66 d0cda8c4 2005-07-28 devnull else
67 d0cda8c4 2005-07-28 devnull h = cwd;
68 d0cda8c4 2005-07-28 devnull for(p=path; *p; p=q){
69 d0cda8c4 2005-07-28 devnull q = strchr(p, '/');
70 d0cda8c4 2005-07-28 devnull if(q == nil)
71 d0cda8c4 2005-07-28 devnull q = p+strlen(p);
72 d0cda8c4 2005-07-28 devnull else
73 d0cda8c4 2005-07-28 devnull *q++ = 0;
74 d0cda8c4 2005-07-28 devnull if(*p == 0)
75 d0cda8c4 2005-07-28 devnull continue;
76 d0cda8c4 2005-07-28 devnull if((ok = fsyslookup(fsys, auth, &h, p, &h)) != Nfs3Ok){
77 d0cda8c4 2005-07-28 devnull nfs3errstr(ok);
78 d0cda8c4 2005-07-28 devnull return ebuf();
79 d0cda8c4 2005-07-28 devnull }
80 d0cda8c4 2005-07-28 devnull }
81 d0cda8c4 2005-07-28 devnull *ph = h;
82 d0cda8c4 2005-07-28 devnull return nil;
83 d0cda8c4 2005-07-28 devnull }
84 d0cda8c4 2005-07-28 devnull
85 d0cda8c4 2005-07-28 devnull char*
86 d0cda8c4 2005-07-28 devnull cmdhelp(int argc, char **argv)
87 d0cda8c4 2005-07-28 devnull {
88 d0cda8c4 2005-07-28 devnull int i;
89 d0cda8c4 2005-07-28 devnull
90 d0cda8c4 2005-07-28 devnull for(i=0; i<nelem(cmdtab); i++)
91 d0cda8c4 2005-07-28 devnull print("%s\n", cmdtab[i].help);
92 d0cda8c4 2005-07-28 devnull return nil;
93 d0cda8c4 2005-07-28 devnull }
94 d0cda8c4 2005-07-28 devnull
95 d0cda8c4 2005-07-28 devnull char*
96 d0cda8c4 2005-07-28 devnull cmdcd(int argc, char **argv)
97 d0cda8c4 2005-07-28 devnull {
98 d0cda8c4 2005-07-28 devnull char *err;
99 d0cda8c4 2005-07-28 devnull Nfs3Attr attr;
100 d0cda8c4 2005-07-28 devnull Nfs3Status ok;
101 d0cda8c4 2005-07-28 devnull Nfs3Handle h;
102 d0cda8c4 2005-07-28 devnull
103 d0cda8c4 2005-07-28 devnull if(argc != 2)
104 d0cda8c4 2005-07-28 devnull return "usage: cd dir";
105 d0cda8c4 2005-07-28 devnull
106 d0cda8c4 2005-07-28 devnull if((err = walk(argv[1], &h)) != nil)
107 d0cda8c4 2005-07-28 devnull return err;
108 d0cda8c4 2005-07-28 devnull if((ok = fsysgetattr(fsys, auth, &h, &attr)) != Nfs3Ok){
109 d0cda8c4 2005-07-28 devnull nfs3errstr(ok);
110 d0cda8c4 2005-07-28 devnull fprint(2, "%s: %r\n");
111 d0cda8c4 2005-07-28 devnull return nil;
112 d0cda8c4 2005-07-28 devnull }
113 d0cda8c4 2005-07-28 devnull if(attr.type != Nfs3FileDir)
114 d0cda8c4 2005-07-28 devnull return "not a directory";
115 d0cda8c4 2005-07-28 devnull if(argv[1][0] == '/')
116 d0cda8c4 2005-07-28 devnull pwd[0] = 0;
117 d0cda8c4 2005-07-28 devnull strcat(pwd, "/");
118 d0cda8c4 2005-07-28 devnull strcat(pwd, argv[1]);
119 d0cda8c4 2005-07-28 devnull cleanname(pwd);
120 d0cda8c4 2005-07-28 devnull cwd = h;
121 d0cda8c4 2005-07-28 devnull print("%s\n", pwd);
122 d0cda8c4 2005-07-28 devnull return nil;
123 d0cda8c4 2005-07-28 devnull }
124 d0cda8c4 2005-07-28 devnull
125 d0cda8c4 2005-07-28 devnull char*
126 d0cda8c4 2005-07-28 devnull cmdpwd(int argc, char **argv)
127 d0cda8c4 2005-07-28 devnull {
128 d0cda8c4 2005-07-28 devnull if(argc != 1)
129 d0cda8c4 2005-07-28 devnull return "usage: pwd";
130 d0cda8c4 2005-07-28 devnull
131 d0cda8c4 2005-07-28 devnull print("%s\n", pwd);
132 d0cda8c4 2005-07-28 devnull return nil;
133 d0cda8c4 2005-07-28 devnull }
134 d0cda8c4 2005-07-28 devnull
135 d0cda8c4 2005-07-28 devnull /*
136 d0cda8c4 2005-07-28 devnull * XXX maybe make a list of these in memory and then print them nicer
137 d0cda8c4 2005-07-28 devnull */
138 d0cda8c4 2005-07-28 devnull void
139 d0cda8c4 2005-07-28 devnull ls(char *dir, char *elem, Nfs3Attr *attr)
140 d0cda8c4 2005-07-28 devnull {
141 d0cda8c4 2005-07-28 devnull char c;
142 d0cda8c4 2005-07-28 devnull
143 d0cda8c4 2005-07-28 devnull c = ' '; /* use attr->type */
144 d0cda8c4 2005-07-28 devnull Bprint(&bout, "%s%s%s", dir ? dir : "", dir && elem ? "/" : "", elem ? elem : "");
145 d0cda8c4 2005-07-28 devnull Bprint(&bout, " %c%luo %1d %4d %4d", c, attr->mode, attr->nlink, attr->uid, attr->gid);
146 d0cda8c4 2005-07-28 devnull Bprint(&bout, " %11,lld %11,lld %4d.%4d %#11,llux %#11,llux",
147 d0cda8c4 2005-07-28 devnull attr->size, attr->used, attr->major, attr->minor, attr->fsid, attr->fileid);
148 d0cda8c4 2005-07-28 devnull Bprint(&bout, "\n");
149 d0cda8c4 2005-07-28 devnull }
150 d0cda8c4 2005-07-28 devnull
151 d0cda8c4 2005-07-28 devnull void
152 d0cda8c4 2005-07-28 devnull lsdir(char *dir, Nfs3Handle *h)
153 d0cda8c4 2005-07-28 devnull {
154 d0cda8c4 2005-07-28 devnull uchar *data, *p, *ep;
155 d0cda8c4 2005-07-28 devnull Nfs3Attr attr;
156 d0cda8c4 2005-07-28 devnull Nfs3Entry e;
157 d0cda8c4 2005-07-28 devnull Nfs3Handle eh;
158 d0cda8c4 2005-07-28 devnull u32int count;
159 d0cda8c4 2005-07-28 devnull u1int eof;
160 d0cda8c4 2005-07-28 devnull Nfs3Status ok;
161 d0cda8c4 2005-07-28 devnull u64int cookie;
162 d0cda8c4 2005-07-28 devnull
163 d0cda8c4 2005-07-28 devnull cookie = 0;
164 d0cda8c4 2005-07-28 devnull for(;;){
165 d0cda8c4 2005-07-28 devnull ok = fsysreaddir(fsys, auth, h, 8192, cookie, &data, &count, &eof);
166 d0cda8c4 2005-07-28 devnull if(ok != Nfs3Ok){
167 d0cda8c4 2005-07-28 devnull nfs3errstr(ok);
168 d0cda8c4 2005-07-28 devnull fprint(2, "ls %s: %r\n", dir);
169 d0cda8c4 2005-07-28 devnull return;
170 d0cda8c4 2005-07-28 devnull }
171 8ecefa41 2005-08-11 devnull fprint(2, "got %d\n", count);
172 d0cda8c4 2005-07-28 devnull p = data;
173 d0cda8c4 2005-07-28 devnull ep = data+count;
174 d0cda8c4 2005-07-28 devnull while(p<ep){
175 d0cda8c4 2005-07-28 devnull if(nfs3entryunpack(p, ep, &p, &e) < 0){
176 d0cda8c4 2005-07-28 devnull fprint(2, "%s: unpacking directory: %r\n", dir);
177 d0cda8c4 2005-07-28 devnull break;
178 d0cda8c4 2005-07-28 devnull }
179 d0cda8c4 2005-07-28 devnull cookie = e.cookie;
180 d0cda8c4 2005-07-28 devnull if((ok = fsyslookup(fsys, auth, h, e.name, &eh)) != Nfs3Ok){
181 d0cda8c4 2005-07-28 devnull nfs3errstr(ok);
182 d0cda8c4 2005-07-28 devnull fprint(2, "%s/%s: %r\n", dir, e.name);
183 d0cda8c4 2005-07-28 devnull continue;
184 d0cda8c4 2005-07-28 devnull }
185 d0cda8c4 2005-07-28 devnull if((ok = fsysgetattr(fsys, auth, &eh, &attr)) != Nfs3Ok){
186 d0cda8c4 2005-07-28 devnull nfs3errstr(ok);
187 d0cda8c4 2005-07-28 devnull fprint(2, "%s/%s: %r\n", dir, e.name);
188 d0cda8c4 2005-07-28 devnull continue;
189 d0cda8c4 2005-07-28 devnull }
190 d0cda8c4 2005-07-28 devnull ls(dir, e.name, &attr);
191 d0cda8c4 2005-07-28 devnull }
192 d0cda8c4 2005-07-28 devnull free(data);
193 d0cda8c4 2005-07-28 devnull if(eof)
194 d0cda8c4 2005-07-28 devnull break;
195 d0cda8c4 2005-07-28 devnull }
196 d0cda8c4 2005-07-28 devnull }
197 d0cda8c4 2005-07-28 devnull
198 d0cda8c4 2005-07-28 devnull char*
199 d0cda8c4 2005-07-28 devnull cmdls(int argc, char **argv)
200 d0cda8c4 2005-07-28 devnull {
201 d0cda8c4 2005-07-28 devnull int i;
202 d0cda8c4 2005-07-28 devnull int dflag;
203 d0cda8c4 2005-07-28 devnull char *e;
204 d0cda8c4 2005-07-28 devnull Nfs3Handle h;
205 d0cda8c4 2005-07-28 devnull Nfs3Attr attr;
206 d0cda8c4 2005-07-28 devnull Nfs3Status ok;
207 d0cda8c4 2005-07-28 devnull
208 d0cda8c4 2005-07-28 devnull dflag = 0;
209 d0cda8c4 2005-07-28 devnull ARGBEGIN{
210 d0cda8c4 2005-07-28 devnull case 'd':
211 d0cda8c4 2005-07-28 devnull dflag = 1;
212 d0cda8c4 2005-07-28 devnull break;
213 d0cda8c4 2005-07-28 devnull default:
214 d0cda8c4 2005-07-28 devnull return "usage: ls [-d] [path...]";
215 d0cda8c4 2005-07-28 devnull }ARGEND
216 d0cda8c4 2005-07-28 devnull
217 d0cda8c4 2005-07-28 devnull if(argc == 0){
218 d0cda8c4 2005-07-28 devnull lsdir(nil, &cwd);
219 d0cda8c4 2005-07-28 devnull Bflush(&bout);
220 d0cda8c4 2005-07-28 devnull return nil;
221 d0cda8c4 2005-07-28 devnull }
222 d0cda8c4 2005-07-28 devnull
223 d0cda8c4 2005-07-28 devnull for(i=0; i<argc; i++){
224 d0cda8c4 2005-07-28 devnull if((e = walk(argv[i], &h)) != nil){
225 d0cda8c4 2005-07-28 devnull fprint(2, "%s: %s\n", argv[i], e);
226 d0cda8c4 2005-07-28 devnull continue;
227 d0cda8c4 2005-07-28 devnull }
228 d0cda8c4 2005-07-28 devnull if((ok = fsysgetattr(fsys, auth, &h, &attr)) != Nfs3Ok){
229 d0cda8c4 2005-07-28 devnull nfs3errstr(ok);
230 d0cda8c4 2005-07-28 devnull fprint(2, "%s: %r\n", argv[i]);
231 d0cda8c4 2005-07-28 devnull continue;
232 d0cda8c4 2005-07-28 devnull }
233 d0cda8c4 2005-07-28 devnull if(attr.type != Nfs3FileDir || dflag)
234 d0cda8c4 2005-07-28 devnull ls(argv[i], nil, &attr);
235 d0cda8c4 2005-07-28 devnull else
236 d0cda8c4 2005-07-28 devnull lsdir(argv[i], &h);
237 d0cda8c4 2005-07-28 devnull Bflush(&bout);
238 d0cda8c4 2005-07-28 devnull }
239 d0cda8c4 2005-07-28 devnull return nil;
240 d0cda8c4 2005-07-28 devnull }
241 d0cda8c4 2005-07-28 devnull
242 d0cda8c4 2005-07-28 devnull char*
243 8ecefa41 2005-08-11 devnull cmdget(int argc, char **argv)
244 8ecefa41 2005-08-11 devnull {
245 8ecefa41 2005-08-11 devnull uchar eof;
246 8ecefa41 2005-08-11 devnull u32int n;
247 8ecefa41 2005-08-11 devnull int dflag, fd;
248 8ecefa41 2005-08-11 devnull char *e, *local;
249 8ecefa41 2005-08-11 devnull uchar *buf;
250 8ecefa41 2005-08-11 devnull Nfs3Handle h;
251 8ecefa41 2005-08-11 devnull Nfs3Attr attr;
252 8ecefa41 2005-08-11 devnull Nfs3Status ok;
253 8ecefa41 2005-08-11 devnull vlong o;
254 8ecefa41 2005-08-11 devnull
255 8ecefa41 2005-08-11 devnull dflag = 0;
256 8ecefa41 2005-08-11 devnull ARGBEGIN{
257 8ecefa41 2005-08-11 devnull default:
258 8ecefa41 2005-08-11 devnull usage:
259 8ecefa41 2005-08-11 devnull return "usage: get path [lpath]]";
260 8ecefa41 2005-08-11 devnull }ARGEND
261 8ecefa41 2005-08-11 devnull
262 8ecefa41 2005-08-11 devnull if(argc != 1 && argc != 2)
263 8ecefa41 2005-08-11 devnull goto usage;
264 8ecefa41 2005-08-11 devnull
265 8ecefa41 2005-08-11 devnull if((e = walk(argv[0], &h)) != nil){
266 8ecefa41 2005-08-11 devnull fprint(2, "%s: %s\n", argv[0], e);
267 8ecefa41 2005-08-11 devnull return nil;
268 8ecefa41 2005-08-11 devnull }
269 8ecefa41 2005-08-11 devnull if((ok = fsysgetattr(fsys, auth, &h, &attr)) != Nfs3Ok){
270 8ecefa41 2005-08-11 devnull nfs3errstr(ok);
271 8ecefa41 2005-08-11 devnull fprint(2, "%s: %r\n", argv[0]);
272 8ecefa41 2005-08-11 devnull return nil;
273 8ecefa41 2005-08-11 devnull }
274 8ecefa41 2005-08-11 devnull local = argv[0];
275 8ecefa41 2005-08-11 devnull if(argc == 2)
276 8ecefa41 2005-08-11 devnull local = argv[1];
277 8ecefa41 2005-08-11 devnull if((fd = create(local, OWRITE, 0666)) < 0){
278 8ecefa41 2005-08-11 devnull fprint(2, "create %s: %r\n", local);
279 8ecefa41 2005-08-11 devnull return nil;
280 8ecefa41 2005-08-11 devnull }
281 8ecefa41 2005-08-11 devnull eof = 0;
282 8ecefa41 2005-08-11 devnull for(o=0; o<attr.size && !eof; o+=n){
283 8ecefa41 2005-08-11 devnull if((ok = fsysreadfile(fsys, nil, &h, fsys->blocksize, o, &buf, &n, &eof)) != Nfs3Ok){
284 8ecefa41 2005-08-11 devnull nfs3errstr(ok);
285 8ecefa41 2005-08-11 devnull fprint(2, "reading %s: %r\n", argv[0]);
286 8ecefa41 2005-08-11 devnull close(fd);
287 8ecefa41 2005-08-11 devnull return nil;
288 8ecefa41 2005-08-11 devnull }
289 8ecefa41 2005-08-11 devnull if(write(fd, buf, n) != n){
290 8ecefa41 2005-08-11 devnull fprint(2, "writing %s: %r\n", local);
291 8ecefa41 2005-08-11 devnull close(fd);
292 8ecefa41 2005-08-11 devnull free(buf);
293 8ecefa41 2005-08-11 devnull return nil;
294 8ecefa41 2005-08-11 devnull }
295 8ecefa41 2005-08-11 devnull free(buf);
296 8ecefa41 2005-08-11 devnull }
297 8ecefa41 2005-08-11 devnull close(fd);
298 8ecefa41 2005-08-11 devnull fprint(2, "copied %,lld bytes\n", o);
299 8ecefa41 2005-08-11 devnull return nil;
300 8ecefa41 2005-08-11 devnull }
301 8ecefa41 2005-08-11 devnull
302 8ecefa41 2005-08-11 devnull
303 8ecefa41 2005-08-11 devnull char*
304 d0cda8c4 2005-07-28 devnull cmdblock(int argc, char **argv)
305 d0cda8c4 2005-07-28 devnull {
306 d0cda8c4 2005-07-28 devnull char *e;
307 d0cda8c4 2005-07-28 devnull Nfs3Handle h;
308 d0cda8c4 2005-07-28 devnull u64int bno;
309 d0cda8c4 2005-07-28 devnull
310 d0cda8c4 2005-07-28 devnull ARGBEGIN{
311 d0cda8c4 2005-07-28 devnull default:
312 d0cda8c4 2005-07-28 devnull return "usage: block path offset";
313 d0cda8c4 2005-07-28 devnull }ARGEND
314 d0cda8c4 2005-07-28 devnull
315 d0cda8c4 2005-07-28 devnull if(argc != 2)
316 d0cda8c4 2005-07-28 devnull return "usage: block path offset";
317 d0cda8c4 2005-07-28 devnull
318 d0cda8c4 2005-07-28 devnull if((e = walk(argv[0], &h)) != nil){
319 d0cda8c4 2005-07-28 devnull fprint(2, "%s: %s\n", argv[0], e);
320 d0cda8c4 2005-07-28 devnull return nil;
321 d0cda8c4 2005-07-28 devnull }
322 d0cda8c4 2005-07-28 devnull if((bno = fsys->fileblock(fsys, &h, strtoll(argv[1], 0, 0))) == 0){
323 d0cda8c4 2005-07-28 devnull fprint(2, "%s: %r\n", argv[0]);
324 d0cda8c4 2005-07-28 devnull return nil;
325 d0cda8c4 2005-07-28 devnull }
326 d0cda8c4 2005-07-28 devnull print("%#llux\n", bno);
327 d0cda8c4 2005-07-28 devnull return nil;
328 d0cda8c4 2005-07-28 devnull }
329 d0cda8c4 2005-07-28 devnull
330 d0cda8c4 2005-07-28 devnull char*
331 d0cda8c4 2005-07-28 devnull cmddisk(int argc, char **argv)
332 d0cda8c4 2005-07-28 devnull {
333 d0cda8c4 2005-07-28 devnull Block *b;
334 d0cda8c4 2005-07-28 devnull int delta, count, i;
335 d0cda8c4 2005-07-28 devnull u64int offset;
336 d0cda8c4 2005-07-28 devnull uchar *p;
337 d0cda8c4 2005-07-28 devnull
338 d0cda8c4 2005-07-28 devnull ARGBEGIN{
339 d0cda8c4 2005-07-28 devnull default:
340 d0cda8c4 2005-07-28 devnull return "usage: disk offset count";
341 d0cda8c4 2005-07-28 devnull }ARGEND
342 d0cda8c4 2005-07-28 devnull
343 d0cda8c4 2005-07-28 devnull if(argc != 2)
344 d0cda8c4 2005-07-28 devnull return "usage: disk offset count";
345 d0cda8c4 2005-07-28 devnull
346 d0cda8c4 2005-07-28 devnull offset = strtoull(argv[0], 0, 0);
347 d0cda8c4 2005-07-28 devnull count = atoi(argv[1]);
348 d0cda8c4 2005-07-28 devnull delta = offset%fsys->blocksize;
349 d0cda8c4 2005-07-28 devnull
350 d0cda8c4 2005-07-28 devnull b = diskread(disk, fsys->blocksize, offset-delta);
351 d0cda8c4 2005-07-28 devnull if(b == nil){
352 d0cda8c4 2005-07-28 devnull fprint(2, "diskread: %r\n");
353 d0cda8c4 2005-07-28 devnull return nil;
354 d0cda8c4 2005-07-28 devnull }
355 d0cda8c4 2005-07-28 devnull p = b->data + delta;
356 d0cda8c4 2005-07-28 devnull for(i=0; i<count; i++){
357 d0cda8c4 2005-07-28 devnull Bprint(&bout, "%2.2ux ", p[i]);
358 d0cda8c4 2005-07-28 devnull if(i%16 == 15)
359 d0cda8c4 2005-07-28 devnull Bprint(&bout, "\n");
360 d0cda8c4 2005-07-28 devnull else if(i%8 == 7)
361 d0cda8c4 2005-07-28 devnull Bprint(&bout, " - ");
362 d0cda8c4 2005-07-28 devnull }
363 d0cda8c4 2005-07-28 devnull if(i%16 != 0)
364 d0cda8c4 2005-07-28 devnull Bprint(&bout, "\n");
365 d0cda8c4 2005-07-28 devnull Bflush(&bout);
366 d0cda8c4 2005-07-28 devnull blockput(b);
367 d0cda8c4 2005-07-28 devnull return nil;
368 d0cda8c4 2005-07-28 devnull }
369 d0cda8c4 2005-07-28 devnull
370 d0cda8c4 2005-07-28 devnull void
371 d0cda8c4 2005-07-28 devnull usage(void)
372 d0cda8c4 2005-07-28 devnull {
373 d0cda8c4 2005-07-28 devnull fprint(2, "usage: vftp score\n");
374 d0cda8c4 2005-07-28 devnull threadexitsall("usage");
375 d0cda8c4 2005-07-28 devnull }
376 dbf91a04 2006-06-15 devnull
377 dbf91a04 2006-06-15 devnull extern int allowall;
378 d0cda8c4 2005-07-28 devnull
379 d0cda8c4 2005-07-28 devnull void
380 d0cda8c4 2005-07-28 devnull threadmain(int argc, char **argv)
381 d0cda8c4 2005-07-28 devnull {
382 d0cda8c4 2005-07-28 devnull char *err, *f[10], *p;
383 d0cda8c4 2005-07-28 devnull int i, nf;
384 d0cda8c4 2005-07-28 devnull uchar score[VtScoreSize];
385 d0cda8c4 2005-07-28 devnull Nfs3Status ok;
386 d0cda8c4 2005-07-28 devnull
387 dbf91a04 2006-06-15 devnull allowall = 1;
388 d0cda8c4 2005-07-28 devnull ARGBEGIN{
389 d0cda8c4 2005-07-28 devnull case 'V':
390 d0cda8c4 2005-07-28 devnull chattyventi++;
391 d0cda8c4 2005-07-28 devnull break;
392 d0cda8c4 2005-07-28 devnull default:
393 d0cda8c4 2005-07-28 devnull usage();
394 d0cda8c4 2005-07-28 devnull }ARGEND
395 d0cda8c4 2005-07-28 devnull
396 d0cda8c4 2005-07-28 devnull if(argc != 1)
397 d0cda8c4 2005-07-28 devnull usage();
398 d0cda8c4 2005-07-28 devnull
399 d0cda8c4 2005-07-28 devnull fmtinstall('F', vtfcallfmt);
400 d0cda8c4 2005-07-28 devnull fmtinstall('H', encodefmt);
401 d0cda8c4 2005-07-28 devnull fmtinstall('V', vtscorefmt);
402 8ecefa41 2005-08-11 devnull
403 8ecefa41 2005-08-11 devnull if(access(argv[0], AEXIST) >= 0 || strchr(argv[0], '/')){
404 8ecefa41 2005-08-11 devnull if((disk = diskopenfile(argv[0])) == nil)
405 8ecefa41 2005-08-11 devnull sysfatal("diskopen: %r");
406 651ababc 2006-06-26 devnull if((disk = diskcache(disk, 32768, 16)) == nil)
407 8ecefa41 2005-08-11 devnull sysfatal("diskcache: %r");
408 8ecefa41 2005-08-11 devnull }else{
409 8ecefa41 2005-08-11 devnull if(vtparsescore(argv[0], nil, score) < 0)
410 8ecefa41 2005-08-11 devnull sysfatal("bad score '%s'", argv[0]);
411 8ecefa41 2005-08-11 devnull if((z = vtdial(nil)) == nil)
412 8ecefa41 2005-08-11 devnull sysfatal("vtdial: %r");
413 8ecefa41 2005-08-11 devnull if(vtconnect(z) < 0)
414 8ecefa41 2005-08-11 devnull sysfatal("vtconnect: %r");
415 651ababc 2006-06-26 devnull if((c = vtcachealloc(z, 32768, 32)) == nil)
416 8ecefa41 2005-08-11 devnull sysfatal("vtcache: %r");
417 8ecefa41 2005-08-11 devnull if((disk = diskopenventi(c, score)) == nil)
418 8ecefa41 2005-08-11 devnull sysfatal("diskopenventi: %r");
419 8ecefa41 2005-08-11 devnull }
420 d0cda8c4 2005-07-28 devnull if((fsys = fsysopen(disk)) == nil)
421 d0cda8c4 2005-07-28 devnull sysfatal("ffsopen: %r");
422 d0cda8c4 2005-07-28 devnull
423 d0cda8c4 2005-07-28 devnull fprint(2, "block size %d\n", fsys->blocksize);
424 d0cda8c4 2005-07-28 devnull buf = emalloc(fsys->blocksize);
425 d0cda8c4 2005-07-28 devnull if((ok = fsysroot(fsys, &root)) != Nfs3Ok){
426 d0cda8c4 2005-07-28 devnull nfs3errstr(ok);
427 d0cda8c4 2005-07-28 devnull sysfatal("accessing root: %r");
428 d0cda8c4 2005-07-28 devnull }
429 d0cda8c4 2005-07-28 devnull cwd = root;
430 d0cda8c4 2005-07-28 devnull Binit(&bin, 0, OREAD);
431 d0cda8c4 2005-07-28 devnull Binit(&bout, 1, OWRITE);
432 d0cda8c4 2005-07-28 devnull
433 d0cda8c4 2005-07-28 devnull while(fprint(2, "vftp> "), (p = Brdstr(&bin, '\n', 1)) != nil){
434 d0cda8c4 2005-07-28 devnull if(p[0] == '#')
435 d0cda8c4 2005-07-28 devnull continue;
436 d0cda8c4 2005-07-28 devnull nf = tokenize(p, f, nelem(f));
437 d0cda8c4 2005-07-28 devnull if(nf == 0)
438 d0cda8c4 2005-07-28 devnull continue;
439 d0cda8c4 2005-07-28 devnull for(i=0; i<nelem(cmdtab); i++){
440 d0cda8c4 2005-07-28 devnull if(strcmp(f[0], cmdtab[i].s) == 0){
441 d0cda8c4 2005-07-28 devnull if((err = cmdtab[i].fn(nf, f)) != nil)
442 d0cda8c4 2005-07-28 devnull fprint(2, "%s\n", err);
443 d0cda8c4 2005-07-28 devnull break;
444 d0cda8c4 2005-07-28 devnull }
445 d0cda8c4 2005-07-28 devnull }
446 d0cda8c4 2005-07-28 devnull if(i == nelem(cmdtab))
447 d0cda8c4 2005-07-28 devnull fprint(2, "unknown command '%s'\n", f[0]);
448 d0cda8c4 2005-07-28 devnull }
449 d0cda8c4 2005-07-28 devnull threadexitsall(nil);
450 d0cda8c4 2005-07-28 devnull }
451 d0cda8c4 2005-07-28 devnull