17a02f3c0SDavid du Colombier #define Rendez KRendez 27a02f3c0SDavid du Colombier 39a747e4fSDavid du Colombier typedef struct Block Block; 49a747e4fSDavid du Colombier typedef struct Chan Chan; 59a747e4fSDavid du Colombier typedef struct Cname Cname; 69a747e4fSDavid du Colombier typedef struct Dev Dev; 79a747e4fSDavid du Colombier typedef struct Dirtab Dirtab; 89a747e4fSDavid du Colombier typedef struct Proc Proc; 99a747e4fSDavid du Colombier typedef struct Ref Ref; 109a747e4fSDavid du Colombier typedef struct Rendez Rendez; 119a747e4fSDavid du Colombier typedef struct Walkqid Walkqid; 129a747e4fSDavid du Colombier typedef int Devgen(Chan*, Dirtab*, int, int, Dir*); 139a747e4fSDavid du Colombier 149a747e4fSDavid du Colombier enum 159a747e4fSDavid du Colombier { 169a747e4fSDavid du Colombier KNAMELEN = 28, 179a747e4fSDavid du Colombier NERR = 15, 189a747e4fSDavid du Colombier 199a747e4fSDavid du Colombier COPEN = 0x0001, /* for i/o */ 209a747e4fSDavid du Colombier CFREE = 0x0010, /* not in use */ 219a747e4fSDavid du Colombier }; 229a747e4fSDavid du Colombier 239a747e4fSDavid du Colombier struct Ref 249a747e4fSDavid du Colombier { 259a747e4fSDavid du Colombier Lock; 269a747e4fSDavid du Colombier int ref; 279a747e4fSDavid du Colombier }; 289a747e4fSDavid du Colombier 299a747e4fSDavid du Colombier struct Rendez 309a747e4fSDavid du Colombier { 319a747e4fSDavid du Colombier Lock; 329a747e4fSDavid du Colombier Proc *p; 339a747e4fSDavid du Colombier }; 349a747e4fSDavid du Colombier 359a747e4fSDavid du Colombier struct Chan 369a747e4fSDavid du Colombier { 379a747e4fSDavid du Colombier Ref; 389a747e4fSDavid du Colombier Chan* next; /* allocation */ 399a747e4fSDavid du Colombier Chan* link; 409a747e4fSDavid du Colombier vlong offset; /* in file */ 419a747e4fSDavid du Colombier ushort type; 429a747e4fSDavid du Colombier ulong dev; 439a747e4fSDavid du Colombier ushort mode; /* read/write */ 449a747e4fSDavid du Colombier ushort flag; 459a747e4fSDavid du Colombier Qid qid; 469a747e4fSDavid du Colombier int fid; /* for devmnt */ 479a747e4fSDavid du Colombier ulong iounit; /* chunk size for i/o; 0==default */ 489a747e4fSDavid du Colombier void* aux; 499a747e4fSDavid du Colombier Cname *name; 509a747e4fSDavid du Colombier }; 519a747e4fSDavid du Colombier 529a747e4fSDavid du Colombier struct Cname 539a747e4fSDavid du Colombier { 549a747e4fSDavid du Colombier Ref; 559a747e4fSDavid du Colombier int alen; /* allocated length */ 569a747e4fSDavid du Colombier int len; /* strlen(s) */ 579a747e4fSDavid du Colombier char *s; 589a747e4fSDavid du Colombier }; 599a747e4fSDavid du Colombier 609a747e4fSDavid du Colombier struct Dev 619a747e4fSDavid du Colombier { 629a747e4fSDavid du Colombier int dc; 639a747e4fSDavid du Colombier char* name; 649a747e4fSDavid du Colombier 659a747e4fSDavid du Colombier void (*reset)(void); 669a747e4fSDavid du Colombier void (*init)(void); 679a747e4fSDavid du Colombier Chan* (*attach)(char*); 689a747e4fSDavid du Colombier Walkqid* (*walk)(Chan*, Chan*, char**, int); 699a747e4fSDavid du Colombier int (*stat)(Chan*, uchar*, int); 709a747e4fSDavid du Colombier Chan* (*open)(Chan*, int); 719a747e4fSDavid du Colombier void (*create)(Chan*, char*, int, ulong); 729a747e4fSDavid du Colombier void (*close)(Chan*); 739a747e4fSDavid du Colombier long (*read)(Chan*, void*, long, vlong); 749a747e4fSDavid du Colombier Block* (*bread)(Chan*, long, ulong); 759a747e4fSDavid du Colombier long (*write)(Chan*, void*, long, vlong); 769a747e4fSDavid du Colombier long (*bwrite)(Chan*, Block*, ulong); 779a747e4fSDavid du Colombier void (*remove)(Chan*); 789a747e4fSDavid du Colombier int (*wstat)(Chan*, uchar*, int); 799a747e4fSDavid du Colombier }; 809a747e4fSDavid du Colombier 819a747e4fSDavid du Colombier struct Dirtab 829a747e4fSDavid du Colombier { 839a747e4fSDavid du Colombier char name[KNAMELEN]; 849a747e4fSDavid du Colombier Qid qid; 859a747e4fSDavid du Colombier vlong length; 869a747e4fSDavid du Colombier long perm; 879a747e4fSDavid du Colombier }; 889a747e4fSDavid du Colombier 899a747e4fSDavid du Colombier struct Walkqid 909a747e4fSDavid du Colombier { 919a747e4fSDavid du Colombier Chan *clone; 929a747e4fSDavid du Colombier int nqid; 939a747e4fSDavid du Colombier Qid qid[1]; 949a747e4fSDavid du Colombier }; 959a747e4fSDavid du Colombier 969a747e4fSDavid du Colombier struct Proc 979a747e4fSDavid du Colombier { 989a747e4fSDavid du Colombier Lock rlock; /* for rendsleep, rendwakeup, intr */ 999a747e4fSDavid du Colombier Rendez *r; 1009a747e4fSDavid du Colombier int intr; 1019a747e4fSDavid du Colombier 1029a747e4fSDavid du Colombier char name[KNAMELEN]; 1039a747e4fSDavid du Colombier char *user; 1049a747e4fSDavid du Colombier char error[ERRMAX]; 1059a747e4fSDavid du Colombier int nerrlab; 1069a747e4fSDavid du Colombier jmp_buf errlab[NERR]; 1079a747e4fSDavid du Colombier char genbuf[128]; /* buffer used e.g. for last name element from namec */ 1089a747e4fSDavid du Colombier }; 1099a747e4fSDavid du Colombier 1109a747e4fSDavid du Colombier #define DEVDOTDOT -1 1119a747e4fSDavid du Colombier 1129a747e4fSDavid du Colombier extern Proc **privup; 1139a747e4fSDavid du Colombier #define up (*privup) 1149a747e4fSDavid du Colombier extern char *eve; 1159a747e4fSDavid du Colombier extern Dev* devtab[]; 1169a747e4fSDavid du Colombier 1179a747e4fSDavid du Colombier Chan* cclone(Chan*); 1189a747e4fSDavid du Colombier void cclose(Chan*); 1199a747e4fSDavid du Colombier void cnameclose(Cname*); 1209a747e4fSDavid du Colombier int decref(Ref*); 1219a747e4fSDavid du Colombier Chan* devattach(int, char*); 1229a747e4fSDavid du Colombier Block* devbread(Chan*, long, ulong); 1239a747e4fSDavid du Colombier long devbwrite(Chan*, Block*, ulong); 1249a747e4fSDavid du Colombier void devcreate(Chan*, char*, int, ulong); 1259a747e4fSDavid du Colombier void devdir(Chan*, Qid, char*, vlong, char*, long, Dir*); 1269a747e4fSDavid du Colombier long devdirread(Chan*, char*, long, Dirtab*, int, Devgen*); 1279a747e4fSDavid du Colombier Devgen devgen; 1289a747e4fSDavid du Colombier void devinit(void); 1299a747e4fSDavid du Colombier Chan* devopen(Chan*, int, Dirtab*, int, Devgen*); 1309a747e4fSDavid du Colombier void devremove(Chan*); 1319a747e4fSDavid du Colombier void devreset(void); 1329a747e4fSDavid du Colombier int devstat(Chan*, uchar*, int, Dirtab*, int, Devgen*); 1339a747e4fSDavid du Colombier Walkqid* devwalk(Chan*, Chan*, char**, int, Dirtab*, int, Devgen*); 1349a747e4fSDavid du Colombier int devwstat(Chan*, uchar*, int); 1359a747e4fSDavid du Colombier void error(char*); 1369a747e4fSDavid du Colombier int incref(Ref*); 1379a747e4fSDavid du Colombier void isdir(Chan*); 1389a747e4fSDavid du Colombier void kproc(char*, void(*)(void*), void*); 1399a747e4fSDavid du Colombier void mkqid(Qid*, vlong, ulong, int); 1409a747e4fSDavid du Colombier void nexterror(void); 1419a747e4fSDavid du Colombier Chan* newchan(void); 1429a747e4fSDavid du Colombier Cname* newcname(char*); 1439a747e4fSDavid du Colombier int openmode(ulong); 1449a747e4fSDavid du Colombier void panic(char*, ...); 1459a747e4fSDavid du Colombier int readstr(ulong, char*, ulong, char*); 1469a747e4fSDavid du Colombier long seconds(void); 1479a747e4fSDavid du Colombier void* smalloc(ulong); 1489a747e4fSDavid du Colombier 1499a747e4fSDavid du Colombier #define poperror() up->nerrlab-- 1509a747e4fSDavid du Colombier #define waserror() (up->nerrlab++, setjmp(up->errlab[up->nerrlab-1])) 1519a747e4fSDavid du Colombier 1529a747e4fSDavid du Colombier void initcompat(void); 1539a747e4fSDavid du Colombier void rendintr(void *v); 1549a747e4fSDavid du Colombier void rendclearintr(void); 1559a747e4fSDavid du Colombier void rendsleep(Rendez*, int(*)(void*), void*); 1569a747e4fSDavid du Colombier int rendwakeup(Rendez*); 1579a747e4fSDavid du Colombier void kexit(void); 1589a747e4fSDavid du Colombier int sysexport(int fd, Chan **roots, int nroots); 1599a747e4fSDavid du Colombier int errdepth(int ed); 1609a747e4fSDavid du Colombier void newup(char *name); 1619a747e4fSDavid du Colombier 1629a747e4fSDavid du Colombier int exporter(Dev**, int*, int*); 1639a747e4fSDavid du Colombier int mounter(char *mntpt, int how, int fds, int n); 1649a747e4fSDavid du Colombier void shutdown(void); 1659a747e4fSDavid du Colombier 1669a747e4fSDavid du Colombier void screeninit(int, int, char*); 167*74f16c81SDavid du Colombier 168*74f16c81SDavid du Colombier #pragma varargck argpos panic 1 169