Convert omode to 9p for devmnt [4/7]
[akaros.git] / kern / include / ns.h
index fdfba12..ed4f386 100644 (file)
@@ -7,6 +7,7 @@
 #include <rendez.h>
 #include <rwlock.h>
 #include <linker_func.h>
+#include <fdtap.h>
 
 /*
  * functions (possibly) linked in, complete, from libc.
@@ -99,6 +100,9 @@ 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;
@@ -243,6 +247,7 @@ enum {
        Tmax,
 };
 
+void init_empty_dir(struct dir *d);
 unsigned int convM2S(uint8_t * unused_uint8_p_t, unsigned int unused_int,
                                         struct fcall *);
 unsigned int convS2M(struct fcall *, uint8_t * unused_uint8_p_t, unsigned int);
@@ -300,15 +305,22 @@ enum {
        Amount,                                         /* to be mounted or mounted upon */
        Acreate,                                        /* is to be created */
        Aremove,                                        /* will be removed by caller */
-
-       COPEN = 0x0001,                         /* for i/o */
-       CMSG = 0x0002,  /* the message channel for a mount */
-       CCEXEC = 0x0008,        /* close on exec */
-       CFREE = 0x0010, /* not in use */
-       CRCLOSE = 0x0020,       /* remove on close */
-       CCACHE = 0x0080,        /* client cache */
-       /* file/chan status flags, affected by setfl and reported in getfl */
-       CAPPEND = 0x0100,       /* append on write */
+       Acreatechan,                                    /* return a chan for a create request. for sysrename. */
+
+       /* internal chan flags, used by the kernel only */
+       COPEN =                 0x0001, /* for i/o */
+       CMSG =                  0x0002, /* the message channel for a mount */
+       CFREE =                 0x0004, /* not in use */
+       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),
 };
 
 #define NS_IPCK_SHIFT  2
@@ -383,6 +395,10 @@ struct chan {
                void *aux;
                char tag[4];                    /* for iproute */
        };
+       /* mountpoint, as discovered during walk.
+        * Used for rename at present.
+        */
+       struct chan *mountpoint;
        struct chan *mchan;                     /* channel to mounted server */
        struct qid mqid;                        /* qid of root of mount point */
        struct cname *name;
@@ -421,8 +437,9 @@ struct dev {
        void (*power) (int);            /* power mgt: power(1) → on, power (0) → off */
 //  int (*config)( int unused_int, char *unused_char_p_t, DevConf*);
        char *(*chaninfo) (struct chan *, char *, size_t);
-       /* we need to be aligned, i think to 32 bytes, for the linker tables. */
-} __attribute__ ((aligned(32)));
+       int (*tapfd) (struct chan *, struct fd_tap *, int);
+       /* we need to be aligned, we think to 64 bytes, for the linker tables. */
+} __attribute__ ((aligned(64)));
 
 struct dirtab {
        char name[KNAMELEN];
@@ -515,16 +532,6 @@ struct pgrp {
        int pin;
 };
 
-struct fgrp {
-       spinlock_t lock;
-       struct kref ref;
-       struct chan **fd;
-       int nfd;                                        /* number of fd slots */
-       int maxfd;                                      /* highest fd in use */
-       int minfd;                                      /* lower bound on free fd */
-       int closed;
-};
-
 struct evalue {
        char *var;
        char *val;
@@ -574,7 +581,7 @@ enum {
        PRINTSIZE = 256,
        NUMSIZE = 12,   /* size of formatted number */
        MB = (1024 * 1024),
-       READSTR = 1000, /* temporary buffer size for device reads */
+       READSTR = 2000, /* temporary buffer size for device reads */
 };
 
 extern struct dev devtab[];
@@ -592,15 +599,16 @@ struct cmdtab {
        int narg;                                       /* expected #args; 0 ==> variadic */
 };
 
-/* queue state bits,  Qmsg, Qcoalesce, and Qkick can be set in qopen */
+/* queue state bits, all can be set in qopen (Qstarve is always set) */
 enum {
-       /* Queue.state */
        Qstarve = (1 << 0),                     /* consumer starved */
        Qmsg = (1 << 1),        /* message stream */
        Qclosed = (1 << 2),     /* queue has been closed/hungup */
        Qflow = (1 << 3),       /* producer flow controlled */
        Qcoalesce = (1 << 4),   /* coallesce packets on read */
        Qkick = (1 << 5),       /* always call the kick routine after qwrite */
+       Qdropoverflow = (1 << 6),       /* writes that would block will be dropped */
+       Qnonblock = (1 << 7),   /* do not block, throw EAGAIN */
 };
 
 #define DEVDOTDOT -1
@@ -630,7 +638,6 @@ void chan_incref(struct chan *);
 void chandevinit(void);
 void chandevreset(void);
 void chandevshutdown(void);
-struct dir *chandirstat(struct chan *);
 void chanfree(struct chan *);
 void chanrec(struct mnt *);
 void checkalarms(void);
@@ -639,11 +646,10 @@ void cinit(void);
 struct chan *cclone(struct chan *);
 void cclose(struct chan *);
 void closeegrp(struct egrp *);
-void closefgrp(struct fgrp *);
 void closemount(struct mount *);
 void closepgrp(struct pgrp *);
 void closesigs(struct skeyset *);
-void cmderror(struct cmdbuf *, char *unused_char_p_t);
+void debugcmd(struct cmdbuf *cb);
 struct mhead *newmhead(struct chan *from);
 int cmount(struct chan *, struct chan *, int unused_int, char *unused_char_p_t);
 void cnameclose(struct cname *);
@@ -695,7 +701,6 @@ int domount(struct chan **, struct mhead **);
 void drawactive(int);
 void drawcmap(void);
 void dumpstack(void);
-struct fgrp *dupfgrp(struct proc *, struct fgrp *);
 void egrpcpy(struct egrp *, struct egrp *);
 int emptystr(char *unused_char_p_t);
 int eqchan(struct chan *, struct chan *, int);
@@ -709,8 +714,6 @@ void halt(void);
 int export(int unused_int, char *unused_char_p_t, int);
 uint64_t fastticks(uint64_t *);
 uint64_t fastticks2ns(uint64_t);
-void fdclose(struct fgrp *, int);
-struct chan *fdtochan(struct fgrp *, int unused_int, int, int, int);
 int findmount(struct chan **, struct mhead **, int unused_int, int, struct qid);
 void free(void *);
 void freeb(struct block *);
@@ -719,8 +722,6 @@ void freeskey(struct signerkey *);
 void getcolor(uint32_t, uint32_t *, uint32_t *, uint32_t *);
 uint32_t getmalloctag(void *);
 uint32_t getrealloctag(void *);
-void hnputl(void *, uint32_t);
-void hnputs(void *, uint16_t);
 struct block *iallocb(int);
 void iallocsummary(void);
 void printblock(struct block *b);
@@ -735,14 +736,12 @@ int kbdcr2nl(struct queue *, int);
 int kbdputc(struct queue *, int);
 void kbdrepeat(int);
 void kproc(char *unused_char_p_t, void (*)(void *), void *, int);
-int fgrpclose(struct fgrp *, 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 cmdtab *lookupcmd(struct cmdbuf *, struct cmdtab *, int);
 struct block *mem2bl(uint8_t * unused_uint8_p_t, int);
 int memusehigh(void);
 void microdelay(int);
@@ -759,7 +758,6 @@ void muxclose(struct mnt *);
 struct chan *namec(char *unused_char_p_t, int unused_int, int, uint32_t);
 struct chan *newchan(void);
 struct egrp *newegrp(void);
-struct fgrp *newfgrp(void);
 struct mount *newmount(struct mhead *, struct chan *, int unused_int,
                                           char *unused_char_p_t);
 struct pgrp *newpgrp(void);
@@ -771,12 +769,11 @@ void notkilled(void);
 int nrand(int);
 uint64_t ns2fastticks(uint64_t);
 int okaddr(uint32_t, uint32_t, int);
-int openmode(uint32_t);
+int omode_to_rwx(int);
+int omode_to_9p_accmode(int open_flags);
 struct block *packblock(struct block *);
 struct block *padblock(struct block *, int);
 
-struct cmdbuf *parsecmd(char *unused_char_p_t, int);
-
 void pgrpcpy(struct pgrp *, struct pgrp *);
 
 int progfdprint(struct chan *, int unused_int, int, char *unused_char_p_t,
@@ -808,7 +805,8 @@ void qhangup(struct queue *, char *unused_char_p_t);
 int qisclosed(struct queue *);
 int qiwrite(struct queue *, void *, int);
 int qlen(struct queue *);
-void qnoblock(struct queue *, int);
+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 *);
@@ -820,6 +818,9 @@ void qreopen(struct queue *);
 void qsetlimit(struct queue *, int);
 int qwindow(struct queue *);
 int 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);
@@ -834,7 +835,6 @@ void renameproguser(char *unused_char_p_t, char *);
 void renameuser(char *unused_char_p_t, char *);
 void resrcwait(char *unused_char_p_t);
 struct proc *runproc(void);
-long seconds(void);
 void (*serwrite) (char *unused_char_p_t, int);
 int setcolor(uint32_t, uint32_t, uint32_t, uint32_t);
 
@@ -862,15 +862,12 @@ struct block *trimblock(struct block *, int unused_int, int);
 int uartgetc(void);
 void uartputc(int);
 void uartputs(char *unused_char_p_t, int);
-long unionread(struct chan *, void *, long);
 void unlock(spinlock_t *);
 void userinit(void);
 uint32_t userpc(void);
-void validname(char *unused_char_p_t, int);
-void validstat(uint8_t * unused_uint8_p_t, int);
-void validwstatname(char *unused_char_p_t);
+void validname(char *, int);
+void validwstatname(char *);
 int walk(struct chan **, char **unused_char_pp_t, int unused_int, int, int *);
-void werrstr(char *unused_char_p_t, ...);
 void *xalloc(uint32_t);
 void *xallocz(uint32_t, int);
 void xfree(void *);
@@ -972,16 +969,19 @@ void cmderror(struct cmdbuf *cb, char *s);
 struct cmdtab *lookupcmd(struct cmdbuf *cb, struct cmdtab *ctab, int nctab);
 
 /* kern/src/ns/sysfile.c */
-int newfd(struct chan *c);
-struct chan *fdtochan(struct fgrp *f, int fd, int mode, int chkmnt, int iref);
+int newfd(struct chan *c, int oflags);
+struct chan *fdtochan(struct fd_table *fdt, int fd, int mode, int chkmnt,
+                      int iref);
 long kchanio(void *vc, void *buf, int n, int mode);
 int openmode(uint32_t o);
-void fdclose(struct fgrp *f, int fd);
+void fdclose(struct fd_table *fdt, int fd);
 int syschdir(char *path);
-int grpclose(struct fgrp *f, int fd);
+int grpclose(struct fd_table *fdt, int fd);
 int sysclose(int fd);
 int syscreate(char *path, int mode, uint32_t perm);
-int sysdup(int old, int new);
+int sysdup(int old);
+int sys_dup_to(struct proc *from_proc, unsigned int from_fd,
+               struct proc *to_proc, unsigned int to_fd);
 int sysfstat(int fd, uint8_t*, int n);
 int sysfstatakaros(int fd, struct kstat *);
 char *sysfd2path(int fd);
@@ -995,11 +995,12 @@ int sysmount(int fd, int afd, char *old, int flags, char *spec);
 int sysunmount(char *old, char *new);
 int sysopen(char *path, int mode);
 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);
 long syspread(int fd, void *va, long n, int64_t off);
 int sysremove(char *path);
 int64_t sysseek(int fd, int64_t off, int whence);
-void validstat(uint8_t * s, int n);
+void validstat(uint8_t * s, int n, int slashok);
 int sysstat(char *path, uint8_t*, int n);
 int sysstatakaros(char *path, struct kstat *);
 long syswrite(int fd, void *va, long n);
@@ -1012,9 +1013,7 @@ int sysdirwstat(char *name, struct dir *dir);
 int sysdirfwstat(int fd, struct dir *dir);
 long sysdirread(int fd, struct kdirent **d);
 int sysiounit(int fd);
-void close_9ns_files(struct proc *p, bool only_cloexec);
 void print_chaninfo(struct chan *ch);
-void print_9ns_files(struct proc *p);
 int plan9setup(struct proc *new_proc, struct proc *parent, int flags);
 int iseve(void);
 int fd_getfl(int fd);
@@ -1023,6 +1022,11 @@ int fd_setfl(int fd, int flags);
 /* kern/drivers/dev/srv.c */
 char *srvname(struct chan *c);
 
+/* kern/src/eipconv.c. Put them here or face real include hell. */
+void printqid(void (*putch) (int, void **), void **putdat, struct qid *q);
+void printcname(void (*putch) (int, void **), void **putdat, struct cname *c);
+void printchan(void (*putch) (int, void **), void **putdat, struct chan *c);
+
 static inline int abs(int a)
 {
        if (a < 0)