1 #define Rendez KRendez 2 3 typedef struct Block Block; 4 typedef struct Chan Chan; 5 typedef struct Cname Cname; 6 typedef struct Dev Dev; 7 typedef struct Dirtab Dirtab; 8 typedef struct Proc Proc; 9 typedef struct Ref Ref; 10 typedef struct Rendez Rendez; 11 typedef struct Walkqid Walkqid; 12 typedef int Devgen(Chan*, Dirtab*, int, int, Dir*); 13 14 enum 15 { 16 KNAMELEN = 28, 17 NERR = 15, 18 19 COPEN = 0x0001, /* for i/o */ 20 CFREE = 0x0010, /* not in use */ 21 }; 22 23 struct Ref 24 { 25 Lock; 26 int ref; 27 }; 28 29 struct Rendez 30 { 31 Lock; 32 Proc *p; 33 }; 34 35 struct Chan 36 { 37 Ref; 38 Chan* next; /* allocation */ 39 Chan* link; 40 vlong offset; /* in file */ 41 ushort type; 42 ulong dev; 43 ushort mode; /* read/write */ 44 ushort flag; 45 Qid qid; 46 int fid; /* for devmnt */ 47 ulong iounit; /* chunk size for i/o; 0==default */ 48 void* aux; 49 Cname *name; 50 }; 51 52 struct Cname 53 { 54 Ref; 55 int alen; /* allocated length */ 56 int len; /* strlen(s) */ 57 char *s; 58 }; 59 60 struct Dev 61 { 62 int dc; 63 char* name; 64 65 void (*reset)(void); 66 void (*init)(void); 67 Chan* (*attach)(char*); 68 Walkqid* (*walk)(Chan*, Chan*, char**, int); 69 int (*stat)(Chan*, uchar*, int); 70 Chan* (*open)(Chan*, int); 71 void (*create)(Chan*, char*, int, ulong); 72 void (*close)(Chan*); 73 long (*read)(Chan*, void*, long, vlong); 74 Block* (*bread)(Chan*, long, ulong); 75 long (*write)(Chan*, void*, long, vlong); 76 long (*bwrite)(Chan*, Block*, ulong); 77 void (*remove)(Chan*); 78 int (*wstat)(Chan*, uchar*, int); 79 }; 80 81 struct Dirtab 82 { 83 char name[KNAMELEN]; 84 Qid qid; 85 vlong length; 86 long perm; 87 }; 88 89 struct Walkqid 90 { 91 Chan *clone; 92 int nqid; 93 Qid qid[1]; 94 }; 95 96 struct Proc 97 { 98 Lock rlock; /* for rendsleep, rendwakeup, intr */ 99 Rendez *r; 100 int intr; 101 102 char name[KNAMELEN]; 103 char *user; 104 char error[ERRMAX]; 105 int nerrlab; 106 jmp_buf errlab[NERR]; 107 char genbuf[128]; /* buffer used e.g. for last name element from namec */ 108 }; 109 110 #define DEVDOTDOT -1 111 112 extern Proc **privup; 113 #define up (*privup) 114 extern char *eve; 115 extern Dev* devtab[]; 116 117 Chan* cclone(Chan*); 118 void cclose(Chan*); 119 void cnameclose(Cname*); 120 int decref(Ref*); 121 Chan* devattach(int, char*); 122 Block* devbread(Chan*, long, ulong); 123 long devbwrite(Chan*, Block*, ulong); 124 void devcreate(Chan*, char*, int, ulong); 125 void devdir(Chan*, Qid, char*, vlong, char*, long, Dir*); 126 long devdirread(Chan*, char*, long, Dirtab*, int, Devgen*); 127 Devgen devgen; 128 void devinit(void); 129 Chan* devopen(Chan*, int, Dirtab*, int, Devgen*); 130 void devremove(Chan*); 131 void devreset(void); 132 int devstat(Chan*, uchar*, int, Dirtab*, int, Devgen*); 133 Walkqid* devwalk(Chan*, Chan*, char**, int, Dirtab*, int, Devgen*); 134 int devwstat(Chan*, uchar*, int); 135 void error(char*); 136 int incref(Ref*); 137 void isdir(Chan*); 138 void kproc(char*, void(*)(void*), void*); 139 void mkqid(Qid*, vlong, ulong, int); 140 void nexterror(void); 141 Chan* newchan(void); 142 Cname* newcname(char*); 143 int openmode(ulong); 144 void panic(char*, ...); 145 int readstr(ulong, char*, ulong, char*); 146 long seconds(void); 147 void* smalloc(ulong); 148 149 #define poperror() up->nerrlab-- 150 #define waserror() (up->nerrlab++, setjmp(up->errlab[up->nerrlab-1])) 151 152 void initcompat(void); 153 void rendintr(void *v); 154 void rendclearintr(void); 155 void rendsleep(Rendez*, int(*)(void*), void*); 156 int rendwakeup(Rendez*); 157 void kexit(void); 158 int sysexport(int fd, Chan **roots, int nroots); 159 int errdepth(int ed); 160 void newup(char *name); 161 162 int exporter(Dev**, int*, int*); 163 int mounter(char *mntpt, int how, int fds, int n); 164 void shutdown(void); 165 166 void screeninit(int, int, char*); 167 168 #pragma varargck argpos panic 1 169