Replace most uses of strncpy with strlcpy.
[akaros.git] / kern / include / ns.h
1 /* Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
2  * Portions Copyright © 1997-1999 Vita Nuova Limited
3  * Portions Copyright © 2000-2007 Vita Nuova Holdings Limited
4  *                                (www.vitanuova.com)
5  * Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
6  *
7  * Modified for the Akaros operating system:
8  * Copyright (c) 2013-2014 The Regents of the University of California
9  * Copyright (c) 2013-2015 Google Inc.
10  *
11  * Permission is hereby granted, free of charge, to any person obtaining a copy
12  * of this software and associated documentation files (the "Software"), to deal
13  * in the Software without restriction, including without limitation the rights
14  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15  * copies of the Software, and to permit persons to whom the Software is
16  * furnished to do so, subject to the following conditions:
17  *
18  * The above copyright notice and this permission notice shall be included in
19  * all copies or substantial portions of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
24  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27  * SOFTWARE. */
28
29
30 #ifndef ROS_KERN_NS_H
31 #define ROS_KERN_NS_H
32
33 #include <err.h>
34 #include <rendez.h>
35 #include <rwlock.h>
36 #include <linker_func.h>
37 #include <fdtap.h>
38 #include <ros/fs.h>
39 #include <vfs.h>
40
41 /*
42  * functions (possibly) linked in, complete, from libc.
43  */
44 enum {
45         UTFmax = 4,                                     /* maximum bytes per rune */
46         Runesync = 0x80,        /* cannot represent part of a UTF sequence (<) */
47         Runeself = 0x80,        /* rune and UTF sequences are the same (<) */
48         Runeerror = 0xFFFD,     /* decoding error in UTF */
49         Runemax = 0x10FFFF,     /* 21-bit rune */
50         Runemask = 0x1FFFFF,    /* bits used by runes (see grep) */
51         NUMSIZE32 = 10, /* max size of formatted 32 bit number (hex or decimal) */
52         NUMSIZE64 = 20, /* max size of formatted 64 bit number (hex or decimal) */
53 };
54
55 /*
56  * math
57  */
58 extern int isNaN(double);
59 extern int isInf(double, int);
60 extern double floor(double);
61 extern double frexp(double, int *);
62 extern double pow10(int);
63
64 /*
65  * one-of-a-kind
66  */
67 extern char *cleanname(char *unused_char_p_t);
68 //extern    uint32_t    getcallerpc(void*);
69 static inline uint32_t getcallerpc(void *v)
70 {
71         return 0;
72 }
73
74 extern char etext[];
75 extern char edata[];
76 extern char end[];
77 extern int getfields(char *unused_char_p_t, char **unused_char_pp_t,
78                                          int unused_int, int, char *);
79 extern int tokenize(char *unused_char_p_t, char **unused_char_pp_t, int);
80 extern int dec64(uint8_t * unused_uint8_p_t, int unused_int,
81                                  char *unused_char_p_t, int);
82 extern void qsort(void *, long, long, int (*)(void *, void *));
83
84 extern int toupper(int);
85 extern char *netmkaddr(char *unused_char_p_t, char *, char *);
86 extern int myetheraddr(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
87 extern int parseether(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
88
89 /*
90  * network dialling
91  */
92 #define NETPATHLEN      40
93
94 /*
95  * Syscall data structures
96  */
97 #define MORDER  0x0003  /* mask for bits defining order of mounting */
98 #define MREPL   0x0000  /* mount replaces object */
99 #define MBEFORE 0x0001  /* mount goes before others in union directory */
100 #define MAFTER  0x0002  /* mount goes after others in union directory */
101 #define MCREATE 0x0004  /* permit creation in mounted directory */
102 #define MCACHE  0x0010  /* cache some data */
103 #define MMASK   0x0017  /* all bits on */
104
105 #define NCONT   0       /* continue after note */
106 #define NDFLT   1       /* terminate after note */
107 #define NSAVE   2       /* clear note but hold state */
108 #define NRSTR   3       /* restore saved state */
109
110 #define STATMAX 65535U  /* max length of machine-independent stat structure */
111 #define ERRMAX                  128     /* max length of error string */
112 #define KNAMELEN                28      /* max length of name held in kernel */
113
114 /* bits in Qid.type */
115 #define QTDIR           0x80    /* type bit for directories */
116 #define QTAPPEND        0x40    /* type bit for append only files */
117 #define QTEXCL          0x20    /* type bit for exclusive use files */
118 #define QTMOUNT         0x10    /* type bit for mounted channel */
119 #define QTAUTH          0x08    /* type bit for authentication file */
120 #define QTFILE          0x01    /* plain file */
121
122 /* bits in Dir.mode */
123 #define DMDIR           0x80000000      /* mode bit for directories */
124 #define DMAPPEND        0x40000000      /* mode bit for append only files */
125 #define DMEXCL          0x20000000      /* mode bit for exclusive use files */
126 #define DMMOUNT         0x10000000      /* mode bit for mounted channel */
127 #define DMSYMLINK       0x02000000      /* symlink -- from 9p2000.u */
128 #define DMREAD          0x4     /* mode bit for read permission */
129 #define DMWRITE         0x2     /* mode bit for write permission */
130 #define DMEXEC          0x1     /* mode bit for execute permission */
131
132 struct qid {
133         uint64_t path;
134         uint32_t vers;
135         uint8_t type;
136 };
137
138 struct dir {
139         /* system-modified data */
140         uint16_t type;                          /* server type */
141         unsigned int dev;                       /* server subtype */
142         /* file data */
143         struct qid qid;                         /* unique id from server */
144         uint32_t mode;                          /* permissions */
145         uint32_t atime;                         /* last read time */
146         uint32_t mtime;                         /* last write time */
147         int64_t length;                         /* file length: see <u.h> */
148         char *name;                                     /* last element of path */
149         char *uid;                                      /* owner name */
150         char *gid;                                      /* group name */
151         char *muid;                                     /* last modifier name */
152 };
153
154 struct waitmsg {
155         int pid;                                        /* of loved one */
156         uint32_t time[3];                       /* of loved one and descendants */
157         char msg[ERRMAX];                       /* actually variable-size in user mode */
158 };
159
160 #define VERSION9P       "9P2000"
161
162 #define MAXWELEM        16
163
164 typedef
165         struct fcall {
166         uint8_t type;
167         uint32_t fid;
168         uint16_t tag;
169         /* union { */
170         /* struct { */
171         uint32_t msize;                         /* Tversion, Rversion */
172         char *version;                          /* Tversion, Rversion */
173         /* }; */
174         /* struct { */
175         uint16_t oldtag;                        /* Tflush */
176         /* }; */
177         /* struct { */
178         char *ename;                            /* Rerror */
179         /* }; */
180         /* struct { */
181         struct qid qid;                         /* Rattach, Ropen, Rcreate */
182         uint32_t iounit;                        /* Ropen, Rcreate */
183         /* }; */
184         /* struct { */
185         struct qid aqid;                        /* Rauth */
186         /* }; */
187         /* struct { */
188         uint32_t afid;                          /* Tauth, Tattach */
189         char *uname;                            /* Tauth, Tattach */
190         char *aname;                            /* Tauth, Tattach */
191         /* }; */
192         /* struct { */
193         uint32_t perm;                          /* Tcreate */
194         char *name;                                     /* Tcreate */
195         uint8_t mode;                           /* Tcreate, Topen */
196         /* }; */
197         /* struct { */
198         uint32_t newfid;                        /* Twalk */
199         uint16_t nwname;                        /* Twalk */
200         char *wname[MAXWELEM];          /* Twalk */
201         /* }; */
202         /* struct { */
203         uint16_t nwqid;                         /* Rwalk */
204         struct qid wqid[MAXWELEM];      /* Rwalk */
205         /* }; */
206         /* struct { */
207         int64_t offset;                         /* Tread, Twrite */
208         uint32_t count;                         /* Tread, Twrite, Rread */
209         char *data;                                     /* Twrite, Rread */
210         /* }; */
211         /* struct { */
212         uint16_t nstat;                         /* Twstat, Rstat */
213         uint8_t *stat;                          /* Twstat, Rstat */
214         /* }; */
215         /* }; */
216 } fcall;
217
218 #define GBIT8(p)        ((p)[0])
219 #define GBIT16(p)       ((p)[0]|((p)[1]<<8))
220 #define GBIT32(p)       ((uint32_t)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)))
221 #define GBIT64(p)       ((uint32_t)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\
222                                 ((int64_t)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32))
223
224 #define PBIT8(p,v)      (p)[0]=(v)
225 #define PBIT16(p,v)     (p)[0]=(v);(p)[1]=(v)>>8
226 #define PBIT32(p,v)     (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
227 #define PBIT64(p,v)     (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\
228                         (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56
229
230 #define BIT8SZ          1
231 #define BIT16SZ         2
232 #define BIT32SZ         4
233 #define BIT64SZ         8
234 #define QIDSZ   (BIT8SZ+BIT32SZ+BIT64SZ)
235
236 /* STATFIXLEN includes leading 16-bit count */
237 /* The count, however, excludes itself; total size is BIT16SZ+count */
238 #define STATFIXLEN      (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ)   /* amount of fixed length data in a stat buffer */
239
240 #define NOTAG           (uint16_t)~0U   /* Dummy tag */
241 #define NOFID           (uint32_t)~0U   /* Dummy fid */
242 #define IOHDRSZ         24      /* ample room for Twrite/Rread header (iounit) */
243
244 enum {
245         Tversion = 100,
246         Rversion,
247         Tauth = 102,
248         Rauth,
249         Tattach = 104,
250         Rattach,
251         Terror = 106,   /* illegal */
252         Rerror,
253         Tflush = 108,
254         Rflush,
255         Twalk = 110,
256         Rwalk,
257         Topen = 112,
258         Ropen,
259         Tcreate = 114,
260         Rcreate,
261         Tread = 116,
262         Rread,
263         Twrite = 118,
264         Rwrite,
265         Tclunk = 120,
266         Rclunk,
267         Tremove = 122,
268         Rremove,
269         Tstat = 124,
270         Rstat,
271         Twstat = 126,
272         Rwstat,
273         Tmax,
274 };
275
276 void init_empty_dir(struct dir *d);
277 unsigned int convM2S(uint8_t * unused_uint8_p_t, unsigned int unused_int,
278                                          struct fcall *);
279 unsigned int convS2M(struct fcall *, uint8_t * unused_uint8_p_t, unsigned int);
280 unsigned int sizeS2M(struct fcall *);
281
282 unsigned int convM2kdirent(uint8_t * buf, unsigned int nbuf, struct kdirent *kd,
283                                                    char *strs);
284 unsigned int convM2kstat(uint8_t * buf, unsigned int nbuf, struct kstat *ks);
285
286 int statcheck(uint8_t * abuf, unsigned int nbuf);
287 unsigned int convM2D(uint8_t * unused_uint8_p_t, unsigned int unused_int,
288                                          struct dir *, char *unused_char_p_t);
289 unsigned int convD2M(struct dir *, uint8_t * unused_uint8_p_t, unsigned int);
290 unsigned int sizeD2M(struct dir *);
291
292 int read9pmsg(int unused_int, void *, unsigned int);
293
294 struct ref {
295         spinlock_t l;
296         long ref;
297 };
298
299 struct rept {
300         spinlock_t l;
301         struct rendez r;
302         void *o;
303         int t;
304         int (*active) (void *);
305         int (*ck) (void *, int);
306         void (*f) (void *);                     /* called with VM acquire()'d */
307 };
308
309 enum {
310         Nopin = -1
311 };
312
313 struct talarm {
314         spinlock_t lock;
315         struct proc *list;
316 };
317
318 struct alarms {
319         qlock_t qlock;
320         struct proc *head;
321 };
322
323 /*
324  * Access types in namec & channel flags
325  */
326 enum {
327         Aaccess,                                        /* as in stat, wstat */
328         Abind,                                          /* for left-hand-side of bind */
329         Atodir,                                         /* as in chdir */
330         Aopen,                                          /* for i/o */
331         Amount,                                         /* to be mounted or mounted upon */
332         Acreate,                                        /* is to be created */
333         Aremove,                                        /* will be removed by caller */
334         Acreatechan,                                    /* return a chan for a create request. for sysrename. */
335
336         /* internal chan flags, used by the kernel only */
337         COPEN =                 0x0001, /* for i/o */
338         CMSG =                  0x0002, /* the message channel for a mount */
339         CFREE =                 0x0004, /* not in use */
340         CCACHE =                0x0008, /* client cache */
341         CINTERNAL_FLAGS = (COPEN | CMSG | CFREE | CCACHE),
342
343         /* chan/file flags, getable via fcntl/getfl and setably via open and
344          * sometimes fcntl/setfl.  those that can't be set cause an error() in
345          * fd_setfl. */
346         CEXTERNAL_FLAGS = (
347             O_CLOEXEC      | /* (prob should be on the FD, 9ns has it here) */
348             O_REMCLO       | /* remove on close (also, maybe should be on FD) */
349             O_APPEND       | /* append on write */
350             O_NONBLOCK     | /* don't block, can't be set via setfl */
351             O_PATH         | /* path open, just the name, no I/O */
352             0),
353 };
354
355 #define NS_IPCK_SHIFT  2
356 #define NS_UDPCK_SHIFT 3
357 #define NS_TCPCK_SHIFT 4
358 #define NS_PKTCK_SHIFT 5
359 #define NS_TSO_SHIFT 6
360 #define NS_SHIFT_MAX 6
361
362 enum {
363         BINTR = (1 << 0),
364         BFREE = (1 << 1),
365         Bipck = (1 << NS_IPCK_SHIFT),   /* ip checksum */
366         Budpck = (1 << NS_UDPCK_SHIFT), /* udp checksum */
367         Btcpck = (1 << NS_TCPCK_SHIFT), /* tcp checksum */
368         Bpktck = (1 << NS_PKTCK_SHIFT), /* packet checksum */
369         Btso = (1 << NS_TSO_SHIFT),     /* TSO */
370 };
371 #define BCKSUM_FLAGS (Bipck|Budpck|Btcpck|Bpktck|Btso)
372
373 struct extra_bdata {
374         uintptr_t base;
375         /* using u32s for packing reasons.  this means no extras > 4GB */
376         uint32_t off;
377         uint32_t len;
378 };
379
380 struct block {
381         struct block *next;
382         struct block *list;
383         uint8_t *rp;                            /* first unconsumed byte */
384         uint8_t *wp;                            /* first empty byte */
385         uint8_t *lim;                           /* 1 past the end of the buffer */
386         uint8_t *base;                          /* start of the buffer */
387         void (*free) (struct block *);
388         uint16_t flag;
389         uint16_t checksum;                      /* IP checksum of complete packet (minus media header) */
390         uint16_t checksum_start;                /* off from start of block to start csum */
391         uint16_t checksum_offset;               /* off from checksum_start to store csum */
392         uint16_t mss;               /* TCP MSS for TSO */
393         /* might want something to track the next free extra_data slot */
394         size_t extra_len;
395         unsigned int nr_extra_bufs;
396         struct extra_bdata *extra_data;
397 };
398 #define BLEN(s) ((s)->wp - (s)->rp + (s)->extra_len)
399 #define BHLEN(s) ((s)->wp - (s)->rp)
400 #define BALLOC(s) ((s)->lim - (s)->base + (s)->extra_len)
401
402 struct chan {
403         spinlock_t lock;
404         struct kref ref;
405         struct chan *next;                      /* allocation */
406         struct chan *link;
407         int64_t offset;                         /* in file */
408         int type;
409         uint32_t dev;
410         uint16_t mode;                          /* read/write */
411         uint16_t flag;
412         struct qid qid;
413         int fid;                                        /* for devmnt */
414         uint32_t iounit;                        /* chunk size for i/o; 0==default */
415         struct mhead *umh;                      /* mount point that derived Chan; used in unionread */
416         struct chan *umc;                       /* channel in union; held for union read */
417         qlock_t umqlock;                        /* serialize unionreads */
418         int uri;                                        /* union read index */
419         int dri;                                        /* devdirread index */
420         uint32_t mountid;
421         struct mntcache *mcp;           /* Mount cache pointer */
422         struct mnt *mux;                        /* Mnt for clients using me for messages */
423         union {
424                 void *aux;
425                 char tag[4];                    /* for iproute */
426         };
427         /* mountpoint, as discovered during walk.
428          * Used for rename at present.
429          */
430         struct chan *mountpoint;
431         struct chan *mchan;                     /* channel to mounted server */
432         struct qid mqid;                        /* qid of root of mount point */
433         struct cname *name;
434         /* hack for dir reads to try to get them right. */
435         int ateof;
436         void *buf;
437         int bufused;
438 };
439
440 struct cname {
441         struct kref ref;
442         int alen;                                       /* allocated length */
443         int len;                                        /* strlen(s) */
444         char *s;
445 };
446
447 struct dev {
448         char *name;
449
450         void (*reset) (void);
451         void (*init) (void);
452         void (*shutdown) (void);
453         struct chan *(*attach) (char *muxattach);
454         struct walkqid *(*walk) (struct chan *, struct chan *, char **name, int);
455         int (*stat) (struct chan *, uint8_t *, int);
456         struct chan *(*open) (struct chan *, int);
457         void (*create) (struct chan *, char *, int, uint32_t);
458         void (*close) (struct chan *);
459         long (*read) (struct chan *, void *, long, int64_t);
460         struct block *(*bread) (struct chan *, long, uint32_t);
461         long (*write) (struct chan *, void *, long, int64_t);
462         long (*bwrite) (struct chan *, struct block *, uint32_t);
463         void (*remove) (struct chan *);
464         int (*wstat) (struct chan *, uint8_t * unused_uint8_p_t, int);
465         void (*power) (int);            /* power mgt: power(1) → on, power (0) → off */
466 //  int (*config)( int unused_int, char *unused_char_p_t, DevConf*);
467         char *(*chaninfo) (struct chan *, char *, size_t);
468         int (*tapfd) (struct chan *, struct fd_tap *, int);
469         /* we need to be aligned, we think to 64 bytes, for the linker tables. */
470 } __attribute__ ((aligned(64)));
471
472 struct dirtab {
473         char name[KNAMELEN];
474         struct qid qid;
475         int64_t length;
476         long perm;
477 };
478
479 struct walkqid {
480         struct chan *clone;
481         int nqid;
482         struct qid qid[1];
483 };
484
485 enum {
486         NSMAX = 1000,
487         NSLOG = 7,
488         NSCACHE = (1 << NSLOG),
489 };
490
491 struct mntwalk {                                /* state for /proc/#/ns */
492         int cddone;
493         uint32_t id;
494         struct mhead *mh;
495         struct mount *cm;
496 };
497
498 struct mount {
499         uint32_t mountid;
500         struct mount *next;
501         struct mhead *head;
502         struct mount *copy;
503         struct mount *order;
504         struct chan *to;                        /* channel replacing channel */
505         int mflag;
506         char *spec;
507 };
508
509 struct mhead {
510         struct kref ref;
511         struct rwlock lock;
512         struct chan *from;                      /* channel mounted upon */
513         struct mount *mount;            /* what's mounted upon it */
514         struct mhead *hash;                     /* Hash chain */
515 };
516
517 struct mnt {
518         spinlock_t lock;
519         /* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */
520         struct chan *c;                         /* Channel to file service */
521         struct proc *rip;                       /* Reader in progress */
522         struct mntrpc *queue;           /* Queue of pending requests on this channel */
523         uint32_t id;                            /* Multiplexer id for channel check */
524         struct mnt *list;                       /* Free list */
525         int flags;                                      /* cache */
526         int msize;                                      /* data + IOHDRSZ */
527         char *version;                          /* 9P version */
528         struct queue *q;                        /* input queue */
529 };
530
531 enum {
532         RENDLOG = 5,
533         RENDHASH = 1 << RENDLOG,        /* Hash to lookup rendezvous tags */
534         MNTLOG = 5,
535         MNTHASH = 1 << MNTLOG,  /* Hash to walk mount table */
536         DELTAFD = 20,   /* allocation quantum for process file descriptors */
537         MAXNFD = 4000,  /* max per process file descriptors */
538         MAXKEY = 8,     /* keys for signed modules */
539 };
540 #define MOUNTH(p,qid)   ((p)->mnthash[(qid).path&((1<<MNTLOG)-1)])
541
542 struct mntparam {
543         struct chan *chan;
544         struct chan *authchan;
545         char *spec;
546         int flags;
547 };
548
549 struct pgrp {
550         struct kref ref;                        /* also used as a lock when mounting */
551         uint32_t pgrpid;
552         qlock_t debug;                          /* single access via devproc.c */
553         struct rwlock ns;                       /* Namespace n read/one write lock */
554         qlock_t nsh;
555         struct mhead *mnthash[MNTHASH];
556         int progmode;
557         struct chan *dot;
558         struct chan *slash;
559         int nodevs;
560         int pin;
561 };
562
563 struct evalue {
564         char *var;
565         char *val;
566         int len;
567         struct qid qid;
568         struct evalue *next;
569 };
570
571 struct egrp {
572         struct kref ref;
573         qlock_t qlock;
574         struct evalue *entries;
575         uint32_t path;                          /* qid.path of next Evalue to be allocated */
576         uint32_t vers;                          /* of Egrp */
577 };
578
579 struct signerkey {
580         struct kref ref;
581         char *owner;
582         uint16_t footprint;
583         uint32_t expires;
584         void *alg;
585         void *pk;
586         void (*pkfree) (void *);
587 };
588
589 struct skeyset {
590         struct kref ref;
591         qlock_t qlock;
592         uint32_t flags;
593         char *devs;
594         int nkey;
595         struct signerkey *keys[MAXKEY];
596 };
597
598 /*
599  * fasttick timer interrupts
600  */
601 enum {
602         /* Mode */
603         Trelative,                                      /* timer programmed in ns from now */
604         Tabsolute,                                      /* timer programmed in ns since epoch */
605         Tperiodic,                                      /* periodic timer, period in ns */
606 };
607
608 enum {
609         PRINTSIZE = 256,
610         NUMSIZE = 12,   /* size of formatted number */
611         MB = (1024 * 1024),
612         READSTR = 2000, /* temporary buffer size for device reads */
613 };
614
615 extern struct dev devtab[];
616 extern struct dev __devtabend[];
617
618 struct cmdbuf {
619         char *buf;
620         char **f;
621         int nf;
622 };
623
624 struct cmdtab {
625         int index;                                      /* used by client to switch on result */
626         char *cmd;                                      /* command name */
627         int narg;                                       /* expected #args; 0 ==> variadic */
628 };
629
630 /* queue state bits, all can be set in qopen (Qstarve is always set) */
631 enum {
632         Qstarve = (1 << 0),                     /* consumer starved */
633         Qmsg = (1 << 1),        /* message stream */
634         Qclosed = (1 << 2),     /* queue has been closed/hungup */
635         Qflow = (1 << 3),       /* producer flow controlled */
636         Qcoalesce = (1 << 4),   /* coallesce packets on read */
637         Qkick = (1 << 5),       /* always call the kick routine after qwrite */
638         Qdropoverflow = (1 << 6),       /* writes that would block will be dropped */
639         Qnonblock = (1 << 7),   /* do not block, throw EAGAIN */
640 };
641
642 #define DEVDOTDOT -1
643
644 typedef int Devgen(struct chan *, char *unused_char_p_t, struct dirtab *,
645                                    int unused_int, int, struct dir *);
646
647 /* inferno portfns.h. Not all these are needed. */
648 #define         FPinit() fpinit()       /* remove this if math lib is linked */
649 void FPrestore(void *);
650 void FPsave(void *);
651 struct cname *addelem(struct cname *, char *unused_char_p_t);
652 void addprog(struct proc *);
653 void addrootfile(char *unused_char_p_t, uint8_t * unused_uint8_p_t, uint32_t);
654 struct block *adjustblock(struct block *, int);
655 struct block *allocb(int);
656 int block_add_extd(struct block *b, unsigned int nr_bufs, int mem_flags);
657 int block_append_extra(struct block *b, int len, int mem_flags);
658 int anyhigher(void);
659 int anyready(void);
660 void _assert(char *unused_char_p_t);
661 struct block *bl2mem(uint8_t * unused_uint8_p_t, struct block *, int);
662 int blocklen(struct block *);
663 char *channame(struct chan *);
664 void cclose(struct chan *);
665 void chan_incref(struct chan *);
666 void chandevinit(void);
667 void chandevreset(void);
668 void chandevshutdown(void);
669 void chanfree(struct chan *);
670 void chanrec(struct mnt *);
671 void checkalarms(void);
672 void checkb(struct block *, char *unused_char_p_t);
673 void cinit(void);
674 struct chan *cclone(struct chan *);
675 void cclose(struct chan *);
676 void closeegrp(struct egrp *);
677 void closemount(struct mount *);
678 void closepgrp(struct pgrp *);
679 void closesigs(struct skeyset *);
680 void debugcmd(struct cmdbuf *cb);
681 struct mhead *newmhead(struct chan *from);
682 int cmount(struct chan *, struct chan *, int unused_int, char *unused_char_p_t);
683 void cnameclose(struct cname *);
684 struct block *concatblock(struct block *);
685 struct block *linearizeblock(struct block *b);
686 void confinit(void);
687 void copen(struct chan *);
688 struct block *copyblock(struct block *, int);
689 int cread(struct chan *, uint8_t * unused_uint8_p_t, int unused_int, int64_t);
690 struct chan *cunique(struct chan *);
691 struct chan *createdir(struct chan *, struct mhead *);
692 void cunmount(struct chan *, struct chan *);
693 void cupdate(struct chan *, uint8_t * unused_uint8_p_t, int unused_int,
694                          int64_t);
695 void cursorenable(void);
696 void cursordisable(void);
697 int cursoron(int);
698 void cursoroff(int);
699 void cwrite(struct chan *, uint8_t * unused_uint8_p_t, int unused_int, int64_t);
700 struct chan *devattach(const char *name, char *spec);
701 struct block *devbread(struct chan *, long, uint32_t);
702 long devbwrite(struct chan *, struct block *, uint32_t);
703 struct chan *devclone(struct chan *);
704 void devcreate(struct chan *, char *name, int mode, uint32_t perm);
705 void devdir(struct chan *, struct qid, char *, int64_t, char *, long,
706                         struct dir *);
707 long devdirread(struct chan *, char *, long, struct dirtab *, int, Devgen *);
708 Devgen devgen;
709 void devinit(void);
710 int devno(const char *name, int user);
711 void devpower(int);
712 struct dev *devbyname(char *unused_char_p_t);
713 struct chan *devopen(struct chan *, int unused_int,
714                                          struct dirtab *, int unused_int2, Devgen *);
715 void devpermcheck(char *unused_char_p_t, uint32_t, int);
716 void devremove(struct chan *);
717 void devreset(void);
718 void devshutdown(void);
719 int devstat(struct chan *, uint8_t * unused_uint8_p_t, int unused_int,
720                         struct dirtab *, int unused_int2, Devgen *);
721 struct walkqid *devwalk(struct chan *,
722                                                 struct chan *, char **unused_char_pp_t, int unused_int,
723                                                 struct dirtab *, int unused_intw, Devgen *);
724 int devwstat(struct chan *, uint8_t * unused_uint8_p_t, int);
725 char *devchaninfo(struct chan *chan, char *ret, size_t ret_l);
726 void disinit(void *);
727 void disfault(void *, char *unused_char_p_t);
728 int domount(struct chan **, struct mhead **);
729 void drawactive(int);
730 void drawcmap(void);
731 void dumpstack(void);
732 void egrpcpy(struct egrp *, struct egrp *);
733 int emptystr(char *unused_char_p_t);
734 int eqchan(struct chan *, struct chan *, int);
735 int eqqid(struct qid, struct qid);
736
737 void errstr(char *unused_char_p_t, int);
738 void excinit(void);
739 void exit(int);
740 void reboot(void);
741 void halt(void);
742 int export(int unused_int, char *unused_char_p_t, int);
743 uint64_t fastticks(uint64_t *);
744 uint64_t fastticks2ns(uint64_t);
745 int findmount(struct chan **, struct mhead **, int unused_int, int, struct qid);
746 void free(void *);
747 void free_block_extra(struct block *);
748 void freeb(struct block *);
749 void freeblist(struct block *);
750 void freeskey(struct signerkey *);
751 void getcolor(uint32_t, uint32_t *, uint32_t *, uint32_t *);
752 uint32_t getmalloctag(void *);
753 uint32_t getrealloctag(void *);
754 struct block *iallocb(int);
755 void iallocsummary(void);
756 void printblock(struct block *b);
757 void ilock(spinlock_t *);
758 int iprint(char *unused_char_p_t, ...);
759 void isdir(struct chan *);
760 int islo(void);
761 void iunlock(spinlock_t *);
762 void ixsummary(void);
763 void kbdclock(void);
764 int kbdcr2nl(struct queue *, int);
765 int kbdputc(struct queue *, int);
766 void kbdrepeat(int);
767 void kproc(char *unused_char_p_t, void (*)(void *), void *, int);
768 void kprocchild(struct proc *, void (*)(void *), void *);
769 void (*kproftick) (uint32_t);
770 void ksetenv(char *unused_char_p_t, char *, int);
771 void kstrdup(char **unused_char_pp_t, char *unused_char_p_t);
772
773 struct block *mem2bl(uint8_t * unused_uint8_p_t, int);
774 int memusehigh(void);
775 void microdelay(int);
776 uint64_t mk64fract(uint64_t, uint64_t);
777 void mkqid(struct qid *, int64_t, uint32_t, int);
778 void modinit(void);
779 struct chan *mntauth(struct chan *, char *unused_char_p_t);
780 long mntversion(struct chan *, char *unused_char_p_t, int unused_int, int);
781 void mountfree(struct mount *);
782 void mousetrack(int unused_int, int, int, int);
783 uint64_t ms2fastticks(uint32_t);
784 void mul64fract(uint64_t *, uint64_t, uint64_t);
785 void muxclose(struct mnt *);
786 struct chan *namec(char *unused_char_p_t, int unused_int, int, uint32_t);
787 struct chan *namec_from(struct chan *c, char *name, int amode, int omode,
788                         uint32_t perm);
789 struct chan *newchan(void);
790 struct egrp *newegrp(void);
791 struct mount *newmount(struct mhead *, struct chan *, int unused_int,
792                                            char *unused_char_p_t);
793 struct pgrp *newpgrp(void);
794 struct proc *newproc(void);
795 char *nextelem(char *unused_char_p_t, char *);
796
797 struct cname *newcname(char *unused_char_p_t);
798 void notkilled(void);
799 int nrand(int);
800 uint64_t ns2fastticks(uint64_t);
801 int okaddr(uint32_t, uint32_t, int);
802 int omode_to_rwx(int);
803 int omode_to_9p_accmode(int open_flags);
804 struct block *packblock(struct block *);
805 struct block *padblock(struct block *, int);
806
807 void pgrpcpy(struct pgrp *, struct pgrp *);
808
809 int progfdprint(struct chan *, int unused_int, int, char *unused_char_p_t,
810                                 int i);
811 int pullblock(struct block **, int);
812 struct block *pullupblock(struct block *, int);
813 struct block *pullupqueue(struct queue *, int);
814 void putmhead(struct mhead *);
815 void putstrn(char *unused_char_p_t, int);
816 void qaddlist(struct queue *, struct block *);
817 struct block *qbread(struct queue *, int);
818 long qbwrite(struct queue *, struct block *);
819 long qibwrite(struct queue *q, struct block *b);
820 struct queue *qbypass(void (*)(void *, struct block *), void *);
821 int qcanread(struct queue *);
822 void qclose(struct queue *);
823 int qconsume(struct queue *, void *, int);
824 struct block *qcopy(struct queue *, int unused_int, uint32_t);
825 struct block *qclone(struct queue *q, int header_len, int len,
826                      uint32_t offset);
827 struct block *blist_clone(struct block *blist, int header_len, int len,
828                           uint32_t offset);
829 int qdiscard(struct queue *, int);
830 void qflush(struct queue *);
831 void qfree(struct queue *);
832 int qfull(struct queue *);
833 struct block *qget(struct queue *);
834 void qhangup(struct queue *, char *unused_char_p_t);
835 int qisclosed(struct queue *);
836 int qiwrite(struct queue *, void *, int);
837 int qlen(struct queue *);
838 void qdropoverflow(struct queue *, bool);
839 void qnonblock(struct queue *, bool);
840 struct queue *qopen(int unused_int, int, void (*)(void *), void *);
841 int qpass(struct queue *, struct block *);
842 int qpassnolim(struct queue *, struct block *);
843 int qproduce(struct queue *, void *, int);
844 void qputback(struct queue *, struct block *);
845 long qread(struct queue *, void *, int);
846 struct block *qremove(struct queue *);
847 void qreopen(struct queue *);
848 void qsetlimit(struct queue *, int);
849 int qwindow(struct queue *);
850 int qwrite(struct queue *, void *, int);
851 typedef void (*qio_wake_cb_t)(struct queue *q, void *data, int filter);
852 void qio_set_wake_cb(struct queue *q, qio_wake_cb_t func, void *data);
853
854 void randominit(void);
855 uint32_t randomread(void *, uint32_t);
856 void *realloc(void *, uint32_t);
857 int readmem(unsigned long offset, char *buf, unsigned long n,
858                         void *mem, size_t mem_len);
859 int readnum(unsigned long off, char *buf, unsigned long n, unsigned long val,
860                         size_t size);
861 int readstr(unsigned long offset, char *buf, unsigned long n, char *str);
862 int readnum_int64_t(uint32_t, char *unused_char_p_t, uint32_t, int64_t, int);
863 void ready(struct proc *);
864 void renameproguser(char *unused_char_p_t, char *);
865 void renameuser(char *unused_char_p_t, char *);
866 void resrcwait(char *unused_char_p_t);
867 struct proc *runproc(void);
868 void (*serwrite) (char *unused_char_p_t, int);
869 int setcolor(uint32_t, uint32_t, uint32_t, uint32_t);
870
871 void setmalloctag(void *, uint32_t);
872 int setpri(int);
873 void setrealloctag(void *, uint32_t);
874 char *skipslash(char *unused_char_p_t);
875 void *smalloc(uint32_t);
876 int splhi(void);
877 int spllo(void);
878 void splx(int);
879 void splxpc(int);
880 void swiproc(struct proc *, int);
881 uint32_t _tas(uint32_t *);
882 uint32_t tk2ms(uint32_t);
883 #define         TK2MS(x) ((x)*(1000/HZ))
884 uint64_t tod2fastticks(int64_t);
885 int64_t todget(int64_t *);
886 void todfix(void);
887 void todsetfreq(int64_t);
888 void todinit(void);
889 void todset(int64_t, int64_t, int);
890 int tready(void *);
891 struct block *trimblock(struct block *, int unused_int, int);
892 int uartgetc(void);
893 void uartputc(int);
894 void uartputs(char *unused_char_p_t, int);
895 void unlock(spinlock_t *);
896 void userinit(void);
897 uint32_t userpc(void);
898 void validname(char *, int);
899 void validwstatname(char *);
900 int walk(struct chan **, char **unused_char_pp_t, int unused_int, bool, int *);
901 void *xalloc(uint32_t);
902 void *xallocz(uint32_t, int);
903 void xfree(void *);
904 void xhole(uint32_t, uint32_t);
905 void xinit(void);
906 int xmerge(void *, void *);
907 void *xspanalloc(uint32_t, int unused_int, uint32_t);
908 void xsummary(void);
909
910 void validaddr(void *, uint32_t, int);
911 void *vmemchr(void *, int unused_int, int);
912 void hnputv(void *, int64_t);
913 void hnputl(void *, uint32_t);
914 void hnputs(void *, uint16_t);
915 int64_t nhgetv(void *);
916 uint32_t nhgetl(void *);
917 uint16_t nhgets(void *);
918
919 /* error messages, from inferno emu error.h */
920 extern char Emount[];                   /* inconsistent mount */
921 extern char Eunmount[];                 /* not mounted */
922 extern char Eunion[];                   /* not in union */
923 extern char Emountrpc[];                /* mount rpc error */
924 extern char Enocreate[];                /* mounted directory forbids creation */
925 extern char Enonexist[];                /* file does not exist */
926 extern char Eexist[];                   /* file already exists */
927 extern char Enotdir[];                  /* not a directory */
928 extern char Eisdir[];                   /* file is a directory */
929 extern char Ebadchar[];                 /* bad character in file name */
930 extern char Efilename[];                /* file name syntax */
931 extern char Eperm[];                    /* permission denied */
932 extern char Ebadusefd[];                /* inappropriate use of fd */
933 extern char Ebadarg[];                  /* bad arg in system call */
934 extern char Einuse[];                   /* device or object already in use */
935 extern char Eio[];                              /* i/o error */
936 extern char Etoobig[];                  /* read or write too large */
937 extern char Etoosmall[];                /* read or write too small */
938 extern char Enoifc[];                   /* bad interface or no free interface slots */
939 extern char Ehungup[];                  /* i/o on hungup channel */
940 extern char Ebadctl[];                  /* bad process or channel control request */
941 extern char Enodev[];                   /* no free devices */
942 extern char Enochild[];                 /* no living children */
943 extern char Enovmem[];                  /* out of memory: virtual memory */
944 extern char Eisstream[];                /* seek on a stream */
945 extern char Etimedout[];                /* connection timed out */
946 extern char Econrefused[];              /* connection refused */
947 extern char Econinuse[];                /* connection in use */
948 extern char Eintr[];                    /* interrupted */
949 extern char Enomem[];                   /* out of memory: kernel */
950 extern char Eshort[];                   /* i/o count too small */
951 extern char Enobitstore[];              /* out of screen memory */
952 extern char Egreg[];                    /* jim'll fix it */
953 extern char Ebadspec[];                 /* bad attach specifier */
954 extern char Enoattach[];                /* mount/attach disallowed */
955 extern char Eshortstat[];               /* stat buffer too small */
956 extern char Enegoff[];                  /* negative i/o offset */
957 extern char Ebadstat[];                 /* malformed stat buffer */
958 extern char Ecmdargs[];                 /* wrong #args in control message */
959 extern char Enofd[];                    /* no free file descriptors */
960 extern char Eprocdied[];                /* process died */
961
962 char *get_cur_genbuf(void);
963
964 /* hack for now. */
965 #define NOW     tsc2msec(read_tsc())
966 #define seconds() tsc2sec(read_tsc())
967 #define milliseconds() tsc2msec(read_tsc())
968
969 /* kern/drivers/dev/tab.c */
970 void devtabinit();
971 void devtabreset();
972
973 /* kern/src/ns/parse.c */
974 struct cmdbuf *parsecmd(char *p, int n);
975 void cmderror(struct cmdbuf *cb, char *s);
976 struct cmdtab *lookupcmd(struct cmdbuf *cb, struct cmdtab *ctab, int nctab);
977
978 /* kern/src/ns/sysfile.c */
979 int newfd(struct chan *c, int oflags);
980 struct chan *fdtochan(struct fd_table *fdt, int fd, int mode, int chkmnt,
981                       int iref);
982 long kchanio(void *vc, void *buf, int n, int mode);
983 int openmode(uint32_t o);
984 void fdclose(struct fd_table *fdt, int fd);
985 int syschdir(char *path);
986 int grpclose(struct fd_table *fdt, int fd);
987 int sysclose(int fd);
988 int syscreate(char *path, int mode, uint32_t perm);
989 int sysdup(int old);
990 int sys_dup_to(struct proc *from_proc, unsigned int from_fd,
991                struct proc *to_proc, unsigned int to_fd);
992 int sysfstat(int fd, uint8_t*, int n);
993 int sysfstatakaros(int fd, struct kstat *);
994 char *sysfd2path(int fd);
995 int sysfauth(int fd, char *aname);
996 int sysfversion(int fd, unsigned int msize, char *vers, unsigned int arglen);
997 int syspipe(int fd[2]);
998 int sysfwstat(int fd, uint8_t * buf, int n);
999 long bindmount(struct chan *c, char *old, int flag, char *spec);
1000 int sysbind(char *new, char *old, int flags);
1001 int sysmount(int fd, int afd, char *old, int flags, char *spec);
1002 int sysunmount(char *old, char *new);
1003 int sysopenat(int dirfd, char *path, int vfs_flags);
1004 int sysopen(char *path, int vfs_flags);
1005 long unionread(struct chan *c, void *va, long n);
1006 void read_exactly_n(struct chan *c, void *vp, long n);
1007 long sysread(int fd, void *va, long n);
1008 long syspread(int fd, void *va, long n, int64_t off);
1009 int sysremove(char *path);
1010 int64_t sysseek(int fd, int64_t off, int whence);
1011 void validstat(uint8_t * s, int n, int slashok);
1012 int sysstat(char *path, uint8_t*, int n);
1013 int sysstatakaros(char *path, struct kstat *);
1014 long syswrite(int fd, void *va, long n);
1015 long syspwrite(int fd, void *va, long n, int64_t off);
1016 int syswstat(char *path, uint8_t * buf, int n);
1017 struct dir *chandirstat(struct chan *c);
1018 struct dir *sysdirstat(char *name);
1019 struct dir *sysdirfstat(int fd);
1020 int sysdirwstat(char *name, struct dir *dir);
1021 int sysdirfwstat(int fd, struct dir *dir);
1022 long sysdirread(int fd, struct kdirent **d);
1023 int sysiounit(int fd);
1024 void print_chaninfo(struct chan *ch);
1025 int plan9setup(struct proc *new_proc, struct proc *parent, int flags);
1026 int iseve(void);
1027 int fd_getfl(int fd);
1028 int fd_setfl(int fd, int flags);
1029
1030 /* kern/drivers/dev/srv.c */
1031 char *srvname(struct chan *c);
1032
1033 /* kern/src/eipconv.c. Put them here or face real include hell. */
1034 void printqid(void (*putch) (int, void **), void **putdat, struct qid *q);
1035 void printcname(void (*putch) (int, void **), void **putdat, struct cname *c);
1036 void printchan(void (*putch) (int, void **), void **putdat, struct chan *c);
1037
1038 static inline int abs(int a)
1039 {
1040         if (a < 0)
1041                 return -a;
1042         return a;
1043 }
1044
1045 extern char *eve;
1046 extern unsigned int qiomaxatomic;
1047
1048 /* special sections */
1049 #define __devtab  __attribute__((__section__(".devtab")))
1050
1051 #endif /* ROS_KERN_NS_H */