Introduction
Introduction Statistics Contact Development Disclaimer Help
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_ */
You are viewing proxied material from suckless.org. 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.