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.
This commit is contained in:
parent
a0e001a234
commit
958d698bf8
1 changed files with 12 additions and 17 deletions
|
@ -35,7 +35,7 @@ dial(char *dest, char *local, char *dir, int *cfdp)
|
||||||
{
|
{
|
||||||
DS ds;
|
DS ds;
|
||||||
int rv;
|
int rv;
|
||||||
char err[ERRMAX], alterr[ERRMAX];
|
char err[ERRMAX];
|
||||||
|
|
||||||
ds.local = local;
|
ds.local = local;
|
||||||
ds.dir = dir;
|
ds.dir = dir;
|
||||||
|
@ -49,23 +49,20 @@ dial(char *dest, char *local, char *dir, int *cfdp)
|
||||||
rv = csdial(&ds);
|
rv = csdial(&ds);
|
||||||
if(rv >= 0)
|
if(rv >= 0)
|
||||||
return rv;
|
return rv;
|
||||||
err[0] = '\0';
|
*err = 0;
|
||||||
errstr(err, sizeof err);
|
errstr(err, sizeof err);
|
||||||
if(strstr(err, "refused") != 0){
|
if(strcmp(err, "interrupted") == 0 || strstr(err, "refused") != nil){
|
||||||
werrstr("%s", err);
|
errstr(err, sizeof err);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
ds.netdir = "/net.alt";
|
ds.netdir = "/net.alt";
|
||||||
rv = csdial(&ds);
|
rv = csdial(&ds);
|
||||||
if(rv >= 0)
|
if(rv >= 0)
|
||||||
return rv;
|
return rv;
|
||||||
|
errstr(err, sizeof err);
|
||||||
alterr[0] = 0;
|
if(strstr(err, "translate") == nil && strstr(err, "does not exist") == nil)
|
||||||
errstr(alterr, sizeof alterr);
|
errstr(err, sizeof err);
|
||||||
if(strstr(alterr, "translate") || strstr(alterr, "does not exist"))
|
|
||||||
werrstr("%s", err);
|
|
||||||
else
|
|
||||||
werrstr("%s", alterr);
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,7 +70,7 @@ static int
|
||||||
csdial(DS *ds)
|
csdial(DS *ds)
|
||||||
{
|
{
|
||||||
int n, fd, rv;
|
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
|
* open connection server
|
||||||
|
@ -101,7 +98,6 @@ csdial(DS *ds)
|
||||||
*/
|
*/
|
||||||
rv = -1;
|
rv = -1;
|
||||||
*err = 0;
|
*err = 0;
|
||||||
*besterr = 0;
|
|
||||||
seek(fd, 0, 0);
|
seek(fd, 0, 0);
|
||||||
while((n = read(fd, buf, sizeof(buf) - 1)) > 0){
|
while((n = read(fd, buf, sizeof(buf) - 1)) > 0){
|
||||||
buf[n] = 0;
|
buf[n] = 0;
|
||||||
|
@ -112,18 +108,17 @@ csdial(DS *ds)
|
||||||
rv = call(buf, p, ds);
|
rv = call(buf, p, ds);
|
||||||
if(rv >= 0)
|
if(rv >= 0)
|
||||||
break;
|
break;
|
||||||
*err = 0;
|
|
||||||
errstr(err, sizeof err);
|
errstr(err, sizeof err);
|
||||||
if(strcmp(err, "interrupted") == 0)
|
if(strcmp(err, "interrupted") == 0)
|
||||||
break;
|
break;
|
||||||
if(strstr(err, "does not exist") == 0)
|
if(strstr(err, "does not exist") != nil)
|
||||||
strcpy(besterr, err);
|
errstr(err, sizeof err); /* get previous error back */
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
/* restore errstr if any */
|
/* restore errstr if any */
|
||||||
if(rv < 0 && *err)
|
if(rv < 0 && *err)
|
||||||
errstr(*besterr ? besterr : err, sizeof err);
|
errstr(err, sizeof err);
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue