Fix up sys*stat
[akaros.git] / kern / src / ns / sysfile.c
index df80ceb..13b46a8 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);
@@ -849,16 +823,16 @@ int sysremove(char *path)
 
        c = namec(path, Aremove, 0, 0);
        if (waserror()) {
-               c->type = 0;    /* see below */
+               c->type = -1;   /* see below */
                cclose(c);
                nexterror();
        }
        devtab[c->type].remove(c);
        /*
         * Remove clunks the fid, but we need to recover the Chan
-        * so fake it up.  rootclose() is known to be a nop.
+        * so fake it up.  -1 aborts the dev's close.
         */
-       c->type = 0;
+       c->type = -1;
        poperror();
        cclose(c);
 
@@ -964,11 +938,48 @@ void validstat(uint8_t * s, int n)
                validname(buf, 0);
 }
 
-int sysstat(char *path, uint8_t * buf, int n)
+int sysfstat(int fd, uint8_t *buf, 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, buf, n);
+
+       poperror();
+       cclose(c);
+
+       poperror();
+       return n;
+}
+
+int sysfstatakaros(int fd, struct kstat *ks)
+{
+       int n = 4096;
+       uint8_t *buf;
+       buf = kmalloc(n, KMALLOC_WAIT);
+       n = sysfstat(fd, buf, n);
+       if (n > 0) {
+               convM2kstat(buf, n, ks);
+               n = 0;
+       }
+       kfree(buf);
+       return n;
+}
+
+int sysstat(char *path, uint8_t *buf, int n)
 {
        ERRSTACK(2);
        struct chan *c;
-       struct dir dir9ns;
 
        if (waserror()) {
                poperror();
@@ -980,13 +991,27 @@ 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, buf, n);
        poperror();
        cclose(c);
 
        poperror();
-       convM2kstat((void *)&dir9ns, sizeof(struct dir), (struct kstat *)buf);
-       return 0;
+
+       return n;
+}
+
+int sysstatakaros(char *path, struct kstat *ks)
+{
+       int n = 4096;
+       uint8_t *buf;
+       buf = kmalloc(n, KMALLOC_WAIT);
+       n = sysstat(path, buf, n);
+       if (n > 0) {
+               convM2kstat(buf, n, ks);
+               n = 0;
+       }
+       kfree(buf);
+       return n;
 }
 
 static long rwrite(int fd, void *va, long n, int64_t * offp)