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 void
11 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 exits("usage");
19 }
21 void
22 printattr(Nfs3Attr *attr)
23 {
24 Fmt fmt;
25 char buf[256];
27 fmtfdinit(&fmt, 1, buf, sizeof buf);
28 nfs3attrprint(&fmt, attr);
29 fmtfdflush(&fmt);
30 print("\n");
31 }
33 char buf[8192];
35 void
36 x(int ok)
37 {
38 if(ok != Nfs3Ok){
39 nfs3errstr(ok);
40 sysfatal("%r");
41 }
42 }
44 void
45 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 }ARGEND
67 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("ffsopen: %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 }else
94 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 offset = 0;
109 for(;;){
110 x(fsysreadfile(fsys, &au, &h, sizeof buf, offset, &data, &n, &eof));
111 if(n){
112 write(1, data, n);
113 free(data);
114 offset += n;
116 if(eof)
117 break;
119 break;
120 case Nfs3FileSymlink:
121 x(fsysreadlink(fsys, &au, &h, &link));
122 print("%s\n", link);
123 break;
124 default:
125 print("cannot cat: not file, not link\n");
126 break;
128 }else if(strcmp(argv[1], "ls") == 0){
129 /* not implemented */
130 }else if(strcmp(argv[1], "stat") == 0){
131 /* already done */
133 threadexitsall(nil);