aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/acme/xfid.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/acme/xfid.c')
-rw-r--r--src/cmd/acme/xfid.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/cmd/acme/xfid.c b/src/cmd/acme/xfid.c
index 15b411ce..65ae2d99 100644
--- a/src/cmd/acme/xfid.c
+++ b/src/cmd/acme/xfid.c
@@ -98,9 +98,9 @@ xfidopen(Xfid *x)
w = x->f->w;
t = &w->body;
+ q = FILE(x->f->qid);
if(w){
winlock(w, 'E');
- q = FILE(x->f->qid);
switch(q){
case QWaddr:
if(w->nopen[q]++ == 0){
@@ -174,11 +174,26 @@ xfidopen(Xfid *x)
respond(x, &fc, Eperm);
return;
}
+ if(!canqlock(&w->editoutlk)){
+ winunlock(w);
+ respond(x, &fc, Einuse);
+ return;
+ }
w->wrselrange = range(t->q1, t->q1);
break;
}
winunlock(w);
}
+ else{
+ switch(q){
+ case Qeditout:
+ if(!canqlock(&editoutlk)){
+ respond(x, &fc, Einuse);
+ return;
+ }
+ break;
+ }
+ }
fc.qid = x->f->qid;
fc.iounit = messagesize-IOHDRSZ;
x->f->open = TRUE;
@@ -203,10 +218,10 @@ xfidclose(Xfid *x)
return;
}
+ q = FILE(x->f->qid);
x->f->open = FALSE;
if(w){
winlock(w, 'E');
- q = FILE(x->f->qid);
switch(q){
case QWctl:
if(w->ctlfid!=~0 && w->ctlfid==x->f->fid){
@@ -247,10 +262,20 @@ xfidclose(Xfid *x)
min(w->wrselrange.q1, t->file->b.nc), 1);
textscrdraw(t);
break;
+ case QWeditout:
+ qunlock(&w->editoutlk);
+ break;
}
winunlock(w);
winclose(w);
}
+ else{
+ switch(q){
+ case Qeditout:
+ qunlock(&editoutlk);
+ break;
+ }
+ }
respond(x, &fc, nil);
}