1 #include <lib9.h> 2 #include "styxserver.h" 3 4 int nq; 5 Styxserver *server; 6 7 void 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 * 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 * 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 * 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 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