summaryrefslogtreecommitdiff
path: root/sys/src/9/port/devshr.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-08-17 23:27:31 +0200
committercinap_lenrek <cinap_lenrek@centraldogma>2011-08-17 23:27:31 +0200
commitc44b78f739a15469ea0d9a1cb3895abeb62e21fc (patch)
tree0289c607eede11a18aa3b08a0f770385a051272c /sys/src/9/port/devshr.c
parent72304eb350228a3267ef339905bef2f11659c4bf (diff)
change definition of Chan.create to return a chan like open
Diffstat (limited to 'sys/src/9/port/devshr.c')
-rw-r--r--sys/src/9/port/devshr.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/sys/src/9/port/devshr.c b/sys/src/9/port/devshr.c
index 3aa604ea0..ddab43d0b 100644
--- a/sys/src/9/port/devshr.c
+++ b/sys/src/9/port/devshr.c
@@ -418,7 +418,10 @@ shropen(Chan *c, int omode)
return c;
}
-static void
+/* chan.c */
+Chan* createdir(Chan *c, Mhead *m);
+
+static Chan*
shrcreate(Chan *c, char *name, int omode, ulong perm)
{
Sch *sch;
@@ -426,17 +429,34 @@ shrcreate(Chan *c, char *name, int omode, ulong perm)
Mpt *mpt;
Mhead *h;
Mount *m;
+ Chan *nc;
sch = tosch(c);
switch(sch->level){
- default:
- error(Enocreate);
case Qcroot:
case Qcshr:
if(strcmp(up->user, "none") == 0)
error(Eperm);
}
switch(sch->level){
+ default:
+ error(Eperm);
+ case Qshr:
+ incref(c);
+ if(waserror()){
+ cclose(c);
+ nexterror();
+ }
+ nc = createdir(c, &sch->shr->umh);
+ poperror();
+ if(waserror()){
+ cclose(nc);
+ nexterror();
+ }
+ nc = devtab[nc->type]->create(nc, name, omode, perm);
+ poperror();
+ cclose(c);
+ return nc;
case Qcroot:
if((perm & DMDIR) == 0 || openmode(omode) != OREAD)
error(Eperm);
@@ -498,6 +518,7 @@ shrcreate(Chan *c, char *name, int omode, ulong perm)
mpt->perm = perm;
incref(mpt);
+ mpt->m.mflag = (h->mount == nil) ? MCREATE : 0;
mpt->m.head = h;
mpt->m.next = h->mount;
h->mount = &mpt->m;
@@ -511,6 +532,7 @@ shrcreate(Chan *c, char *name, int omode, ulong perm)
}
c->flag |= COPEN;
c->mode = openmode(omode);
+ return c;
}
static void