}
}
-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;
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);
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')
*/
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);
}
/*
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;