]> 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 77bc9951dc376619be0f963c23ddd460deeb5856..cce88ba3e4d6c1e21fa9c7e10782d15fa5c2a32f 100644 (file)
@@ -1277,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')
@@ -1359,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);
        }
 
        /*
@@ -1583,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;