qio: Remove qconsume()
[akaros.git] / kern / include / ns.h
index ed4f386..3973cb7 100644 (file)
@@ -1,13 +1,41 @@
-// INFERNO
-
-#ifndef ROS_KERN_NS_H
-#define ROS_KERN_NS_H
+/* Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
+ * Portions Copyright © 1997-1999 Vita Nuova Limited
+ * Portions Copyright © 2000-2007 Vita Nuova Holdings Limited
+ *                                (www.vitanuova.com)
+ * Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
+ *
+ * Modified for the Akaros operating system:
+ * Copyright (c) 2013-2014 The Regents of the University of California
+ * Copyright (c) 2013-2015 Google Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE. */
+
+
+#pragma once
 
 #include <err.h>
 #include <rendez.h>
 #include <rwlock.h>
 #include <linker_func.h>
 #include <fdtap.h>
+#include <ros/fs.h>
+#include <vfs.h>
 
 /*
  * functions (possibly) linked in, complete, from libc.
@@ -19,8 +47,8 @@ enum {
        Runeerror = 0xFFFD,     /* decoding error in UTF */
        Runemax = 0x10FFFF,     /* 21-bit rune */
        Runemask = 0x1FFFFF,    /* bits used by runes (see grep) */
-       NUMSIZE32 = 9,  /* max size of formatted 32 bit number */
-       NUMSIZE64 = 20, /* max size of formatted 64 bit number */
+       NUMSIZE32 = 10, /* max size of formatted 32 bit number (hex or decimal) */
+       NUMSIZE64 = 20, /* max size of formatted 64 bit number (hex or decimal) */
 };
 
 /*
@@ -42,9 +70,6 @@ static inline uint32_t getcallerpc(void *v)
        return 0;
 }
 
-extern char etext[];
-extern char edata[];
-extern char end[];
 extern int getfields(char *unused_char_p_t, char **unused_char_pp_t,
                                         int unused_int, int, char *);
 extern int tokenize(char *unused_char_p_t, char **unused_char_pp_t, int);
@@ -100,9 +125,6 @@ extern int parseether(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
 #define DMWRITE                0x2     /* mode bit for write permission */
 #define DMEXEC         0x1     /* mode bit for execute permission */
 
-/* Helper for mode checks.  It's poorly named since it's really "not writable"*/
-#define IS_RDONLY(x) (!((x) & O_WRITE))
-
 struct qid {
        uint64_t path;
        uint32_t vers;
@@ -314,13 +336,16 @@ enum {
        CCACHE =                0x0008, /* client cache */
        CINTERNAL_FLAGS = (COPEN | CMSG | CFREE | CCACHE),
 
-       /* chan/file flags, setably via open and sometimes fcntl/setfl.  these are
-        * the internal names used in some parts of 9ns */
-       CCEXEC =                O_CLOEXEC,      /* (prob should be on the FD, 9ns has it here) */
-       CRCLOSE =               O_REMCLO,       /* remove on close (also, maybe should be on FD) */
-       CAPPEND =               O_APPEND,       /* append on write */
-       CNONBLOCK =     O_NONBLOCK,     /* don't block, can't be set via setfl */
-       CEXTERNAL_FLAGS = (CCEXEC | CRCLOSE | CAPPEND | CNONBLOCK),
+       /* chan/file flags, getable via fcntl/getfl and setably via open and
+        * sometimes fcntl/setfl.  those that can't be set cause an error() in
+        * fd_setfl. */
+       CEXTERNAL_FLAGS = (
+           O_CLOEXEC      | /* (prob should be on the FD, 9ns has it here) */
+           O_REMCLO       | /* remove on close (also, maybe should be on FD) */
+           O_APPEND       | /* append on write */
+           O_NONBLOCK     | /* don't block, can't be set via setfl */
+           O_PATH         | /* path open, just the name, no I/O */
+           0),
 };
 
 #define NS_IPCK_SHIFT  2
@@ -331,7 +356,6 @@ enum {
 #define NS_SHIFT_MAX 6
 
 enum {
-       BINTR = (1 << 0),
        BFREE = (1 << 1),
        Bipck = (1 << NS_IPCK_SHIFT),   /* ip checksum */
        Budpck = (1 << NS_UDPCK_SHIFT), /* udp checksum */
@@ -416,7 +440,6 @@ struct cname {
 };
 
 struct dev {
-       int dc;
        char *name;
 
        void (*reset) (void);
@@ -438,6 +461,7 @@ struct dev {
 //  int (*config)( int unused_int, char *unused_char_p_t, DevConf*);
        char *(*chaninfo) (struct chan *, char *, size_t);
        int (*tapfd) (struct chan *, struct fd_tap *, int);
+       int (*chan_ctl)(struct chan *, int);
        /* we need to be aligned, we think to 64 bytes, for the linker tables. */
 } __attribute__ ((aligned(64)));
 
@@ -617,7 +641,6 @@ typedef int Devgen(struct chan *, char *unused_char_p_t, struct dirtab *,
                                   int unused_int, int, struct dir *);
 
 /* inferno portfns.h. Not all these are needed. */
-// INFERNO
 #define                FPinit() fpinit()       /* remove this if math lib is linked */
 void FPrestore(void *);
 void FPsave(void *);
@@ -625,8 +648,9 @@ struct cname *addelem(struct cname *, char *unused_char_p_t);
 void addprog(struct proc *);
 void addrootfile(char *unused_char_p_t, uint8_t * unused_uint8_p_t, uint32_t);
 struct block *adjustblock(struct block *, int);
-struct block *allocb(int);
-void block_add_extd(struct block *b, unsigned int nr_bufs, int mem_flags);
+struct block *block_alloc(size_t, int);
+int block_add_extd(struct block *b, unsigned int nr_bufs, int mem_flags);
+int block_append_extra(struct block *b, int len, int mem_flags);
 int anyhigher(void);
 int anyready(void);
 void _assert(char *unused_char_p_t);
@@ -669,7 +693,7 @@ void cursordisable(void);
 int cursoron(int);
 void cursoroff(int);
 void cwrite(struct chan *, uint8_t * unused_uint8_p_t, int unused_int, int64_t);
-struct chan *devattach(int unused_int, char *unused_char_p_t);
+struct chan *devattach(const char *name, char *spec);
 struct block *devbread(struct chan *, long, uint32_t);
 long devbwrite(struct chan *, struct block *, uint32_t);
 struct chan *devclone(struct chan *);
@@ -679,7 +703,7 @@ void devdir(struct chan *, struct qid, char *, int64_t, char *, long,
 long devdirread(struct chan *, char *, long, struct dirtab *, int, Devgen *);
 Devgen devgen;
 void devinit(void);
-int devno(int unused_int, int);
+int devno(const char *name, int user);
 void devpower(int);
 struct dev *devbyname(char *unused_char_p_t);
 struct chan *devopen(struct chan *, int unused_int,
@@ -716,14 +740,13 @@ uint64_t fastticks(uint64_t *);
 uint64_t fastticks2ns(uint64_t);
 int findmount(struct chan **, struct mhead **, int unused_int, int, struct qid);
 void free(void *);
+void free_block_extra(struct block *);
 void freeb(struct block *);
 void freeblist(struct block *);
 void freeskey(struct signerkey *);
 void getcolor(uint32_t, uint32_t *, uint32_t *, uint32_t *);
 uint32_t getmalloctag(void *);
 uint32_t getrealloctag(void *);
-struct block *iallocb(int);
-void iallocsummary(void);
 void printblock(struct block *b);
 void ilock(spinlock_t *);
 int iprint(char *unused_char_p_t, ...);
@@ -739,7 +762,6 @@ void kproc(char *unused_char_p_t, void (*)(void *), void *, int);
 void kprocchild(struct proc *, void (*)(void *), void *);
 void (*kproftick) (uint32_t);
 void ksetenv(char *unused_char_p_t, char *, int);
-//void      kstrncpy( char *unused_char_p_t, char*, int unused_int, sizeof(char*, char*));
 void kstrdup(char **unused_char_pp_t, char *unused_char_p_t);
 
 struct block *mem2bl(uint8_t * unused_uint8_p_t, int);
@@ -756,6 +778,8 @@ uint64_t ms2fastticks(uint32_t);
 void mul64fract(uint64_t *, uint64_t, uint64_t);
 void muxclose(struct mnt *);
 struct chan *namec(char *unused_char_p_t, int unused_int, int, uint32_t);
+struct chan *namec_from(struct chan *c, char *name, int amode, int omode,
+                        uint32_t perm);
 struct chan *newchan(void);
 struct egrp *newegrp(void);
 struct mount *newmount(struct mhead *, struct chan *, int unused_int,
@@ -766,7 +790,8 @@ char *nextelem(char *unused_char_p_t, char *);
 
 struct cname *newcname(char *unused_char_p_t);
 void notkilled(void);
-int nrand(int);
+uint32_t random_read(void *xp, uint32_t n);
+uint32_t urandom_read(void *xp, uint32_t n);
 uint64_t ns2fastticks(uint64_t);
 int okaddr(uint32_t, uint32_t, int);
 int omode_to_rwx(int);
@@ -785,12 +810,11 @@ void putmhead(struct mhead *);
 void putstrn(char *unused_char_p_t, int);
 void qaddlist(struct queue *, struct block *);
 struct block *qbread(struct queue *, int);
-long qbwrite(struct queue *, struct block *);
-long qibwrite(struct queue *q, struct block *b);
+ssize_t qbwrite(struct queue *, struct block *);
+ssize_t qibwrite(struct queue *q, struct block *b);
 struct queue *qbypass(void (*)(void *, struct block *), void *);
 int qcanread(struct queue *);
 void qclose(struct queue *);
-int qconsume(struct queue *, void *, int);
 struct block *qcopy(struct queue *, int unused_int, uint32_t);
 struct block *qclone(struct queue *q, int header_len, int len,
                      uint32_t offset);
@@ -803,26 +827,22 @@ int qfull(struct queue *);
 struct block *qget(struct queue *);
 void qhangup(struct queue *, char *unused_char_p_t);
 int qisclosed(struct queue *);
-int qiwrite(struct queue *, void *, int);
+ssize_t qiwrite(struct queue *, void *, int);
 int qlen(struct queue *);
 void qdropoverflow(struct queue *, bool);
 void qnonblock(struct queue *, bool);
 struct queue *qopen(int unused_int, int, void (*)(void *), void *);
-int qpass(struct queue *, struct block *);
-int qpassnolim(struct queue *, struct block *);
-int qproduce(struct queue *, void *, int);
+ssize_t qpass(struct queue *, struct block *);
+ssize_t qpassnolim(struct queue *, struct block *);
 void qputback(struct queue *, struct block *);
 long qread(struct queue *, void *, int);
-struct block *qremove(struct queue *);
 void qreopen(struct queue *);
 void qsetlimit(struct queue *, int);
 int qwindow(struct queue *);
-int qwrite(struct queue *, void *, int);
+ssize_t qwrite(struct queue *, void *, int);
 typedef void (*qio_wake_cb_t)(struct queue *q, void *data, int filter);
 void qio_set_wake_cb(struct queue *q, qio_wake_cb_t func, void *data);
 
-void randominit(void);
-uint32_t randomread(void *, uint32_t);
 void *realloc(void *, uint32_t);
 int readmem(unsigned long offset, char *buf, unsigned long n,
                        void *mem, size_t mem_len);
@@ -867,7 +887,7 @@ void userinit(void);
 uint32_t userpc(void);
 void validname(char *, int);
 void validwstatname(char *);
-int walk(struct chan **, char **unused_char_pp_t, int unused_int, int, int *);
+int walk(struct chan **, char **unused_char_pp_t, int unused_int, bool, int *);
 void *xalloc(uint32_t);
 void *xallocz(uint32_t, int);
 void xfree(void *);
@@ -886,72 +906,6 @@ int64_t nhgetv(void *);
 uint32_t nhgetl(void *);
 uint16_t nhgets(void *);
 
-/* error messages, from inferno emu error.h */
-extern char Enoerror[];                        /* no error */
-extern char Emount[];                  /* inconsistent mount */
-extern char Eunmount[];                        /* not mounted */
-extern char Eunion[];                  /* not in union */
-extern char Emountrpc[];               /* mount rpc error */
-extern char Eshutdown[];               /* mounted device shut down */
-extern char Eowner[];                  /* not owner */
-extern char Eunknown[];                        /* unknown user or group id */
-extern char Enocreate[];               /* mounted directory forbids creation */
-extern char Enonexist[];               /* file does not exist */
-extern char Eexist[];                  /* file already exists */
-extern char Ebadsharp[];               /* unknown device in # filename */
-extern char Enotdir[];                 /* not a directory */
-extern char Eisdir[];                  /* file is a directory */
-extern char Ebadchar[];                        /* bad character in file name */
-extern char Efilename[];               /* file name syntax */
-extern char Eperm[];                   /* permission denied */
-extern char Ebadusefd[];               /* inappropriate use of fd */
-extern char Ebadarg[];                 /* bad arg in system call */
-extern char Einuse[];                  /* device or object already in use */
-extern char Eio[];                             /* i/o error */
-extern char Etoobig[];                 /* read or write too large */
-extern char Etoosmall[];               /* read or write too small */
-extern char Enetaddr[];                        /* bad network address */
-extern char Emsgsize[];                        /* message is too big for protocol */
-extern char Enetbusy[];                        /* network device is busy or allocated */
-extern char Enoproto[];                        /* network protocol not supported */
-extern char Enoport[];                 /* network port not available */
-extern char Enoifc[];                  /* bad interface or no free interface slots */
-extern char Enolisten[];               /* not announced */
-extern char Ehungup[];                 /* i/o on hungup channel */
-extern char Ebadctl[];                 /* bad process or channel control request */
-extern char Enodev[];                  /* no free devices */
-extern char Enoenv[];                  /* no free environment resources */
-extern char Ethread[];                 /* thread exited */
-extern char Enochild[];                        /* no living children */
-extern char Eioload[];                 /* i/o error in demand load */
-extern char Enovmem[];                 /* out of memory: virtual memory */
-extern char Ebadld[];                  /* illegal line discipline */
-extern char Ebadfd[];                  /* fd out of range or not open */
-extern char Eisstream[];               /* seek on a stream */
-extern char Ebadexec[];                        /* exec header invalid */
-extern char Etimedout[];               /* connection timed out */
-extern char Econrefused[];             /* connection refused */
-extern char Econinuse[];               /* connection in use */
-extern char Enetunreach[];             /* network unreachable */
-extern char Eintr[];                   /* interrupted */
-extern char Enomem[];                  /* out of memory: kernel */
-extern char Esfnotcached[];            /* subfont not cached */
-extern char Esoverlap[];               /* segments overlap */
-extern char Emouseset[];               /* mouse type already set */
-extern char Eshort[];                  /* i/o count too small */
-extern char Enobitstore[];             /* out of screen memory */
-extern char Egreg[];                   /* jim'll fix it */
-extern char Ebadspec[];                        /* bad attach specifier */
-extern char Estopped[];                        /* thread must be stopped */
-extern char Enoattach[];               /* mount/attach disallowed */
-extern char Eshortstat[];              /* stat buffer too small */
-extern char Enegoff[];                 /* negative i/o offset */
-extern char Ebadstat[];                        /* malformed stat buffer */
-extern char Ecmdargs[];                        /* wrong #args in control message */
-extern char Enofd[];                   /* no free file descriptors */
-extern char Enoctl[];                  /* unknown control request */
-extern char Eprocdied[];               /* process died */
-
 char *get_cur_genbuf(void);
 
 /* hack for now. */
@@ -993,7 +947,8 @@ long bindmount(struct chan *c, char *old, int flag, char *spec);
 int sysbind(char *new, char *old, int flags);
 int sysmount(int fd, int afd, char *old, int flags, char *spec);
 int sysunmount(char *old, char *new);
-int sysopen(char *path, int mode);
+int sysopenat(int dirfd, char *path, int vfs_flags);
+int sysopen(char *path, int vfs_flags);
 long unionread(struct chan *c, void *va, long n);
 void read_exactly_n(struct chan *c, void *vp, long n);
 long sysread(int fd, void *va, long n);
@@ -1040,4 +995,9 @@ extern unsigned int qiomaxatomic;
 /* special sections */
 #define __devtab  __attribute__((__section__(".devtab")))
 
-#endif /* ROS_KERN_NS_H */
+#define DEVVARS_ENTRY(name, fmt)                                               \
+struct dirtab __attribute__((__section__("devvars"))) __devvars_##name =       \
+              {#name "!" fmt,                                                  \
+               {(uint64_t)&(name), 0, QTFILE},                                 \
+               sizeof((name)),                                                 \
+               0444}