Idenfity devices by name, not by char [1/3]
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 15 Sep 2015 15:09:07 +0000 (11:09 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
Previously, all devices were one character, followed by a spec. (e.g.
 #l0, where # says it is a device, l says it is devether, and 0 is the
NIC).  Now, devices are referred to by their name, with the spec
separated from the name by a '.'.  So "#l0" is now "#ether.0".

Since we don't use UTF8, we have a limited number of device IDs, nor do
I want to type out the infinity symbol or something.  Plus, there is
high demand for popular letters.  Why was ether using 'l'?  Looking at
one character does not helpfully identify a device.  All of these issues
are solved by using a name.

This compiles, but userspace will have trouble with it since it still
uses the old chars (e.g. #I).

19 files changed:
kern/arch/x86/devarch.c
kern/drivers/dev/acpi.c
kern/drivers/dev/alarm.c
kern/drivers/dev/cons.c
kern/drivers/dev/ether.c
kern/drivers/dev/kprof.c
kern/drivers/dev/mnt.c
kern/drivers/dev/nix.c
kern/drivers/dev/pci.c
kern/drivers/dev/pipe.c
kern/drivers/dev/proc.c
kern/drivers/dev/regress.c
kern/drivers/dev/root.c
kern/drivers/dev/srv.c
kern/include/ns.h
kern/src/net/devip.c
kern/src/ns/chan.c
kern/src/ns/dev.c
kern/src/ns/sysfile.c

index a97d59d..425b094 100644 (file)
 #include <ip.h>
 #include <time.h>
 
+struct dev archdevtab;
+
+static char *devname(void)
+{
+       return archdevtab.name;
+}
+
 typedef struct IOMap IOMap;
 struct IOMap {
        IOMap *next;
@@ -314,7 +321,7 @@ static void checkport(int start, int end)
 
 static struct chan *archattach(char *spec)
 {
-       return devattach('P', spec);
+       return devattach(devname(), spec);
 }
 
 struct walkqid *archwalk(struct chan *c, struct chan *nc, char **name,
index 21baff7..e9d4270 100644 (file)
 #include <arch/pci.h>
 #endif
 
+struct dev acpidevtab;
+
+static char *devname(void)
+{
+       return acpidevtab.name;
+}
+
 /*
  * ACPI 4.0 Support.
  * Still WIP.
@@ -1233,7 +1240,7 @@ acpigen(struct chan *c, char *unused_char_p_t, struct dirtab *tab, int ntab,
 
        if (i == DEVDOTDOT) {
                mkqid(&qid, Qdir, 0, QTDIR);
-               devdir(c, qid, ".", 0, eve, 0555, dp);
+               devdir(c, qid, devname(), 0, eve, 0555, dp);
                return 1;
        }
        i++;    /* skip first element for . itself */
@@ -1519,7 +1526,7 @@ static struct chan *acpiattach(char *spec)
                error("acpi: failed to enable\n");
 //  if(fadt.sciint != 0)
 //      intrenable(fadt.sciint, acpiintr, 0, BUSUNKNOWN, "acpi");
-       return devattach('a', spec);
+       return devattach(devname(), spec);
 }
 
 static struct walkqid *acpiwalk(struct chan *c, struct chan *nc, char **name,
index 11d7564..14dc8a5 100644 (file)
@@ -2,22 +2,23 @@
  * Barret Rhoden <brho@cs.berkeley.edu>
  * See LICENSE for details.
  *
- * devalarm/#A: a device for registering per-process alarms.
+ * #alarm: a device for registering per-process alarms.
  *
  * Allows a process to set up alarms, where the kernel will send an event to a
  * posted ev_q at a certain TSC time.
  *
- * Every process has their own alarm sets and view of #A; gen and friends look
- * at current's alarmset when it is time to gen or open a file.
+ * Every process has their own alarm sets and view of #alarm; gen and friends
+ * look at current's alarmset when it is time to gen or open a file.
  *
- * To use, first open #A/clone, and that gives you an alarm directory aN, where
- * N is ID of the alarm.  ctl takes two commands: "evq POINTER" (to tell the
- * kernel the pointer of your ev_q) and "cancel", to stop an alarm.  timer takes
- * just the value (in absolute tsc time) to fire the alarm.
+ * To use, first open #alarm/clone, and that gives you an alarm directory aN,
+ * where N is ID of the alarm.  ctl takes two commands: "evq POINTER" (to tell
+ * the kernel the pointer of your ev_q) and "cancel", to stop an alarm.  timer
+ * takes just the value (in absolute tsc time) to fire the alarm.
  *
- * While each process has a separate view of #A, it is possible to post a chan
- * to Qctl or Qtimer to #s.  If another proc has your Qtimer, it can set it in
- * the past, thereby triggering an immediate event.  More clever than useful.
+ * While each process has a separate view of #alarm, it is possible to post a
+ * chan to Qctl or Qtimer to #srv.  If another proc has your Qtimer, it can set
+ * it in the past, thereby triggering an immediate event.  More clever than
+ * useful.
  *
  * Notes on refcnting (the trickier parts here):
  * - the proc_alarms have counted references to their proc
 #include <umem.h>
 #include <devalarm.h>
 
+struct dev alarmdevtab;
+
+static char *devname(void)
+{
+       return alarmdevtab.name;
+}
+
 /* qid path types */
 #define Qtopdir                                        1
 #define Qclone                                 2
@@ -116,7 +124,7 @@ static int alarmgen(struct chan *c, char *entry_name,
        /* Whether we're in one dir or at the top, .. still takes us to the top. */
        if (s == DEVDOTDOT) {
                mkqid(&q, Qtopdir, 0, QTDIR);
-               devdir(c, q, "#A", 0, eve, 0555, dp);
+               devdir(c, q, devname(), 0, eve, 0555, dp);
                return 1;
        }
        switch (TYPE(c->qid)) {
@@ -148,8 +156,8 @@ static int alarmgen(struct chan *c, char *entry_name,
                         * parameters to devwalk), so that we can have some invariants
                         * between gen runs.
                         *
-                        * Til then, we're stuck with arrays like in #I (though we can use
-                        * Linux style fdsets) or lousy O(n^2) linked lists (like #s).
+                        * Til then, we're stuck with arrays like in #ip (though we can use
+                        * Linux style fdsets) or lousy O(n^2) linked lists (like #srv).
                         *
                         * Note that we won't always start a gen loop with s == 0
                         * (devdirread, for instance) */
@@ -212,7 +220,7 @@ static void alarminit(void)
 
 static struct chan *alarmattach(char *spec)
 {
-       struct chan *c = devattach('A', spec);
+       struct chan *c = devattach(devname(), spec);
        mkqid(&c->qid, Qtopdir, 0, QTDIR);
        return c;
 }
index 0135436..a87847c 100644 (file)
 #include <smp.h>
 #include <ip.h>
 
+struct dev consdevtab;
+
+static char *devname(void)
+{
+       return consdevtab.name;
+}
+
 extern char *eve;
 /* much stuff not ready yet. */
 
@@ -569,7 +576,7 @@ static void consinit(void)
 
 static struct chan *consattach(char *spec)
 {
-       return devattach('c', spec);
+       return devattach(devname(), spec);
 }
 
 static struct walkqid *conswalk(struct chan *c, struct chan *nc, char **name,
index 480a531..a6b2e6d 100644 (file)
 #include <smp.h>
 #include <ip.h>
 
+struct dev etherdevtab;
+
+static char *devname(void)
+{
+       return etherdevtab.name;
+}
+
 enum {
        Type8021Q = 0x8100,                     /* value of type field for 802.1[pQ] tags */
 };
@@ -55,14 +62,14 @@ struct chan *etherattach(char *spec)
                if (ether->maxmtu < ETHERMAXTU + 4)
                        error("interface cannot support 802.1 tags");
                vlan = vlanalloc(ether, vlanid);
-               chan = devattach('l', spec);
+               chan = devattach(devname(), spec);
                chan->dev = ctlrno + (vlanid << 8);
                chan->aux = vlan;
                poperror();
                runlock(&ether->rwlock);
                return chan;
        }
-       chan = devattach('l', spec);
+       chan = devattach(devname(), spec);
        chan->dev = ctlrno;
        chan->aux = ether;
        if (ether->attach)
index 742db27..46c96a1 100644 (file)
 #include <ip.h>
 #include <oprofile.h>
 
+struct dev kprofdevtab;
+
+static char *devname(void)
+{
+       return kprofdevtab.name;
+}
+
 #define LRES   3               /* log of PC resolution */
 #define CELLSIZE       8       /* sizeof of count cell */
 
@@ -108,7 +115,7 @@ kprofattach(char *spec)
        if ( !(oprof_alarms && kprof.buf && kprof.systrace) )
                error(Enomem);
 
-       return devattach('K', spec);
+       return devattach(devname(), spec);
 }
 
 static void
index 0ee76c0..b5769cf 100644 (file)
 #include <ip.h>
 #include <smallidpool.h>
 
+struct dev mntdevtab;
+
+static char *devname(void)
+{
+       return mntdevtab.name;
+}
+
 /*
  * References are managed as follows:
  * The channel to the server - a network connection or pipe - has one
@@ -383,7 +390,7 @@ struct chan *mntchan(void)
 {
        struct chan *c;
 
-       c = devattach('M', 0);
+       c = devattach(devname(), 0);
        spin_lock(&mntalloc.l);
        c->dev = mntalloc.id++;
        spin_unlock(&mntalloc.l);
index 5987f52..c053408 100644 (file)
 #include <kdebug.h>
 #include <bitmap.h>
 
+struct dev nixdevtab;
+
+static char *devname(void)
+{
+       return nixdevtab.name;
+}
+
 /* qid path types */
 enum {
        Qtopdir = 1,
@@ -191,7 +198,7 @@ static int nixgen(struct chan *c, char *entry_name,
        /* Whether we're in one dir or at the top, .. still takes us to the top. */
        if (s == DEVDOTDOT) {
                mkqid(&q, Qtopdir, 0, QTDIR);
-               devdir(c, c->qid, "#V", 0, eve, 0555, dp);
+               devdir(c, c->qid, devname(), 0, eve, 0555, dp);
                return 1;
        }
        switch (TYPE(c->qid)) {
@@ -291,7 +298,7 @@ static struct chan *nixattach(char *spec)
 {
        if (!nixok)
                error("No NIXs available");
-       struct chan *c = devattach('t', spec);
+       struct chan *c = devattach(devname(), spec);
        mkqid(&c->qid, Qtopdir, 0, QTDIR);
        return c;
 }
index 74c635a..98173af 100644 (file)
 #include <ip.h>
 #include <arch/io.h>
 
+struct dev pcidevtab;
+
+static char *devname(void)
+{
+       return pcidevtab.name;
+}
+
 enum {
        Qtopdir = 0,
 
@@ -38,8 +45,6 @@ static struct dirtab topdir[] = {
        {"pci", {Qpcidir, 0, QTDIR}, 0, 0555},
 };
 
-extern struct dev pcidevtab;
-
 static int pcidirgen(struct chan *c, int t, int tbdf, struct dir *dp)
 {
        struct qid q;
@@ -110,7 +115,7 @@ pcigen(struct chan *c, char *, struct dirtab *, int unused_int, int s,
 
 static struct chan *pciattach(char *spec)
 {
-       return devattach(pcidevtab.dc, spec);
+       return devattach(devname(), spec);
 }
 
 struct walkqid *pciwalk(struct chan *c, struct chan *nc, char **name, int nname)
index e6913ec..b247bb6 100644 (file)
 #include <smp.h>
 #include <ip.h>
 
+struct dev pipedevtab;
+
+static char *devname(void)
+{
+       return pipedevtab.name;
+}
+
 typedef struct Pipe Pipe;
 struct Pipe {
        qlock_t qlock;
@@ -75,7 +82,7 @@ static struct chan *pipeattach(char *spec)
        Pipe *p;
        struct chan *c;
 
-       c = devattach('|', spec);
+       c = devattach(devname(), spec);
        p = kzmalloc(sizeof(Pipe), 0);
        if (p == 0)
                error(Enomem);
@@ -120,7 +127,7 @@ pipegen(struct chan *c, char *unused,
        Pipe *p;
 
        if (i == DEVDOTDOT) {
-               devdir(c, c->qid, "#|", 0, eve, 0555, dp);
+               devdir(c, c->qid, devname(), 0, eve, 0555, dp);
                return 1;
        }
        i++;    /* skip . */
index 98b2795..cbff07c 100644 (file)
 #include <smp.h>
 #include <arch/vmm/vmm.h>
 
+struct dev procdevtab;
+
+static char *devname(void)
+{
+       return procdevtab.name;
+}
+
 enum {
        Qdir,
        Qtrace,
@@ -203,7 +210,7 @@ procgen(struct chan *c, char *name, struct dirtab *tab, int unused, int s,
        uint32_t path, perm, len;
        if (s == DEVDOTDOT) {
                mkqid(&qid, Qdir, 0, QTDIR);
-               devdir(c, qid, "#p", 0, eve, 0555, dp);
+               devdir(c, qid, devname(), 0, eve, 0555, dp);
                return 1;
        }
 
@@ -361,7 +368,7 @@ static void procinit(void)
 
 static struct chan *procattach(char *spec)
 {
-       return devattach('p', spec);
+       return devattach(devname(), spec);
 }
 
 static struct walkqid *procwalk(struct chan *c, struct chan *nc, char **name,
index 060974a..444a021 100644 (file)
 #include <console.h>
 #include <ktest.h>
 
+struct dev regressdevtab;
+
+static char *devname(void)
+{
+       return regressdevtab.name;
+}
+
 struct regress
 {
        spinlock_t lock;
@@ -58,7 +65,7 @@ regressattach(char *spec)
        if (! regress.monitor) {
                printk("monitor allocate failed. No monitor output\n");
        }
-       return devattach('Z', spec);
+       return devattach(devname(), spec);
 }
 
 static void
index 0f5a635..503591f 100644 (file)
 #include <ip.h>
 #include <umem.h>
 
+struct dev rootdevtab;
+
+static char *devname(void)
+{
+       return rootdevtab.name;
+}
+
 /* make it a power of 2 and nobody gets hurt */
 #define MAXFILE 1024
 int rootmaxq = MAXFILE;
@@ -56,7 +63,7 @@ int inumber = 13;
 /* Inferno seems to want to: perm |= DMDIR.  It gets checked in other places.
  * NxM didn't want this, IIRC.
  *
- * Also note that "" (/, #r, whatever) has no vers/next/sibling.
+ * Also note that "" (/, #root, whatever) has no vers/next/sibling.
  *
  * If you want to add new entries, add it to the roottab such that the linked
  * list of indexes is a cycle (change the last current one), then add an entry
@@ -147,7 +154,7 @@ static int newentry(int parent)
        int n = findempty();
        int sib;
        if (n < 0)
-               error("#r. No more");
+               error("#root. No more");
        printd("new entry is %d\n", n);
        /* add the new one to the head of the linked list.  vers is 'next' */
        roottab[n].qid.vers = rootdata[parent].child;
@@ -197,7 +204,7 @@ static struct chan *rootattach(char *spec)
        struct chan *c;
        if (*spec)
                error(Ebadspec);
-       c = devattach('r', spec);
+       c = devattach(devname(), spec);
        mkqid(&c->qid, roottab[0].qid.path, roottab[0].qid.vers, QTDIR);
        return c;
 }
@@ -218,7 +225,7 @@ rootgen(struct chan *c, char *name,
                // XXX we need to set the vers too.  equiv to mkqid(&c->qid, ...)
                c->qid.path = p;
                c->qid.type = QTDIR;
-               name = "#r";
+               name = devname();
                if (p != 0) {
                        /* TODO: what is this doing?  do we want to walk the entire table,
                         * or are we just walking the siblings of our parent? */
@@ -373,7 +380,7 @@ static long rootread(struct chan *c, void *buf, long n, int64_t offset)
                n = len - offset;
        data = rootdata[p].ptr;
        /* we can't really claim it has to be a user address. Lots of
-        * kernel things read directly, e.g. /dev/reboot, #V, etc.
+        * kernel things read directly, e.g. /dev/reboot, #nix, etc.
         * Address validation should be done in the syscall layer.
         */
        memcpy(buf, data + offset, n);
index 15399a9..d8ed6bc 100644 (file)
 #include <ip.h>
 #include <sys/queue.h>
 
+struct dev srvdevtab;
+
+static char *devname(void)
+{
+       return srvdevtab.name;
+}
+
 #define Qtopdir                        1
 #define Qsrvfile               2
 
@@ -93,7 +100,7 @@ static int srvgen(struct chan *c, char *name, struct dirtab *tab,
        if (s == DEVDOTDOT) {
                /* changing whatever c->aux was to be topdir */
                mkqid(&q, Qtopdir, 0, QTDIR);
-               devdir(c, q, "#s", 0, eve, 0555, dp);
+               devdir(c, q, devname(), 0, eve, 0555, dp);
                return 1;
        }
        spin_lock(&srvlock);
@@ -138,7 +145,7 @@ static struct chan *srvattach(char *spec)
 {
        /* the inferno attach was pretty complicated, but
         * we're not sure that complexity is needed. */
-       struct chan *c = devattach('s', spec);
+       struct chan *c = devattach(devname(), spec);
        mkqid(&c->qid, Qtopdir, 0, QTDIR);
        /* c->aux is an uncounted ref */
        c->aux = top_dir;
index 6561bcb..a936600 100644 (file)
@@ -669,7 +669,7 @@ void cursordisable(void);
 int cursoron(int);
 void cursoroff(int);
 void cwrite(struct chan *, uint8_t * unused_uint8_p_t, int unused_int, int64_t);
-struct chan *devattach(int unused_int, char *unused_char_p_t);
+struct chan *devattach(const char *name, char *spec);
 struct block *devbread(struct chan *, long, uint32_t);
 long devbwrite(struct chan *, struct block *, uint32_t);
 struct chan *devclone(struct chan *);
@@ -679,7 +679,7 @@ void devdir(struct chan *, struct qid, char *, int64_t, char *, long,
 long devdirread(struct chan *, char *, long, struct dirtab *, int, Devgen *);
 Devgen devgen;
 void devinit(void);
-int devno(int unused_int, int);
+int devno(const char *name, int user);
 void devpower(int);
 struct dev *devbyname(char *unused_char_p_t);
 struct chan *devopen(struct chan *, int unused_int,
index b6dbcf0..119b4da 100644 (file)
 #include <smp.h>
 #include <ip.h>
 
+struct dev ipdevtab;
+
+static char *devname(void)
+{
+       return ipdevtab.name;
+}
+
 enum {
        Qtopdir = 1,                            /* top level directory */
        Qtopbase,
@@ -79,7 +86,7 @@ static int topdirgen(struct chan *c, struct dir *dp)
 {
        struct qid q;
        mkqid(&q, QID(0, 0, Qtopdir), 0, QTDIR);
-       snprintf(get_cur_genbuf(), GENBUF_SZ, "#I%lu", c->dev);
+       snprintf(get_cur_genbuf(), GENBUF_SZ, "#%s%lu", devname(), c->dev);
        return founddevdir(c, q, get_cur_genbuf(), 0, network, 0555, dp);
 }
 
@@ -327,7 +334,7 @@ static struct chan *ipattach(char *spec)
                error("bad specification");
 
        ipgetfs(dev);
-       c = devattach('I', spec);
+       c = devattach(devname(), spec);
        mkqid(&c->qid, QID(0, 0, Qtopdir), 0, QTDIR);
        c->dev = dev;
 
@@ -467,7 +474,7 @@ static struct chan *ipopen(struct chan *c, int omode)
                         * since an O_PATH perm is 0).
                         *
                         * But we probably want to incref to keep the conversation around
-                        * until this FD/chan is closed.  #I is a little weird in that
+                        * until this FD/chan is closed.  #ip is a little weird in that
                         * objects never really go away (high water mark for convs, you can
                         * always find them in the ns).  I think it is possible to
                         * namec/ipgen a chan, then have that conv close, then have that
@@ -1335,7 +1342,7 @@ int iptapfd(struct chan *chan, struct fd_tap *tap, int cmd)
                case Qdata:
                        if (tap->filter & ~DEVIP_LEGAL_DATA_TAPS) {
                                set_errno(ENOSYS);
-                               set_errstr("Unsupported #I data tap, must be %p",
+                               set_errstr("Unsupported #%s data tap, must be %p", devname(),
                                           DEVIP_LEGAL_DATA_TAPS);
                                return -1;
                        }
@@ -1359,7 +1366,8 @@ int iptapfd(struct chan *chan, struct fd_tap *tap, int cmd)
                                        break;
                                default:
                                        set_errno(ENOSYS);
-                                       set_errstr("Unsupported #I data tap command");
+                                       set_errstr("Unsupported #%s data tap command %p",
+                                                  devname(), cmd);
                                        ret = -1;
                        }
                        spin_unlock(&conv->tap_lock);
@@ -1367,7 +1375,7 @@ int iptapfd(struct chan *chan, struct fd_tap *tap, int cmd)
                case Qlisten:
                        if (tap->filter & ~DEVIP_LEGAL_LISTEN_TAPS) {
                                set_errno(ENOSYS);
-                               set_errstr("Unsupported #I listen tap, must be %p",
+                               set_errstr("Unsupported #%s listen tap, must be %p", devname(),
                                           DEVIP_LEGAL_LISTEN_TAPS);
                                return -1;
                        }
@@ -1383,14 +1391,16 @@ int iptapfd(struct chan *chan, struct fd_tap *tap, int cmd)
                                        break;
                                default:
                                        set_errno(ENOSYS);
-                                       set_errstr("Unsupported #I data tap command");
+                                       set_errstr("Unsupported #%s listen tap command %p",
+                                                  devname(), cmd);
                                        ret = -1;
                        }
                        spin_unlock(&conv->tap_lock);
                        return ret;
                default:
                        set_errno(ENOSYS);
-                       set_errstr("Can't tap #I file type %d", TYPE(chan->qid));
+                       set_errstr("Can't tap #%s file type %d", devname(),
+                                  TYPE(chan->qid));
                        return -1;
        }
 }
index 09b160f..ab8d6f5 100644 (file)
@@ -968,7 +968,7 @@ struct chan *namec(char *aname, int amode, int omode, uint32_t perm)
        struct mhead *m;
        char tmperrbuf[ERRMAX];
        int saved_errno;
-       char *name;
+       char *name, *devname, *devspec;
        // Rune r;
 
        static_assert(!(CINTERNAL_FLAGS & CEXTERNAL_FLAGS));
@@ -993,21 +993,29 @@ struct chan *namec(char *aname, int amode, int omode, uint32_t perm)
 
                case '#':
                        nomount = 1;
-                       get_cur_genbuf()[0] = '\0';
+                       devname = get_cur_genbuf();
+                       devname[0] = '\0';
                        n = 0;
+                       name++; /* drop the # */
                        while ((*name != '\0') && (*name != '/')) {
                                if (n >= GENBUF_SZ - 1)
                                        error(Efilename);
-                               get_cur_genbuf()[n++] = *name++;
+                               devname[n++] = *name++;
                        }
-                       get_cur_genbuf()[n] = '\0';
-#if 0
-                       n = chartorune(&r, get_cur_genbuf() + 1) + 1;
-                       if (r == 'M')
-                               error(Enoattach);
-#endif
-                       if (get_cur_genbuf()[1] == 'M')
+                       devname[n] = '\0';
+                       /* for a name #foo.spec, devname = foo\0, devspec = spec\0.
+                        * genbuf contains foo\0spec\0.  for no spec, devspec = \0 */
+                       devspec = strchr(devname, '.');
+                       if (devspec) {
+                               *devspec = '\0';
+                               devspec++;
+                       } else {
+                               devspec = &devname[n];
+                       }
+                       if (!strcmp(devname, "mnt"))
                                error(Enoattach);
+                       /* TODO: deal with this "nodevs" business. */
+                       #if 0
                        /*
                         *  the nodevs exceptions are
                         *  |  it only gives access to pipes you create
@@ -1022,13 +1030,12 @@ struct chan *namec(char *aname, int amode, int omode, uint32_t perm)
                                 || (get_cur_genbuf()[1] == 's' // || r == 's'
                                         && get_cur_genbuf()[n] != '\0')))
                                error(Enoattach);
-                       t = devno( /*r */ get_cur_genbuf()[1], 1);
+                       #endif
+                       t = devno(devname, 1);
                        if (t == -1)
-                               error(Ebadsharp);
-                       /* genbuf + 2: skips the # and X, just the spec left */
-                       c = devtab[t].attach(get_cur_genbuf() + 2);
+                               error("Unknown #device %s (spec %s)", devname, devspec);
+                       c = devtab[t].attach(devspec);
                        break;
-
                default:
                        c = current->dot;
                        if (!c)
index 0fb8570..89a634b 100644 (file)
@@ -23,16 +23,16 @@ void mkqid(struct qid *q, int64_t path, uint32_t vers, int type)
        q->path = path;
 }
 
-int devno(int c, int user)
+int devno(const char *name, int user)
 {
        int i;
 
        for (i = 0; &devtab[i] < __devtabend; i++) {
-               if (devtab[i].dc == c)
+               if (!strcmp(devtab[i].name, name))
                        return i;
        }
        if (user == 0)
-               panic("devno %c 0x%u", c, c);
+               panic("Lookup of dev :%s: failed", name);
 
        return -1;
 }
@@ -94,7 +94,7 @@ void devshutdown(void)
 {
 }
 
-struct chan *devattach(int tc, char *spec)
+struct chan *devattach(const char *name, char *spec)
 {
        struct chan *c;
        char *buf;
@@ -102,13 +102,13 @@ struct chan *devattach(int tc, char *spec)
 
        c = newchan();
        mkqid(&c->qid, 0, 0, QTDIR);
-       c->type = devno(tc, 0);
+       c->type = devno(name, 0);
        if (spec == NULL)
                spec = "";
-       /* 2 for #c, 1 for \0 */
-       buflen = 2 + strlen(spec) + 1;
+       /* 1 for #, 1 for ., 1 for \0 */
+       buflen = strlen(name) + strlen(spec) + 3;
        buf = kzmalloc(buflen, KMALLOC_WAIT);
-       snprintf(buf, buflen, "#%c%s", tc, spec);
+       snprintf(buf, sizeof(buf), "#%s.%s", name, spec);
        c->name = newcname(buf);
        kfree(buf);
        return c;
index 22e3db1..ce538f4 100644 (file)
@@ -335,7 +335,7 @@ int syspipe(int fd[2])
        struct chan *c[2];
        static char *names[] = { "data", "data1" };
 
-       d = &devtab[devno('|', 0)];
+       d = &devtab[devno("pipe", 0)];
        c[0] = 0;
        c[1] = 0;
        fd[0] = -1;
@@ -356,7 +356,7 @@ int syspipe(int fd[2])
                poperror();
                return -1;
        }
-       c[0] = namec("#|", Atodir, 0, 0);
+       c[0] = namec("#pipe", Atodir, 0, 0);
        c[1] = cclone(c[0]);
        if (walk(&c[0], &names[0], 1, 1, NULL) < 0)
                error(Egreg);
@@ -475,7 +475,7 @@ int sysmount(int fd, int afd, char *old, int flags, char *spec)
        mntparam.authchan = ac.c;
        mntparam.spec = spec;
        mntparam.flags = flags;
-       c0.c = devtab[devno('M', 0)].attach((char *)&mntparam);
+       c0.c = devtab[devno("mnt", 0)].attach((char *)&mntparam);
 
        r = bindmount(c0.c, old, flags, spec);
        poperror();
@@ -1318,11 +1318,11 @@ int plan9setup(struct proc *new_proc, struct proc *parent, int flags)
                 * switch_to() also loads the cr3. */
                new_proc->pgrp = newpgrp();
                old_current = switch_to(new_proc);
-               new_proc->slash = namec("#r", Atodir, 0, 0);
+               new_proc->slash = namec("#root", Atodir, 0, 0);
                if (!new_proc->slash)
                        panic("no root device");
                switch_back(new_proc, old_current);
-               /* Want the name to be "/" instead of "#r" */
+               /* Want the name to be "/" instead of "#root" */
                cnameclose(new_proc->slash->name);
                new_proc->slash->name = newcname("/");
                new_proc->dot = cclone(new_proc->slash);