diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-11-03 00:34:35 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-11-03 00:34:35 +0100 |
commit | 9619a621ac8b9be2b38790d21fc5f0c482cd83fa (patch) | |
tree | 53a64676701fbf692c0fb8b6cade6ed21da6a4d5 /sys/src/cmd/rio | |
parent | bcad0cd4e631ef321dca17ffa49c8ecdd30cb652 (diff) |
rio: cleanup and error handling
Diffstat (limited to 'sys/src/cmd/rio')
-rw-r--r-- | sys/src/cmd/rio/dat.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/rio/fsys.c | 13 | ||||
-rw-r--r-- | sys/src/cmd/rio/rio.c | 40 | ||||
-rw-r--r-- | sys/src/cmd/rio/util.c | 2 | ||||
-rw-r--r-- | sys/src/cmd/rio/wind.c | 24 | ||||
-rw-r--r-- | sys/src/cmd/rio/xfid.c | 132 |
6 files changed, 111 insertions, 101 deletions
diff --git a/sys/src/cmd/rio/dat.h b/sys/src/cmd/rio/dat.h index 454fcd9ac..9ba409a1a 100644 --- a/sys/src/cmd/rio/dat.h +++ b/sys/src/cmd/rio/dat.h @@ -24,6 +24,7 @@ enum }; #define STACK 8192 +#define MAXSNARF 100*1024 typedef struct Consreadmesg Consreadmesg; typedef struct Conswritemesg Conswritemesg; diff --git a/sys/src/cmd/rio/fsys.c b/sys/src/cmd/rio/fsys.c index 5e680ea85..b0ae83b5e 100644 --- a/sys/src/cmd/rio/fsys.c +++ b/sys/src/cmd/rio/fsys.c @@ -13,8 +13,9 @@ char Eperm[] = "permission denied"; char Eexist[] = "file does not exist"; char Enotdir[] = "not a directory"; -char Ebadfcall[] = "bad fcall type"; -char Eoffset[] = "illegal offset"; +char Ebadfcall[] = "bad fcall type"; +char Eoffset[] = "illegal offset"; +char Enomem[] = "out of memory"; int messagesize = 8192+IOHDRSZ; /* good start */ @@ -192,7 +193,9 @@ filsysproc(void *arg) fs->pid = getpid(); x = nil; for(;;){ - buf = emalloc(messagesize+UTFmax); /* UTFmax for appending partial rune in xfidwrite */ + buf = malloc(messagesize+UTFmax); /* UTFmax for appending partial rune in xfidwrite */ + if(buf == nil) + error(Enomem); while((n = read9pmsg(fs->sfd, buf, messagesize)) == 0) yield(); if(n < 0){ @@ -259,7 +262,7 @@ filsysrespond(Filsys *fs, Xfid *x, Fcall *t, char *err) t->fid = x->fid; t->tag = x->tag; if(x->buf == nil) - x->buf = malloc(messagesize); + error("no buffer in respond"); n = convS2M(t, x->buf, messagesize); if(n <= 0) error("convert error in convS2M"); @@ -556,7 +559,7 @@ filsysread(Filsys *fs, Xfid *x, Fid *f) clock = getclock(); b = malloc(messagesize-IOHDRSZ); /* avoid memset of emalloc */ if(b == nil) - return filsysrespond(fs, x, &t, "out of memory"); + return filsysrespond(fs, x, &t, Enomem); n = 0; switch(FILE(f->qid)){ case Qdir: diff --git a/sys/src/cmd/rio/rio.c b/sys/src/cmd/rio/rio.c index e6537283f..ccf06ab0d 100644 --- a/sys/src/cmd/rio/rio.c +++ b/sys/src/cmd/rio/rio.c @@ -270,24 +270,29 @@ void getsnarf(void) { int i, n, nb, nulls; - char *sn, buf[1024]; + char *s, *sn; if(snarffd < 0) return; sn = nil; i = 0; seek(snarffd, 0, 0); - while((n = read(snarffd, buf, sizeof buf)) > 0){ - sn = erealloc(sn, i+n+1); - memmove(sn+i, buf, n); + for(;;){ + if(i > MAXSNARF) + break; + if((s = realloc(sn, i+1024+1)) == nil) + break; + sn = s; + if((n = read(snarffd, sn+i, 1024)) <= 0) + break; i += n; - sn[i] = 0; } - if(i > 0){ - snarf = runerealloc(snarf, i+1); + if(i == 0) + return; + sn[i] = 0; + if((snarf = runerealloc(snarf, i+1)) != nil) cvttorunes(sn, i, snarf, &nb, &nsnarf, &nulls); - free(sn); - } + free(sn); } void @@ -365,16 +370,15 @@ keyboardsend(char *s, int cnt) if(s[cnt-1] == 0) chanprint(kbdchan, "%s", s); else { - Rune *r; - int i, nb, nr; - - r = runemalloc(cnt); - cvttorunes(s, cnt, r, &nb, &nr, nil); - for(i=0; i<nr; i++){ - if(r[i]) - chanprint(kbdchan, "c%C", r[i]); + Rune r; + int nb; + + nb = 0; + while(fullrune(s+nb, cnt-nb)){ + nb += chartorune(&r, s+nb); + if(r != 0) + chanprint(kbdchan, "c%C", r); } - free(r); } } diff --git a/sys/src/cmd/rio/util.c b/sys/src/cmd/rio/util.c index 6d19eb5ae..dffaaae79 100644 --- a/sys/src/cmd/rio/util.c +++ b/sys/src/cmd/rio/util.c @@ -58,6 +58,7 @@ erealloc(void *p, uint n) p = realloc(p, n); if(p == nil) error("realloc failed"); + setrealloctag(p, getcallerpc(&p)); return p; } @@ -69,6 +70,7 @@ emalloc(uint n) p = malloc(n); if(p == nil) error("malloc failed"); + setmalloctag(p, getcallerpc(&n)); memset(p, 0, n); return p; } diff --git a/sys/src/cmd/rio/wind.c b/sys/src/cmd/rio/wind.c index 74758bcc5..4a15cc6e8 100644 --- a/sys/src/cmd/rio/wind.c +++ b/sys/src/cmd/rio/wind.c @@ -435,11 +435,13 @@ winctl(void *arg) showcandidates(w, cr); if(cr->advance){ rp = runesmprint("%s", cr->string); - nr = runestrlen(rp); - q0 = w->q0; - q0 = winsert(w, rp, nr, q0); - wshow(w, q0+nr); - free(rp); + if(rp){ + nr = runestrlen(rp); + q0 = w->q0; + q0 = winsert(w, rp, nr, q0); + wshow(w, q0+nr); + free(rp); + } } } freecompletion(cr); @@ -582,21 +584,19 @@ namecomplete(Window *w) runemove(path, w->r+(w->q0-nstr-npath), npath); /* is path rooted? if not, we need to make it relative to window path */ - if(npath>0 && path[0]=='/'){ - dir = malloc(UTFmax*npath+1); - sprint(dir, "%.*S", npath, path); - }else{ + if(npath>0 && path[0]=='/') + dir = runetobyte(path, npath, &npath); + else { if(strcmp(w->dir, "") == 0) root = "."; else root = w->dir; - dir = malloc(strlen(root)+1+UTFmax*npath+1); - sprint(dir, "%s/%.*S", root, npath, path); + dir = smprint("%s/%.*S", root, npath, path); } /* run in background, winctl will collect the result on w->complete chan */ job = emalloc(sizeof *job); - job->str = smprint("%.*S", nstr, str); + job->str = runetobyte(str, nstr, &nstr); job->dir = cleanname(dir); job->win = w; incref(w); diff --git a/sys/src/cmd/rio/xfid.c b/sys/src/cmd/rio/xfid.c index 7cf7eadb6..adae440cf 100644 --- a/sys/src/cmd/rio/xfid.c +++ b/sys/src/cmd/rio/xfid.c @@ -11,13 +11,9 @@ #include "dat.h" #include "fns.h" -#define MAXSNARF 100*1024 - char Einuse[] = "file in use"; char Edeleted[] = "window deleted"; -char Ebadreq[] = "bad graphics request"; char Etooshort[] = "buffer too small"; -char Ebadtile[] = "unknown tile"; char Eshort[] = "short i/o request"; char Elong[] = "snarf buffer too long"; char Eunkid[] = "unknown id in attach"; @@ -25,9 +21,9 @@ char Ebadrect[] = "bad rectangle in attach"; char Ewindow[] = "cannot make window"; char Enowindow[] = "window has no image"; char Ebadmouse[] = "bad format on /dev/mouse"; -char Ebadwrect[] = "rectangle outside screen"; -char Ebadoffset[] = "window read not on scan line boundary"; + extern char Eperm[]; +extern char Enomem[]; static Xfid *xfidfree; static Xfid *xfid; @@ -292,12 +288,8 @@ xfidopen(Xfid *x) w->mouseopen = TRUE; break; case Qsnarf: - if(x->mode==ORDWR || x->mode==OWRITE){ - if(tsnarf) - free(tsnarf); /* collision, but OK */ + if(x->mode==ORDWR || x->mode==OWRITE) ntsnarf = 0; - tsnarf = malloc(1); - } break; case Qwctl: if(x->mode==OREAD || x->mode==ORDWR){ @@ -364,8 +356,6 @@ xfidclose(Xfid *x) if(x->f->mode==ORDWR || x->f->mode==OWRITE){ snarf = runerealloc(snarf, ntsnarf+1); cvttorunes(tsnarf, ntsnarf, snarf, &nb, &nsnarf, &nulls); - free(tsnarf); - tsnarf = nil; ntsnarf = 0; } break; @@ -382,8 +372,8 @@ void xfidwrite(Xfid *x) { Fcall fc; - int c, cnt, qid, nb, off, nr; - char buf[256], *p; + int cnt, qid, nb, off, nr; + char err[ERRMAX], *p; Point pt; Window *w; Rune *r; @@ -403,27 +393,6 @@ xfidwrite(Xfid *x) x->data[cnt] = 0; switch(qid){ case Qcons: - nr = x->f->nrpart; - if(nr > 0){ - memmove(x->data+nr, x->data, cnt); /* there's room: see malloc in filsysproc */ - memmove(x->data, x->f->rpart, nr); - cnt += nr; - x->f->nrpart = 0; - } - r = runemalloc(cnt); - cvttorunes(x->data, cnt-UTFmax, r, &nb, &nr, nil); - /* approach end of buffer */ - while(fullrune(x->data+nb, cnt-nb)){ - c = nb; - nb += chartorune(&r[nr], x->data+c); - if(r[nr]) - nr++; - } - if(nb < cnt){ - memmove(x->f->rpart, x->data+nb, cnt-nb); - x->f->nrpart = cnt-nb; - } - alts[CWdata].c = w->conswrite; alts[CWdata].v = &cwm; alts[CWdata].op = CHANRCV; @@ -440,15 +409,38 @@ xfidwrite(Xfid *x) break; case CWgone: filsysrespond(x->fs, x, &fc, Edeleted); - free(r); return; case CWflush: - free(r); filsyscancel(x); return; } - /* received data */ + nr = x->f->nrpart; + if(nr > 0){ + memmove(x->data+nr, x->data, cnt); /* there's room: see malloc in filsysproc */ + memmove(x->data, x->f->rpart, nr); + cnt += nr; + } + r = runemalloc(cnt); + if(r == nil){ + pair.ns = 0; + send(cwm.cw, &pair); + filsysrespond(x->fs, x, &fc, Enomem); + return; + } + x->f->nrpart = 0; + cvttorunes(x->data, cnt-UTFmax, r, &nb, &nr, nil); + /* approach end of buffer */ + while(fullrune(x->data+nb, cnt-nb)){ + nb += chartorune(&r[nr], x->data+nb); + if(r[nr]) + nr++; + } + if(nb < cnt){ + memmove(x->f->rpart, x->data+nb, cnt-nb); + x->f->nrpart = cnt-nb; + } + pair.s = r; pair.ns = nr; send(cwm.cw, &pair); @@ -501,10 +493,14 @@ xfidwrite(Xfid *x) filsysrespond(x->fs, x, &fc, "non-zero offset writing label"); return; } - free(w->label); - w->label = emalloc(cnt+1); - memmove(w->label, x->data, cnt); + p = realloc(w->label, cnt+1); + if(p == nil){ + filsysrespond(x->fs, x, &fc, Enomem); + return; + } + w->label = p; w->label[cnt] = 0; + memmove(w->label, x->data, cnt); break; case Qmouse: @@ -526,12 +522,19 @@ xfidwrite(Xfid *x) break; case Qsnarf: + if(cnt == 0) + break; /* always append only */ if(ntsnarf > MAXSNARF){ /* avoid thrashing when people cut huge text */ filsysrespond(x->fs, x, &fc, Elong); return; } - tsnarf = erealloc(tsnarf, ntsnarf+cnt+1); /* room for NUL */ + p = realloc(tsnarf, ntsnarf+cnt+1); /* room for NUL */ + if(p == nil){ + filsysrespond(x->fs, x, &fc, Enomem); + return; + } + tsnarf = p; memmove(tsnarf+ntsnarf, x->data, cnt); ntsnarf += cnt; snarfversion++; @@ -546,20 +549,17 @@ xfidwrite(Xfid *x) x->data[cnt-1] = '\0'; } /* assume data comes in a single write */ - /* - * Problem: programs like dossrv, ftp produce illegal UTF; - * we must cope by converting it first. - */ - snprint(buf, sizeof buf, "%.*s", cnt, x->data); - if(buf[0] == '/'){ - free(w->dir); - w->dir = estrdup(buf); + if(x->data[0] == '/'){ + p = smprint("%.*s", cnt, x->data); }else{ - p = emalloc(strlen(w->dir) + 1 + strlen(buf) + 1); - sprint(p, "%s/%s", w->dir, buf); - free(w->dir); - w->dir = cleanname(p); + p = smprint("%s/%.*s", w->dir, cnt, x->data); + } + if(p == nil){ + filsysrespond(x->fs, x, &fc, Enomem); + return; } + free(w->dir); + w->dir = cleanname(p); break; case Qkbdin: @@ -567,16 +567,15 @@ xfidwrite(Xfid *x) break; case Qwctl: - if(writewctl(x, buf) < 0){ - filsysrespond(x->fs, x, &fc, buf); + if(writewctl(x, err) < 0){ + filsysrespond(x->fs, x, &fc, err); return; } break; default: fprint(2, "unknown qid %d in write\n", qid); - snprint(buf, sizeof(buf), "unknown qid in write"); - filsysrespond(x->fs, x, &fc, buf); + filsysrespond(x->fs, x, &fc, "unknown qid in write"); return; } fc.count = cnt; @@ -653,7 +652,7 @@ xfidread(Xfid *x) alts[CRflush].c = x->flushc; alts[CRflush].v = nil; alts[CRflush].op = CHANRCV; - alts[NMR].op = CHANEND; + alts[NCR].op = CHANEND; switch(alt(alts)){ case CRdata: @@ -666,7 +665,6 @@ xfidread(Xfid *x) return; } - /* received data */ c1 = crm.c1; c2 = crm.c2; t = malloc(cnt+UTFmax+1); /* room to unpack partial rune plus */ @@ -713,6 +711,7 @@ xfidread(Xfid *x) filsyscancel(x); return; } + recv(mrm.cm, &ms); c = 'm'; if(w->resized) @@ -747,7 +746,6 @@ xfidread(Xfid *x) return; } - /* received data */ t = recvp(krm.ck); fc.data = t; fc.count = strlen(t)+1; @@ -829,9 +827,12 @@ xfidread(Xfid *x) goto Text; } off -= 5*12; + n = -1; t = malloc(cnt); - fc.data = t; - n = readwindow(i, t, r, off, cnt); /* careful; fc.count is unsigned */ + if(t){ + fc.data = t; + n = readwindow(i, t, r, off, cnt); /* careful; fc.count is unsigned */ + } if(n < 0){ buf[0] = 0; errstr(buf, sizeof buf); @@ -858,7 +859,7 @@ xfidread(Xfid *x) alts[WCRflush].c = x->flushc; alts[WCRflush].v = nil; alts[WCRflush].op = CHANRCV; - alts[NMR].op = CHANEND; + alts[NWCR].op = CHANEND; switch(alt(alts)){ case WCRdata: @@ -871,7 +872,6 @@ xfidread(Xfid *x) return; } - /* received data */ c1 = cwrm.c1; c2 = cwrm.c2; t = malloc(cnt+1); /* be sure to have room for NUL */ |