Adds rootwstat, for chmod
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 30 Jan 2014 20:21:34 +0000 (12:21 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 31 Jan 2014 00:05:00 +0000 (16:05 -0800)
Plus some other chmod tidbits.

I also have a new busybox config, with chmod built in.  You'll need to
copy it to your .config, rebuild busybox, and load it in KFS.

kern/drivers/dev/root.c
kern/kfs/bin/chmod [new symlink]
kern/kfs/bin/ln [new symlink]
kern/src/syscall.c
tools/patches/busybox-1.17.3-config

index 6b5b7d0..68eefd8 100644 (file)
@@ -403,6 +403,33 @@ static long rootwrite(struct chan *c, void *a, long n, int64_t off)
        return n;
 }
 
+static int rootwstat(struct chan *c, uint8_t *m_buf, int m_buf_sz)
+{
+       struct dirtab *file = &roottab[c->qid.path];
+       struct dir *dir;
+       int m_sz;
+
+       /* TODO: some security check, Eperm on error */
+
+       /* common trick in wstats.  we want the dir and any strings in the M.  the
+        * strings are smaller than entire M (strings plus other M).  the strings
+        * will be placed right after the dir (dir[1]) */
+       dir = kzmalloc(sizeof(struct dir) + m_buf_sz, KMALLOC_WAIT);
+       m_sz = convM2D(m_buf, m_buf_sz, &dir[0], (char*)&dir[1]);
+       if (!m_sz) {
+               kfree(dir);
+               error(Eshortstat);
+       }
+       /* TODO: handle more things than just the mode */
+       if (!emptystr(dir->name))
+               printk("[%s] attempted rename of %s to %s\n", __FUNCTION__,
+                      file->name, dir->name);  /* strncpy for this btw */
+       if (dir->mode != ~0UL)
+               file->perm = dir->mode | (file->qid.type == QTDIR ? DMDIR : 0);
+       kfree(dir);
+       return m_sz;
+}
+
 struct dev rootdevtab __devtab = {
        'r',
        "root",
@@ -420,7 +447,7 @@ struct dev rootdevtab __devtab = {
        rootwrite,
        devbwrite,
        devremove,
-       devwstat,
+       rootwstat,
        devpower,
        devchaninfo,
 };
diff --git a/kern/kfs/bin/chmod b/kern/kfs/bin/chmod
new file mode 120000 (symlink)
index 0000000..c3fa810
--- /dev/null
@@ -0,0 +1 @@
+busybox
\ No newline at end of file
diff --git a/kern/kfs/bin/ln b/kern/kfs/bin/ln
new file mode 120000 (symlink)
index 0000000..c3fa810
--- /dev/null
@@ -0,0 +1 @@
+busybox
\ No newline at end of file
index d8c5921..bcd0162 100644 (file)
@@ -1326,7 +1326,9 @@ intreg_t sys_chmod(struct proc *p, const char *path, size_t path_l, int mode)
                size = sizeD2M(&d);
                buf = kmalloc(size, KMALLOC_WAIT);
                convD2M(&d, buf, size);
+               /* wstat returns the number of bytes written */
                retval = syswstat(t_path, buf, size);
+               retval = (retval > 0 ? 0 : -1);
                kfree(buf);
        }
        user_memdup_free(p, t_path);
index 1fd5e46..5cc8d73 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Busybox version: 1.17.3
-# Mon Nov  4 17:24:22 2013
+# Thu Jan 30 12:02:08 2014
 #
 CONFIG_HAVE_DOT_CONFIG=y
 
@@ -175,7 +175,7 @@ CONFIG_FEATURE_TEST_64=y
 # CONFIG_CAL is not set
 # CONFIG_CATV is not set
 # CONFIG_CHGRP is not set
-# CONFIG_CHMOD is not set
+CONFIG_CHMOD=y
 # CONFIG_CHOWN is not set
 # CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set
 # CONFIG_CHROOT is not set
@@ -213,7 +213,7 @@ CONFIG_FEATURE_FANCY_ECHO=y
 # CONFIG_INSTALL is not set
 # CONFIG_FEATURE_INSTALL_LONG_OPTIONS is not set
 # CONFIG_LENGTH is not set
-# CONFIG_LN is not set
+CONFIG_LN=y
 # CONFIG_LOGNAME is not set
 CONFIG_LS=y
 CONFIG_FEATURE_LS_FILETYPES=y