ref: 11129532fb1da903d0a22d4bc498bb43b7bce797
parent: a2f934209e5ddc46f7af3d429d86da032a7aca45
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Nov 7 03:10:19 EST 2014
libc: improve dial error handling when dial is called with a generic dialstring, it will try /net and /net.alt in sequence. error out if the /net dial gets interrupted and do not continue dialing /net.alt. reduce stack usage by using the swaping nature of errstr() instead of keeping two error string buffers on the stack.
--- a/sys/src/libc/9sys/dial.c
+++ b/sys/src/libc/9sys/dial.c
@@ -35,7 +35,7 @@
{DS ds;
int rv;
- char err[ERRMAX], alterr[ERRMAX];
+ char err[ERRMAX];
ds.local = local;
ds.dir = dir;
@@ -49,23 +49,20 @@
rv = csdial(&ds);
if(rv >= 0)
return rv;
- err[0] = '\0';
+ *err = 0;
errstr(err, sizeof err);
- if(strstr(err, "refused") != 0){- werrstr("%s", err);+ if(strcmp(err, "interrupted") == 0 || strstr(err, "refused") != nil){+ errstr(err, sizeof err);
return rv;
}
+
ds.netdir = "/net.alt";
rv = csdial(&ds);
if(rv >= 0)
return rv;
-
- alterr[0] = 0;
- errstr(alterr, sizeof alterr);
- if(strstr(alterr, "translate") || strstr(alterr, "does not exist"))
- werrstr("%s", err);- else
- werrstr("%s", alterr);+ errstr(err, sizeof err);
+ if(strstr(err, "translate") == nil && strstr(err, "does not exist") == nil)
+ errstr(err, sizeof err);
return rv;
}
@@ -73,7 +70,7 @@
csdial(DS *ds)
{int n, fd, rv;
- char *p, buf[Maxstring], clone[Maxpath], err[ERRMAX], besterr[ERRMAX];
+ char *p, buf[Maxstring], clone[Maxpath], err[ERRMAX];
/*
* open connection server
@@ -101,7 +98,6 @@
*/
rv = -1;
*err = 0;
- *besterr = 0;
seek(fd, 0, 0);
while((n = read(fd, buf, sizeof(buf) - 1)) > 0){buf[n] = 0;
@@ -112,18 +108,17 @@
rv = call(buf, p, ds);
if(rv >= 0)
break;
- *err = 0;
errstr(err, sizeof err);
if(strcmp(err, "interrupted") == 0)
break;
- if(strstr(err, "does not exist") == 0)
- strcpy(besterr, err);
+ if(strstr(err, "does not exist") != nil)
+ errstr(err, sizeof err); /* get previous error back */
}
close(fd);
/* restore errstr if any */
if(rv < 0 && *err)
- errstr(*besterr ? besterr : err, sizeof err);
+ errstr(err, sizeof err);
return rv;
}
--
⑨