compat.h 3.3 KB

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