Set up what we think is the right way to read directories
authorRonald G. Minnich <rminnich@google.com>
Sun, 19 Jan 2014 04:26:02 +0000 (20:26 -0800)
committerRonald G. Minnich <rminnich@google.com>
Sun, 19 Jan 2014 04:26:02 +0000 (20:26 -0800)
Long term, I'd be much happier if we read and converted the
real inferno types, but for now we convert to kdirents in sysdirread.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
kern/include/ns.h
kern/src/ns/convM2kdirent.c
kern/src/ns/sysfile.c

index 69b534c..644cba3 100644 (file)
@@ -248,7 +248,7 @@ unsigned int        convM2S( uint8_t *unused_uint8_p_t, unsigned int unused_int, struct
 unsigned int   convS2M(struct fcall*, uint8_t *unused_uint8_p_t, unsigned int);
 unsigned int   sizeS2M(struct fcall*);
 
-unsigned int convM2kdirent(uint8_t * buf, unsigned int nbuf, struct kdirent *kd);
+unsigned int convM2kdirent(uint8_t * buf, unsigned int nbuf, struct kdirent *kd, char *strs);
 unsigned int convM2kstat(uint8_t * buf, unsigned int nbuf, struct kstat *ks);
 
 
@@ -1001,7 +1001,7 @@ struct dir *sysdirstat(char *name);
 struct dir *sysdirfstat(int fd);
 int sysdirwstat(char *name, struct dir *dir);
 int sysdirfwstat(int fd, struct dir *dir);
-long sysdirread(int fd, struct dir **d);
+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);
index 249095a..3b64183 100644 (file)
@@ -31,7 +31,7 @@ struct kdirent {
 
 #endif
 
-unsigned int convM2kdirent(uint8_t * buf, unsigned int nbuf, struct kdirent *kd)
+unsigned int convM2kdirent(uint8_t * buf, unsigned int nbuf, struct kdirent *kd, char *strs)
 {
        uint8_t *p, *ebuf;
        char *sv[4];
@@ -76,6 +76,12 @@ unsigned int convM2kdirent(uint8_t * buf, unsigned int nbuf, struct kdirent *kd)
                p += BIT16SZ;
                if (p + ns > ebuf)
                        return 0;
+               if(strs){
+                       sv[i] = strs;
+                       memmove(strs, p, ns);
+                       strs += ns;
+                       *strs++ = '\0';
+               }
                if (i == 0) {
                        kd->d_reclen = ns;
                        printd("memmove %p %p %d\n", kd->d_name, p, ns);
index 5479c84..b3980ee 100644 (file)
@@ -1146,10 +1146,10 @@ sysdirfwstat(int fd, struct dir *dir)
 }
 
 static long
-dirpackage(uint8_t *buf, long ts, struct dir **d)
+dirpackage(uint8_t *buf, long ts, struct kdirent **d)
 {
        char *s;
-       long ss, i, n, nn, m;
+       long ss, i, n, nn, m = 0;
 
        *d = NULL;
        if(ts <= 0)
@@ -1171,18 +1171,18 @@ dirpackage(uint8_t *buf, long ts, struct dir **d)
        if(i != ts)
                error("bad directory format");
 
-       *d = kzmalloc(n * sizeof(struct dir) + ss, 0);
+       *d = kzmalloc(n * sizeof(**d) + ss, 0);
        if(*d == NULL)
                error(Enomem);
 
        /*
         * then convert all buffers
         */
-       s = ( char *)*d + n * sizeof(struct dir);
+       s = ( char *)*d + n * sizeof(**d);
        nn = 0;
        for(i = 0; i < ts; i += m){
                m = BIT16SZ + GBIT16(( uint8_t *)&buf[i]);
-               if(nn >= n || convM2D(&buf[i], m, *d + nn, s) != m){
+               if(nn >= n || /*convM2D*/convM2kdirent(&buf[i], m, *d + nn, s) != m){
                        kfree(*d);
                        *d = NULL;
                        error("bad directory entry");
@@ -1195,7 +1195,7 @@ dirpackage(uint8_t *buf, long ts, struct dir **d)
 }
 
 long
-sysdirread(int fd, struct dir **d)
+sysdirread(int fd, struct kdirent **d)
 {
        ERRSTACK(2);
        uint8_t *buf;