9ns: Add #gtfs
[akaros.git] / kern / src / ns / dev.c
index 7012b5a..f041e67 100644 (file)
@@ -26,8 +26,6 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE. */
 
-#include <vfs.h>
-#include <kfs.h>
 #include <slab.h>
 #include <kmalloc.h>
 #include <kref.h>
@@ -68,6 +66,8 @@ void
 devdir(struct chan *c, struct qid qid, char *n,
           int64_t length, char *user, long perm, struct dir *db)
 {
+       struct timespec now = nsec2timespec(epoch_nsec());
+
        db->name = n;
        if (c->flag & CMSG)
                qid.type |= QTMOUNT;
@@ -76,12 +76,22 @@ devdir(struct chan *c, struct qid qid, char *n,
        db->dev = c->dev;
        db->mode = perm;
        db->mode |= qid.type << 24;
-       db->atime = seconds();
-       db->mtime = kerndate;
        db->length = length;
        db->uid = user;
        db->gid = eve.name;
        db->muid = user;
+       db->ext = NULL;
+       /* TODO: once we figure out what to do for uid/gid, then we can try to tie
+        * that to the n_uid.  Or just ignore it, and only use that as a
+        * pass-through for 9p2000.u. */
+       db->n_uid = 0;
+       db->n_gid = 0;
+       db->n_muid = 0;
+       /* TODO: what does devdir really want? */
+       db->atime = now;
+       db->btime = now;
+       db->ctime = now;
+       db->mtime = now;
 }
 
 /*
@@ -258,11 +268,10 @@ Accept:
                                        printd("DEVWALK -1, i was %d, want path %p\n", i,
                                                   c->qid.path);
 Notfound:
-                                       if (j == 0)
-                                               error(ENOENT, "could not find name %s, dev %s", n,
+                                       set_error(ENOENT, "could not find name %s, dev %s", n,
                                                      c->type == -1 ? "no dev" : devtab[c->type].name);
-                                       /* TODO: I think we don't need to just set_error here */
-                                       set_error(ENOENT, "tell brho you saw this in an error");
+                                       if (j == 0)
+                                               error_jmp();
                                        goto Done;
                                case 0:
                                        printd("DEVWALK continue, i was %d\n", i);
@@ -293,6 +302,9 @@ Done:
        } else if (wq->clone) {
                /* attach cloned channel to same device */
                wq->clone->type = c->type;
+       } else {
+               /* Not sure this is possible, would like to know. */
+               warn_once("had enough names, but still no wq->clone");
        }
        return wq;
 }
@@ -309,9 +321,8 @@ size_t dev_make_stat(struct chan *c, struct dir *dir, uint8_t *dp, size_t n)
        return n;
 }
 
-int
-devstat(struct chan *c, uint8_t * db, int n,
-               struct dirtab *tab, int ntab, Devgen * gen)
+size_t devstat(struct chan *c, uint8_t *db, size_t n, struct dirtab *tab,
+               int ntab, Devgen *gen)
 {
        int i;
        struct dir dir;
@@ -391,27 +402,13 @@ devdirread(struct chan *c, char *d, long n,
 }
 
 /*
- * error(EPERM, ERROR_FIXME) if open permission not granted for
- * current->user.name
+ * Throws an error if open permission not granted for current->user.name
  */
 void devpermcheck(char *fileuid, uint32_t perm, int omode)
 {
-       int rwx;
-
-       /* select user, group, or other from the traditional rwxrwxrwx, shifting
-        * into the upper-most position */
-       if (strcmp(current->user.name, fileuid) == 0)
-               perm <<= 0;
-       else if (iseve())
-               perm <<= 3;
-       else
-               perm <<= 6;
-       /* translate omode into things like S_IRUSR (just one set of rwx------).
-        * Plan 9 originally only returned 0400 0200 0600 and 0100 here; it didn't
-        * seem to handle O_EXEC being mixed readable or writable. */
-       rwx = omode_to_rwx(omode);
-       if ((rwx & perm) != rwx)
-               error(EPERM, "devpermcheck(%s, 0%o, 0%o) failed", fileuid, perm, omode);
+       if (!caller_has_perms(fileuid, perm, omode))
+               error(EPERM, "permcheck(user: %s, rwx: 0%o, omode 0%o) failed",
+                     fileuid, perm, omode);
 }
 
 struct chan *devopen(struct chan *c, int omode, struct dirtab *tab, int ntab,
@@ -444,13 +441,13 @@ Return:
        return c;
 }
 
-void
-devcreate(struct chan *c, char *unused_char_p_t, int unused_int, uint32_t u)
+void devcreate(struct chan *c, char *unused_char_p_t, int unused_int,
+               uint32_t u, char *ext)
 {
        error(EPERM, ERROR_FIXME);
 }
 
-struct block *devbread(struct chan *c, long n, uint32_t offset)
+struct block *devbread(struct chan *c, size_t n, off64_t offset)
 {
        ERRSTACK(1);
        struct block *bp;
@@ -467,7 +464,7 @@ struct block *devbread(struct chan *c, long n, uint32_t offset)
        return bp;
 }
 
-long devbwrite(struct chan *c, struct block *bp, uint32_t offset)
+size_t devbwrite(struct chan *c, struct block *bp, off64_t offset)
 {
        ERRSTACK(1);
        long n;
@@ -488,7 +485,7 @@ void devremove(struct chan *c)
        error(EPERM, ERROR_FIXME);
 }
 
-int devwstat(struct chan *c, uint8_t * unused_uint8_p_t, int i)
+size_t devwstat(struct chan *c, uint8_t *unused_uint8_p_t, size_t i)
 {
        error(EPERM, ERROR_FIXME);
        return 0;