diff options
author | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-08-17 23:27:31 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-08-17 23:27:31 +0200 |
commit | c44b78f739a15469ea0d9a1cb3895abeb62e21fc (patch) | |
tree | 0289c607eede11a18aa3b08a0f770385a051272c /sys/src/9/port/devshr.c | |
parent | 72304eb350228a3267ef339905bef2f11659c4bf (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.c | 28 |
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 |