#include #include #include #include #include #include #include #include uchar *buf; uint bufsize; Nfs3Handle cwd, root; Biobuf bin, bout; char pwd[1000]; Fsys *fsys; SunAuthUnix *auth; VtConn *z; VtCache *c; Disk *disk; char *cmdhelp(int, char**); char *cmdcd(int, char**); char *cmdpwd(int, char**); char *cmdls(int, char**); char *cmdget(int, char**); char *cmdblock(int, char**); char *cmddisk(int, char**); typedef struct Cmd Cmd; struct Cmd { char *s; char *(*fn)(int, char**); char *help; }; Cmd cmdtab[] = { "cd", cmdcd, "cd dir - change directory", "ls", cmdls, "ls [-d] path... - list file", "get", cmdget, "get path [lpath] - copy file to local directory", "pwd", cmdpwd, "pwd - print working directory", "help", cmdhelp, "help - print usage summaries", "block", cmdblock, "block path offset - print disk offset of path's byte offset", "disk", cmddisk, "disk offset count - dump disk contents" }; char* ebuf(void) { static char buf[ERRMAX]; rerrstr(buf, sizeof buf); return buf; } char* walk(char *path, Nfs3Handle *ph) { char *p, *q; Nfs3Handle h; Nfs3Status ok; if(path[0] == '/') h = root; else h = cwd; for(p=path; *p; p=q){ q = strchr(p, '/'); if(q == nil) q = p+strlen(p); else *q++ = 0; if(*p == 0) continue; if((ok = fsyslookup(fsys, auth, &h, p, &h)) != Nfs3Ok){ nfs3errstr(ok); return ebuf(); } } *ph = h; return nil; } char* cmdhelp(int argc, char **argv) { int i; for(i=0; itype */ Bprint(&bout, "%s%s%s", dir ? dir : "", dir && elem ? "/" : "", elem ? elem : ""); Bprint(&bout, " %c%luo %1d %4d %4d", c, attr->mode, attr->nlink, attr->uid, attr->gid); Bprint(&bout, " %11,lld %11,lld %4d.%4d %#11,llux %#11,llux", attr->size, attr->used, attr->major, attr->minor, attr->fsid, attr->fileid); Bprint(&bout, "\n"); } void lsdir(char *dir, Nfs3Handle *h) { uchar *data, *p, *ep; Nfs3Attr attr; Nfs3Entry e; Nfs3Handle eh; u32int count; u1int eof; Nfs3Status ok; u64int cookie; cookie = 0; for(;;){ ok = fsysreaddir(fsys, auth, h, 8192, cookie, &data, &count, &eof); if(ok != Nfs3Ok){ nfs3errstr(ok); fprint(2, "ls %s: %r\n", dir); return; } fprint(2, "got %d\n", count); p = data; ep = data+count; while(pblocksize, o, &buf, &n, &eof)) != Nfs3Ok){ nfs3errstr(ok); fprint(2, "reading %s: %r\n", argv[0]); close(fd); return nil; } if(write(fd, buf, n) != n){ fprint(2, "writing %s: %r\n", local); close(fd); free(buf); return nil; } free(buf); } close(fd); fprint(2, "copied %,lld bytes\n", o); return nil; } char* cmdblock(int argc, char **argv) { char *e; Nfs3Handle h; u64int bno; ARGBEGIN{ default: return "usage: block path offset"; }ARGEND if(argc != 2) return "usage: block path offset"; if((e = walk(argv[0], &h)) != nil){ fprint(2, "%s: %s\n", argv[0], e); return nil; } if((bno = fsys->fileblock(fsys, &h, strtoll(argv[1], 0, 0))) == 0){ fprint(2, "%s: %r\n", argv[0]); return nil; } print("%#llux\n", bno); return nil; } char* cmddisk(int argc, char **argv) { Block *b; int delta, count, i; u64int offset; uchar *p; ARGBEGIN{ default: return "usage: disk offset count"; }ARGEND if(argc != 2) return "usage: disk offset count"; offset = strtoull(argv[0], 0, 0); count = atoi(argv[1]); delta = offset%fsys->blocksize; b = diskread(disk, fsys->blocksize, offset-delta); if(b == nil){ fprint(2, "diskread: %r\n"); return nil; } p = b->data + delta; for(i=0; i= 0 || strchr(argv[0], '/')){ if((disk = diskopenfile(argv[0])) == nil) sysfatal("diskopen: %r"); if((disk = diskcache(disk, 16384, 16)) == nil) sysfatal("diskcache: %r"); }else{ if(vtparsescore(argv[0], nil, score) < 0) sysfatal("bad score '%s'", argv[0]); if((z = vtdial(nil)) == nil) sysfatal("vtdial: %r"); if(vtconnect(z) < 0) sysfatal("vtconnect: %r"); if((c = vtcachealloc(z, 16384, 32)) == nil) sysfatal("vtcache: %r"); if((disk = diskopenventi(c, score)) == nil) sysfatal("diskopenventi: %r"); } if((fsys = fsysopen(disk)) == nil) sysfatal("ffsopen: %r"); fprint(2, "block size %d\n", fsys->blocksize); buf = emalloc(fsys->blocksize); if((ok = fsysroot(fsys, &root)) != Nfs3Ok){ nfs3errstr(ok); sysfatal("accessing root: %r"); } cwd = root; Binit(&bin, 0, OREAD); Binit(&bout, 1, OWRITE); while(fprint(2, "vftp> "), (p = Brdstr(&bin, '\n', 1)) != nil){ if(p[0] == '#') continue; nf = tokenize(p, f, nelem(f)); if(nf == 0) continue; for(i=0; i