Print. Add printing for qids, cnams, and chans
[akaros.git] / kern / include / ns.h
index 9805d0f..955129a 100644 (file)
@@ -87,13 +87,14 @@ extern int parseether(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
 #define QTEXCL         0x20    /* type bit for exclusive use files */
 #define QTMOUNT                0x10    /* type bit for mounted channel */
 #define QTAUTH         0x08    /* type bit for authentication file */
-#define QTFILE         0x00    /* plain file */
+#define QTFILE         0x01    /* plain file */
 
 /* bits in Dir.mode */
 #define DMDIR          0x80000000      /* mode bit for directories */
 #define DMAPPEND       0x40000000      /* mode bit for append only files */
 #define DMEXCL         0x20000000      /* mode bit for exclusive use files */
 #define DMMOUNT                0x10000000      /* mode bit for mounted channel */
+#define DMSYMLINK      0x02000000      /* symlink -- from 9p2000.u */
 #define DMREAD         0x4     /* mode bit for read permission */
 #define DMWRITE                0x2     /* mode bit for write permission */
 #define DMEXEC         0x1     /* mode bit for execute permission */
@@ -242,6 +243,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);
@@ -299,6 +301,7 @@ enum {
        Amount,                                         /* to be mounted or mounted upon */
        Acreate,                                        /* is to be created */
        Aremove,                                        /* will be removed by caller */
+       Acreatechan,                                    /* return a chan for a create request. for sysrename. */
 
        COPEN = 0x0001,                         /* for i/o */
        CMSG = 0x0002,  /* the message channel for a mount */
@@ -310,13 +313,29 @@ enum {
        CAPPEND = 0x0100,       /* append on write */
 };
 
+#define NS_IPCK_SHIFT  2
+#define NS_UDPCK_SHIFT 3
+#define NS_TCPCK_SHIFT 4
+#define NS_PKTCK_SHIFT 5
+#define NS_TSO_SHIFT 6
+#define NS_SHIFT_MAX 6
+
 enum {
        BINTR = (1 << 0),
        BFREE = (1 << 1),
-       Bipck = (1 << 2),       /* ip checksum */
-       Budpck = (1 << 3),      /* udp checksum */
-       Btcpck = (1 << 4),      /* tcp checksum */
-       Bpktck = (1 << 5),      /* packet checksum */
+       Bipck = (1 << NS_IPCK_SHIFT),   /* ip checksum */
+       Budpck = (1 << NS_UDPCK_SHIFT), /* udp checksum */
+       Btcpck = (1 << NS_TCPCK_SHIFT), /* tcp checksum */
+       Bpktck = (1 << NS_PKTCK_SHIFT), /* packet checksum */
+       Btso = (1 << NS_TSO_SHIFT),     /* TSO */
+};
+#define BCKSUM_FLAGS (Bipck|Budpck|Btcpck|Bpktck|Btso)
+
+struct extra_bdata {
+       uintptr_t base;
+       /* using u32s for packing reasons.  this means no extras > 4GB */
+       uint32_t off;
+       uint32_t len;
 };
 
 struct block {
@@ -329,9 +348,17 @@ struct block {
        void (*free) (struct block *);
        uint16_t flag;
        uint16_t checksum;                      /* IP checksum of complete packet (minus media header) */
+       uint16_t checksum_start;                /* off from start of block to start csum */
+       uint16_t checksum_offset;               /* off from checksum_start to store csum */
+       uint16_t mss;               /* TCP MSS for TSO */
+       /* might want something to track the next free extra_data slot */
+       size_t extra_len;
+       unsigned int nr_extra_bufs;
+       struct extra_bdata *extra_data;
 };
-#define BLEN(s)        ((s)->wp - (s)->rp)
-#define BALLOC(s) ((s)->lim - (s)->base)
+#define BLEN(s)        ((s)->wp - (s)->rp + (s)->extra_len)
+#define BHLEN(s) ((s)->wp - (s)->rp)
+#define BALLOC(s) ((s)->lim - (s)->base + (s)->extra_len)
 
 struct chan {
        spinlock_t lock;
@@ -361,6 +388,10 @@ struct chan {
        struct chan *mchan;                     /* channel to mounted server */
        struct qid mqid;                        /* qid of root of mount point */
        struct cname *name;
+       /* hack for dir reads to try to get them right. */
+       int ateof;
+       void *buf;
+       int bufused;
 };
 
 struct cname {
@@ -393,7 +424,7 @@ struct dev {
 //  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)));;
+} __attribute__ ((aligned(32)));
 
 struct dirtab {
        char name[KNAMELEN];
@@ -589,6 +620,7 @@ 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);
 int anyhigher(void);
 int anyready(void);
 void _assert(char *unused_char_p_t);
@@ -596,6 +628,7 @@ struct block *bl2mem(uint8_t * unused_uint8_p_t, struct block *, int);
 int blocklen(struct block *);
 char *channame(struct chan *);
 void cclose(struct chan *);
+void chan_incref(struct chan *);
 void chandevinit(void);
 void chandevreset(void);
 void chandevshutdown(void);
@@ -617,6 +650,7 @@ struct mhead *newmhead(struct chan *from);
 int cmount(struct chan *, struct chan *, int unused_int, char *unused_char_p_t);
 void cnameclose(struct cname *);
 struct block *concatblock(struct block *);
+struct block *linearizeblock(struct block *b);
 void confinit(void);
 void copen(struct chan *);
 struct block *copyblock(struct block *, int);
@@ -663,7 +697,7 @@ int domount(struct chan **, struct mhead **);
 void drawactive(int);
 void drawcmap(void);
 void dumpstack(void);
-struct fgrp *dupfgrp(struct fgrp *);
+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);
@@ -691,6 +725,7 @@ void hnputl(void *, uint32_t);
 void hnputs(void *, uint16_t);
 struct block *iallocb(int);
 void iallocsummary(void);
+void printblock(struct block *b);
 void ilock(spinlock_t *);
 int iprint(char *unused_char_p_t, ...);
 void isdir(struct chan *);
@@ -756,11 +791,16 @@ 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);
 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);
+struct block *blist_clone(struct block *blist, int header_len, int len,
+                          uint32_t offset);
 int qdiscard(struct queue *, int);
 void qflush(struct queue *);
 void qfree(struct queue *);
@@ -915,13 +955,8 @@ 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 */
 
-/* kern/src/err.c */
-int errpush(struct errbuf *errstack, int stacksize, int *curindex,
-                       struct errbuf **prev_errbuf);
-void errpop(struct errbuf *errstack, int stacksize, int *curindex,
-                       struct errbuf *prev_errbuf);
-/* */
 char *get_cur_genbuf(void);
 
 /* hack for now. */
@@ -949,7 +984,8 @@ int grpclose(struct fgrp *f, int fd);
 int sysclose(int fd);
 int syscreate(char *path, int mode, uint32_t perm);
 int sysdup(int old, int new);
-int sysfstat(int fd, uint8_t * buf, int n);
+int sysfstat(int fd, uint8_t*, int n);
+int sysfstatakaros(int fd, struct kstat *);
 char *sysfd2path(int fd);
 int sysfauth(int fd, char *aname);
 int sysfversion(int fd, unsigned int msize, char *vers, unsigned int arglen);
@@ -966,7 +1002,8 @@ 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);
-int sysstat(char *path, uint8_t * buf, int n);
+int sysstat(char *path, uint8_t*, int n);
+int sysstatakaros(char *path, struct kstat *);
 long syswrite(int fd, void *va, long n);
 long syspwrite(int fd, void *va, long n, int64_t off);
 int syswstat(char *path, uint8_t * buf, int n);
@@ -980,11 +1017,19 @@ 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 plan9setup(struct proc *new_proc, struct proc *parent, int flags);
 int iseve(void);
 int fd_getfl(int fd);
 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)