Create akaros wrappers for sysstat and sysfstat
authorRonald G. Minnich <rminnich@google.com>
Fri, 31 Jan 2014 16:50:38 +0000 (08:50 -0800)
committerRonald G. Minnich <rminnich@google.com>
Fri, 31 Jan 2014 16:50:38 +0000 (08:50 -0800)
We'll need this as we need to see the raw dir struct
for sys_readlink.

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

index c207c0b..10ec3b8 100644 (file)
@@ -950,7 +950,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, struct dir *, int n);
+int sysfstatakaros(int fd, uint8_t *buf, int n);
 char *sysfd2path(int fd);
 int sysfauth(int fd, char *aname);
 int sysfversion(int fd, unsigned int msize, char *vers, unsigned int arglen);
@@ -967,7 +968,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, struct dir * buf, int n);
+int sysstatakaros(char *path, uint8_t * buf, int n);
 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);
index 6a359e2..4275bac 100644 (file)
@@ -313,32 +313,6 @@ int sysdup(int old, int new)
        return fd;
 }
 
-int sysfstat(int fd, uint8_t * buf, int n)
-{
-       ERRSTACK(2);
-       struct chan *c;
-       struct dir dir9ns;
-
-       if (waserror()) {
-               poperror();
-               return -1;
-       }
-
-       c = fdtochan(current->fgrp, fd, -1, 0, 1);
-       if (waserror()) {
-               cclose(c);
-               nexterror();
-       }
-       devtab[c->type].stat(c, (void *)&dir9ns, sizeof(struct dir));
-
-       poperror();
-       cclose(c);
-
-       poperror();
-       convM2kstat((void *)&dir9ns, sizeof(struct dir), (struct kstat *)buf);
-       return n;
-}
-
 char *sysfd2path(int fd)
 {
        ERRSTACK(1);
@@ -964,11 +938,43 @@ void validstat(uint8_t * s, int n)
                validname(buf, 0);
 }
 
-int sysstat(char *path, uint8_t * buf, int n)
+int sysfstat(int fd, struct dir *dir9ns, int n)
 {
        ERRSTACK(2);
        struct chan *c;
+
+       if (waserror()) {
+               poperror();
+               return -1;
+       }
+
+       c = fdtochan(current->fgrp, fd, -1, 0, 1);
+       if (waserror()) {
+               cclose(c);
+               nexterror();
+       }
+       devtab[c->type].stat(c, (void *)dir9ns, n);
+
+       poperror();
+       cclose(c);
+
+       poperror();
+       return n;
+}
+
+int sysfstatakaros(int fd, uint8_t *buf, int n)
+{
        struct dir dir9ns;
+       if ((n = sysfstat(fd, &dir9ns, sizeof(dir9ns))) < 0)
+               return n;
+       convM2kstat((void *)&dir9ns, sizeof(struct dir), (struct kstat *)buf);
+       return n;
+}
+
+int sysstat(char *path, struct dir *dir9ns, int n)
+{
+       ERRSTACK(2);
+       struct chan *c;
 
        if (waserror()) {
                poperror();
@@ -980,11 +986,21 @@ int sysstat(char *path, uint8_t * buf, int n)
                cclose(c);
                nexterror();
        }
-       devtab[c->type].stat(c, (void *)&dir9ns, sizeof(struct dir));
+       devtab[c->type].stat(c, (void *)dir9ns, sizeof(struct dir));
        poperror();
        cclose(c);
 
        poperror();
+
+       return n;
+}
+
+int sysstatakaros(char *path, uint8_t * buf, int n)
+{
+       struct dir dir9ns;
+       n = sysstat(path, &dir9ns, sizeof(dir9ns));
+       if (n < 0)
+               return n;
        convM2kstat((void *)&dir9ns, sizeof(struct dir), (struct kstat *)buf);
        return 0;
 }
index bcd0162..064217e 100644 (file)
@@ -1134,7 +1134,7 @@ static intreg_t sys_fstat(struct proc *p, int fd, struct kstat *u_stat)
                kref_put(&file->f_kref);
        } else {
                unset_errno();  /* Go can't handle extra errnos */
-           if (sysfstat(fd, (uint8_t*)kbuf, sizeof(*kbuf)) < 0) {
+           if (sysfstatakaros(fd, (uint8_t*)kbuf, sizeof(*kbuf)) < 0) {
                        kfree(kbuf);
                        return -1;
                }
@@ -1174,7 +1174,7 @@ static intreg_t stat_helper(struct proc *p, const char *path, size_t path_l,
        } else {
                /* VFS failed, checking 9ns */
                unset_errno();  /* Go can't handle extra errnos */
-               retval = sysstat(t_path, (uint8_t*)kbuf, sizeof(*kbuf));
+               retval = sysstatakaros(t_path, (uint8_t*)kbuf, sizeof(*kbuf));
                printd("sysstat returns %d\n", retval);
                /* both VFS and 9ns failed, bail out */
                if (retval < 0)
@@ -1417,14 +1417,19 @@ intreg_t sys_readlink(struct proc *p, char *path, size_t path_l,
 {
        char *symname;
        ssize_t copy_amt;
+       int fail = 0;
        struct dentry *path_d;
        char *t_path = user_strdup_errno(p, path, path_l);
        if (t_path == NULL)
                return -1;
        /* TODO: 9ns support */
        path_d = lookup_dentry(t_path, 0);
+       if (!path_d){
+               /* try 9ns. */
+               fail = 1;
+       }
        user_memdup_free(p, t_path);
-       if (!path_d)
+       if (fail)
                return -1;
        symname = path_d->d_inode->i_op->readlink(path_d);
        copy_amt = strnlen(symname, buf_l - 1) + 1;