1 #include <lib9.h>
2 #include "styxserver.h"
3
4 int nq;
5 Styxserver *server;
6
7 void
myinit(Styxserver * s)8 myinit(Styxserver *s)
9 {
10 styxaddfile(s, Qroot, 1, "fred", 0664, "inferno");
11 styxaddfile(s, Qroot, 2, "joe", 0664, "inferno");
12 styxadddir(s, Qroot, 3, "adir", 0775, "inferno");
13 styxaddfile(s, 3, 4, "bill", 0664, "inferno");
14 styxadddir(s, Qroot, 5, "new", 0775, "inferno");
15 styxadddir(s, 5, 6, "cdir", 0775, "inferno");
16 styxaddfile(s, 6, 7, "cfile", 0664, "inferno");
17 nq = 8;
18 }
19
20 char *
mycreate(Qid * qid,char * name,int perm,int mode)21 mycreate(Qid *qid, char *name, int perm, int mode)
22 {
23 int isdir;
24 Styxfile *f;
25
26 USED(mode);
27 isdir = perm&DMDIR;
28 if(isdir)
29 f = styxadddir(server, qid->path, nq++, name , perm, "inferno");
30 else
31 f = styxaddfile(server, qid->path, nq++, name, perm, "inferno");
32 if(f == nil)
33 return Eexist;
34 *qid = f->d.qid;
35 return nil;
36 }
37
38 char *
myremove(Qid qid)39 myremove(Qid qid)
40 {
41 Styxfile *f;
42
43 f = styxfindfile(server, qid.path);
44 if(f != nil && (f->d.qid.type&QTDIR) && f->child != nil)
45 return "directory not empty";
46
47 if(styxrmfile(server, qid.path) < 0)
48 return Enonexist;
49 return nil;
50 }
51
52 char *
myread(Qid qid,char * d,ulong * n,vlong offset)53 myread(Qid qid, char *d, ulong *n, vlong offset)
54 {
55 if(qid.path != 1){
56 *n = 0;
57 return nil;
58 }
59 *n = styxreadstr(offset, d, *n, "abcdefghijklmn");
60 return nil;
61 }
62
63 Styxops ops = {
64 nil, /* newclient */
65 nil, /* freeclient */
66
67 nil, /* attach */
68 nil, /* walk */
69 nil, /* open */
70 mycreate, /* create */
71 myread, /* read */
72 nil, /* write */
73 nil, /* close */
74 myremove, /* remove */
75 nil, /* stat */
76 nil, /* wstat */
77 };
78
main(int argc,char ** argv)79 main(int argc, char **argv)
80 {
81 Styxserver s;
82
83 USED(argc);
84 USED(argv);
85 server = &s;
86 styxdebug();
87 styxinit(&s, &ops, "6701", 0555, 0);
88 myinit(&s);
89 for(;;){
90 styxwait(&s);
91 styxprocess(&s);
92 }
93 return 0;
94 }
95
96