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