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