Blob
1 #include <u.h>2 #include <libc.h>3 #include <thread.h>4 #include <sunrpc.h>5 #include <nfs3.h>6 #include <diskfs.h>8 int debug;10 void11 usage(void)12 {13 fprint(2, "usage: fsview fspartition cmd\n");14 fprint(2, "cmd is:\n");15 fprint(2, "\tcat file\n");16 fprint(2, "\tls dir\n");17 fprint(2, "\tstat file\n");18 threadexitsall("usage");19 }21 void22 printattr(Nfs3Attr *attr)23 {24 Fmt fmt;25 char buf[256];27 fmtfdinit(&fmt, 2, buf, sizeof buf);28 nfs3attrprint(&fmt, attr);29 fmtfdflush(&fmt);30 fprint(2, "\n");31 }33 char buf[8192];35 void36 x(int ok)37 {38 if(ok != Nfs3Ok){39 nfs3errstr(ok);40 sysfatal("%r");41 }42 }44 void45 threadmain(int argc, char **argv)46 {47 char *p, *q;48 u32int n;49 Disk *disk;50 Fsys *fsys;51 Nfs3Handle h;52 SunAuthUnix au;53 Nfs3Attr attr;54 u64int offset;55 u1int eof;56 uchar *data;57 char *link;59 ARGBEGIN{60 case 'd':61 debug = 1;62 break;63 default:64 usage();65 }ARGEND67 if(argc != 3)68 usage();70 if((disk = diskopenfile(argv[0])) == nil)71 sysfatal("diskopen: %r");72 if((disk = diskcache(disk, 16384, 16)) == nil)73 sysfatal("diskcache: %r");74 if((fsys = fsysopen(disk)) == nil)75 sysfatal("fsysopen: %r");77 allowall = 1;78 memset(&au, 0, sizeof au);80 /* walk */81 if(debug) fprint(2, "get root...");82 x(fsysroot(fsys, &h));83 p = argv[2];84 while(*p){85 while(*p == '/')86 p++;87 if(*p == 0)88 break;89 q = strchr(p, '/');90 if(q){91 *q = 0;92 q++;93 }else94 q = "";95 if(debug) fprint(2, "walk %s...", p);96 x(fsyslookup(fsys, &au, &h, p, &h));97 p = q;98 }100 if(debug) fprint(2, "getattr...");101 x(fsysgetattr(fsys, &au, &h, &attr));102 printattr(&attr);104 /* do the op */105 if(strcmp(argv[1], "cat") == 0){106 switch(attr.type){107 case Nfs3FileReg:108 case Nfs3FileDir:109 offset = 0;110 for(;;){111 x(fsysreadfile(fsys, &au, &h, sizeof buf, offset, &data, &n, &eof));112 if(n){113 write(1, data, n);114 free(data);115 offset += n;116 }117 if(eof)118 break;119 }120 break;121 case Nfs3FileSymlink:122 x(fsysreadlink(fsys, &au, &h, &link));123 print("%s\n", link);124 break;125 default:126 print("cannot cat: not file, not link\n");127 break;128 }129 }else if(strcmp(argv[1], "ls") == 0){130 /* not implemented */131 }else if(strcmp(argv[1], "stat") == 0){132 /* already done */133 }134 threadexitsall(nil);135 }