summaryrefslogtreecommitdiff
path: root/sys/src/cmd/rio
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-11-03 00:34:35 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2013-11-03 00:34:35 +0100
commit9619a621ac8b9be2b38790d21fc5f0c482cd83fa (patch)
tree53a64676701fbf692c0fb8b6cade6ed21da6a4d5 /sys/src/cmd/rio
parentbcad0cd4e631ef321dca17ffa49c8ecdd30cb652 (diff)
rio: cleanup and error handling
Diffstat (limited to 'sys/src/cmd/rio')
-rw-r--r--sys/src/cmd/rio/dat.h1
-rw-r--r--sys/src/cmd/rio/fsys.c13
-rw-r--r--sys/src/cmd/rio/rio.c40
-rw-r--r--sys/src/cmd/rio/util.c2
-rw-r--r--sys/src/cmd/rio/wind.c24
-rw-r--r--sys/src/cmd/rio/xfid.c132
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 */