a87a63119561cfa50a7e1b0fa4caae7d7c3d0d39
[akaros.git] / kern / include / ns.h
1 // INFERNO
2 #include <err.h>
3 #include <rendez.h>
4 #include <rwlock.h>
5 /*
6  * functions (possibly) linked in, complete, from libc.
7  */
8 enum
9 {
10         UTFmax          = 4,            /* maximum bytes per rune */
11         Runesync        = 0x80,         /* cannot represent part of a UTF sequence (<) */
12         Runeself        = 0x80,         /* rune and UTF sequences are the same (<) */
13         Runeerror       = 0xFFFD,       /* decoding error in UTF */
14         Runemax         = 0x10FFFF,     /* 21-bit rune */
15         Runemask        = 0x1FFFFF,     /* bits used by runes (see grep) */
16 };
17
18 extern  int     abs(int);
19
20 /*
21  * math
22  */
23 extern int      isNaN(double);
24 extern int      isInf(double, int);
25 extern double   floor(double);
26 extern double   frexp(double, int*);
27 extern double   pow10(int);
28
29 /*
30  * one-of-a-kind
31  */
32 extern  char*   cleanname( char *unused_char_p_t);
33 extern  uint32_t        getcallerpc(void*);
34
35 extern  char    etext[];
36 extern  char    edata[];
37 extern  char    end[];
38 extern  int     getfields( char *unused_char_p_t, char **unused_char_pp_t, int unused_int, int, char*);
39 extern  int     tokenize( char *unused_char_p_t, char **unused_char_pp_t, int);
40 extern  int     dec64( uint8_t *unused_uint8_p_t, int unused_int, char *unused_char_p_t, int);
41 extern  void    qsort(void*, long, long, int (*)(void*, void*));
42
43 extern  int     toupper(int);
44 extern  char*   netmkaddr( char *unused_char_p_t, char*, char*);
45 extern  int     myetheraddr( uint8_t *unused_uint8_p_t, char *unused_char_p_t);
46 extern  int     parseether( uint8_t *unused_uint8_p_t, char *unused_char_p_t);
47
48 /*
49  * network dialling
50  */
51 #define NETPATHLEN      40
52
53 /*
54  * Syscall data structures
55  */
56 #define MORDER  0x0003  /* mask for bits defining order of mounting */
57 #define MREPL   0x0000  /* mount replaces object */
58 #define MBEFORE 0x0001  /* mount goes before others in union directory */
59 #define MAFTER  0x0002  /* mount goes after others in union directory */
60 #define MCREATE 0x0004  /* permit creation in mounted directory */
61 #define MCACHE  0x0010  /* cache some data */
62 #define MMASK   0x0017  /* all bits on */
63
64 #define NCONT   0       /* continue after note */
65 #define NDFLT   1       /* terminate after note */
66 #define NSAVE   2       /* clear note but hold state */
67 #define NRSTR   3       /* restore saved state */
68
69 #define STATMAX 65535U  /* max length of machine-independent stat structure */
70 #define ERRMAX                  128     /* max length of error string */
71 #define KNAMELEN                28      /* max length of name held in kernel */
72
73 /* bits in Qid.type */
74 #define QTDIR           0x80            /* type bit for directories */
75 #define QTAPPEND        0x40            /* type bit for append only files */
76 #define QTEXCL          0x20            /* type bit for exclusive use files */
77 #define QTMOUNT         0x10            /* type bit for mounted channel */
78 #define QTAUTH          0x08            /* type bit for authentication file */
79 #define QTFILE          0x00            /* plain file */
80
81 /* bits in Dir.mode */
82 #define DMDIR           0x80000000      /* mode bit for directories */
83 #define DMAPPEND        0x40000000      /* mode bit for append only files */
84 #define DMEXCL          0x20000000      /* mode bit for exclusive use files */
85 #define DMMOUNT         0x10000000      /* mode bit for mounted channel */
86 #define DMREAD          0x4             /* mode bit for read permission */
87 #define DMWRITE         0x2             /* mode bit for write permission */
88 #define DMEXEC          0x1             /* mode bit for execute permission */
89
90 struct qid
91 {
92         uint64_t        path;
93         uint32_t        vers;
94         uint8_t type;
95 };
96
97 struct dir {
98         /* system-modified data */
99         uint16_t        type;   /* server type */
100         unsigned int    dev;    /* server subtype */
101         /* file data */
102         struct qid      qid;    /* unique id from server */
103         uint32_t        mode;   /* permissions */
104         uint32_t        atime;  /* last read time */
105         uint32_t        mtime;  /* last write time */
106         int64_t length; /* file length: see <u.h> */
107         char    *name;  /* last element of path */
108         char    *uid;   /* owner name */
109         char    *gid;   /* group name */
110         char    *muid;  /* last modifier name */
111 };
112
113 struct waitmsg
114 {
115         int     pid;    /* of loved one */
116         uint32_t        time[3];        /* of loved one and descendants */
117         char    msg[ERRMAX];    /* actually variable-size in user mode */
118 };
119
120 #define VERSION9P       "9P2000"
121
122 #define MAXWELEM        16
123
124 typedef
125 struct  fcall
126 {
127         uint8_t type;
128         uint32_t        fid;
129         uint16_t        tag;
130         /* union { */
131                 /* struct { */
132                         uint32_t        msize;          /* Tversion, Rversion */
133                         char    *version;       /* Tversion, Rversion */
134                 /* }; */
135                 /* struct { */
136                         uint16_t        oldtag;         /* Tflush */
137                 /* }; */
138                 /* struct { */
139                         char    *ename;         /* Rerror */
140                 /* }; */
141                 /* struct { */
142                         struct qid      qid;            /* Rattach, Ropen, Rcreate */
143                         uint32_t        iounit;         /* Ropen, Rcreate */
144                 /* }; */
145                 /* struct { */
146                         struct qid      aqid;           /* Rauth */
147                 /* }; */
148                 /* struct { */
149                         uint32_t        afid;           /* Tauth, Tattach */
150                         char    *uname;         /* Tauth, Tattach */
151                         char    *aname;         /* Tauth, Tattach */
152                 /* }; */
153                 /* struct { */
154                         uint32_t        perm;           /* Tcreate */ 
155                         char    *name;          /* Tcreate */
156                         uint8_t mode;           /* Tcreate, Topen */
157                 /* }; */
158                 /* struct { */
159                         uint32_t        newfid;         /* Twalk */
160                         uint16_t        nwname;         /* Twalk */
161                         char    *wname[MAXWELEM];       /* Twalk */
162                 /* }; */
163                 /* struct { */
164                         uint16_t        nwqid;          /* Rwalk */
165                         struct qid      wqid[MAXWELEM];         /* Rwalk */
166                 /* }; */
167                 /* struct { */
168                         int64_t offset;         /* Tread, Twrite */
169                         uint32_t        count;          /* Tread, Twrite, Rread */
170                         char    *data;          /* Twrite, Rread */
171                 /* }; */
172                 /* struct { */
173                         uint16_t        nstat;          /* Twstat, Rstat */
174                         uint8_t *stat;          /* Twstat, Rstat */
175                 /* }; */
176         /* }; */
177 } fcall;
178
179
180 #define GBIT8(p)        ((p)[0])
181 #define GBIT16(p)       ((p)[0]|((p)[1]<<8))
182 #define GBIT32(p)       ((uint32_t)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)))
183 #define GBIT64(p)       ((uint32_t)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\
184                                 ((int64_t)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32))
185
186 #define PBIT8(p,v)      (p)[0]=(v)
187 #define PBIT16(p,v)     (p)[0]=(v);(p)[1]=(v)>>8
188 #define PBIT32(p,v)     (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
189 #define PBIT64(p,v)     (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\
190                         (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56
191
192 #define BIT8SZ          1
193 #define BIT16SZ         2
194 #define BIT32SZ         4
195 #define BIT64SZ         8
196 #define QIDSZ   (BIT8SZ+BIT32SZ+BIT64SZ)
197
198 /* STATFIXLEN includes leading 16-bit count */
199 /* The count, however, excludes itself; total size is BIT16SZ+count */
200 #define STATFIXLEN      (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ)   /* amount of fixed length data in a stat buffer */
201
202 #define NOTAG           (uint16_t)~0U   /* Dummy tag */
203 #define NOFID           (uint32_t)~0U   /* Dummy fid */
204 #define IOHDRSZ         24      /* ample room for Twrite/Rread header (iounit) */
205
206 enum
207 {
208         Tversion =      100,
209         Rversion,
210         Tauth = 102,
211         Rauth,
212         Tattach =       104,
213         Rattach,
214         Terror =        106,    /* illegal */
215         Rerror,
216         Tflush =        108,
217         Rflush,
218         Twalk =         110,
219         Rwalk,
220         Topen =         112,
221         Ropen,
222         Tcreate =       114,
223         Rcreate,
224         Tread =         116,
225         Rread,
226         Twrite =        118,
227         Rwrite,
228         Tclunk =        120,
229         Rclunk,
230         Tremove =       122,
231         Rremove,
232         Tstat =         124,
233         Rstat,
234         Twstat =        126,
235         Rwstat,
236         Tmax,
237 };
238
239 unsigned int    convM2S( uint8_t *unused_uint8_p_t, unsigned int unused_int, struct fcall*);
240 unsigned int    convS2M(struct fcall*, uint8_t *unused_uint8_p_t, unsigned int);
241 unsigned int    sizeS2M(struct fcall*);
242
243 int     statcheck(uint8_t *abuf, unsigned int nbuf);
244 unsigned int    convM2D( uint8_t *unused_uint8_p_t, unsigned int unused_int, struct dir*, char *unused_char_p_t);
245 unsigned int    convD2M(struct dir*, uint8_t *unused_uint8_p_t, unsigned int);
246 unsigned int    sizeD2M(struct dir*);
247
248 int     read9pmsg( int unused_int, void*, unsigned int);
249
250 struct ref
251 {
252         spinlock_t      l;
253         long    ref;
254 };
255
256 struct rept
257 {
258         spinlock_t      l;
259         struct rendez   r;
260         void    *o;
261         int     t;
262         int     (*active)(void*);
263         int     (*ck)(void*, int);
264         void    (*f)(void*);    /* called with VM acquire()'d */
265 };
266
267 enum
268 {
269         Nopin = -1
270 };
271
272 struct talarm
273 {
274         spinlock_t lock;
275         struct proc*    list;
276 };
277
278 struct alarms
279 {
280         qlock_t qlock;
281         struct proc*    head;
282 };
283
284 struct rootdata
285 {
286         int     dotdot;
287         void    *ptr;
288         int     size;
289         int     *sizep;
290 };
291
292 /*
293  * Access types in namec & channel flags
294  */
295 enum
296 {
297         Aaccess,                        /* as in stat, wstat */
298         Abind,                  /* for left-hand-side of bind */
299         Atodir,                         /* as in chdir */
300         Aopen,                          /* for i/o */
301         Amount,                         /* to be mounted or mounted upon */
302         Acreate,                        /* is to be created */
303         Aremove,                        /* will be removed by caller */
304
305         COPEN   = 0x0001,               /* for i/o */
306         CMSG    = 0x0002,               /* the message channel for a mount */
307         CCEXEC  = 0x0008,               /* close on exec */
308         CFREE   = 0x0010,               /* not in use */
309         CRCLOSE = 0x0020,               /* remove on close */
310         CCACHE  = 0x0080,               /* client cache */
311 };
312
313 enum
314 {
315         BINTR           =       (1<<0),
316         BFREE           =       (1<<1),
317         Bipck   =       (1<<2),         /* ip checksum */
318         Budpck  =       (1<<3),         /* udp checksum */
319         Btcpck  =       (1<<4),         /* tcp checksum */
320         Bpktck  =       (1<<5),         /* packet checksum */
321 };
322
323 struct block
324 {
325         struct block*   next;
326         struct block*   list;
327         uint8_t*        rp;                     /* first unconsumed byte */
328         uint8_t*        wp;                     /* first empty byte */
329         uint8_t*        lim;                    /* 1 past the end of the buffer */
330         uint8_t*        base;                   /* start of the buffer */
331         void    (*free)(struct block*);
332         uint16_t        flag;
333         uint16_t        checksum;               /* IP checksum of complete packet (minus media header) */
334 };
335 #define BLEN(s) ((s)->wp - (s)->rp)
336 #define BALLOC(s) ((s)->lim - (s)->base)
337
338 struct chan
339 {
340         spinlock_t lock;
341         struct kref ref;
342         struct chan*    next;                   /* allocation */
343         struct chan*    link;
344         int64_t offset;                 /* in file */
345         uint16_t        type;
346         uint32_t        dev;
347         uint16_t        mode;                   /* read/write */
348         uint16_t        flag;
349         struct qid      qid;
350         int     fid;                    /* for devmnt */
351         uint32_t        iounit; /* chunk size for i/o; 0==default */
352         struct mhead*   umh;                    /* mount point that derived Chan; used in unionread */
353         struct chan*    umc;                    /* channel in union; held for union read */
354         qlock_t umqlock;                /* serialize unionreads */
355         int     uri;                    /* union read index */
356         int     dri;                    /* devdirread index */
357         uint32_t        mountid;
358         struct mntcache *mcp;                   /* Mount cache pointer */
359         struct mnt              *mux;           /* Mnt for clients using me for messages */
360         union {
361                 void*   aux;
362                 char    tag[4];         /* for iproute */
363         };
364         struct chan*    mchan;                  /* channel to mounted server */
365         struct qid      mqid;                   /* qid of root of mount point */
366         struct cname    *name;
367 };
368
369 struct cname
370 {
371         struct kref ref;
372         int     alen;                   /* allocated length */
373         int     len;                    /* strlen(s) */
374         char    *s;
375 };
376
377 struct dev
378 {
379         int     dc;
380         char*   name;
381
382         void    (*reset)(void);
383         void    (*init)(void);
384         void    (*shutdown)(void);
385         struct chan*    (*attach)( char *unused_char_p_t);
386         struct walkqid* (*walk)(struct chan*, struct chan*, char **unused_char_pp_t, int);
387         int     (*stat)(struct chan*, uint8_t *unused_uint8_p_t, int);
388         struct chan*    (*open)(struct chan*, int);
389         void    (*create)(struct chan*, char *unused_char_p_t, int unused_int, uint32_t);
390         void    (*close)(struct chan*);
391         long    (*read)(struct chan*, void*, long, int64_t);
392         struct block*   (*bread)(struct chan*, long, uint32_t);
393         long    (*write)(struct chan*, void*, long, int64_t);
394         long    (*bwrite)(struct chan*, struct block*, uint32_t);
395         void    (*remove)(struct chan*);
396         int     (*wstat)(struct chan*, uint8_t *unused_uint8_p_t, int);
397         void    (*power)(int);  /* power mgt: power(1) → on, power (0) → off */
398 //      int     (*config)( int unused_int, char *unused_char_p_t, DevConf*);
399 };
400
401 struct dirtab
402 {
403         char    name[KNAMELEN];
404         struct qid      qid;
405         int64_t length;
406         long    perm;
407 };
408
409 struct walkqid
410 {
411         struct chan     *clone;
412         int     nqid;
413         struct qid      qid[1];
414 };
415
416 enum
417 {
418         NSMAX   =       1000,
419         NSLOG   =       7,
420         NSCACHE =       (1<<NSLOG),
421 };
422
423 struct mntwalk                          /* state for /proc/#/ns */
424 {
425         int             cddone;
426         uint32_t        id;
427         struct mhead*   mh;
428         struct mount*   cm;
429 };
430
431 struct mount
432 {
433         uint32_t        mountid;
434         struct mount*   next;
435         struct mhead*   head;
436         struct mount*   copy;
437         struct mount*   order;
438         struct chan*    to;                     /* channel replacing channel */
439         int     mflag;
440         char    *spec;
441 };
442
443 struct mhead
444 {
445         struct kref ref;
446         struct rwlock   lock;
447         struct chan*    from;                   /* channel mounted upon */
448         struct mount*   mount;                  /* what's mounted upon it */
449         struct mhead*   hash;                   /* Hash chain */
450 };
451
452 struct mnt
453 {
454         spinlock_t lock;
455         /* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */
456         struct chan     *c;             /* Channel to file service */
457         struct proc     *rip;           /* Reader in progress */
458         struct mntrpc   *queue;         /* Queue of pending requests on this channel */
459         uint32_t        id;             /* Multiplexer id for channel check */
460         struct mnt      *list;          /* Free list */
461         int     flags;          /* cache */
462         int     msize;          /* data + IOHDRSZ */
463         char    *version;                       /* 9P version */
464         struct queue    *q;             /* input queue */
465 };
466
467 enum
468 {
469         RENDLOG =       5,
470         RENDHASH =      1<<RENDLOG,             /* Hash to lookup rendezvous tags */
471         MNTLOG  =       5,
472         MNTHASH =       1<<MNTLOG,              /* Hash to walk mount table */
473         DELTAFD=                20,             /* allocation quantum for process file descriptors */
474         MAXNFD =                4000,           /* max per process file descriptors */
475         MAXKEY =                8,      /* keys for signed modules */
476 };
477 #define MOUNTH(p,qid)   ((p)->mnthash[(qid).path&((1<<MNTLOG)-1)])
478
479 struct mntparam {
480         struct chan*    chan;
481         struct chan*    authchan;
482         char*   spec;
483         int     flags;
484 };
485
486 struct pgrp
487 {
488         struct kref ref;                                /* also used as a lock when mounting */
489         uint32_t        pgrpid;
490         qlock_t debug;                  /* single access via devproc.c */
491         struct rwlock   ns;                     /* Namespace n read/one write lock */
492         qlock_t nsh;
493         struct mhead*   mnthash[MNTHASH];
494         int     progmode;
495         struct chan*    dot;
496         struct chan*    slash;
497         int     nodevs;
498         int     pin;
499 };
500
501 struct fgrp
502 {
503         spinlock_t lock;
504         struct kref ref;
505         struct chan**   fd;
506         int     nfd;                    /* number of fd slots */
507         int     maxfd;                  /* highest fd in use */
508         int     minfd;                  /* lower bound on free fd */
509 };
510
511 struct evalue
512 {
513         char    *var;
514         char    *val;
515         int     len;
516         struct qid      qid;
517         struct evalue   *next;
518 };
519
520 struct egrp
521 {
522         struct kref ref;
523         qlock_t qlock;
524         struct evalue   *entries;
525         uint32_t        path;   /* qid.path of next Evalue to be allocated */
526         uint32_t        vers;   /* of Egrp */
527 };
528
529 struct signerkey
530 {
531         struct kref ref;
532         char*   owner;
533         uint16_t        footprint;
534         uint32_t        expires;
535         void*   alg;
536         void*   pk;
537         void    (*pkfree)(void*);
538 };
539
540 struct skeyset
541 {
542         struct kref ref;
543         qlock_t qlock;
544         uint32_t        flags;
545         char*   devs;
546         int     nkey;
547         struct signerkey        *keys[MAXKEY];
548 };
549
550 /*
551  * fasttick timer interrupts
552  */
553 enum {
554         /* Mode */
555         Trelative,      /* timer programmed in ns from now */
556         Tabsolute,      /* timer programmed in ns since epoch */
557         Tperiodic,      /* periodic timer, period in ns */
558 };
559
560 enum
561 {
562         PRINTSIZE =     256,
563         NUMSIZE =       12,             /* size of formatted number */
564         MB =            (1024*1024),
565         READSTR =       1000,           /* temporary buffer size for device reads */
566 };
567
568 extern  struct dev*     devtab[];
569 struct cmdbuf
570 {
571         char    *buf;
572         char    **f;
573         int     nf;
574 };
575
576 struct cmdtab
577 {
578         int     index;  /* used by client to switch on result */
579         char    *cmd;   /* command name */
580         int     narg;   /* expected #args; 0 ==> variadic */
581 };
582
583 /* queue state bits,  Qmsg, Qcoalesce, and Qkick can be set in qopen */
584 enum
585 {
586         /* Queue.state */
587         Qstarve         = (1<<0),       /* consumer starved */
588         Qmsg            = (1<<1),       /* message stream */
589         Qclosed         = (1<<2),       /* queue has been closed/hungup */
590         Qflow           = (1<<3),       /* producer flow controlled */
591         Qcoalesce       = (1<<4),       /* coallesce packets on read */
592         Qkick           = (1<<5),       /* always call the kick routine after qwrite */
593 };
594
595 #define DEVDOTDOT -1
596
597
598 typedef int    Devgen(struct chan*, char *unused_char_p_t, struct dirtab*, int unused_int, int,
599                       struct dir*);
600
601 /* inferno portfns.h. Not all these are needed. */
602 // INFERNO
603 #define         FPinit() fpinit() /* remove this if math lib is linked */
604 void            FPrestore(void*);
605 void            FPsave(void*);
606 struct cname*           addelem(struct cname*, char *unused_char_p_t);
607 void            addprog(struct proc*);
608 void            addrootfile( char *unused_char_p_t, uint8_t *unused_uint8_p_t, uint32_t);
609 struct block*           adjustblock(struct block*, int);
610 struct block*           allocb(int);
611 int     anyhigher(void);
612 int     anyready(void);
613 void    _assert( char *unused_char_p_t);
614 struct block*           bl2mem( uint8_t *unused_uint8_p_t, struct block*, int);
615 int             blocklen(struct block*);
616 char*           channame(struct chan*);
617 void            cclose(struct chan*);
618 void            chandevinit(void);
619 void            chandevreset(void);
620 void            chandevshutdown(void);
621 struct dir*             chandirstat(struct chan*);
622 void            chanfree(struct chan*);
623 void            chanrec(struct mnt*);
624 void            checkalarms(void);
625 void            checkb(struct block*, char *unused_char_p_t);
626 void            cinit(void);
627 struct chan*            cclone(struct chan*);
628 void            cclose(struct chan*);
629 void            closeegrp(struct egrp*);
630 void            closefgrp(struct fgrp*);
631 void            closemount(struct mount*);
632 void            closepgrp(struct pgrp*);
633 void            closesigs(struct skeyset*);
634 void            cmderror(struct cmdbuf*, char *unused_char_p_t);
635 int             cmount(struct chan*, struct chan*, int unused_int, char *unused_char_p_t);
636 void            cnameclose(struct cname*);
637 struct block*           concatblock(struct block*);
638 void            confinit(void);
639 void            copen(struct chan*);
640 struct block*           copyblock(struct block*, int);
641 int             cread(struct chan*, uint8_t *unused_uint8_p_t, int unused_int, int64_t);
642 struct chan*    cunique(struct chan*);
643 struct chan*            createdir(struct chan*, struct mhead*);
644 void            cunmount(struct chan*, struct chan*);
645 void            cupdate(struct chan*, uint8_t *unused_uint8_p_t, int unused_int, int64_t);
646 void            cursorenable(void);
647 void            cursordisable(void);
648 int             cursoron(int);
649 void            cursoroff(int);
650 void            cwrite(struct chan*, uint8_t *unused_uint8_p_t, int unused_int, int64_t);
651 struct chan*            devattach( int unused_int, char *unused_char_p_t);
652 struct block*           devbread(struct chan*, long, uint32_t);
653 long            devbwrite(struct chan*, struct block*, uint32_t);
654 struct chan*            devclone(struct chan*);
655 void            devcreate(struct chan*, char *unused_char_p_t, int unused_int, uint32_t);
656 void            devdir(struct chan*, struct qid, char *unused_char_p_t, int64_t, char*, long,
657                            struct dir*);
658 long            devdirread(struct chan*, char *unused_char_p_t, long,
659                                struct dirtab*, int unused_int, Devgen*);
660 Devgen          devgen;
661 void            devinit(void);
662 int             devno( int unused_int, int);
663 void    devpower(int);
664 struct dev*     devbyname( char *unused_char_p_t);
665 struct chan*            devopen(struct chan*, int unused_int,
666                                     struct dirtab*, int unused_int2, Devgen*);
667 void            devpermcheck( char *unused_char_p_t, uint32_t, int);
668 void            devremove(struct chan*);
669 void            devreset(void);
670 void            devshutdown(void);
671 int             devstat(struct chan*, uint8_t *unused_uint8_p_t, int unused_int,
672                            struct dirtab*, int unused_int2, Devgen*);
673 struct walkqid* devwalk(struct chan*,
674                         struct chan*, char **unused_char_pp_t, int unused_int,
675                         struct dirtab*, int unused_intw, Devgen*);
676 int             devwstat(struct chan*, uint8_t *unused_uint8_p_t, int);
677 void            disinit(void*);
678 void            disfault(void*, char *unused_char_p_t);
679 int             domount(struct chan**, struct mhead**);
680 void            drawactive(int);
681 void            drawcmap(void);
682 void            dumpstack(void);
683 struct fgrp*            dupfgrp(struct fgrp*);
684 void            egrpcpy(struct egrp*, struct egrp*);
685 int             emptystr( char *unused_char_p_t);
686 int             eqchan(struct chan*, struct chan*, int);
687 int             eqqid(struct qid, struct qid);
688
689 void            errorf( char *unused_char_p_t, ...);
690 void            errstr( char *unused_char_p_t, int);
691 void            excinit(void);
692 void            exhausted( char *unused_char_p_t);
693 void            exit(int);
694 void            reboot(void);
695 void            halt(void);
696 int             export( int unused_int, char *unused_char_p_t, int);
697 uint64_t                fastticks(uint64_t*);
698 uint64_t                fastticks2ns(uint64_t);
699 void            fdclose(struct fgrp*, int);
700 struct chan*            fdtochan(struct fgrp*, int unused_int, int, int, int);
701 int             findmount(struct chan**,
702                              struct mhead**, int unused_int, int, struct qid);
703 void            free(void*);
704 void            freeb(struct block*);
705 void            freeblist(struct block*);
706 void            freeskey(struct signerkey*);
707 void            getcolor(uint32_t, uint32_t*, uint32_t*, uint32_t*);
708 uint32_t        getmalloctag(void*);
709 uint32_t        getrealloctag(void*);
710 void            hnputl(void*, uint32_t);
711 void            hnputs(void*, uint16_t);
712 struct block*           iallocb(int);
713 void            iallocsummary(void);
714 void            ilock(spinlock_t*);
715 int             incref(struct kref*);
716 int             iprint( char *unused_char_p_t, ...);
717 void            isdir(struct chan*);
718 int             iseve(void);
719 int             islo(void);
720 void            iunlock(spinlock_t*);
721 void            ixsummary(void);
722 void            kbdclock(void);
723 int             kbdcr2nl(struct queue*, int);
724 int             kbdputc(struct queue*, int);
725 void            kbdrepeat(int);
726 void            kproc( char *unused_char_p_t, void(*)(void*), void*, int);
727 int             kfgrpclose(struct fgrp*, int);
728 void            kprocchild(struct proc*, void (*)(void*), void*);
729 int             kprint( char *unused_char_p_t, ...);
730 void    (*kproftick)(uint32_t);
731 void            ksetenv( char *unused_char_p_t, char*, int);
732 //void          kstrncpy( char *unused_char_p_t, char*, int unused_int, sizeof(char*, char*));
733 void            kstrdup( char **unused_char_pp_t, char *unused_char_p_t);
734
735 struct cmdtab*          lookupcmd(struct cmdbuf*, struct cmdtab*, int);
736 void*           malloc(uint32_t);
737 void*           mallocz(uint32_t, int);
738 struct block*           mem2bl( uint8_t *unused_uint8_p_t, int);
739 int                     memusehigh(void);
740 void            microdelay(int);
741 uint64_t                mk64fract(uint64_t, uint64_t);
742 void            mkqid(struct qid*, int64_t, uint32_t, int);
743 void            modinit(void);
744 struct chan*            mntauth(struct chan*, char *unused_char_p_t);
745 long            mntversion(struct chan*, char *unused_char_p_t, int unused_int, int);
746 void            mountfree(struct mount*);
747 void            mousetrack( int unused_int, int, int, int);
748 uint64_t                ms2fastticks(uint32_t);
749 uint32_t                msize(void*);
750 void            mul64fract(uint64_t*, uint64_t, uint64_t);
751 void            muxclose(struct mnt*);
752 struct chan*            namec( char *unused_char_p_t, int unused_int, int, uint32_t);
753 struct chan*            newchan(void);
754 struct egrp*            newegrp(void);
755 struct fgrp*            newfgrp(struct fgrp*);
756 struct mount*           newmount(struct mhead*, struct chan*, int unused_int, char *unused_char_p_t);
757 struct pgrp*            newpgrp(void);
758 struct proc*            newproc(void);
759 char*           nextelem( char *unused_char_p_t, char*);
760
761 struct cname*           newcname( char *unused_char_p_t);
762 void    notkilled(void);
763 int             nrand(int);
764 uint64_t                ns2fastticks(uint64_t);
765 int             okaddr(uint32_t, uint32_t, int);
766 int             openmode(uint32_t);
767 struct block*           packblock(struct block*);
768 struct block*           padblock(struct block*, int);
769
770 struct cmdbuf*          parsecmd( char *unused_char_p_t, int);
771
772 void            pgrpcpy(struct pgrp*, struct pgrp*);
773
774 int             progfdprint(struct chan*, int unused_int, int, char *unused_char_p_t, int i);
775 int             pullblock(struct block**, int);
776 struct block*           pullupblock(struct block*, int);
777 struct block*           pullupqueue(struct queue*, int);
778 void            putmhead(struct mhead*);
779 void            putstrn( char *unused_char_p_t, int);
780 void            qaddlist(struct queue*, struct block*);
781 struct block*           qbread(struct queue*, int);
782 long            qbwrite(struct queue*, struct block*);
783 struct queue*   qbypass(void (*)(void*, struct block*), void*);
784 int             qcanread(struct queue*);
785 void            qclose(struct queue*);
786 int             qconsume(struct queue*, void*, int);
787 struct block*           qcopy(struct queue*, int unused_int, uint32_t);
788 int             qdiscard(struct queue*, int);
789 void            qflush(struct queue*);
790 void            qfree(struct queue*);
791 int             qfull(struct queue*);
792 struct block*           qget(struct queue*);
793 void            qhangup(struct queue*, char *unused_char_p_t);
794 int             qisclosed(struct queue*);
795 int             qiwrite(struct queue*, void*, int);
796 int             qlen(struct queue*);
797 void            qlock(qlock_t*);
798 void            qnoblock(struct queue*, int);
799 struct queue*           qopen( int unused_int, int, void (*)(void*), void*);
800 int             qpass(struct queue*, struct block*);
801 int             qpassnolim(struct queue*, struct block*);
802 int             qproduce(struct queue*, void*, int);
803 void            qputback(struct queue*, struct block*);
804 long            qread(struct queue*, void*, int);
805 struct block*           qremove(struct queue*);
806 void            qreopen(struct queue*);
807 void            qsetlimit(struct queue*, int);
808 int             qwindow(struct queue*);
809 int             qwrite(struct queue*, void*, int);
810 void            randominit(void);
811 uint32_t        randomread(void*, uint32_t);
812 void*   realloc(void*, uint32_t);
813 int             readnum(uint32_t, char *unused_char_p_t, uint32_t, uint32_t, int);
814 int             readnum_int64_t(uint32_t, char *unused_char_p_t, uint32_t, int64_t, int);
815 int             readstr(uint32_t, char *unused_char_p_t, uint32_t, char*);
816 void            ready(struct proc*);
817 void            renameproguser( char *unused_char_p_t, char*);
818 void            renameuser( char *unused_char_p_t, char*);
819 void            resrcwait( char *unused_char_p_t);
820 int             return0(void*);
821 struct proc*            runproc(void);
822 void            sched(void);
823 void            schedinit(void);
824 long            seconds(void);
825 void            (*serwrite)( char *unused_char_p_t, int);
826 int             setcolor(uint32_t, uint32_t, uint32_t, uint32_t);
827
828 void            setmalloctag(void*, uint32_t);
829 int             setpri(int);
830 void            setrealloctag(void*, uint32_t);
831 char*           skipslash( char *unused_char_p_t);
832 void            sleep(struct rendez*, int(*)(void*), void*);
833 void*           smalloc(uint32_t);
834 int             splhi(void);
835 int             spllo(void);
836 void            splx(int);
837 void    splxpc(int);
838 void            swiproc(struct proc*, int);
839 uint32_t                _tas(uint32_t*);
840 uint32_t        tk2ms(uint32_t);
841 #define         TK2MS(x) ((x)*(1000/HZ))
842 uint64_t                tod2fastticks(int64_t);
843 int64_t         todget(int64_t*);
844 void            todfix(void);
845 void            todsetfreq(int64_t);
846 void            todinit(void);
847 void            todset(int64_t, int64_t, int);
848 int             tready(void*);
849 struct block*           trimblock(struct block*, int unused_int, int);
850 void            tsleep(struct rendez*, int (*)(void*), void*, int);
851 int             uartgetc(void);
852 void            uartputc(int);
853 void            uartputs( char *unused_char_p_t, int);
854 long            unionread(struct chan*, void*, long);
855 void            unlock(spinlock_t*);
856 void            userinit(void);
857 uint32_t                userpc(void);
858 void            validname( char *unused_char_p_t, int);
859 void            validstat( uint8_t *unused_uint8_p_t, int);
860 void            validwstatname( char *unused_char_p_t);
861 int             wakeup(struct rendez*);
862 int             walk(struct chan**, char **unused_char_pp_t, int unused_int, int, int*);
863 void            werrstr( char *unused_char_p_t, ...);
864 void*           xalloc(uint32_t);
865 void*           xallocz(uint32_t, int);
866 void            xfree(void*);
867 void            xhole(uint32_t, uint32_t);
868 void            xinit(void);
869 int             xmerge(void*, void*);
870 void*           xspanalloc(uint32_t, int unused_int, uint32_t);
871 void            xsummary(void);
872  
873 void            validaddr(void*, uint32_t, int);
874 void*   vmemchr(void*, int unused_int, int);
875 void            hnputv(void*, int64_t);
876 void            hnputl(void*, uint32_t);
877 void            hnputs(void*, uint16_t);
878 int64_t         nhgetv(void*);
879 uint32_t                nhgetl(void*);
880 uint16_t                nhgets(void*);
881
882 /* error messages, from inferno emu error.h */
883 extern char Enoerror[];         /* no error */
884 extern char Emount[];           /* inconsistent mount */
885 extern char Eunmount[];         /* not mounted */
886 extern char Eunion[];           /* not in union */
887 extern char Emountrpc[];        /* mount rpc error */
888 extern char Eshutdown[];        /* mounted device shut down */
889 extern char Eowner[];           /* not owner */
890 extern char Eunknown[];         /* unknown user or group id */
891 extern char Enocreate[];        /* mounted directory forbids creation */
892 extern char Enonexist[];        /* file does not exist */
893 extern char Eexist[];           /* file already exists */
894 extern char Ebadsharp[];        /* unknown device in # filename */
895 extern char Enotdir[];          /* not a directory */
896 extern char Eisdir[];           /* file is a directory */
897 extern char Ebadchar[];         /* bad character in file name */
898 extern char Efilename[];        /* file name syntax */
899 extern char Eperm[];            /* permission denied */
900 extern char Ebadusefd[];        /* inappropriate use of fd */
901 extern char Ebadarg[];          /* bad arg in system call */
902 extern char Einuse[];           /* device or object already in use */
903 extern char Eio[];              /* i/o error */
904 extern char Etoobig[];          /* read or write too large */
905 extern char Etoosmall[];        /* read or write too small */
906 extern char Enetaddr[];         /* bad network address */
907 extern char Emsgsize[];         /* message is too big for protocol */
908 extern char Enetbusy[];         /* network device is busy or allocated */
909 extern char Enoproto[];         /* network protocol not supported */
910 extern char Enoport[];          /* network port not available */
911 extern char Enoifc[];           /* bad interface or no free interface slots */
912 extern char Enolisten[];        /* not announced */
913 extern char Ehungup[];          /* i/o on hungup channel */
914 extern char Ebadctl[];          /* bad process or channel control request */
915 extern char Enodev[];           /* no free devices */
916 extern char Enoenv[];           /* no free environment resources */
917 extern char Ethread[];          /* thread exited */
918 extern char Enochild[];         /* no living children */
919 extern char Eioload[];          /* i/o error in demand load */
920 extern char Enovmem[];          /* out of memory: virtual memory */
921 extern char Ebadld[];           /* illegal line discipline */
922 extern char Ebadfd[];           /* fd out of range or not open */
923 extern char Eisstream[];        /* seek on a stream */
924 extern char Ebadexec[];         /* exec header invalid */
925 extern char Etimedout[];        /* connection timed out */
926 extern char Econrefused[];      /* connection refused */
927 extern char Econinuse[];        /* connection in use */
928 extern char Enetunreach[];      /* network unreachable */
929 extern char Eintr[];            /* interrupted */
930 extern char Enomem[];           /* out of memory: kernel */
931 extern char Esfnotcached[];     /* subfont not cached */
932 extern char Esoverlap[];        /* segments overlap */
933 extern char Emouseset[];        /* mouse type already set */
934 extern char Eshort[];           /* i/o count too small */
935 extern char Enobitstore[];      /* out of screen memory */
936 extern char Egreg[];            /* jim'll fix it */
937 extern char Ebadspec[];         /* bad attach specifier */
938 extern char Estopped[];         /* thread must be stopped */
939 extern char Enoattach[];        /* mount/attach disallowed */
940 extern char Eshortstat[];       /* stat buffer too small */
941 extern char Enegoff[];  /* negative i/o offset */
942 extern char Ebadstat[]; /* malformed stat buffer */
943 extern char Ecmdargs[];         /* wrong #args in control message */
944 extern char     Enofd[];        /* no free file descriptors */
945 extern char Enoctl[];   /* unknown control request */
946
947
948 /* kern/src/err.c */
949 int errpush(struct errbuf *errstack, int stacksize, int *curindex,
950             struct errbuf **prev_errbuf);
951 void errpop(struct errbuf *errstack, int stacksize, int *curindex,
952             struct errbuf *prev_errbuf);
953 /* */
954 char *get_cur_genbuf(void);
955
956 /* stuff we really ought to have ... */
957 char *index(char *s, int c);