1 /* 2 * template for making a new device 3 */ 4 #include "u.h" 5 #include "../port/lib.h" 6 #include "mem.h" 7 #include "dat.h" 8 #include "fns.h" 9 #include "../port/error.h" 10 11 12 enum{ 13 Qdir, 14 Qdata, 15 }; 16 17 static 18 Dirtab XXXtab[]={ 19 ".", {Qdir, 0, QTDIR}, 0, 0555, /* entry for "." must be first if devgen used */ 20 "data", {Qdata, 0}, 0, 0666, 21 }; 22 23 static void 24 XXXreset(void) /* default in dev.c */ 25 { 26 } 27 28 static void 29 XXXinit(void) /* default in dev.c */ 30 { 31 } 32 33 static Chan* 34 XXXattach(char* spec) 35 { 36 return devattach('X', spec); 37 } 38 39 static Walkqid* 40 XXXwalk(Chan *c, Chan *nc, char **name, int nname) 41 { 42 return devwalk(c, nc, name, nname, XXXtab, nelem(XXXtab), devgen); 43 } 44 45 static int 46 XXXstat(Chan* c, uchar *db, int n) 47 { 48 return devstat(c, db, n, XXXtab, nelem(XXXtab), devgen); 49 } 50 51 static Chan* 52 XXXopen(Chan* c, int omode) 53 { 54 return devopen(c, omode, XXXtab, nelem(XXXtab), devgen); 55 } 56 57 static void 58 XXXcreate(Chan* c, char* name, int omode, ulong perm) /* default in dev.c */ 59 { 60 USED(c, name, omode, perm); 61 error(Eperm); 62 } 63 64 static void 65 XXXremove(Chan* c) /* default in dev.c */ 66 { 67 USED(c); 68 error(Eperm); 69 } 70 71 static int 72 XXXwstat(Chan* c, uchar *dp, int n) /* default in dev.c */ 73 { 74 USED(c, dp); 75 error(Eperm); 76 return n; 77 } 78 79 static void 80 XXXclose(Chan* c) 81 { 82 USED(c); 83 } 84 85 static long 86 XXXread(Chan* c, void* a, long n, vlong offset) 87 { 88 USED(offset); 89 90 switch((ulong)c->qid.path){ 91 case Qdir: 92 return devdirread(c, a, n, XXXtab, nelem(XXXtab), devgen); 93 case Qdata: 94 break; 95 default: 96 n=0; 97 break; 98 } 99 return n; 100 } 101 102 static Block* 103 XXXbread(Chan* c, long n, ulong offset) /* default in dev.c */ 104 { 105 return devbread(c, n, offset); 106 } 107 108 static long 109 XXXwrite(Chan* c, void* a, long n, vlong offset) 110 { 111 USED(a, offset); 112 113 switch((ulong)c->qid.path){ 114 case Qdata: 115 break; 116 default: 117 error(Ebadusefd); 118 } 119 return n; 120 } 121 122 static long 123 XXXbwrite(Chan* c, Block* bp, ulong offset) /* default in dev.c */ 124 { 125 return devbwrite(c, bp, offset); 126 } 127 128 Dev XXXdevtab = { /* defaults in dev.c */ 129 'X', 130 "XXX", 131 132 XXXreset, /* devreset */ 133 XXXinit, /* devinit */ 134 devshutdown, 135 XXXattach, 136 XXXwalk, 137 XXXstat, 138 XXXopen, 139 XXXcreate, /* devcreate */ 140 XXXclose, 141 XXXread, 142 XXXbread, /* devbread */ 143 XXXwrite, 144 XXXbwrite, /* devbwrite */ 145 XXXremove, /* devremove */ 146 XXXwstat, /* devwstat */ 147 }; 148