]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/port/chan.c
devproc: return process id when reading /proc/n/ctl file
[plan9front.git] / sys / src / 9 / port / chan.c
index 24eb72d70e4506c158390af07f779cc50e5eb5d2..cce88ba3e4d6c1e21fa9c7e10782d15fa5c2a32f 100644 (file)
@@ -1204,19 +1204,7 @@ parsename(char *aname, Elemlist *e)
        }
 }
 
-void*
-memrchr(void *va, int c, long n)
-{
-       uchar *a, *e;
-
-       a = va;
-       for(e=a+n-1; e>a; e--)
-               if(*e == c)
-                       return e;
-       return nil;
-}
-
-void
+static void
 namelenerror(char *aname, int len, char *err)
 {
        char *ename, *name, *next;
@@ -1237,9 +1225,11 @@ namelenerror(char *aname, int len, char *err)
                next = ename;
                do{
                        name = next;
-                       next = memrchr(aname, '/', name-aname);
-                       if(next == nil)
-                               next = aname;
+                       if(next == aname)
+                               break;
+                       while(next > aname)
+                               if(*--next == '/')
+                                       break;
                        len = ename-next;
                }while(len < ERRMAX/3 || len + errlen < 2*ERRMAX/3);
 
@@ -1287,12 +1277,13 @@ Chan*
 namec(char *aname, int amode, int omode, ulong perm)
 {
        int len, n, t, nomount;
-       Chan *c, *cnew;
-       Path *path;
+       Chan *c;
+       Chan *volatile cnew;
+       Path *volatile path;
        Elemlist e;
        Rune r;
        Mhead *m;
-       char *createerr, tmperrbuf[ERRMAX];
+       char *err;
        char *name;
 
        if(aname[0] == '\0')
@@ -1369,13 +1360,15 @@ namec(char *aname, int amode, int omode, ulong perm)
                 */
                if(e.nerror == 0)
                        nexterror();
-               strcpy(tmperrbuf, up->errstr);
                if(e.off[e.nerror]==0)
                        print("nerror=%d but off=%d\n",
                                e.nerror, e.off[e.nerror]);
                len = e.prefix+e.off[e.nerror];
                free(e.off);
-               namelenerror(aname, len, tmperrbuf);
+               err = up->errstr;
+               up->errstr = up->syserrstr;
+               up->syserrstr = err;
+               namelenerror(aname, len, err);
        }
 
        /*
@@ -1593,14 +1586,16 @@ namec(char *aname, int amode, int omode, ulong perm)
                if(omode & OEXCL)
                        nexterror();
                /* save error */
-               createerr = up->errstr;
-               up->errstr = tmperrbuf;
+               err = up->errstr;
+               up->errstr = up->syserrstr;
+               up->syserrstr = err;
                /* note: we depend that walk does not error */
-               if(walk(&c, e.elems+e.nelems-1, 1, nomount, nil) < 0){
-                       up->errstr = createerr;
-                       error(createerr);       /* report true error */
-               }
-               up->errstr = createerr;
+               if(walk(&c, e.elems+e.nelems-1, 1, nomount, nil) < 0)
+                       error(err);     /* report true error */
+               /* restore error */
+               err = up->syserrstr;
+               up->syserrstr = up->errstr;
+               up->errstr = err;
                omode |= OTRUNC;
                goto Open;