libc.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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 _LOCK_EXTENSION
  10. #define _QLOCK_EXTENSION
  11. #define _BSD_EXTENSION
  12. #include <sys/types.h>
  13. #include <lock.h>
  14. #include <qlock.h>
  15. #include <lib9.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <bsd.h>
  19. #include <unistd.h>
  20. #include <fcntl.h>
  21. #include <assert.h>
  22. #include <utf.h>
  23. #include <fmt.h>
  24. #include <signal.h>
  25. // #include <time.h>
  26. #define nelem(x) (sizeof(x)/sizeof((x)[0]))
  27. extern int tokenize(char*, char**, int);
  28. typedef
  29. struct Qid
  30. {
  31. uvlong path;
  32. uint32_t vers;
  33. uchar type;
  34. } Qid;
  35. typedef
  36. struct Dir {
  37. /* system-modified data */
  38. ushort type; /* server type */
  39. uint dev; /* server subtype */
  40. /* file data */
  41. Qid qid; /* unique id from server */
  42. uint32_t mode; /* permissions */
  43. uint32_t atime; /* last read time */
  44. uint32_t mtime; /* last write time */
  45. vlong length; /* file length: see <u.h> */
  46. char *name; /* last element of path */
  47. char *uid; /* owner name */
  48. char *gid; /* group name */
  49. char *muid; /* last modifier name */
  50. } Dir;
  51. uint _convM2D(uchar*, uint, Dir*, char*);
  52. uint _convD2M(Dir*, uchar*, uint);
  53. Dir *_dirstat(char*);
  54. int _dirwstat(char*, Dir*);
  55. Dir *_dirfstat(int);
  56. int _dirfwstat(int, Dir*);
  57. long _dirread(int, Dir**);
  58. long _dirreadall(int, Dir**);
  59. void _nulldir(Dir*);
  60. uint _sizeD2M(Dir*);
  61. typedef
  62. struct Waitmsg
  63. {
  64. int pid; /* of loved one */
  65. unsigned long time[3]; /* of loved one & descendants */
  66. char *msg;
  67. } Waitmsg;
  68. /*
  69. * Time-of-day
  70. */
  71. typedef
  72. struct Tm
  73. {
  74. int sec;
  75. int min;
  76. int hour;
  77. int mday;
  78. int mon;
  79. int year;
  80. int wday;
  81. int yday;
  82. char zone[4];
  83. int tzoff;
  84. } Tm;
  85. extern Tm* gmtime(long);
  86. extern Tm* localtime(long);
  87. extern char* asctime(Tm*);
  88. extern char* ctime(long);
  89. extern double cputime(void);
  90. extern long times(long*);
  91. extern long tm2sec(Tm*);
  92. extern vlong nsec(void);
  93. extern void cycles(uvlong*); /* 64-bit value of the cycle counter if there is one, 0 if there isn't */
  94. extern long time(long*);
  95. extern int _AWAIT(char*, int);
  96. extern int _ALARM(unsigned long);
  97. extern int _BIND(const char*, const char*, int);
  98. extern int _CHDIR(const char*);
  99. extern int _CLOSE(int);
  100. extern int _CREATE(char*, int, unsigned long);
  101. extern int _DUP(int, int);
  102. extern int _ERRSTR(char*, unsigned int);
  103. extern int _EXEC(char*, char*[]);
  104. extern void _EXITS(char *);
  105. extern int _FD2PATH(int, char*, int);
  106. extern int _FAUTH(int, char*);
  107. extern int _FSESSION(int, char*, int);
  108. extern int _FSTAT(int, unsigned char*, int);
  109. extern int _FWSTAT(int, unsigned char*, int);
  110. extern int _MOUNT(int, int, const char*, int, const char*);
  111. extern int _NOTED(int);
  112. extern int _NOTIFY(int(*)(void*, char*));
  113. extern int _OPEN(const char*, int);
  114. extern int _PIPE(int*);
  115. extern long _PREAD(int, void*, long, long long);
  116. extern long _PWRITE(int, void*, long, long long);
  117. extern long _READ(int, void*, long);
  118. extern int _REMOVE(const char*);
  119. extern int _RENDEZVOUS(unsigned long, unsigned long);
  120. extern int _RFORK(int);
  121. extern int _SEGATTACH(int, char*, void*, unsigned long);
  122. extern int _SEGBRK(void*, void*);
  123. extern int _SEGDETACH(void*);
  124. extern int _SEGFLUSH(void*, unsigned long);
  125. extern int _SEGFREE(void*, unsigned long);
  126. extern long long _SEEK(int, long long, int);
  127. extern int _SLEEP(long);
  128. extern int _STAT(const char*, unsigned char*, int);
  129. extern Waitmsg* _WAIT(void);
  130. extern long _WRITE(int, const void*, long);
  131. extern int _WSTAT(const char*, unsigned char*, int);
  132. extern void *_MALLOCZ(int, int);
  133. extern int _WERRSTR(char*, ...);
  134. extern long _READN(int, void*, long);
  135. extern int _IOUNIT(int);
  136. #define dirstat _dirstat
  137. #define dirfstat _dirfstat
  138. #define OREAD 0
  139. #define OWRITE 1
  140. #define ORDWR 2
  141. #define OCEXEC 32
  142. #define AREAD 4
  143. #define AWRITE 2
  144. #define AEXEC 1
  145. #define AEXIST 0
  146. #define open _OPEN
  147. #define close _CLOSE
  148. #define read _READ
  149. #define write _WRITE
  150. #define _exits(s) _exit(s && *(char*)s ? 1 : 0)
  151. #define exits(s) exit(s && *(char*)s ? 1 : 0)
  152. #define create _CREATE
  153. #define pread _PREAD
  154. #define readn _READN
  155. #define mallocz _MALLOCZ
  156. #define iounit _IOUNIT
  157. /* assume being called as in event.c */
  158. #define postnote(x, pid, msg) kill(pid, SIGTERM)
  159. #define atnotify(x, y) signal(SIGTERM, ekill)
  160. #define ERRMAX 128
  161. extern void setmalloctag(void*, uint32_t);
  162. extern uint32_t getcallerpc(void*);
  163. /* Used in libsec.h and not picked up in earlier type definitions */
  164. typedef unsigned int u32int;
  165. typedef unsigned long long u64int;
  166. int dec16(uchar *, int, char *, int);
  167. int enc16(char *, int, uchar *, int);
  168. int dec32(uchar *, int, char *, int);
  169. int enc32(char *, int, uchar *, int);
  170. int dec64(uchar *, int, char *, int);
  171. int enc64(char *, int, uchar *, int);
  172. extern vlong nsec(void);
  173. extern void sysfatal(char*, ...);
  174. extern uint32_t truerand(void); /* uses /dev/random */
  175. extern int getfields(char*, char**, int, int, char*);
  176. #pragma varargck type "lld" vlong
  177. #pragma varargck type "llo" vlong
  178. #pragma varargck type "llx" vlong
  179. #pragma varargck type "llb" vlong
  180. #pragma varargck type "lld" uvlong
  181. #pragma varargck type "llo" uvlong
  182. #pragma varargck type "llx" uvlong
  183. #pragma varargck type "llb" uvlong
  184. #pragma varargck type "ld" long
  185. #pragma varargck type "lo" long
  186. #pragma varargck type "lx" long
  187. #pragma varargck type "lb" long
  188. #pragma varargck type "ld" ulong
  189. #pragma varargck type "lo" ulong
  190. #pragma varargck type "lx" ulong
  191. #pragma varargck type "lb" ulong
  192. #pragma varargck type "d" int
  193. #pragma varargck type "o" int
  194. #pragma varargck type "x" int
  195. #pragma varargck type "c" int
  196. #pragma varargck type "C" int
  197. #pragma varargck type "b" int
  198. #pragma varargck type "d" uint
  199. #pragma varargck type "x" uint
  200. #pragma varargck type "c" uint
  201. #pragma varargck type "C" uint
  202. #pragma varargck type "b" uint
  203. #pragma varargck type "f" double
  204. #pragma varargck type "e" double
  205. #pragma varargck type "g" double
  206. #pragma varargck type "s" char*
  207. #pragma varargck type "q" char*
  208. #pragma varargck type "S" Rune*
  209. #pragma varargck type "Q" Rune*
  210. #pragma varargck type "r" void
  211. #pragma varargck type "%" void
  212. #pragma varargck type "n" int*
  213. #pragma varargck type "p" ulong /* uintptr */
  214. #pragma varargck type "p" void*
  215. #pragma varargck flag ','
  216. #pragma varargck flag ' '
  217. #pragma varargck flag 'h'
  218. #pragma varargck type "<" void*
  219. #pragma varargck type "[" void*
  220. #pragma varargck type "H" void*
  221. #pragma varargck type "lH" void*