blob: d16b40436389d9e7533621976ebd95265af1aedb [file] [log] [blame]
Russ Coxc8ae41f2009-08-14 22:49:38 -07001// 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
rsc8ad51792004-03-25 23:03:57 +00005/*
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)
13extern "C" {
rsc3b5a5a62005-01-04 21:17:33 +000014#endif
rscb2cfc4e2003-09-30 17:47:41 +000015
rsc7e8769c2005-11-26 15:38:59 +000016#include <utf.h>
17#include <fmt.h>
18
rsc8ad51792004-03-25 23:03:57 +000019/*
20 * Begin usual libc.h
21 */
22
rscaaa502d2005-03-15 16:12:51 +000023#ifndef nil
rsc8ad51792004-03-25 23:03:57 +000024#define nil ((void*)0)
rscaaa502d2005-03-15 16:12:51 +000025#endif
rsc8ad51792004-03-25 23:03:57 +000026#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 *
35extern void* memccpy(void*, void*, int, ulong);
36extern void* memset(void*, int, ulong);
37extern int memcmp(void*, void*, ulong);
38extern void* memcpy(void*, void*, ulong);
39extern void* memmove(void*, void*, ulong);
40extern void* memchr(void*, int, ulong);
41 */
42
43/*
44 * string routines (provided by system <string.h>)
45 *
46extern char* strcat(char*, char*);
47extern char* strchr(char*, int);
48extern int strcmp(char*, char*);
49extern char* strcpy(char*, char*);
50 */
51extern char* strecpy(char*, char*, char*);
rsc22f3ae22004-06-09 14:25:42 +000052extern char* p9strdup(char*);
53/*
rsc8ad51792004-03-25 23:03:57 +000054extern char* strncat(char*, char*, long);
55extern char* strncpy(char*, char*, long);
56extern int strncmp(char*, char*, long);
57extern char* strpbrk(char*, char*);
58extern char* strrchr(char*, int);
59extern char* strtok(char*, char*);
60extern long strlen(char*);
61extern long strspn(char*, char*);
62extern long strcspn(char*, char*);
63extern char* strstr(char*, char*);
64 */
65extern int cistrncmp(char*, char*, int);
66extern int cistrcmp(char*, char*);
67extern char* cistrstr(char*, char*);
68extern int tokenize(char*, char**, int);
69
70/*
71enum
72{
Russ Cox9eec0232009-09-13 17:46:46 -040073 UTFmax = 4,
rsc8ad51792004-03-25 23:03:57 +000074 Runesync = 0x80,
75 Runeself = 0x80,
Russ Cox9eec0232009-09-13 17:46:46 -040076 Runeerror = 0xFFFD,
77 Runemax = 0x10FFFF,
rsc8ad51792004-03-25 23:03:57 +000078};
79*/
80
81/*
82 * rune routines (provided by <utf.h>
83 *
84extern int runetochar(char*, Rune*);
85extern int chartorune(Rune*, char*);
86extern int runelen(long);
87extern int runenlen(Rune*, int);
88extern int fullrune(char*, int);
89extern int utflen(char*);
90extern int utfnlen(char*, long);
91extern char* utfrune(char*, long);
92extern char* utfrrune(char*, long);
93extern char* utfutf(char*, char*);
94extern char* utfecpy(char*, char*, char*);
95
96extern Rune* runestrcat(Rune*, Rune*);
97extern Rune* runestrchr(Rune*, Rune);
98extern int runestrcmp(Rune*, Rune*);
99extern Rune* runestrcpy(Rune*, Rune*);
100extern Rune* runestrncpy(Rune*, Rune*, long);
101extern Rune* runestrecpy(Rune*, Rune*, Rune*);
102extern Rune* runestrdup(Rune*);
103extern Rune* runestrncat(Rune*, Rune*, long);
104extern int runestrncmp(Rune*, Rune*, long);
105extern Rune* runestrrchr(Rune*, Rune);
106extern long runestrlen(Rune*);
107extern Rune* runestrstr(Rune*, Rune*);
108
109extern Rune tolowerrune(Rune);
110extern Rune totitlerune(Rune);
111extern Rune toupperrune(Rune);
112extern int isalpharune(Rune);
113extern int islowerrune(Rune);
114extern int isspacerune(Rune);
115extern int istitlerune(Rune);
116extern int isupperrune(Rune);
117 */
118
119/*
120 * malloc (provied by system <stdlib.h>)
121 *
122extern void* malloc(ulong);
123 */
124extern void* p9malloc(ulong);
125extern void* mallocz(ulong, int);
rsc7e0e6522004-05-23 00:58:23 +0000126extern void p9free(void*);
127extern void* p9calloc(ulong, ulong);
128extern void* p9realloc(void*, ulong);
rsc8ad51792004-03-25 23:03:57 +0000129extern void setmalloctag(void*, ulong);
130extern void setrealloctag(void*, ulong);
131extern ulong getmalloctag(void*);
132extern ulong getrealloctag(void*);
133/*
134extern void* malloctopoolblock(void*);
135*/
136#ifndef NOPLAN9DEFINES
137#define malloc p9malloc
rsc7e0e6522004-05-23 00:58:23 +0000138#define realloc p9realloc
139#define calloc p9calloc
140#define free p9free
rsc22f3ae22004-06-09 14:25:42 +0000141#undef strdup
142#define strdup p9strdup
rsc8ad51792004-03-25 23:03:57 +0000143#endif
144
145/*
146 * print routines (provided by <fmt.h>)
147 *
148typedef struct Fmt Fmt;
149struct 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
164enum{
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
182extern int print(char*, ...);
183extern char* seprint(char*, char*, char*, ...);
184extern char* vseprint(char*, char*, char*, va_list);
185extern int snprint(char*, int, char*, ...);
186extern int vsnprint(char*, int, char*, va_list);
187extern char* smprint(char*, ...);
188extern char* vsmprint(char*, va_list);
189extern int sprint(char*, char*, ...);
190extern int fprint(int, char*, ...);
191extern int vfprint(int, char*, va_list);
192
193extern int runesprint(Rune*, char*, ...);
194extern int runesnprint(Rune*, int, char*, ...);
195extern int runevsnprint(Rune*, int, char*, va_list);
196extern Rune* runeseprint(Rune*, Rune*, char*, ...);
197extern Rune* runevseprint(Rune*, Rune*, char*, va_list);
198extern Rune* runesmprint(char*, ...);
199extern Rune* runevsmprint(char*, va_list);
200
201extern int fmtfdinit(Fmt*, int, char*, int);
202extern int fmtfdflush(Fmt*);
203extern int fmtstrinit(Fmt*);
204extern char* fmtstrflush(Fmt*);
205extern int runefmtstrinit(Fmt*);
206extern Rune* runefmtstrflush(Fmt*);
207
208extern int fmtinstall(int, int (*)(Fmt*));
209extern int dofmt(Fmt*, char*);
210extern int dorfmt(Fmt*, Rune*);
211extern int fmtprint(Fmt*, char*, ...);
212extern int fmtvprint(Fmt*, char*, va_list);
213extern int fmtrune(Fmt*, int);
214extern int fmtstrcpy(Fmt*, char*);
215extern 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 *
224extern int errfmt(Fmt *f);
225 */
226
227/*
228 * quoted strings
229 */
230extern char *unquotestrdup(char*);
231extern Rune *unquoterunestrdup(Rune*);
232extern char *quotestrdup(char*);
233extern Rune *quoterunestrdup(Rune*);
234/*
235 * in fmt.h
236 *
237extern void quotefmtinstall(void);
238extern int quotestrfmt(Fmt*);
239extern int quoterunestrfmt(Fmt*);
240 */
241#ifndef NOPLAN9DEFINES
242#define doquote fmtdoquote
243#endif
244extern int needsrcquote(int);
245
246/*
rsc3b5a5a62005-01-04 21:17:33 +0000247 * random number
wkj62397982004-12-29 01:33:33 +0000248 */
rsc3b5a5a62005-01-04 21:17:33 +0000249extern void p9srand(long);
250extern int p9rand(void);
wkj62397982004-12-29 01:33:33 +0000251
rsc3b5a5a62005-01-04 21:17:33 +0000252extern int p9nrand(int);
253extern long p9lrand(void);
254extern long p9lnrand(long);
255extern double p9frand(void);
rsc8ad51792004-03-25 23:03:57 +0000256extern ulong truerand(void); /* uses /dev/random */
257extern ulong ntruerand(ulong); /* uses /dev/random */
258
rsc3b5a5a62005-01-04 21:17:33 +0000259#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
rsc8ad51792004-03-25 23:03:57 +0000268/*
269 * math
270 */
271extern ulong getfcr(void);
272extern void setfsr(ulong);
273extern ulong getfsr(void);
274extern void setfcr(ulong);
275extern double NaN(void);
276extern double Inf(int);
277extern int isNaN(double);
278extern int isInf(double, int);
279extern ulong umuldiv(ulong, ulong, ulong);
280extern long muldiv(long, long, long);
281
282/*
283 * provided by math.h
284 *
285extern double pow(double, double);
286extern double atan2(double, double);
287extern double fabs(double);
288extern double atan(double);
289extern double log(double);
290extern double log10(double);
291extern double exp(double);
292extern double floor(double);
293extern double ceil(double);
294extern double hypot(double, double);
295extern double sin(double);
296extern double cos(double);
297extern double tan(double);
298extern double asin(double);
299extern double acos(double);
300extern double sinh(double);
301extern double cosh(double);
302extern double tanh(double);
303extern double sqrt(double);
304extern 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
316typedef
317struct 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
331extern Tm* p9gmtime(long);
332extern Tm* p9localtime(long);
333extern char* p9asctime(Tm*);
334extern char* p9ctime(long);
335extern double p9cputime(void);
336extern long p9times(long*);
337extern long p9tm2sec(Tm*);
338extern 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 */
354enum
355{
356 PNPROC = 1,
rsccbeb0b22006-04-01 19:24:03 +0000357 PNGROUP = 2
rsc8ad51792004-03-25 23:03:57 +0000358};
359
360/* extern int abs(int); <stdlib.h> */
361extern int p9atexit(void(*)(void));
362extern void p9atexitdont(void(*)(void));
363extern int atnotify(int(*)(void*, char*), int);
364/*
365 * <stdlib.h>
366extern double atof(char*); <stdlib.h>
rsc8ad51792004-03-25 23:03:57 +0000367 */
rsca67406e2004-04-08 19:31:48 +0000368extern int p9atoi(char*);
369extern long p9atol(char*);
370extern vlong p9atoll(char*);
rscc8b63422005-01-13 04:49:19 +0000371extern double fmtcharstod(int(*)(void*), void*);
rsc8ad51792004-03-25 23:03:57 +0000372extern char* cleanname(char*);
rscafe82ee2005-02-08 21:03:48 +0000373extern int p9decrypt(void*, void*, int);
374extern int p9encrypt(void*, void*, int);
rscce2a3782005-02-10 16:08:16 +0000375extern int netcrypt(void*, void*);
rsc8ad51792004-03-25 23:03:57 +0000376extern int dec64(uchar*, int, char*, int);
377extern int enc64(char*, int, uchar*, int);
378extern int dec32(uchar*, int, char*, int);
379extern int enc32(char*, int, uchar*, int);
380extern int dec16(uchar*, int, char*, int);
381extern int enc16(char*, int, uchar*, int);
382extern int encodefmt(Fmt*);
383extern int dirmodefmt(Fmt*);
rsceadb18a2006-02-12 19:40:55 +0000384extern int exitcode(char*);
rsc8ad51792004-03-25 23:03:57 +0000385extern void exits(char*);
386extern double frexp(double, int*);
387extern ulong getcallerpc(void*);
388extern char* p9getenv(char*);
389extern int p9putenv(char*, char*);
390extern int getfields(char*, char**, int, int, char*);
391extern int gettokens(char *, char **, int, char *);
392extern char* getuser(void);
393extern char* p9getwd(char*, int);
394extern int iounit(int);
395/* extern long labs(long); <math.h> */
396/* extern double ldexp(double, int); <math.h> */
397extern void p9longjmp(p9jmp_buf, int);
398extern char* mktemp(char*);
Russ Coxa58a8272008-07-10 11:10:10 -0400399extern int opentemp(char*, int);
rsc8ad51792004-03-25 23:03:57 +0000400/* extern double modf(double, double*); <math.h> */
rsc8ad51792004-03-25 23:03:57 +0000401extern void p9notejmp(void*, p9jmp_buf, int);
402extern void perror(const char*);
403extern int postnote(int, int, char *);
rscbe36ff62004-04-29 17:13:24 +0000404extern double p9pow10(int);
rsc8ad51792004-03-25 23:03:57 +0000405/* extern int putenv(char*, char*); <stdlib.h. */
406/* extern void qsort(void*, long, long, int (*)(void*, void*)); <stdlib.h> */
rsc4a623712005-01-23 22:33:59 +0000407extern char* searchpath(char*);
rsc8ad51792004-03-25 23:03:57 +0000408/* extern int p9setjmp(p9jmp_buf); */
409#define p9setjmp(b) sigsetjmp((void*)(b), 1)
410/*
411 * <stdlib.h>
rsc8ad51792004-03-25 23:03:57 +0000412extern long strtol(char*, char**, int);
413extern ulong strtoul(char*, char**, int);
414extern vlong strtoll(char*, char**, int);
415extern uvlong strtoull(char*, char**, int);
416 */
417extern void sysfatal(char*, ...);
rscce2a3782005-02-10 16:08:16 +0000418extern void p9syslog(int, char*, char*, ...);
rsc8ad51792004-03-25 23:03:57 +0000419extern long p9time(long*);
420/* extern int tolower(int); <ctype.h> */
421/* extern int toupper(int); <ctype.h> */
rsccf10d092004-04-21 23:34:46 +0000422extern void needstack(int);
rscce2a3782005-02-10 16:08:16 +0000423extern char* readcons(char*, char*, int);
rsccf10d092004-04-21 23:34:46 +0000424
rscdf970452006-06-26 05:47:59 +0000425extern void (*_pin)(void);
426extern void (*_unpin)(void);
427
rsc8ad51792004-03-25 23:03:57 +0000428#ifndef NOPLAN9DEFINES
429#define atexit p9atexit
430#define atexitdont p9atexitdont
rsca67406e2004-04-08 19:31:48 +0000431#define atoi p9atoi
432#define atol p9atol
433#define atoll p9atoll
rsc8ad51792004-03-25 23:03:57 +0000434#define encrypt p9encrypt
435#define decrypt p9decrypt
436#define getenv p9getenv
437#define getwd p9getwd
438#define longjmp p9longjmp
439#undef setjmp
440#define setjmp p9setjmp
441#define putenv p9putenv
442#define notejmp p9notejmp
443#define jmp_buf p9jmp_buf
rsc8ad51792004-03-25 23:03:57 +0000444#define time p9time
rscbe36ff62004-04-29 17:13:24 +0000445#define pow10 p9pow10
rscc8b63422005-01-13 04:49:19 +0000446#define strtod fmtstrtod
447#define charstod fmtcharstod
rscce2a3782005-02-10 16:08:16 +0000448#define syslog p9syslog
rsc8ad51792004-03-25 23:03:57 +0000449#endif
450
451/*
rsc3286afd2004-12-25 22:00:11 +0000452 * just enough information so that libc can be
453 * properly locked without dragging in all of libthread
454 */
455typedef struct _Thread _Thread;
456typedef struct _Threadlist _Threadlist;
457struct _Threadlist
458{
459 _Thread *head;
460 _Thread *tail;
461};
462
463extern _Thread *(*threadnow)(void);
464
465/*
rsc8ad51792004-03-25 23:03:57 +0000466 * synchronization
467 */
rsc06bb4ed2004-09-17 00:38:29 +0000468typedef struct Lock Lock;
469struct Lock
470{
rsc3286afd2004-12-25 22:00:11 +0000471#ifdef PLAN9PORT_USING_PTHREADS
rsc06bb4ed2004-09-17 00:38:29 +0000472 int init;
473 pthread_mutex_t mutex;
rsc06bb4ed2004-09-17 00:38:29 +0000474#endif
rsc3286afd2004-12-25 22:00:11 +0000475 int held;
rsc06bb4ed2004-09-17 00:38:29 +0000476};
rsc8ad51792004-03-25 23:03:57 +0000477
478extern void lock(Lock*);
479extern void unlock(Lock*);
480extern int canlock(Lock*);
rsc3286afd2004-12-25 22:00:11 +0000481extern int (*_lock)(Lock*, int, ulong);
482extern void (*_unlock)(Lock*, ulong);
rsc8ad51792004-03-25 23:03:57 +0000483
rsc3286afd2004-12-25 22:00:11 +0000484typedef struct QLock QLock;
rsc8ad51792004-03-25 23:03:57 +0000485struct QLock
486{
rsc3286afd2004-12-25 22:00:11 +0000487 Lock l;
488 _Thread *owner;
489 _Threadlist waiting;
490};
rsc8ad51792004-03-25 23:03:57 +0000491
492extern void qlock(QLock*);
493extern void qunlock(QLock*);
494extern int canqlock(QLock*);
rsc3286afd2004-12-25 22:00:11 +0000495extern int (*_qlock)(QLock*, int, ulong); /* do not use */
496extern void (*_qunlock)(QLock*, ulong);
rsc8ad51792004-03-25 23:03:57 +0000497
rsc3286afd2004-12-25 22:00:11 +0000498typedef struct Rendez Rendez;
499struct Rendez
500{
501 QLock *l;
502 _Threadlist waiting;
503};
504
505extern void rsleep(Rendez*); /* unlocks r->l, sleeps, locks r->l again */
506extern int rwakeup(Rendez*);
507extern int rwakeupall(Rendez*);
508extern void (*_rsleep)(Rendez*, ulong); /* do not use */
509extern int (*_rwakeup)(Rendez*, int, ulong);
510
511typedef struct RWLock RWLock;
rsc8ad51792004-03-25 23:03:57 +0000512struct RWLock
513{
rsc3286afd2004-12-25 22:00:11 +0000514 Lock l;
515 int readers;
516 _Thread *writer;
517 _Threadlist rwaiting;
518 _Threadlist wwaiting;
519};
rsc8ad51792004-03-25 23:03:57 +0000520
521extern void rlock(RWLock*);
522extern void runlock(RWLock*);
523extern int canrlock(RWLock*);
524extern void wlock(RWLock*);
525extern void wunlock(RWLock*);
526extern int canwlock(RWLock*);
rsc3286afd2004-12-25 22:00:11 +0000527extern int (*_rlock)(RWLock*, int, ulong); /* do not use */
528extern int (*_wlock)(RWLock*, int, ulong);
529extern void (*_runlock)(RWLock*, ulong);
530extern void (*_wunlock)(RWLock*, ulong);
rsc8ad51792004-03-25 23:03:57 +0000531
rsc3286afd2004-12-25 22:00:11 +0000532/*
533 * per-process private data
534 */
rsc8ad51792004-03-25 23:03:57 +0000535extern void** privalloc(void);
536extern void privfree(void**);
537
538/*
539 * network dialing
540 */
541#define NETPATHLEN 40
542extern int p9accept(int, char*);
543extern int p9announce(char*, char*);
544extern int p9dial(char*, char*, char*, int*);
rsc819822c2004-06-16 16:45:22 +0000545extern int p9dialparse(char *ds, char **net, char **unixa, u32int *ip, int *port);
rsc8ad51792004-03-25 23:03:57 +0000546extern void p9setnetmtpt(char*, int, char*);
rsc8ad51792004-03-25 23:03:57 +0000547extern int p9listen(char*, char*);
548extern char* p9netmkaddr(char*, char*, char*);
549extern int p9reject(int, char*, char*);
550
551#ifndef NOPLAN9DEFINES
552#define accept p9accept
553#define announce p9announce
554#define dial p9dial
555#define setnetmtpt p9setnetmtpt
rsc8ad51792004-03-25 23:03:57 +0000556#define listen p9listen
557#define netmkaddr p9netmkaddr
558#define reject p9reject
559#endif
560
561/*
562 * encryption
563 */
564extern int pushssl(int, char*, char*, char*, int*);
565extern int pushtls(int, char*, char*, int, char*, char*);
566
567/*
568 * network services
569 */
570typedef struct NetConnInfo NetConnInfo;
571struct NetConnInfo
572{
573 char *dir; /* connection directory */
574 char *root; /* network root */
575 char *spec; /* binding spec */
576 char *lsys; /* local system */
577 char *lserv; /* local service */
578 char *rsys; /* remote system */
579 char *rserv; /* remote service */
rsc00e0b272005-02-13 18:31:45 +0000580 char *laddr;
581 char *raddr;
rsc8ad51792004-03-25 23:03:57 +0000582};
583extern NetConnInfo* getnetconninfo(char*, int);
584extern void freenetconninfo(NetConnInfo*);
585
586/*
587 * system calls
588 *
589 */
590#define STATMAX 65535U /* max length of machine-independent stat structure */
591#define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */
592#define ERRMAX 128 /* max length of error string */
593
594#define MORDER 0x0003 /* mask for bits defining order of mounting */
595#define MREPL 0x0000 /* mount replaces object */
596#define MBEFORE 0x0001 /* mount goes before others in union directory */
597#define MAFTER 0x0002 /* mount goes after others in union directory */
598#define MCREATE 0x0004 /* permit creation in mounted directory */
599#define MCACHE 0x0010 /* cache some data */
600#define MMASK 0x0017 /* all bits on */
601
602#define OREAD 0 /* open for read */
603#define OWRITE 1 /* write */
604#define ORDWR 2 /* read and write */
605#define OEXEC 3 /* execute, == read but check execute permission */
606#define OTRUNC 16 /* or'ed in (except for exec), truncate file first */
607#define OCEXEC 32 /* or'ed in, close on exec */
608#define ORCLOSE 64 /* or'ed in, remove on close */
rsc3286afd2004-12-25 22:00:11 +0000609#define ODIRECT 128 /* or'ed in, direct access */
rscf91af8a2005-09-13 01:31:48 +0000610#define ONONBLOCK 256 /* or'ed in, non-blocking call */
rsc8ad51792004-03-25 23:03:57 +0000611#define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */
rscd2ffec72004-06-11 14:38:44 +0000612#define OLOCK 0x2000 /* or'ed in, lock after opening */
rscce2a3782005-02-10 16:08:16 +0000613#define OAPPEND 0x4000 /* or'ed in, append only */
rsc8ad51792004-03-25 23:03:57 +0000614
615#define AEXIST 0 /* accessible: exists */
616#define AEXEC 1 /* execute access */
617#define AWRITE 2 /* write access */
618#define AREAD 4 /* read access */
619
620/* Segattch */
621#define SG_RONLY 0040 /* read only */
622#define SG_CEXEC 0100 /* detach on exec */
623
624#define NCONT 0 /* continue after note */
625#define NDFLT 1 /* terminate after note */
626#define NSAVE 2 /* clear note but hold state */
627#define NRSTR 3 /* restore saved state */
628
629/* bits in Qid.type */
630#define QTDIR 0x80 /* type bit for directories */
631#define QTAPPEND 0x40 /* type bit for append only files */
632#define QTEXCL 0x20 /* type bit for exclusive use files */
633#define QTMOUNT 0x10 /* type bit for mounted channel */
634#define QTAUTH 0x08 /* type bit for authentication file */
rscf91af8a2005-09-13 01:31:48 +0000635#define QTTMP 0x04 /* type bit for non-backed-up file */
636#define QTSYMLINK 0x02 /* type bit for symbolic link */
637#define QTFILE 0x00 /* type bits for plain file */
rsc8ad51792004-03-25 23:03:57 +0000638
639/* bits in Dir.mode */
640#define DMDIR 0x80000000 /* mode bit for directories */
641#define DMAPPEND 0x40000000 /* mode bit for append only files */
642#define DMEXCL 0x20000000 /* mode bit for exclusive use files */
643#define DMMOUNT 0x10000000 /* mode bit for mounted channel */
644#define DMAUTH 0x08000000 /* mode bit for authentication file */
rscf91af8a2005-09-13 01:31:48 +0000645#define DMTMP 0x04000000 /* mode bit for non-backed-up file */
646#define DMSYMLINK 0x02000000 /* mode bit for symbolic link (Unix, 9P2000.u) */
647#define DMDEVICE 0x00800000 /* mode bit for device file (Unix, 9P2000.u) */
648#define DMNAMEDPIPE 0x00200000 /* mode bit for named pipe (Unix, 9P2000.u) */
649#define DMSOCKET 0x00100000 /* mode bit for socket (Unix, 9P2000.u) */
rsc57778262006-01-27 03:45:30 +0000650#define DMSETUID 0x00080000 /* mode bit for setuid (Unix, 9P2000.u) */
651#define DMSETGID 0x00040000 /* mode bit for setgid (Unix, 9P2000.u) */
rscce2a3782005-02-10 16:08:16 +0000652
rsc8ad51792004-03-25 23:03:57 +0000653#define DMREAD 0x4 /* mode bit for read permission */
654#define DMWRITE 0x2 /* mode bit for write permission */
655#define DMEXEC 0x1 /* mode bit for execute permission */
656
rsc52e61642005-05-01 18:40:01 +0000657#ifdef RFMEM /* FreeBSD, OpenBSD */
rsc8ad51792004-03-25 23:03:57 +0000658#undef RFFDG
659#undef RFNOTEG
660#undef RFPROC
661#undef RFMEM
662#undef RFNOWAIT
663#undef RFCFDG
664#undef RFNAMEG
665#undef RFENVG
666#undef RFCENVG
667#undef RFCFDG
668#undef RFCNAMEG
669#endif
670
671enum
672{
673 RFNAMEG = (1<<0),
674 RFENVG = (1<<1),
675 RFFDG = (1<<2),
676 RFNOTEG = (1<<3),
677 RFPROC = (1<<4),
678 RFMEM = (1<<5),
679 RFNOWAIT = (1<<6),
680 RFCNAMEG = (1<<10),
681 RFCENVG = (1<<11),
rsccbeb0b22006-04-01 19:24:03 +0000682 RFCFDG = (1<<12)
rsc8ad51792004-03-25 23:03:57 +0000683/* RFREND = (1<<13), */
684/* RFNOMNT = (1<<14) */
685};
686
rsc8ad51792004-03-25 23:03:57 +0000687typedef
688struct Qid
689{
690 uvlong path;
691 ulong vers;
692 uchar type;
693} Qid;
694
695typedef
696struct Dir {
697 /* system-modified data */
698 ushort type; /* server type */
699 uint dev; /* server subtype */
700 /* file data */
701 Qid qid; /* unique id from server */
702 ulong mode; /* permissions */
703 ulong atime; /* last read time */
704 ulong mtime; /* last write time */
705 vlong length; /* file length */
706 char *name; /* last element of path */
707 char *uid; /* owner name */
708 char *gid; /* group name */
709 char *muid; /* last modifier name */
rscf91af8a2005-09-13 01:31:48 +0000710
711 /* 9P2000.u extensions */
712 uint uidnum; /* numeric uid */
713 uint gidnum; /* numeric gid */
714 uint muidnum; /* numeric muid */
715 char *ext; /* extended info */
rsc8ad51792004-03-25 23:03:57 +0000716} Dir;
717
718/* keep /sys/src/ape/lib/ap/plan9/sys9.h in sync with this -rsc */
719typedef
720struct Waitmsg
721{
722 int pid; /* of loved one */
723 ulong time[3]; /* of loved one & descendants */
724 char *msg;
725} Waitmsg;
726
727typedef
728struct IOchunk
729{
730 void *addr;
731 ulong len;
732} IOchunk;
733
734extern void _exits(char*);
735
736extern void abort(void);
rsc924eb642004-03-25 23:30:46 +0000737/* extern int access(char*, int); */
rsc8ad51792004-03-25 23:03:57 +0000738extern long p9alarm(ulong);
739extern int await(char*, int);
rsc03417612004-12-27 19:11:21 +0000740extern int awaitfor(int, char*, int);
rsc8ad51792004-03-25 23:03:57 +0000741extern int awaitnohang(char*, int);
742/* extern int bind(char*, char*, int); give up */
743/* extern int brk(void*); <unistd.h> */
744extern int p9chdir(char*);
745extern int close(int);
746extern int p9create(char*, int, ulong);
747extern int p9dup(int, int);
748extern int errstr(char*, uint);
749extern int p9exec(char*, char*[]);
rsc3b5a5a62005-01-04 21:17:33 +0000750extern int p9execl(char*, ...);
rsc4fbe07e2004-09-23 03:25:29 +0000751/* extern int p9fork(void); */
rsc8ad51792004-03-25 23:03:57 +0000752extern int p9rfork(int);
753/* not implemented
754extern int fauth(int, char*);
755extern int fstat(int, uchar*, int);
756extern int fwstat(int, uchar*, int);
757extern int fversion(int, int, char*, int);
758extern int mount(int, int, char*, int, char*);
759extern int unmount(char*, char*);
760*/
761extern int noted(int);
762extern int notify(void(*)(void*, char*));
rsc10f14b02005-01-16 21:28:44 +0000763extern int noteenable(char*);
764extern int notedisable(char*);
765extern int notifyon(char*);
766extern int notifyoff(char*);
rsc8ad51792004-03-25 23:03:57 +0000767extern int p9open(char*, int);
768extern int fd2path(int, char*, int);
769extern int p9pipe(int*);
770/*
771 * use defs from <unistd.h>
772extern long pread(int, void*, long, vlong);
773extern long preadv(int, IOchunk*, int, vlong);
774extern long pwrite(int, void*, long, vlong);
775extern long pwritev(int, IOchunk*, int, vlong);
776extern long read(int, void*, long);
777 */
778extern long readn(int, void*, long);
779/* extern long readv(int, IOchunk*, int); <unistd.h> */
780extern int remove(const char*);
781/* extern void* sbrk(ulong); <unistd.h> */
782/* extern long oseek(int, long, int); */
783extern vlong p9seek(int, vlong, int);
784/* give up
785extern long segattach(int, char*, void*, ulong);
786extern int segbrk(void*, void*);
787extern int segdetach(void*);
788extern int segflush(void*, ulong);
789extern int segfree(void*, ulong);
790*/
791extern int p9sleep(long);
792/* extern int stat(char*, uchar*, int); give up */
793extern Waitmsg* p9wait(void);
rsc03417612004-12-27 19:11:21 +0000794extern Waitmsg* p9waitfor(int);
rsc8ad51792004-03-25 23:03:57 +0000795extern Waitmsg* waitnohang(void);
796extern int p9waitpid(void);
797/* <unistd.h>
798extern long write(int, void*, long);
799extern long writev(int, IOchunk*, int);
800*/
Russ Coxcab935a2008-07-04 12:38:26 -0400801extern long p9write(int, void*, long);
rsc8ad51792004-03-25 23:03:57 +0000802/* extern int wstat(char*, uchar*, int); give up */
803extern ulong rendezvous(ulong, ulong);
804
805#ifndef NOPLAN9DEFINES
806#define alarm p9alarm
807#define dup p9dup
808#define exec p9exec
rsc3b5a5a62005-01-04 21:17:33 +0000809#define execl p9execl
rsc8ad51792004-03-25 23:03:57 +0000810#define seek p9seek
811#define sleep p9sleep
812#define wait p9wait
813#define waitpid p9waitpid
rsc4fbe07e2004-09-23 03:25:29 +0000814/* #define fork p9fork */
rsc8ad51792004-03-25 23:03:57 +0000815#define rfork p9rfork
rsc924eb642004-03-25 23:30:46 +0000816/* #define access p9access */
rsc8ad51792004-03-25 23:03:57 +0000817#define create p9create
rsc3286afd2004-12-25 22:00:11 +0000818#undef open
rsc8ad51792004-03-25 23:03:57 +0000819#define open p9open
820#define pipe p9pipe
rsc03417612004-12-27 19:11:21 +0000821#define waitfor p9waitfor
Russ Coxcab935a2008-07-04 12:38:26 -0400822#define write p9write
rsc8ad51792004-03-25 23:03:57 +0000823#endif
824
825extern Dir* dirstat(char*);
826extern Dir* dirfstat(int);
827extern int dirwstat(char*, Dir*);
828extern int dirfwstat(int, Dir*);
829extern long dirread(int, Dir**);
830extern void nulldir(Dir*);
831extern long dirreadall(int, Dir**);
832/* extern int getpid(void); <unistd.h> */
833/* extern int getppid(void); */
834extern void rerrstr(char*, uint);
835extern char* sysname(void);
836extern void werrstr(char*, ...);
837extern char* getns(void);
838extern char* get9root(void);
839extern char* unsharp(char*);
840extern int sendfd(int, int);
841extern int recvfd(int);
Russ Cox118dfa92008-05-05 23:07:54 -0400842extern int post9pservice(int, char*, char*);
843extern int chattyfuse;
rsc8ad51792004-03-25 23:03:57 +0000844
845/* external names that we don't want to step on */
846#ifndef NOPLAN9DEFINES
847#define main p9main
848#endif
849
rsc01a1c312005-09-29 06:18:32 +0000850#ifdef VARARGCK
851#pragma varargck type "lld" vlong
852#pragma varargck type "llx" vlong
853#pragma varargck type "lld" uvlong
854#pragma varargck type "llx" uvlong
855#pragma varargck type "ld" long
856#pragma varargck type "lx" long
857#pragma varargck type "ld" ulong
858#pragma varargck type "lx" ulong
859#pragma varargck type "d" int
860#pragma varargck type "x" int
861#pragma varargck type "c" int
862#pragma varargck type "C" int
863#pragma varargck type "d" uint
864#pragma varargck type "x" uint
865#pragma varargck type "c" uint
866#pragma varargck type "C" uint
867#pragma varargck type "f" double
868#pragma varargck type "e" double
869#pragma varargck type "g" double
870#pragma varargck type "lf" long double
871#pragma varargck type "le" long double
872#pragma varargck type "lg" long double
873#pragma varargck type "s" char*
874#pragma varargck type "q" char*
875#pragma varargck type "S" Rune*
876#pragma varargck type "Q" Rune*
877#pragma varargck type "r" void
878#pragma varargck type "%" void
879#pragma varargck type "n" int*
880#pragma varargck type "p" void*
881#pragma varargck type "<" void*
882#pragma varargck type "[" void*
883#pragma varargck type "H" void*
884#pragma varargck type "lH" void*
885
886#pragma varargck flag ' '
887#pragma varargck flag '#'
888#pragma varargck flag '+'
889#pragma varargck flag ','
890#pragma varargck flag '-'
891#pragma varargck flag 'u'
892
893#pragma varargck argpos fmtprint 2
894#pragma varargck argpos fprint 2
895#pragma varargck argpos print 1
896#pragma varargck argpos runeseprint 3
897#pragma varargck argpos runesmprint 1
898#pragma varargck argpos runesnprint 3
899#pragma varargck argpos runesprint 2
900#pragma varargck argpos seprint 3
901#pragma varargck argpos smprint 1
902#pragma varargck argpos snprint 3
903#pragma varargck argpos sprint 2
904#pragma varargck argpos sysfatal 1
rscf49c5cb2005-11-07 02:47:08 +0000905#pragma varargck argpos p9syslog 3
rsc01a1c312005-09-29 06:18:32 +0000906#pragma varargck argpos werrstr 1
907#endif
908
rsc8ad51792004-03-25 23:03:57 +0000909/* compiler directives on plan 9 */
rsc8ad51792004-03-25 23:03:57 +0000910#define SET(x) ((x)=0)
rsc3286afd2004-12-25 22:00:11 +0000911#define USED(x) if(x){}else{}
912#ifdef __GNUC__
913# if __GNUC__ >= 3
914# undef USED
rsc15085f72006-06-26 00:02:52 +0000915# define USED(x) ((void)(x))
rsc3286afd2004-12-25 22:00:11 +0000916# endif
917#endif
rsc8ad51792004-03-25 23:03:57 +0000918
919/* command line */
920extern char *argv0;
921extern void __fixargv0(void);
922#define ARGBEGIN for((argv0?0:(argv0=(__fixargv0(),*argv))),argv++,argc--;\
923 argv[0] && argv[0][0]=='-' && argv[0][1];\
924 argc--, argv++) {\
925 char *_args, *_argt;\
926 Rune _argc;\
927 _args = &argv[0][1];\
928 if(_args[0]=='-' && _args[1]==0){\
929 argc--; argv++; break;\
930 }\
931 _argc = 0;\
932 while(*_args && (_args += chartorune(&_argc, _args)))\
933 switch(_argc)
934#define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc);
935#define ARGF() (_argt=_args, _args="",\
936 (*_argt? _argt: argv[1]? (argc--, *++argv): 0))
937#define EARGF(x) (_argt=_args, _args="",\
938 (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
939
940#define ARGC() _argc
941
942#if defined(__cplusplus)
943}
944#endif
945#endif /* _LIB9_H_ */