diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-11-07 08:10:19 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-11-07 08:10:19 +0100 |
commit | 958d698bf8b58bf30357882242b8fc84c93116ae (patch) | |
tree | ac8c784a96d207fd7353ef6d9f7ef8aa8353cc38 /sys/src | |
parent | a0e001a234796825f809e28c48880932b9e2aea9 (diff) |
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.
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/libc/9sys/dial.c | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/sys/src/libc/9sys/dial.c b/sys/src/libc/9sys/dial.c index 2a378f219..2ea0e6f9f 100644 --- a/sys/src/libc/9sys/dial.c +++ b/sys/src/libc/9sys/dial.c @@ -35,7 +35,7 @@ dial(char *dest, char *local, char *dir, int *cfdp) { DS ds; int rv; - char err[ERRMAX], alterr[ERRMAX]; + char err[ERRMAX]; ds.local = local; ds.dir = dir; @@ -49,23 +49,20 @@ dial(char *dest, char *local, char *dir, int *cfdp) 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 @@ static int 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 @@ csdial(DS *ds) */ 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 @@ csdial(DS *ds) 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; } |