]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/port/lib.h
fix devproc text chan leak
[plan9front.git] / sys / src / 9 / port / lib.h
1 /*
2  * functions (possibly) linked in, complete, from libc.
3  */
4 #define nelem(x)        (sizeof(x)/sizeof((x)[0]))
5 #define offsetof(s, m)  (ulong)(&(((s*)0)->m))
6 #define assert(x)       if(x){}else _assert("x")
7
8 /*
9  * mem routines
10  */
11 extern  void*   memccpy(void*, void*, int, ulong);
12 extern  void*   memset(void*, int, ulong);
13 extern  int     memcmp(void*, void*, ulong);
14 extern  void*   memmove(void*, void*, ulong);
15 extern  void*   memchr(void*, int, ulong);
16
17 /*
18  * string routines
19  */
20 extern  char*   strcat(char*, char*);
21 extern  char*   strchr(char*, int);
22 extern  char*   strrchr(char*, int);
23 extern  int     strcmp(char*, char*);
24 extern  char*   strcpy(char*, char*);
25 extern  char*   strecpy(char*, char*, char*);
26 extern  char*   strncat(char*, char*, long);
27 extern  char*   strncpy(char*, char*, long);
28 extern  int     strncmp(char*, char*, long);
29 extern  long    strlen(char*);
30 extern  char*   strstr(char*, char*);
31 extern  int     atoi(char*);
32 extern  int     fullrune(char*, int);
33 extern  int     cistrcmp(char*, char*);
34 extern  int     cistrncmp(char*, char*, int);
35
36 enum
37 {
38         UTFmax          = 3,    /* maximum bytes per rune */
39         Runesync        = 0x80, /* cannot represent part of a UTF sequence */
40         Runeself        = 0x80, /* rune and UTF sequences are the same (<) */
41         Runeerror       = 0x80, /* decoding error in UTF */
42 };
43
44 /*
45  * rune routines
46  */
47 extern  int     runetochar(char*, Rune*);
48 extern  int     chartorune(Rune*, char*);
49 extern  char*   utfrune(char*, long);
50 extern  int     utflen(char*);
51 extern  int     utfnlen(char*, long);
52 extern  int     runelen(long);
53
54 extern  int     abs(int);
55
56 /*
57  * print routines
58  */
59 typedef struct Fmt      Fmt;
60 typedef int (*Fmts)(Fmt*);
61 struct Fmt{
62         uchar   runes;                  /* output buffer is runes or chars? */
63         void    *start;                 /* of buffer */
64         void    *to;                    /* current place in the buffer */
65         void    *stop;                  /* end of the buffer; overwritten if flush fails */
66         int     (*flush)(Fmt *);        /* called when to == stop */
67         void    *farg;                  /* to make flush a closure */
68         int     nfmt;                   /* num chars formatted so far */
69         va_list args;                   /* args passed to dofmt */
70         int     r;                      /* % format Rune */
71         int     width;
72         int     prec;
73         ulong   flags;
74 };
75 extern  int     print(char*, ...);
76 extern  char*   seprint(char*, char*, char*, ...);
77 extern  char*   vseprint(char*, char*, char*, va_list);
78 extern  int     snprint(char*, int, char*, ...);
79 extern  int     vsnprint(char*, int, char*, va_list);
80 extern  int     sprint(char*, char*, ...);
81
82 #pragma varargck        argpos  fmtprint        2
83 #pragma varargck        argpos  print           1
84 #pragma varargck        argpos  seprint         3
85 #pragma varargck        argpos  snprint         3
86 #pragma varargck        argpos  sprint          2
87
88 #pragma varargck        type    "llb"   vlong
89 #pragma varargck        type    "lld"   vlong
90 #pragma varargck        type    "llx"   vlong
91 #pragma varargck        type    "llb"   uvlong
92 #pragma varargck        type    "lld"   uvlong
93 #pragma varargck        type    "llx"   uvlong
94 #pragma varargck        type    "lb"    long
95 #pragma varargck        type    "ld"    long
96 #pragma varargck        type    "lx"    long
97 #pragma varargck        type    "lb"    ulong
98 #pragma varargck        type    "ld"    ulong
99 #pragma varargck        type    "lx"    ulong
100 #pragma varargck        type    "b"     int
101 #pragma varargck        type    "d"     int
102 #pragma varargck        type    "x"     int
103 #pragma varargck        type    "c"     int
104 #pragma varargck        type    "C"     int
105 #pragma varargck        type    "b"     uint
106 #pragma varargck        type    "d"     uint
107 #pragma varargck        type    "x"     uint
108 #pragma varargck        type    "c"     uint
109 #pragma varargck        type    "C"     uint
110 #pragma varargck        type    "s"     char*
111 #pragma varargck        type    "q"     char*
112 #pragma varargck        type    "S"     Rune*
113 #pragma varargck        type    "%"     void
114 #pragma varargck        type    "p"     uintptr
115 #pragma varargck        type    "p"     void*
116 #pragma varargck        flag    ','
117
118 extern  int     fmtstrinit(Fmt*);
119 extern  int     fmtinstall(int, int (*)(Fmt*));
120 extern  void    quotefmtinstall(void);
121 extern  int     fmtprint(Fmt*, char*, ...);
122 extern  int     fmtstrcpy(Fmt*, char*);
123 extern  char*   fmtstrflush(Fmt*);
124
125 /*
126  * one-of-a-kind
127  */
128 extern  char*   cleanname(char*);
129 extern  ulong   getcallerpc(void*);
130
131 extern  long    strtol(char*, char**, int);
132 extern  ulong   strtoul(char*, char**, int);
133 extern  vlong   strtoll(char*, char**, int);
134 extern  uvlong  strtoull(char*, char**, int);
135 extern  char    etext[];
136 extern  char    edata[];
137 extern  char    end[];
138 extern  int     getfields(char*, char**, int, int, char*);
139 extern  int     tokenize(char*, char**, int);
140 extern  int     dec64(uchar*, int, char*, int);
141 extern  int     encodefmt(Fmt*);
142 extern  void    qsort(void*, long, long, int (*)(void*, void*));
143
144 /*
145  * Syscall data structures
146  */
147 #define MORDER  0x0003  /* mask for bits defining order of mounting */
148 #define MREPL   0x0000  /* mount replaces object */
149 #define MBEFORE 0x0001  /* mount goes before others in union directory */
150 #define MAFTER  0x0002  /* mount goes after others in union directory */
151 #define MCREATE 0x0004  /* permit creation in mounted directory */
152 #define MCACHE  0x0010  /* cache some data */
153 #define MMASK   0x0017  /* all bits on */
154
155 #define OREAD   0       /* open for read */
156 #define OWRITE  1       /* write */
157 #define ORDWR   2       /* read and write */
158 #define OEXEC   3       /* execute, == read but check execute permission */
159 #define OTRUNC  16      /* or'ed in (except for exec), truncate file first */
160 #define OCEXEC  32      /* or'ed in, close on exec */
161 #define ORCLOSE 64      /* or'ed in, remove on close */
162 #define OEXCL   0x1000  /* or'ed in, exclusive create */
163
164 #define NCONT   0       /* continue after note */
165 #define NDFLT   1       /* terminate after note */
166 #define NSAVE   2       /* clear note but hold state */
167 #define NRSTR   3       /* restore saved state */
168
169 typedef struct Qid      Qid;
170 typedef struct Dir      Dir;
171 typedef struct OWaitmsg OWaitmsg;
172 typedef struct Waitmsg  Waitmsg;
173
174 #define ERRMAX                  128     /* max length of error string */
175 #define KNAMELEN                28      /* max length of name held in kernel */
176
177 /* bits in Qid.type */
178 #define QTDIR           0x80            /* type bit for directories */
179 #define QTAPPEND        0x40            /* type bit for append only files */
180 #define QTEXCL          0x20            /* type bit for exclusive use files */
181 #define QTMOUNT         0x10            /* type bit for mounted channel */
182 #define QTAUTH          0x08            /* type bit for authentication file */
183 #define QTFILE          0x00            /* plain file */
184
185 /* bits in Dir.mode */
186 #define DMDIR           0x80000000      /* mode bit for directories */
187 #define DMAPPEND        0x40000000      /* mode bit for append only files */
188 #define DMEXCL          0x20000000      /* mode bit for exclusive use files */
189 #define DMMOUNT         0x10000000      /* mode bit for mounted channel */
190 #define DMREAD          0x4             /* mode bit for read permission */
191 #define DMWRITE         0x2             /* mode bit for write permission */
192 #define DMEXEC          0x1             /* mode bit for execute permission */
193
194 struct Qid
195 {
196         uvlong  path;
197         ulong   vers;
198         uchar   type;
199 };
200
201 struct Dir {
202         /* system-modified data */
203         ushort  type;   /* server type */
204         uint    dev;    /* server subtype */
205         /* file data */
206         Qid     qid;    /* unique id from server */
207         ulong   mode;   /* permissions */
208         ulong   atime;  /* last read time */
209         ulong   mtime;  /* last write time */
210         vlong   length; /* file length: see <u.h> */
211         char    *name;  /* last element of path */
212         char    *uid;   /* owner name */
213         char    *gid;   /* group name */
214         char    *muid;  /* last modifier name */
215 };
216
217 struct OWaitmsg
218 {
219         char    pid[12];        /* of loved one */
220         char    time[3*12];     /* of loved one and descendants */
221         char    msg[64];        /* compatibility BUG */
222 };
223
224 struct Waitmsg
225 {
226         int     pid;            /* of loved one */
227         ulong   time[3];        /* of loved one and descendants */
228         char    msg[ERRMAX];    /* actually variable-size in user mode */
229 };