compat.h 3.8 KB

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