blob: af4422d17283ad8c56c7b1d61674e9a122be732c [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{
73 UTFmax = 3,
74 Runesync = 0x80,
75 Runeself = 0x80,
76 Runeerror = 0x80,
77};
78*/
79
80/*
81 * rune routines (provided by <utf.h>
82 *
83extern int runetochar(char*, Rune*);
84extern int chartorune(Rune*, char*);
85extern int runelen(long);
86extern int runenlen(Rune*, int);
87extern int fullrune(char*, int);
88extern int utflen(char*);
89extern int utfnlen(char*, long);
90extern char* utfrune(char*, long);
91extern char* utfrrune(char*, long);
92extern char* utfutf(char*, char*);
93extern char* utfecpy(char*, char*, char*);
94
95extern Rune* runestrcat(Rune*, Rune*);
96extern Rune* runestrchr(Rune*, Rune);
97extern int runestrcmp(Rune*, Rune*);
98extern Rune* runestrcpy(Rune*, Rune*);
99extern Rune* runestrncpy(Rune*, Rune*, long);
100extern Rune* runestrecpy(Rune*, Rune*, Rune*);
101extern Rune* runestrdup(Rune*);
102extern Rune* runestrncat(Rune*, Rune*, long);
103extern int runestrncmp(Rune*, Rune*, long);
104extern Rune* runestrrchr(Rune*, Rune);
105extern long runestrlen(Rune*);
106extern Rune* runestrstr(Rune*, Rune*);
107
108extern Rune tolowerrune(Rune);
109extern Rune totitlerune(Rune);
110extern Rune toupperrune(Rune);
111extern int isalpharune(Rune);
112extern int islowerrune(Rune);
113extern int isspacerune(Rune);
114extern int istitlerune(Rune);
115extern int isupperrune(Rune);
116 */
117
118/*
119 * malloc (provied by system <stdlib.h>)
120 *
121extern void* malloc(ulong);
122 */
123extern void* p9malloc(ulong);
124extern void* mallocz(ulong, int);
rsc7e0e6522004-05-23 00:58:23 +0000125extern void p9free(void*);
126extern void* p9calloc(ulong, ulong);
127extern void* p9realloc(void*, ulong);
rsc8ad51792004-03-25 23:03:57 +0000128extern void setmalloctag(void*, ulong);
129extern void setrealloctag(void*, ulong);
130extern ulong getmalloctag(void*);
131extern ulong getrealloctag(void*);
132/*
133extern void* malloctopoolblock(void*);
134*/
135#ifndef NOPLAN9DEFINES
136#define malloc p9malloc
rsc7e0e6522004-05-23 00:58:23 +0000137#define realloc p9realloc
138#define calloc p9calloc
139#define free p9free
rsc22f3ae22004-06-09 14:25:42 +0000140#undef strdup
141#define strdup p9strdup
rsc8ad51792004-03-25 23:03:57 +0000142#endif
143
144/*
145 * print routines (provided by <fmt.h>)
146 *
147typedef struct Fmt Fmt;
148struct Fmt{
149 uchar runes;
150 void *start;
151 void *to;
152 void *stop;
153 int (*flush)(Fmt *);
154 void *farg;
155 int nfmt;
156 va_list args;
157 int r;
158 int width;
159 int prec;
160 ulong flags;
161};
162
163enum{
164 FmtWidth = 1,
165 FmtLeft = FmtWidth << 1,
166 FmtPrec = FmtLeft << 1,
167 FmtSharp = FmtPrec << 1,
168 FmtSpace = FmtSharp << 1,
169 FmtSign = FmtSpace << 1,
170 FmtZero = FmtSign << 1,
171 FmtUnsigned = FmtZero << 1,
172 FmtShort = FmtUnsigned << 1,
173 FmtLong = FmtShort << 1,
174 FmtVLong = FmtLong << 1,
175 FmtComma = FmtVLong << 1,
176 FmtByte = FmtComma << 1,
177
178 FmtFlag = FmtByte << 1
179};
180
181extern int print(char*, ...);
182extern char* seprint(char*, char*, char*, ...);
183extern char* vseprint(char*, char*, char*, va_list);
184extern int snprint(char*, int, char*, ...);
185extern int vsnprint(char*, int, char*, va_list);
186extern char* smprint(char*, ...);
187extern char* vsmprint(char*, va_list);
188extern int sprint(char*, char*, ...);
189extern int fprint(int, char*, ...);
190extern int vfprint(int, char*, va_list);
191
192extern int runesprint(Rune*, char*, ...);
193extern int runesnprint(Rune*, int, char*, ...);
194extern int runevsnprint(Rune*, int, char*, va_list);
195extern Rune* runeseprint(Rune*, Rune*, char*, ...);
196extern Rune* runevseprint(Rune*, Rune*, char*, va_list);
197extern Rune* runesmprint(char*, ...);
198extern Rune* runevsmprint(char*, va_list);
199
200extern int fmtfdinit(Fmt*, int, char*, int);
201extern int fmtfdflush(Fmt*);
202extern int fmtstrinit(Fmt*);
203extern char* fmtstrflush(Fmt*);
204extern int runefmtstrinit(Fmt*);
205extern Rune* runefmtstrflush(Fmt*);
206
207extern int fmtinstall(int, int (*)(Fmt*));
208extern int dofmt(Fmt*, char*);
209extern int dorfmt(Fmt*, Rune*);
210extern int fmtprint(Fmt*, char*, ...);
211extern int fmtvprint(Fmt*, char*, va_list);
212extern int fmtrune(Fmt*, int);
213extern int fmtstrcpy(Fmt*, char*);
214extern int fmtrunestrcpy(Fmt*, Rune*);
215 */
216
217/*
218 * error string for %r
219 * supplied on per os basis, not part of fmt library
220 *
221 * (provided by lib9, but declared in fmt.h)
222 *
223extern int errfmt(Fmt *f);
224 */
225
226/*
227 * quoted strings
228 */
229extern char *unquotestrdup(char*);
230extern Rune *unquoterunestrdup(Rune*);
231extern char *quotestrdup(char*);
232extern Rune *quoterunestrdup(Rune*);
233/*
234 * in fmt.h
235 *
236extern void quotefmtinstall(void);
237extern int quotestrfmt(Fmt*);
238extern int quoterunestrfmt(Fmt*);
239 */
240#ifndef NOPLAN9DEFINES
241#define doquote fmtdoquote
242#endif
243extern int needsrcquote(int);
244
245/*
rsc3b5a5a62005-01-04 21:17:33 +0000246 * random number
wkj62397982004-12-29 01:33:33 +0000247 */
rsc3b5a5a62005-01-04 21:17:33 +0000248extern void p9srand(long);
249extern int p9rand(void);
wkj62397982004-12-29 01:33:33 +0000250
rsc3b5a5a62005-01-04 21:17:33 +0000251extern int p9nrand(int);
252extern long p9lrand(void);
253extern long p9lnrand(long);
254extern double p9frand(void);
rsc8ad51792004-03-25 23:03:57 +0000255extern ulong truerand(void); /* uses /dev/random */
256extern ulong ntruerand(ulong); /* uses /dev/random */
257
rsc3b5a5a62005-01-04 21:17:33 +0000258#ifndef NOPLAN9DEFINES
259#define srand p9srand
260#define rand p9rand
261#define nrand p9nrand
262#define lrand p9lrand
263#define lnrand p9lnrand
264#define frand p9frand
265#endif
266
rsc8ad51792004-03-25 23:03:57 +0000267/*
268 * math
269 */
270extern ulong getfcr(void);
271extern void setfsr(ulong);
272extern ulong getfsr(void);
273extern void setfcr(ulong);
274extern double NaN(void);
275extern double Inf(int);
276extern int isNaN(double);
277extern int isInf(double, int);
278extern ulong umuldiv(ulong, ulong, ulong);
279extern long muldiv(long, long, long);
280
281/*
282 * provided by math.h
283 *
284extern double pow(double, double);
285extern double atan2(double, double);
286extern double fabs(double);
287extern double atan(double);
288extern double log(double);
289extern double log10(double);
290extern double exp(double);
291extern double floor(double);
292extern double ceil(double);
293extern double hypot(double, double);
294extern double sin(double);
295extern double cos(double);
296extern double tan(double);
297extern double asin(double);
298extern double acos(double);
299extern double sinh(double);
300extern double cosh(double);
301extern double tanh(double);
302extern double sqrt(double);
303extern double fmod(double, double);
304#define HUGE 3.4028234e38
305#define PIO2 1.570796326794896619231e0
306#define PI (PIO2+PIO2)
307 */
308#define PI M_PI
309#define PIO2 M_PI_2
310
311/*
312 * Time-of-day
313 */
314
315typedef
316struct Tm
317{
318 int sec;
319 int min;
320 int hour;
321 int mday;
322 int mon;
323 int year;
324 int wday;
325 int yday;
326 char zone[4];
327 int tzoff;
328} Tm;
329
330extern Tm* p9gmtime(long);
331extern Tm* p9localtime(long);
332extern char* p9asctime(Tm*);
333extern char* p9ctime(long);
334extern double p9cputime(void);
335extern long p9times(long*);
336extern long p9tm2sec(Tm*);
337extern vlong p9nsec(void);
338
339#ifndef NOPLAN9DEFINES
340#define gmtime p9gmtime
341#define localtime p9localtime
342#define asctime p9asctime
343#define ctime p9ctime
344#define cputime p9cputime
345#define times p9times
346#define tm2sec p9tm2sec
347#define nsec p9nsec
348#endif
349
350/*
351 * one-of-a-kind
352 */
353enum
354{
355 PNPROC = 1,
rsccbeb0b22006-04-01 19:24:03 +0000356 PNGROUP = 2
rsc8ad51792004-03-25 23:03:57 +0000357};
358
359/* extern int abs(int); <stdlib.h> */
360extern int p9atexit(void(*)(void));
361extern void p9atexitdont(void(*)(void));
362extern int atnotify(int(*)(void*, char*), int);
363/*
364 * <stdlib.h>
365extern double atof(char*); <stdlib.h>
rsc8ad51792004-03-25 23:03:57 +0000366 */
rsca67406e2004-04-08 19:31:48 +0000367extern int p9atoi(char*);
368extern long p9atol(char*);
369extern vlong p9atoll(char*);
rscc8b63422005-01-13 04:49:19 +0000370extern double fmtcharstod(int(*)(void*), void*);
rsc8ad51792004-03-25 23:03:57 +0000371extern char* cleanname(char*);
rscafe82ee2005-02-08 21:03:48 +0000372extern int p9decrypt(void*, void*, int);
373extern int p9encrypt(void*, void*, int);
rscce2a3782005-02-10 16:08:16 +0000374extern int netcrypt(void*, void*);
rsc8ad51792004-03-25 23:03:57 +0000375extern int dec64(uchar*, int, char*, int);
376extern int enc64(char*, int, uchar*, int);
377extern int dec32(uchar*, int, char*, int);
378extern int enc32(char*, int, uchar*, int);
379extern int dec16(uchar*, int, char*, int);
380extern int enc16(char*, int, uchar*, int);
381extern int encodefmt(Fmt*);
382extern int dirmodefmt(Fmt*);
rsceadb18a2006-02-12 19:40:55 +0000383extern int exitcode(char*);
rsc8ad51792004-03-25 23:03:57 +0000384extern void exits(char*);
385extern double frexp(double, int*);
386extern ulong getcallerpc(void*);
387extern char* p9getenv(char*);
388extern int p9putenv(char*, char*);
389extern int getfields(char*, char**, int, int, char*);
390extern int gettokens(char *, char **, int, char *);
391extern char* getuser(void);
392extern char* p9getwd(char*, int);
393extern int iounit(int);
394/* extern long labs(long); <math.h> */
395/* extern double ldexp(double, int); <math.h> */
396extern void p9longjmp(p9jmp_buf, int);
397extern char* mktemp(char*);
Russ Coxa58a8272008-07-10 11:10:10 -0400398extern int opentemp(char*, int);
rsc8ad51792004-03-25 23:03:57 +0000399/* extern double modf(double, double*); <math.h> */
rsc8ad51792004-03-25 23:03:57 +0000400extern void p9notejmp(void*, p9jmp_buf, int);
401extern void perror(const char*);
402extern int postnote(int, int, char *);
rscbe36ff62004-04-29 17:13:24 +0000403extern double p9pow10(int);
rsc8ad51792004-03-25 23:03:57 +0000404/* extern int putenv(char*, char*); <stdlib.h. */
405/* extern void qsort(void*, long, long, int (*)(void*, void*)); <stdlib.h> */
rsc4a623712005-01-23 22:33:59 +0000406extern char* searchpath(char*);
rsc8ad51792004-03-25 23:03:57 +0000407/* extern int p9setjmp(p9jmp_buf); */
408#define p9setjmp(b) sigsetjmp((void*)(b), 1)
409/*
410 * <stdlib.h>
rsc8ad51792004-03-25 23:03:57 +0000411extern long strtol(char*, char**, int);
412extern ulong strtoul(char*, char**, int);
413extern vlong strtoll(char*, char**, int);
414extern uvlong strtoull(char*, char**, int);
415 */
416extern void sysfatal(char*, ...);
rscce2a3782005-02-10 16:08:16 +0000417extern void p9syslog(int, char*, char*, ...);
rsc8ad51792004-03-25 23:03:57 +0000418extern long p9time(long*);
419/* extern int tolower(int); <ctype.h> */
420/* extern int toupper(int); <ctype.h> */
rsccf10d092004-04-21 23:34:46 +0000421extern void needstack(int);
rscce2a3782005-02-10 16:08:16 +0000422extern char* readcons(char*, char*, int);
rsccf10d092004-04-21 23:34:46 +0000423
rscdf970452006-06-26 05:47:59 +0000424extern void (*_pin)(void);
425extern void (*_unpin)(void);
426
rsc8ad51792004-03-25 23:03:57 +0000427#ifndef NOPLAN9DEFINES
428#define atexit p9atexit
429#define atexitdont p9atexitdont
rsca67406e2004-04-08 19:31:48 +0000430#define atoi p9atoi
431#define atol p9atol
432#define atoll p9atoll
rsc8ad51792004-03-25 23:03:57 +0000433#define encrypt p9encrypt
434#define decrypt p9decrypt
435#define getenv p9getenv
436#define getwd p9getwd
437#define longjmp p9longjmp
438#undef setjmp
439#define setjmp p9setjmp
440#define putenv p9putenv
441#define notejmp p9notejmp
442#define jmp_buf p9jmp_buf
rsc8ad51792004-03-25 23:03:57 +0000443#define time p9time
rscbe36ff62004-04-29 17:13:24 +0000444#define pow10 p9pow10
rscc8b63422005-01-13 04:49:19 +0000445#define strtod fmtstrtod
446#define charstod fmtcharstod
rscce2a3782005-02-10 16:08:16 +0000447#define syslog p9syslog
rsc8ad51792004-03-25 23:03:57 +0000448#endif
449
450/*
rsc3286afd2004-12-25 22:00:11 +0000451 * just enough information so that libc can be
452 * properly locked without dragging in all of libthread
453 */
454typedef struct _Thread _Thread;
455typedef struct _Threadlist _Threadlist;
456struct _Threadlist
457{
458 _Thread *head;
459 _Thread *tail;
460};
461
462extern _Thread *(*threadnow)(void);
463
464/*
rsc8ad51792004-03-25 23:03:57 +0000465 * synchronization
466 */
rsc06bb4ed2004-09-17 00:38:29 +0000467typedef struct Lock Lock;
468struct Lock
469{
rsc3286afd2004-12-25 22:00:11 +0000470#ifdef PLAN9PORT_USING_PTHREADS
rsc06bb4ed2004-09-17 00:38:29 +0000471 int init;
472 pthread_mutex_t mutex;
rsc06bb4ed2004-09-17 00:38:29 +0000473#endif
rsc3286afd2004-12-25 22:00:11 +0000474 int held;
rsc06bb4ed2004-09-17 00:38:29 +0000475};
rsc8ad51792004-03-25 23:03:57 +0000476
477extern void lock(Lock*);
478extern void unlock(Lock*);
479extern int canlock(Lock*);
rsc3286afd2004-12-25 22:00:11 +0000480extern int (*_lock)(Lock*, int, ulong);
481extern void (*_unlock)(Lock*, ulong);
rsc8ad51792004-03-25 23:03:57 +0000482
rsc3286afd2004-12-25 22:00:11 +0000483typedef struct QLock QLock;
rsc8ad51792004-03-25 23:03:57 +0000484struct QLock
485{
rsc3286afd2004-12-25 22:00:11 +0000486 Lock l;
487 _Thread *owner;
488 _Threadlist waiting;
489};
rsc8ad51792004-03-25 23:03:57 +0000490
491extern void qlock(QLock*);
492extern void qunlock(QLock*);
493extern int canqlock(QLock*);
rsc3286afd2004-12-25 22:00:11 +0000494extern int (*_qlock)(QLock*, int, ulong); /* do not use */
495extern void (*_qunlock)(QLock*, ulong);
rsc8ad51792004-03-25 23:03:57 +0000496
rsc3286afd2004-12-25 22:00:11 +0000497typedef struct Rendez Rendez;
498struct Rendez
499{
500 QLock *l;
501 _Threadlist waiting;
502};
503
504extern void rsleep(Rendez*); /* unlocks r->l, sleeps, locks r->l again */
505extern int rwakeup(Rendez*);
506extern int rwakeupall(Rendez*);
507extern void (*_rsleep)(Rendez*, ulong); /* do not use */
508extern int (*_rwakeup)(Rendez*, int, ulong);
509
510typedef struct RWLock RWLock;
rsc8ad51792004-03-25 23:03:57 +0000511struct RWLock
512{
rsc3286afd2004-12-25 22:00:11 +0000513 Lock l;
514 int readers;
515 _Thread *writer;
516 _Threadlist rwaiting;
517 _Threadlist wwaiting;
518};
rsc8ad51792004-03-25 23:03:57 +0000519
520extern void rlock(RWLock*);
521extern void runlock(RWLock*);
522extern int canrlock(RWLock*);
523extern void wlock(RWLock*);
524extern void wunlock(RWLock*);
525extern int canwlock(RWLock*);
rsc3286afd2004-12-25 22:00:11 +0000526extern int (*_rlock)(RWLock*, int, ulong); /* do not use */
527extern int (*_wlock)(RWLock*, int, ulong);
528extern void (*_runlock)(RWLock*, ulong);
529extern void (*_wunlock)(RWLock*, ulong);
rsc8ad51792004-03-25 23:03:57 +0000530
rsc3286afd2004-12-25 22:00:11 +0000531/*
532 * per-process private data
533 */
rsc8ad51792004-03-25 23:03:57 +0000534extern void** privalloc(void);
535extern void privfree(void**);
536
537/*
538 * network dialing
539 */
540#define NETPATHLEN 40
541extern int p9accept(int, char*);
542extern int p9announce(char*, char*);
543extern int p9dial(char*, char*, char*, int*);
rsc819822c2004-06-16 16:45:22 +0000544extern int p9dialparse(char *ds, char **net, char **unixa, u32int *ip, int *port);
rsc8ad51792004-03-25 23:03:57 +0000545extern void p9setnetmtpt(char*, int, char*);
rsc8ad51792004-03-25 23:03:57 +0000546extern int p9listen(char*, char*);
547extern char* p9netmkaddr(char*, char*, char*);
548extern int p9reject(int, char*, char*);
549
550#ifndef NOPLAN9DEFINES
551#define accept p9accept
552#define announce p9announce
553#define dial p9dial
554#define setnetmtpt p9setnetmtpt
rsc8ad51792004-03-25 23:03:57 +0000555#define listen p9listen
556#define netmkaddr p9netmkaddr
557#define reject p9reject
558#endif
559
560/*
561 * encryption
562 */
563extern int pushssl(int, char*, char*, char*, int*);
564extern int pushtls(int, char*, char*, int, char*, char*);
565
566/*
567 * network services
568 */
569typedef struct NetConnInfo NetConnInfo;
570struct NetConnInfo
571{
572 char *dir; /* connection directory */
573 char *root; /* network root */
574 char *spec; /* binding spec */
575 char *lsys; /* local system */
576 char *lserv; /* local service */
577 char *rsys; /* remote system */
578 char *rserv; /* remote service */
rsc00e0b272005-02-13 18:31:45 +0000579 char *laddr;
580 char *raddr;
rsc8ad51792004-03-25 23:03:57 +0000581};
582extern NetConnInfo* getnetconninfo(char*, int);
583extern void freenetconninfo(NetConnInfo*);
584
585/*
586 * system calls
587 *
588 */
589#define STATMAX 65535U /* max length of machine-independent stat structure */
590#define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */
591#define ERRMAX 128 /* max length of error string */
592
593#define MORDER 0x0003 /* mask for bits defining order of mounting */
594#define MREPL 0x0000 /* mount replaces object */
595#define MBEFORE 0x0001 /* mount goes before others in union directory */
596#define MAFTER 0x0002 /* mount goes after others in union directory */
597#define MCREATE 0x0004 /* permit creation in mounted directory */
598#define MCACHE 0x0010 /* cache some data */
599#define MMASK 0x0017 /* all bits on */
600
601#define OREAD 0 /* open for read */
602#define OWRITE 1 /* write */
603#define ORDWR 2 /* read and write */
604#define OEXEC 3 /* execute, == read but check execute permission */
605#define OTRUNC 16 /* or'ed in (except for exec), truncate file first */
606#define OCEXEC 32 /* or'ed in, close on exec */
607#define ORCLOSE 64 /* or'ed in, remove on close */
rsc3286afd2004-12-25 22:00:11 +0000608#define ODIRECT 128 /* or'ed in, direct access */
rscf91af8a2005-09-13 01:31:48 +0000609#define ONONBLOCK 256 /* or'ed in, non-blocking call */
rsc8ad51792004-03-25 23:03:57 +0000610#define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */
rscd2ffec72004-06-11 14:38:44 +0000611#define OLOCK 0x2000 /* or'ed in, lock after opening */
rscce2a3782005-02-10 16:08:16 +0000612#define OAPPEND 0x4000 /* or'ed in, append only */
rsc8ad51792004-03-25 23:03:57 +0000613
614#define AEXIST 0 /* accessible: exists */
615#define AEXEC 1 /* execute access */
616#define AWRITE 2 /* write access */
617#define AREAD 4 /* read access */
618
619/* Segattch */
620#define SG_RONLY 0040 /* read only */
621#define SG_CEXEC 0100 /* detach on exec */
622
623#define NCONT 0 /* continue after note */
624#define NDFLT 1 /* terminate after note */
625#define NSAVE 2 /* clear note but hold state */
626#define NRSTR 3 /* restore saved state */
627
628/* bits in Qid.type */
629#define QTDIR 0x80 /* type bit for directories */
630#define QTAPPEND 0x40 /* type bit for append only files */
631#define QTEXCL 0x20 /* type bit for exclusive use files */
632#define QTMOUNT 0x10 /* type bit for mounted channel */
633#define QTAUTH 0x08 /* type bit for authentication file */
rscf91af8a2005-09-13 01:31:48 +0000634#define QTTMP 0x04 /* type bit for non-backed-up file */
635#define QTSYMLINK 0x02 /* type bit for symbolic link */
636#define QTFILE 0x00 /* type bits for plain file */
rsc8ad51792004-03-25 23:03:57 +0000637
638/* bits in Dir.mode */
639#define DMDIR 0x80000000 /* mode bit for directories */
640#define DMAPPEND 0x40000000 /* mode bit for append only files */
641#define DMEXCL 0x20000000 /* mode bit for exclusive use files */
642#define DMMOUNT 0x10000000 /* mode bit for mounted channel */
643#define DMAUTH 0x08000000 /* mode bit for authentication file */
rscf91af8a2005-09-13 01:31:48 +0000644#define DMTMP 0x04000000 /* mode bit for non-backed-up file */
645#define DMSYMLINK 0x02000000 /* mode bit for symbolic link (Unix, 9P2000.u) */
646#define DMDEVICE 0x00800000 /* mode bit for device file (Unix, 9P2000.u) */
647#define DMNAMEDPIPE 0x00200000 /* mode bit for named pipe (Unix, 9P2000.u) */
648#define DMSOCKET 0x00100000 /* mode bit for socket (Unix, 9P2000.u) */
rsc57778262006-01-27 03:45:30 +0000649#define DMSETUID 0x00080000 /* mode bit for setuid (Unix, 9P2000.u) */
650#define DMSETGID 0x00040000 /* mode bit for setgid (Unix, 9P2000.u) */
rscce2a3782005-02-10 16:08:16 +0000651
rsc8ad51792004-03-25 23:03:57 +0000652#define DMREAD 0x4 /* mode bit for read permission */
653#define DMWRITE 0x2 /* mode bit for write permission */
654#define DMEXEC 0x1 /* mode bit for execute permission */
655
rsc52e61642005-05-01 18:40:01 +0000656#ifdef RFMEM /* FreeBSD, OpenBSD */
rsc8ad51792004-03-25 23:03:57 +0000657#undef RFFDG
658#undef RFNOTEG
659#undef RFPROC
660#undef RFMEM
661#undef RFNOWAIT
662#undef RFCFDG
663#undef RFNAMEG
664#undef RFENVG
665#undef RFCENVG
666#undef RFCFDG
667#undef RFCNAMEG
668#endif
669
670enum
671{
672 RFNAMEG = (1<<0),
673 RFENVG = (1<<1),
674 RFFDG = (1<<2),
675 RFNOTEG = (1<<3),
676 RFPROC = (1<<4),
677 RFMEM = (1<<5),
678 RFNOWAIT = (1<<6),
679 RFCNAMEG = (1<<10),
680 RFCENVG = (1<<11),
rsccbeb0b22006-04-01 19:24:03 +0000681 RFCFDG = (1<<12)
rsc8ad51792004-03-25 23:03:57 +0000682/* RFREND = (1<<13), */
683/* RFNOMNT = (1<<14) */
684};
685
rsc8ad51792004-03-25 23:03:57 +0000686typedef
687struct Qid
688{
689 uvlong path;
690 ulong vers;
691 uchar type;
692} Qid;
693
694typedef
695struct Dir {
696 /* system-modified data */
697 ushort type; /* server type */
698 uint dev; /* server subtype */
699 /* file data */
700 Qid qid; /* unique id from server */
701 ulong mode; /* permissions */
702 ulong atime; /* last read time */
703 ulong mtime; /* last write time */
704 vlong length; /* file length */
705 char *name; /* last element of path */
706 char *uid; /* owner name */
707 char *gid; /* group name */
708 char *muid; /* last modifier name */
rscf91af8a2005-09-13 01:31:48 +0000709
710 /* 9P2000.u extensions */
711 uint uidnum; /* numeric uid */
712 uint gidnum; /* numeric gid */
713 uint muidnum; /* numeric muid */
714 char *ext; /* extended info */
rsc8ad51792004-03-25 23:03:57 +0000715} Dir;
716
717/* keep /sys/src/ape/lib/ap/plan9/sys9.h in sync with this -rsc */
718typedef
719struct Waitmsg
720{
721 int pid; /* of loved one */
722 ulong time[3]; /* of loved one & descendants */
723 char *msg;
724} Waitmsg;
725
726typedef
727struct IOchunk
728{
729 void *addr;
730 ulong len;
731} IOchunk;
732
733extern void _exits(char*);
734
735extern void abort(void);
rsc924eb642004-03-25 23:30:46 +0000736/* extern int access(char*, int); */
rsc8ad51792004-03-25 23:03:57 +0000737extern long p9alarm(ulong);
738extern int await(char*, int);
rsc03417612004-12-27 19:11:21 +0000739extern int awaitfor(int, char*, int);
rsc8ad51792004-03-25 23:03:57 +0000740extern int awaitnohang(char*, int);
741/* extern int bind(char*, char*, int); give up */
742/* extern int brk(void*); <unistd.h> */
743extern int p9chdir(char*);
744extern int close(int);
745extern int p9create(char*, int, ulong);
746extern int p9dup(int, int);
747extern int errstr(char*, uint);
748extern int p9exec(char*, char*[]);
rsc3b5a5a62005-01-04 21:17:33 +0000749extern int p9execl(char*, ...);
rsc4fbe07e2004-09-23 03:25:29 +0000750/* extern int p9fork(void); */
rsc8ad51792004-03-25 23:03:57 +0000751extern int p9rfork(int);
752/* not implemented
753extern int fauth(int, char*);
754extern int fstat(int, uchar*, int);
755extern int fwstat(int, uchar*, int);
756extern int fversion(int, int, char*, int);
757extern int mount(int, int, char*, int, char*);
758extern int unmount(char*, char*);
759*/
760extern int noted(int);
761extern int notify(void(*)(void*, char*));
rsc10f14b02005-01-16 21:28:44 +0000762extern int noteenable(char*);
763extern int notedisable(char*);
764extern int notifyon(char*);
765extern int notifyoff(char*);
rsc8ad51792004-03-25 23:03:57 +0000766extern int p9open(char*, int);
767extern int fd2path(int, char*, int);
768extern int p9pipe(int*);
769/*
770 * use defs from <unistd.h>
771extern long pread(int, void*, long, vlong);
772extern long preadv(int, IOchunk*, int, vlong);
773extern long pwrite(int, void*, long, vlong);
774extern long pwritev(int, IOchunk*, int, vlong);
775extern long read(int, void*, long);
776 */
777extern long readn(int, void*, long);
778/* extern long readv(int, IOchunk*, int); <unistd.h> */
779extern int remove(const char*);
780/* extern void* sbrk(ulong); <unistd.h> */
781/* extern long oseek(int, long, int); */
782extern vlong p9seek(int, vlong, int);
783/* give up
784extern long segattach(int, char*, void*, ulong);
785extern int segbrk(void*, void*);
786extern int segdetach(void*);
787extern int segflush(void*, ulong);
788extern int segfree(void*, ulong);
789*/
790extern int p9sleep(long);
791/* extern int stat(char*, uchar*, int); give up */
792extern Waitmsg* p9wait(void);
rsc03417612004-12-27 19:11:21 +0000793extern Waitmsg* p9waitfor(int);
rsc8ad51792004-03-25 23:03:57 +0000794extern Waitmsg* waitnohang(void);
795extern int p9waitpid(void);
796/* <unistd.h>
797extern long write(int, void*, long);
798extern long writev(int, IOchunk*, int);
799*/
Russ Coxcab935a2008-07-04 12:38:26 -0400800extern long p9write(int, void*, long);
rsc8ad51792004-03-25 23:03:57 +0000801/* extern int wstat(char*, uchar*, int); give up */
802extern ulong rendezvous(ulong, ulong);
803
804#ifndef NOPLAN9DEFINES
805#define alarm p9alarm
806#define dup p9dup
807#define exec p9exec
rsc3b5a5a62005-01-04 21:17:33 +0000808#define execl p9execl
rsc8ad51792004-03-25 23:03:57 +0000809#define seek p9seek
810#define sleep p9sleep
811#define wait p9wait
812#define waitpid p9waitpid
rsc4fbe07e2004-09-23 03:25:29 +0000813/* #define fork p9fork */
rsc8ad51792004-03-25 23:03:57 +0000814#define rfork p9rfork
rsc924eb642004-03-25 23:30:46 +0000815/* #define access p9access */
rsc8ad51792004-03-25 23:03:57 +0000816#define create p9create
rsc3286afd2004-12-25 22:00:11 +0000817#undef open
rsc8ad51792004-03-25 23:03:57 +0000818#define open p9open
819#define pipe p9pipe
rsc03417612004-12-27 19:11:21 +0000820#define waitfor p9waitfor
Russ Coxcab935a2008-07-04 12:38:26 -0400821#define write p9write
rsc8ad51792004-03-25 23:03:57 +0000822#endif
823
824extern Dir* dirstat(char*);
825extern Dir* dirfstat(int);
826extern int dirwstat(char*, Dir*);
827extern int dirfwstat(int, Dir*);
828extern long dirread(int, Dir**);
829extern void nulldir(Dir*);
830extern long dirreadall(int, Dir**);
831/* extern int getpid(void); <unistd.h> */
832/* extern int getppid(void); */
833extern void rerrstr(char*, uint);
834extern char* sysname(void);
835extern void werrstr(char*, ...);
836extern char* getns(void);
837extern char* get9root(void);
838extern char* unsharp(char*);
839extern int sendfd(int, int);
840extern int recvfd(int);
Russ Cox118dfa92008-05-05 23:07:54 -0400841extern int post9pservice(int, char*, char*);
842extern int chattyfuse;
rsc8ad51792004-03-25 23:03:57 +0000843
844/* external names that we don't want to step on */
845#ifndef NOPLAN9DEFINES
846#define main p9main
847#endif
848
rsc01a1c312005-09-29 06:18:32 +0000849#ifdef VARARGCK
850#pragma varargck type "lld" vlong
851#pragma varargck type "llx" vlong
852#pragma varargck type "lld" uvlong
853#pragma varargck type "llx" uvlong
854#pragma varargck type "ld" long
855#pragma varargck type "lx" long
856#pragma varargck type "ld" ulong
857#pragma varargck type "lx" ulong
858#pragma varargck type "d" int
859#pragma varargck type "x" int
860#pragma varargck type "c" int
861#pragma varargck type "C" int
862#pragma varargck type "d" uint
863#pragma varargck type "x" uint
864#pragma varargck type "c" uint
865#pragma varargck type "C" uint
866#pragma varargck type "f" double
867#pragma varargck type "e" double
868#pragma varargck type "g" double
869#pragma varargck type "lf" long double
870#pragma varargck type "le" long double
871#pragma varargck type "lg" long double
872#pragma varargck type "s" char*
873#pragma varargck type "q" char*
874#pragma varargck type "S" Rune*
875#pragma varargck type "Q" Rune*
876#pragma varargck type "r" void
877#pragma varargck type "%" void
878#pragma varargck type "n" int*
879#pragma varargck type "p" void*
880#pragma varargck type "<" void*
881#pragma varargck type "[" void*
882#pragma varargck type "H" void*
883#pragma varargck type "lH" void*
884
885#pragma varargck flag ' '
886#pragma varargck flag '#'
887#pragma varargck flag '+'
888#pragma varargck flag ','
889#pragma varargck flag '-'
890#pragma varargck flag 'u'
891
892#pragma varargck argpos fmtprint 2
893#pragma varargck argpos fprint 2
894#pragma varargck argpos print 1
895#pragma varargck argpos runeseprint 3
896#pragma varargck argpos runesmprint 1
897#pragma varargck argpos runesnprint 3
898#pragma varargck argpos runesprint 2
899#pragma varargck argpos seprint 3
900#pragma varargck argpos smprint 1
901#pragma varargck argpos snprint 3
902#pragma varargck argpos sprint 2
903#pragma varargck argpos sysfatal 1
rscf49c5cb2005-11-07 02:47:08 +0000904#pragma varargck argpos p9syslog 3
rsc01a1c312005-09-29 06:18:32 +0000905#pragma varargck argpos werrstr 1
906#endif
907
rsc8ad51792004-03-25 23:03:57 +0000908/* compiler directives on plan 9 */
rsc8ad51792004-03-25 23:03:57 +0000909#define SET(x) ((x)=0)
rsc3286afd2004-12-25 22:00:11 +0000910#define USED(x) if(x){}else{}
911#ifdef __GNUC__
912# if __GNUC__ >= 3
913# undef USED
rsc15085f72006-06-26 00:02:52 +0000914# define USED(x) ((void)(x))
rsc3286afd2004-12-25 22:00:11 +0000915# endif
916#endif
rsc8ad51792004-03-25 23:03:57 +0000917
918/* command line */
919extern char *argv0;
920extern void __fixargv0(void);
921#define ARGBEGIN for((argv0?0:(argv0=(__fixargv0(),*argv))),argv++,argc--;\
922 argv[0] && argv[0][0]=='-' && argv[0][1];\
923 argc--, argv++) {\
924 char *_args, *_argt;\
925 Rune _argc;\
926 _args = &argv[0][1];\
927 if(_args[0]=='-' && _args[1]==0){\
928 argc--; argv++; break;\
929 }\
930 _argc = 0;\
931 while(*_args && (_args += chartorune(&_argc, _args)))\
932 switch(_argc)
933#define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc);
934#define ARGF() (_argt=_args, _args="",\
935 (*_argt? _argt: argv[1]? (argc--, *++argv): 0))
936#define EARGF(x) (_argt=_args, _args="",\
937 (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
938
939#define ARGC() _argc
940
941#if defined(__cplusplus)
942}
943#endif
944#endif /* _LIB9_H_ */