libc.h - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
libc.h (24860B) | |
--- | |
1 /* | |
2 * Lib9 is miscellany from the Plan 9 C library that doesn't | |
3 * fit into libutf or into libfmt, but is still missing from traditional | |
4 * Unix C libraries. | |
5 */ | |
6 #ifndef _LIBC_H_ | |
7 #define _LIBC_H_ 1 | |
8 #if defined(__cplusplus) | |
9 extern "C" { | |
10 #endif | |
11 | |
12 #include <utf.h> | |
13 #include <fmt.h> | |
14 | |
15 /* | |
16 * Begin usual libc.h | |
17 */ | |
18 | |
19 #ifndef nil | |
20 #define nil ((void*)0) | |
21 #endif | |
22 #define nelem(x) (sizeof(x)/sizeof((x)[0])) | |
23 | |
24 #ifndef offsetof | |
25 #define offsetof(s, m) (ulong)(&(((s*)0)->m)) | |
26 #endif | |
27 | |
28 /* | |
29 * mem routines (provided by system <string.h>) | |
30 * | |
31 extern void* memccpy(void*, void*, int, ulong); | |
32 extern void* memset(void*, int, ulong); | |
33 extern int memcmp(void*, void*, ulong); | |
34 extern void* memcpy(void*, void*, ulong); | |
35 extern void* memmove(void*, void*, ulong); | |
36 extern void* memchr(void*, int, ulong); | |
37 */ | |
38 | |
39 /* | |
40 * string routines (provided by system <string.h>) | |
41 * | |
42 extern char* strcat(char*, char*); | |
43 extern char* strchr(char*, int); | |
44 extern int strcmp(char*, char*); | |
45 extern char* strcpy(char*, char*); | |
46 */ | |
47 extern char* strecpy(char*, char*, char*); | |
48 extern char* p9strdup(char*); | |
49 /* | |
50 extern char* strncat(char*, char*, long); | |
51 extern char* strncpy(char*, char*, long); | |
52 extern int strncmp(char*, char*, long); | |
53 extern char* strpbrk(char*, char*); | |
54 extern char* strrchr(char*, int); | |
55 extern char* strtok(char*, char*); | |
56 extern long strlen(char*); | |
57 extern long strspn(char*, char*); | |
58 extern long strcspn(char*, char*); | |
59 extern char* strstr(char*, char*); | |
60 */ | |
61 extern int cistrncmp(char*, char*, int); | |
62 extern int cistrcmp(char*, char*); | |
63 extern char* cistrstr(char*, char*); | |
64 extern int tokenize(char*, char**, int); | |
65 | |
66 /* | |
67 enum | |
68 { | |
69 UTFmax = 4, | |
70 Runesync = 0x80, | |
71 Runeself = 0x80, | |
72 Runeerror = 0xFFFD, | |
73 Runemax = 0x10FFFF, | |
74 }; | |
75 */ | |
76 | |
77 /* | |
78 * rune routines (provided by <utf.h> | |
79 * | |
80 extern int runetochar(char*, Rune*); | |
81 extern int chartorune(Rune*, char*); | |
82 extern int runelen(long); | |
83 extern int runenlen(Rune*, int); | |
84 extern int fullrune(char*, int); | |
85 extern int utflen(char*); | |
86 extern int utfnlen(char*, long); | |
87 extern char* utfrune(char*, long); | |
88 extern char* utfrrune(char*, long); | |
89 extern char* utfutf(char*, char*); | |
90 extern char* utfecpy(char*, char*, char*); | |
91 | |
92 extern Rune* runestrcat(Rune*, Rune*); | |
93 extern Rune* runestrchr(Rune*, Rune); | |
94 extern int runestrcmp(Rune*, Rune*); | |
95 extern Rune* runestrcpy(Rune*, Rune*); | |
96 extern Rune* runestrncpy(Rune*, Rune*, long); | |
97 extern Rune* runestrecpy(Rune*, Rune*, Rune*); | |
98 extern Rune* runestrdup(Rune*); | |
99 extern Rune* runestrncat(Rune*, Rune*, long); | |
100 extern int runestrncmp(Rune*, Rune*, long); | |
101 extern Rune* runestrrchr(Rune*, Rune); | |
102 extern long runestrlen(Rune*); | |
103 extern Rune* runestrstr(Rune*, Rune*); | |
104 | |
105 extern Rune tolowerrune(Rune); | |
106 extern Rune totitlerune(Rune); | |
107 extern Rune toupperrune(Rune); | |
108 extern int isalpharune(Rune); | |
109 extern int islowerrune(Rune); | |
110 extern int isspacerune(Rune); | |
111 extern int istitlerune(Rune); | |
112 extern int isupperrune(Rune); | |
113 */ | |
114 | |
115 /* | |
116 * malloc (provied by system <stdlib.h>) | |
117 * | |
118 extern void* malloc(ulong); | |
119 */ | |
120 extern void* p9malloc(ulong); | |
121 extern void* mallocz(ulong, int); | |
122 extern void p9free(void*); | |
123 extern void* p9calloc(ulong, ulong); | |
124 extern void* p9realloc(void*, ulong); | |
125 extern void setmalloctag(void*, ulong); | |
126 extern void setrealloctag(void*, ulong); | |
127 extern ulong getmalloctag(void*); | |
128 extern ulong getrealloctag(void*); | |
129 /* | |
130 extern void* malloctopoolblock(void*); | |
131 */ | |
132 #ifndef NOPLAN9DEFINES | |
133 #define malloc p9malloc | |
134 #define realloc p9realloc | |
135 #define calloc p9calloc | |
136 #define free p9free | |
137 #undef strdup | |
138 #define strdup p9strdup | |
139 #endif | |
140 | |
141 /* | |
142 * print routines (provided by <fmt.h>) | |
143 * | |
144 typedef struct Fmt Fmt; | |
145 struct Fmt{ | |
146 uchar runes; | |
147 void *start; | |
148 void *to; | |
149 void *stop; | |
150 int (*flush)(Fmt *); | |
151 void *farg; | |
152 int nfmt; | |
153 va_list args; | |
154 int r; | |
155 int width; | |
156 int prec; | |
157 ulong flags; | |
158 }; | |
159 | |
160 enum{ | |
161 FmtWidth = 1, | |
162 FmtLeft = FmtWidth << 1, | |
163 FmtPrec = FmtLeft << 1, | |
164 FmtSharp = FmtPrec << 1, | |
165 FmtSpace = FmtSharp << 1, | |
166 FmtSign = FmtSpace << 1, | |
167 FmtZero = FmtSign << 1, | |
168 FmtUnsigned = FmtZero << 1, | |
169 FmtShort = FmtUnsigned << 1, | |
170 FmtLong = FmtShort << 1, | |
171 FmtVLong = FmtLong << 1, | |
172 FmtComma = FmtVLong << 1, | |
173 FmtByte = FmtComma << 1, | |
174 | |
175 FmtFlag = FmtByte << 1 | |
176 }; | |
177 | |
178 extern int print(char*, ...); | |
179 extern char* seprint(char*, char*, char*, ...); | |
180 extern char* vseprint(char*, char*, char*, va_list); | |
181 extern int snprint(char*, int, char*, ...); | |
182 extern int vsnprint(char*, int, char*, va_list); | |
183 extern char* smprint(char*, ...); | |
184 extern char* vsmprint(char*, va_list); | |
185 extern int sprint(char*, char*, ...); | |
186 extern int fprint(int, char*, ...); | |
187 extern int vfprint(int, char*, va_list); | |
188 | |
189 extern int runesprint(Rune*, char*, ...); | |
190 extern int runesnprint(Rune*, int, char*, ...); | |
191 extern int runevsnprint(Rune*, int, char*, va_list); | |
192 extern Rune* runeseprint(Rune*, Rune*, char*, ...); | |
193 extern Rune* runevseprint(Rune*, Rune*, char*, va_list); | |
194 extern Rune* runesmprint(char*, ...); | |
195 extern Rune* runevsmprint(char*, va_list); | |
196 | |
197 extern int fmtfdinit(Fmt*, int, char*, int); | |
198 extern int fmtfdflush(Fmt*); | |
199 extern int fmtstrinit(Fmt*); | |
200 extern char* fmtstrflush(Fmt*); | |
201 extern int runefmtstrinit(Fmt*); | |
202 extern Rune* runefmtstrflush(Fmt*); | |
203 | |
204 extern int fmtinstall(int, int (*)(Fmt*)); | |
205 extern int dofmt(Fmt*, char*); | |
206 extern int dorfmt(Fmt*, Rune*); | |
207 extern int fmtprint(Fmt*, char*, ...); | |
208 extern int fmtvprint(Fmt*, char*, va_list); | |
209 extern int fmtrune(Fmt*, int); | |
210 extern int fmtstrcpy(Fmt*, char*); | |
211 extern int fmtrunestrcpy(Fmt*, Rune*); | |
212 */ | |
213 | |
214 /* | |
215 * error string for %r | |
216 * supplied on per os basis, not part of fmt library | |
217 * | |
218 * (provided by lib9, but declared in fmt.h) | |
219 * | |
220 extern int errfmt(Fmt *f); | |
221 */ | |
222 | |
223 /* | |
224 * quoted strings | |
225 */ | |
226 extern char *unquotestrdup(char*); | |
227 extern Rune *unquoterunestrdup(Rune*); | |
228 extern char *quotestrdup(char*); | |
229 extern Rune *quoterunestrdup(Rune*); | |
230 /* | |
231 * in fmt.h | |
232 * | |
233 extern void quotefmtinstall(void); | |
234 extern int quotestrfmt(Fmt*); | |
235 extern int quoterunestrfmt(Fmt*); | |
236 */ | |
237 #ifndef NOPLAN9DEFINES | |
238 #define doquote fmtdoquote | |
239 #endif | |
240 extern int needsrcquote(int); | |
241 | |
242 /* | |
243 * random number | |
244 */ | |
245 extern void p9srand(long); | |
246 extern int p9rand(void); | |
247 | |
248 extern int p9nrand(int); | |
249 extern long p9lrand(void); | |
250 extern long p9lnrand(long); | |
251 extern double p9frand(void); | |
252 extern ulong truerand(void); /* use… | |
253 extern ulong ntruerand(ulong); /* uses /dev… | |
254 | |
255 #ifndef NOPLAN9DEFINES | |
256 #define srand p9srand | |
257 #define rand p9rand | |
258 #define nrand p9nrand | |
259 #define lrand p9lrand | |
260 #define lnrand p9lnrand | |
261 #define frand p9frand | |
262 #endif | |
263 | |
264 /* | |
265 * math | |
266 */ | |
267 extern ulong getfcr(void); | |
268 extern void setfsr(ulong); | |
269 extern ulong getfsr(void); | |
270 extern void setfcr(ulong); | |
271 extern double NaN(void); | |
272 extern double Inf(int); | |
273 extern int isNaN(double); | |
274 extern int isInf(double, int); | |
275 extern ulong umuldiv(ulong, ulong, ulong); | |
276 extern long muldiv(long, long, long); | |
277 | |
278 /* | |
279 * provided by math.h | |
280 * | |
281 extern double pow(double, double); | |
282 extern double atan2(double, double); | |
283 extern double fabs(double); | |
284 extern double atan(double); | |
285 extern double log(double); | |
286 extern double log10(double); | |
287 extern double exp(double); | |
288 extern double floor(double); | |
289 extern double ceil(double); | |
290 extern double hypot(double, double); | |
291 extern double sin(double); | |
292 extern double cos(double); | |
293 extern double tan(double); | |
294 extern double asin(double); | |
295 extern double acos(double); | |
296 extern double sinh(double); | |
297 extern double cosh(double); | |
298 extern double tanh(double); | |
299 extern double sqrt(double); | |
300 extern double fmod(double, double); | |
301 #define HUGE 3.4028234e38 | |
302 #define PIO2 1.570796326794896619231e0 | |
303 #define PI (PIO2+PIO2) | |
304 */ | |
305 #define PI M_PI | |
306 #define PIO2 M_PI_2 | |
307 | |
308 /* | |
309 * Time-of-day | |
310 */ | |
311 | |
312 typedef | |
313 struct Tm | |
314 { | |
315 int sec; | |
316 int min; | |
317 int hour; | |
318 int mday; | |
319 int mon; | |
320 int year; | |
321 int wday; | |
322 int yday; | |
323 char zone[4]; | |
324 int tzoff; | |
325 } Tm; | |
326 | |
327 extern Tm* p9gmtime(long); | |
328 extern Tm* p9localtime(long); | |
329 extern char* p9asctime(Tm*); | |
330 extern char* p9ctime(long); | |
331 extern double p9cputime(void); | |
332 extern long p9times(long*); | |
333 extern long p9tm2sec(Tm*); | |
334 extern vlong p9nsec(void); | |
335 | |
336 #ifndef NOPLAN9DEFINES | |
337 /* Clear some declarations to avoid conflicts in edge situation. | |
338 * uClibc based systems have this issue. | |
339 */ | |
340 #undef gmtime | |
341 #undef localtime | |
342 #undef asctime | |
343 #undef ctime | |
344 #define gmtime p9gmtime | |
345 #define localtime p9localtime | |
346 #define asctime p9asctime | |
347 #define ctime p9ctime | |
348 #define cputime p9cputime | |
349 #define times p9times | |
350 #define tm2sec p9tm2sec | |
351 #define nsec p9nsec | |
352 #endif | |
353 | |
354 /* | |
355 * one-of-a-kind | |
356 */ | |
357 enum | |
358 { | |
359 PNPROC = 1, | |
360 PNGROUP = 2 | |
361 }; | |
362 | |
363 /* extern int abs(int); <stdlib.h> */ | |
364 extern int p9atexit(void(*)(void)); | |
365 extern void p9atexitdont(void(*)(void)); | |
366 extern int atnotify(int(*)(void*, char*), int); | |
367 /* | |
368 * <stdlib.h> | |
369 extern double atof(char*); <stdlib.h> | |
370 */ | |
371 extern int p9atoi(char*); | |
372 extern long p9atol(char*); | |
373 extern vlong p9atoll(char*); | |
374 extern double fmtcharstod(int(*)(void*), void*); | |
375 extern char* cleanname(char*); | |
376 extern int p9decrypt(void*, void*, int); | |
377 extern int p9encrypt(void*, void*, int); | |
378 extern int netcrypt(void*, void*); | |
379 extern int dec64(uchar*, int, char*, int); | |
380 extern int enc64(char*, int, uchar*, int); | |
381 extern int dec32(uchar*, int, char*, int); | |
382 extern int enc32(char*, int, uchar*, int); | |
383 extern int dec16(uchar*, int, char*, int); | |
384 extern int enc16(char*, int, uchar*, int); | |
385 extern int encodefmt(Fmt*); | |
386 extern int dirmodefmt(Fmt*); | |
387 extern int exitcode(char*); | |
388 extern void exits(char*); | |
389 extern double frexp(double, int*); | |
390 extern ulong getcallerpc(void*); | |
391 extern char* p9getenv(char*); | |
392 extern int p9putenv(char*, char*); | |
393 extern int getfields(char*, char**, int, int, char*); | |
394 extern int gettokens(char *, char **, int, char *); | |
395 extern char* getuser(void); | |
396 extern char* p9getwd(char*, int); | |
397 extern int iounit(int); | |
398 /* extern long labs(long); <math.h> */ | |
399 /* extern double ldexp(double, int); <math.h> */ | |
400 extern void p9longjmp(p9jmp_buf, int); | |
401 extern char* mktemp(char*); | |
402 extern int opentemp(char*, int); | |
403 /* extern double modf(double, double*); <math.h> */ | |
404 extern void p9notejmp(void*, p9jmp_buf, int); | |
405 extern void perror(const char*); | |
406 extern int postnote(int, int, char *); | |
407 extern double p9pow10(int); | |
408 /* extern int putenv(char*, char*); <stdlib.h. */ | |
409 /* extern void qsort(void*, long, long, int (*)(void*, voi… | |
410 extern char* searchpath(char*); | |
411 /* extern int p9setjmp(p9jmp_buf); */ | |
412 #define p9setjmp(b) sigsetjmp((void*)(b), 1) | |
413 /* | |
414 * <stdlib.h> | |
415 extern long strtol(char*, char**, int); | |
416 extern ulong strtoul(char*, char**, int); | |
417 extern vlong strtoll(char*, char**, int); | |
418 extern uvlong strtoull(char*, char**, int); | |
419 */ | |
420 extern void sysfatal(char*, ...); | |
421 extern void p9syslog(int, char*, char*, ...); | |
422 extern long p9time(long*); | |
423 /* extern int tolower(int); <ctype.h> */ | |
424 /* extern int toupper(int); <ctype.h> */ | |
425 extern void needstack(int); | |
426 extern char* readcons(char*, char*, int); | |
427 | |
428 extern void (*_pin)(void); | |
429 extern void (*_unpin)(void); | |
430 | |
431 #ifndef NOPLAN9DEFINES | |
432 #define atexit p9atexit | |
433 #define atexitdont p9atexitdont | |
434 #define atoi p9atoi | |
435 #define atol p9atol | |
436 #define atoll p9atoll | |
437 #define encrypt p9encrypt | |
438 #define decrypt p9decrypt | |
439 #define getenv p9getenv | |
440 #define getwd p9getwd | |
441 #undef longjmp | |
442 #define longjmp p9longjmp | |
443 #undef setjmp | |
444 #define setjmp p9setjmp | |
445 #define putenv p9putenv | |
446 #define notejmp p9notejmp | |
447 #define jmp_buf p9jmp_buf | |
448 #define time p9time | |
449 #define pow10 p9pow10 | |
450 #define strtod fmtstrtod | |
451 #define charstod fmtcharstod | |
452 #define syslog p9syslog | |
453 #endif | |
454 | |
455 /* | |
456 * just enough information so that libc can be | |
457 * properly locked without dragging in all of libthread | |
458 */ | |
459 typedef struct _Thread _Thread; | |
460 typedef struct _Threadlist _Threadlist; | |
461 struct _Threadlist | |
462 { | |
463 _Thread *head; | |
464 _Thread *tail; | |
465 }; | |
466 | |
467 extern _Thread *(*threadnow)(void); | |
468 | |
469 /* | |
470 * synchronization | |
471 */ | |
472 typedef struct Lock Lock; | |
473 struct Lock | |
474 { | |
475 #ifdef PLAN9PORT_USING_PTHREADS | |
476 int init; | |
477 pthread_mutex_t mutex; | |
478 #endif | |
479 int held; | |
480 }; | |
481 | |
482 extern void lock(Lock*); | |
483 extern void unlock(Lock*); | |
484 extern int canlock(Lock*); | |
485 extern int (*_lock)(Lock*, int, ulong); | |
486 extern void (*_unlock)(Lock*, ulong); | |
487 | |
488 typedef struct QLock QLock; | |
489 struct QLock | |
490 { | |
491 Lock l; | |
492 _Thread *owner; | |
493 _Threadlist waiting; | |
494 }; | |
495 | |
496 extern void qlock(QLock*); | |
497 extern void qunlock(QLock*); | |
498 extern int canqlock(QLock*); | |
499 extern int (*_qlock)(QLock*, int, ulong); /* do not… | |
500 extern void (*_qunlock)(QLock*, ulong); | |
501 | |
502 typedef struct Rendez Rendez; | |
503 struct Rendez | |
504 { | |
505 QLock *l; | |
506 _Threadlist waiting; | |
507 }; | |
508 | |
509 extern void rsleep(Rendez*); /* unlocks r->l, sleep… | |
510 extern int rwakeup(Rendez*); | |
511 extern int rwakeupall(Rendez*); | |
512 extern void (*_rsleep)(Rendez*, ulong); /* do not u… | |
513 extern int (*_rwakeup)(Rendez*, int, ulong); | |
514 | |
515 typedef struct RWLock RWLock; | |
516 struct RWLock | |
517 { | |
518 Lock l; | |
519 int readers; | |
520 _Thread *writer; | |
521 _Threadlist rwaiting; | |
522 _Threadlist wwaiting; | |
523 }; | |
524 | |
525 extern void rlock(RWLock*); | |
526 extern void runlock(RWLock*); | |
527 extern int canrlock(RWLock*); | |
528 extern void wlock(RWLock*); | |
529 extern void wunlock(RWLock*); | |
530 extern int canwlock(RWLock*); | |
531 extern int (*_rlock)(RWLock*, int, ulong); /* do no… | |
532 extern int (*_wlock)(RWLock*, int, ulong); | |
533 extern void (*_runlock)(RWLock*, ulong); | |
534 extern void (*_wunlock)(RWLock*, ulong); | |
535 | |
536 /* | |
537 * per-process private data | |
538 */ | |
539 extern void** privalloc(void); | |
540 extern void privfree(void**); | |
541 | |
542 /* | |
543 * network dialing | |
544 */ | |
545 #define NETPATHLEN 40 | |
546 extern int p9accept(int, char*); | |
547 extern int p9announce(char*, char*); | |
548 extern int p9dial(char*, char*, char*, int*); | |
549 extern int p9dialparse(char *ds, char **net, char **unixa,… | |
550 extern void p9setnetmtpt(char*, int, char*); | |
551 extern int p9listen(char*, char*); | |
552 extern char* p9netmkaddr(char*, char*, char*); | |
553 extern int p9reject(int, char*, char*); | |
554 | |
555 #ifndef NOPLAN9DEFINES | |
556 #define accept p9accept | |
557 #define announce p9announce | |
558 #define dial p9dial | |
559 #define setnetmtpt p9setnetmtpt | |
560 #define listen p9listen | |
561 #define netmkaddr p9netmkaddr | |
562 #define reject p9reject | |
563 #endif | |
564 | |
565 /* | |
566 * encryption | |
567 */ | |
568 extern int pushssl(int, char*, char*, char*, int*); | |
569 extern int pushtls(int, char*, char*, int, char*, char*); | |
570 | |
571 /* | |
572 * network services | |
573 */ | |
574 typedef struct NetConnInfo NetConnInfo; | |
575 struct NetConnInfo | |
576 { | |
577 char *dir; /* connection directory */ | |
578 char *root; /* network root */ | |
579 char *spec; /* binding spec */ | |
580 char *lsys; /* local system */ | |
581 char *lserv; /* local service */ | |
582 char *rsys; /* remote system */ | |
583 char *rserv; /* remote service */ | |
584 char *laddr; | |
585 char *raddr; | |
586 }; | |
587 extern NetConnInfo* getnetconninfo(char*, int); | |
588 extern void freenetconninfo(NetConnInfo*); | |
589 | |
590 /* | |
591 * system calls | |
592 * | |
593 */ | |
594 #define STATMAX 65535U /* max length of machine-ind… | |
595 #define DIRMAX (sizeof(Dir)+STATMAX) /* max length … | |
596 #define ERRMAX 128 /* max length of error string */ | |
597 | |
598 #define MORDER 0x0003 /* mask for bits defining ord… | |
599 #define MREPL 0x0000 /* mount replaces object */ | |
600 #define MBEFORE 0x0001 /* mount goes before others … | |
601 #define MAFTER 0x0002 /* mount goes after others in… | |
602 #define MCREATE 0x0004 /* permit creation in mounte… | |
603 #define MCACHE 0x0010 /* cache some data */ | |
604 #define MMASK 0x0017 /* all bits on */ | |
605 | |
606 #define OREAD 0 /* open for read */ | |
607 #define OWRITE 1 /* write */ | |
608 #define ORDWR 2 /* read and write */ | |
609 #define OEXEC 3 /* execute, == read but check execu… | |
610 #define OTRUNC 16 /* or'ed in (except for exec), tr… | |
611 #define OCEXEC 32 /* or'ed in, close on exec */ | |
612 #define ORCLOSE 64 /* or'ed in, remove on close */ | |
613 #define ODIRECT 128 /* or'ed in, direct access */ | |
614 #define ONONBLOCK 256 /* or'ed in, non-blocking call */ | |
615 #define OEXCL 0x1000 /* or'ed in, exclusive use (cr… | |
616 #define OLOCK 0x2000 /* or'ed in, lock after openin… | |
617 #define OAPPEND 0x4000 /* or'ed in, append only */ | |
618 | |
619 #define AEXIST 0 /* accessible: exists */ | |
620 #define AEXEC 1 /* execute access */ | |
621 #define AWRITE 2 /* write access */ | |
622 #define AREAD 4 /* read access */ | |
623 | |
624 /* Segattch */ | |
625 #define SG_RONLY 0040 /* read only */ | |
626 #define SG_CEXEC 0100 /* detach on exec */ | |
627 | |
628 #define NCONT 0 /* continue after note */ | |
629 #define NDFLT 1 /* terminate after note */ | |
630 #define NSAVE 2 /* clear note but hold state */ | |
631 #define NRSTR 3 /* restore saved state */ | |
632 | |
633 /* bits in Qid.type */ | |
634 #define QTDIR 0x80 /* type bit for directo… | |
635 #define QTAPPEND 0x40 /* type bit for append only … | |
636 #define QTEXCL 0x20 /* type bit for exclus… | |
637 #define QTMOUNT 0x10 /* type bit for mount… | |
638 #define QTAUTH 0x08 /* type bit for authen… | |
639 #define QTTMP 0x04 /* type bit for non-bac… | |
640 #define QTSYMLINK 0x02 /* type bit for symbolic li… | |
641 #define QTFILE 0x00 /* type bits for plain… | |
642 | |
643 /* bits in Dir.mode */ | |
644 #define DMDIR 0x80000000 /* mode bit for directori… | |
645 #define DMAPPEND 0x40000000 /* mode bit for append only fi… | |
646 #define DMEXCL 0x20000000 /* mode bit for exclusiv… | |
647 #define DMMOUNT 0x10000000 /* mode bit for mounted… | |
648 #define DMAUTH 0x08000000 /* mode bit for authenti… | |
649 #define DMTMP 0x04000000 /* mode bit for non-backe… | |
650 #define DMSYMLINK 0x02000000 /* mode bit for symbolic link… | |
651 #define DMDEVICE 0x00800000 /* mode bit for device file (U… | |
652 #define DMNAMEDPIPE 0x00200000 /* mode bit for named pipe … | |
653 #define DMSOCKET 0x00100000 /* mode bit for socket (Unix, … | |
654 #define DMSETUID 0x00080000 /* mode bit for setuid (Unix, … | |
655 #define DMSETGID 0x00040000 /* mode bit for setgid (Unix, … | |
656 | |
657 #define DMREAD 0x4 /* mode bit for read pe… | |
658 #define DMWRITE 0x2 /* mode bit for write … | |
659 #define DMEXEC 0x1 /* mode bit for execute… | |
660 | |
661 #ifdef RFMEM /* FreeBSD, OpenBSD */ | |
662 #undef RFFDG | |
663 #undef RFNOTEG | |
664 #undef RFPROC | |
665 #undef RFMEM | |
666 #undef RFNOWAIT | |
667 #undef RFCFDG | |
668 #undef RFNAMEG | |
669 #undef RFENVG | |
670 #undef RFCENVG | |
671 #undef RFCFDG | |
672 #undef RFCNAMEG | |
673 #endif | |
674 | |
675 enum | |
676 { | |
677 RFNAMEG = (1<<0), | |
678 RFENVG = (1<<1), | |
679 RFFDG = (1<<2), | |
680 RFNOTEG = (1<<3), | |
681 RFPROC = (1<<4), | |
682 RFMEM = (1<<5), | |
683 RFNOWAIT = (1<<6), | |
684 RFCNAMEG = (1<<10), | |
685 RFCENVG = (1<<11), | |
686 RFCFDG = (1<<12) | |
687 /* RFREND = (1<<13), */ | |
688 /* RFNOMNT = (1<<14) */ | |
689 }; | |
690 | |
691 typedef | |
692 struct Qid | |
693 { | |
694 uvlong path; | |
695 ulong vers; | |
696 uchar type; | |
697 } Qid; | |
698 | |
699 typedef | |
700 struct Dir { | |
701 /* system-modified data */ | |
702 ushort type; /* server type */ | |
703 uint dev; /* server subtype */ | |
704 /* file data */ | |
705 Qid qid; /* unique id from server */ | |
706 ulong mode; /* permissions */ | |
707 ulong atime; /* last read time */ | |
708 ulong mtime; /* last write time */ | |
709 vlong length; /* file length */ | |
710 char *name; /* last element of path */ | |
711 char *uid; /* owner name */ | |
712 char *gid; /* group name */ | |
713 char *muid; /* last modifier name */ | |
714 | |
715 /* 9P2000.u extensions */ | |
716 uint uidnum; /* numeric uid */ | |
717 uint gidnum; /* numeric gid */ | |
718 uint muidnum; /* numeric muid */ | |
719 char *ext; /* extended info */ | |
720 } Dir; | |
721 | |
722 /* keep /sys/src/ape/lib/ap/plan9/sys9.h in sync with this -rsc */ | |
723 typedef | |
724 struct Waitmsg | |
725 { | |
726 int pid; /* of loved one */ | |
727 ulong time[3]; /* of loved one & descendants */ | |
728 char *msg; | |
729 } Waitmsg; | |
730 | |
731 typedef | |
732 struct IOchunk | |
733 { | |
734 void *addr; | |
735 ulong len; | |
736 } IOchunk; | |
737 | |
738 extern void _exits(char*); | |
739 | |
740 extern void abort(void); | |
741 /* extern int access(char*, int); */ | |
742 extern long p9alarm(ulong); | |
743 extern int await(char*, int); | |
744 extern int awaitfor(int, char*, int); | |
745 extern int awaitnohang(char*, int); | |
746 /* extern int bind(char*, char*, int); give up */ | |
747 /* extern int brk(void*); <unistd.h> */ | |
748 extern int p9chdir(char*); | |
749 extern int close(int); | |
750 extern int p9create(char*, int, ulong); | |
751 extern int p9dup(int, int); | |
752 extern int errstr(char*, uint); | |
753 extern int p9exec(char*, char*[]); | |
754 extern int p9execl(char*, ...); | |
755 /* extern int p9fork(void); */ | |
756 extern int p9rfork(int); | |
757 /* not implemented | |
758 extern int fauth(int, char*); | |
759 extern int fstat(int, uchar*, int); | |
760 extern int fwstat(int, uchar*, int); | |
761 extern int fversion(int, int, char*, int); | |
762 extern int mount(int, int, char*, int, char*); | |
763 extern int unmount(char*, char*); | |
764 */ | |
765 extern int noted(int); | |
766 extern int notify(void(*)(void*, char*)); | |
767 extern int noteenable(char*); | |
768 extern int notedisable(char*); | |
769 extern int notifyon(char*); | |
770 extern int notifyoff(char*); | |
771 extern int p9open(char*, int); | |
772 extern int fd2path(int, char*, int); | |
773 extern int p9pipe(int*); | |
774 /* | |
775 * use defs from <unistd.h> | |
776 extern long pread(int, void*, long, vlong); | |
777 extern long preadv(int, IOchunk*, int, vlong); | |
778 extern long pwrite(int, void*, long, vlong); | |
779 extern long pwritev(int, IOchunk*, int, vlong); | |
780 extern long read(int, void*, long); | |
781 */ | |
782 extern long readn(int, void*, long); | |
783 /* extern long readv(int, IOchunk*, int); <unistd.h> */ | |
784 extern int remove(const char*); | |
785 /* extern long oseek(int, long, int); */ | |
786 extern vlong p9seek(int, vlong, int); | |
787 /* give up | |
788 extern long segattach(int, char*, void*, ulong); | |
789 extern int segbrk(void*, void*); | |
790 extern int segdetach(void*); | |
791 extern int segflush(void*, ulong); | |
792 extern int segfree(void*, ulong); | |
793 */ | |
794 extern int p9sleep(long); | |
795 /* extern int stat(char*, uchar*, int); give up */ | |
796 extern Waitmsg* p9wait(void); | |
797 extern Waitmsg* p9waitfor(int); | |
798 extern Waitmsg* waitnohang(void); | |
799 extern int p9waitpid(void); | |
800 /* <unistd.h> | |
801 extern long write(int, void*, long); | |
802 extern long writev(int, IOchunk*, int); | |
803 */ | |
804 extern long p9write(int, void*, long); | |
805 /* extern int wstat(char*, uchar*, int); give up */ | |
806 extern ulong rendezvous(ulong, ulong); | |
807 | |
808 #ifndef NOPLAN9DEFINES | |
809 #define alarm p9alarm | |
810 #define dup p9dup | |
811 #define exec p9exec | |
812 #define execl p9execl | |
813 #define seek p9seek | |
814 #define sleep p9sleep | |
815 #define wait p9wait | |
816 #define waitpid p9waitpid | |
817 /* #define fork p9fork */ | |
818 #define rfork p9rfork | |
819 /* #define access p9access */ | |
820 #define create p9create | |
821 #undef open | |
822 #define open p9open | |
823 #define pipe p9pipe | |
824 #define waitfor p9waitfor | |
825 #define write p9write | |
826 #endif | |
827 | |
828 extern Dir* dirstat(char*); | |
829 extern Dir* dirfstat(int); | |
830 extern int dirwstat(char*, Dir*); | |
831 extern int dirfwstat(int, Dir*); | |
832 extern long dirread(int, Dir**); | |
833 extern void nulldir(Dir*); | |
834 extern long dirreadall(int, Dir**); | |
835 /* extern int getpid(void); <unistd.h> */ | |
836 /* extern int getppid(void); */ | |
837 extern void rerrstr(char*, uint); | |
838 extern char* sysname(void); | |
839 extern void werrstr(char*, ...); | |
840 extern char* getns(void); | |
841 extern char* get9root(void); | |
842 extern char* unsharp(char*); | |
843 extern int sendfd(int, int); | |
844 extern int recvfd(int); | |
845 extern int post9pservice(int, char*, char*); | |
846 extern int chattyfuse; | |
847 | |
848 /* external names that we don't want to step on */ | |
849 #ifndef NOPLAN9DEFINES | |
850 #define main p9main | |
851 #endif | |
852 | |
853 #ifdef VARARGCK | |
854 #pragma varargck type "lld" vlong | |
855 #pragma varargck type "llx" vlong | |
856 #pragma varargck type "lld" uvlong | |
857 #pragma varargck type "llx" uvlong | |
858 #pragma varargck type "ld" long | |
859 #pragma varargck type "lx" long | |
860 #pragma varargck type "ld" ulong | |
861 #pragma varargck type "lx" ulong | |
862 #pragma varargck type "d" int | |
863 #pragma varargck type "x" int | |
864 #pragma varargck type "c" int | |
865 #pragma varargck type "C" int | |
866 #pragma varargck type "d" uint | |
867 #pragma varargck type "x" uint | |
868 #pragma varargck type "c" uint | |
869 #pragma varargck type "C" uint | |
870 #pragma varargck type "f" double | |
871 #pragma varargck type "e" double | |
872 #pragma varargck type "g" double | |
873 #pragma varargck type "lf" long double | |
874 #pragma varargck type "le" long double | |
875 #pragma varargck type "lg" long double | |
876 #pragma varargck type "s" char* | |
877 #pragma varargck type "q" char* | |
878 #pragma varargck type "S" Rune* | |
879 #pragma varargck type "Q" Rune* | |
880 #pragma varargck type "r" void | |
881 #pragma varargck type "%" void | |
882 #pragma varargck type "n" int* | |
883 #pragma varargck type "p" void* | |
884 #pragma varargck type "<" void* | |
885 #pragma varargck type "[" void* | |
886 #pragma varargck type "H" void* | |
887 #pragma varargck type "lH" void* | |
888 | |
889 #pragma varargck flag ' ' | |
890 #pragma varargck flag '#' | |
891 #pragma varargck flag '+' | |
892 #pragma varargck flag ',' | |
893 #pragma varargck flag '-' | |
894 #pragma varargck flag 'u' | |
895 | |
896 #pragma varargck argpos fmtprint 2 | |
897 #pragma varargck argpos fprint 2 | |
898 #pragma varargck argpos print 1 | |
899 #pragma varargck argpos runeseprint 3 | |
900 #pragma varargck argpos runesmprint 1 | |
901 #pragma varargck argpos runesnprint 3 | |
902 #pragma varargck argpos runesprint 2 | |
903 #pragma varargck argpos seprint 3 | |
904 #pragma varargck argpos smprint 1 | |
905 #pragma varargck argpos snprint 3 | |
906 #pragma varargck argpos sprint 2 | |
907 #pragma varargck argpos sysfatal 1 | |
908 #pragma varargck argpos p9syslog 3 | |
909 #pragma varargck argpos werrstr 1 | |
910 #endif | |
911 | |
912 /* compiler directives on plan 9 */ | |
913 #define SET(x) ((x)=0) | |
914 #define USED(x) if(x){}else{} | |
915 #ifdef __GNUC__ | |
916 # if __GNUC__ >= 3 | |
917 # undef USED | |
918 # define USED(x) ((void)(x)) | |
919 # endif | |
920 #endif | |
921 | |
922 /* command line */ | |
923 extern char *argv0; | |
924 extern void __fixargv0(void); | |
925 #define ARGBEGIN for((argv0?0:(argv0=(__fixargv0(),*argv))… | |
926 argv[0] && argv[0][0]=='-' && argv[0][1];\ | |
927 argc--, argv++) {\ | |
928 char *_args, *_argt;\ | |
929 Rune _argc;\ | |
930 _args = &argv[0][1];\ | |
931 if(_args[0]=='-' && _args[1]==0){\ | |
932 argc--; argv++; break;\ | |
933 }\ | |
934 _argc = 0;\ | |
935 while(*_args && (_args += chartorune(&_a… | |
936 switch(_argc) | |
937 #define ARGEND SET(_argt);USED(_argt);USED(_argc);… | |
938 #define ARGF() (_argt=_args, _args="",\ | |
939 (*_argt? _argt: argv[1]? (argc--, *++arg… | |
940 #define EARGF(x) (_argt=_args, _args="",\ | |
941 (*_argt? _argt: argv[1]? (argc--, *++arg… | |
942 | |
943 #define ARGC() _argc | |
944 | |
945 #if defined(__cplusplus) | |
946 } | |
947 #endif | |
948 #endif /* _LIB9_H_ */ |