| plan 9 kernel history: overview | file list | diff list |
1999/0122/port/devsrv.c (diff list | history)
| 1998/0319/sys/src/9/port/devsrv.c:63,68 – 1999/0122/sys/src/9/port/devsrv.c:63,78 (short | long | prev | next) | ||
| 1991/0828 | devstat(c, db, 0, 0, srvgen); | |
| 1990/0227 | } | |
| 1999/0122 | static Srv* srvlookup(char *name, ulong qidpath) { Srv *sp; for(sp = srv; sp; sp = sp->link) if(sp->path == qidpath || (name && strcmp(sp->name, name) == 0)) return sp; return nil; } | |
| 1997/0327 | static Chan* | |
| 1990/0227 | srvopen(Chan *c, int omode) { | |
| 1998/0319/sys/src/9/port/devsrv.c:69,74 – 1999/0122/sys/src/9/port/devsrv.c:79,86 | ||
| 1992/0622 | Srv *sp; | |
| 1990/0227 | ||
| 1991/0828 | if(c->qid.path == CHDIR){ | |
| 1999/0122 | if(omode & ORCLOSE) error(Eperm); | |
| 1990/1110 | if(omode != OREAD) | |
| 1990/11211 | error(Eisdir); | |
| 1990/0227 | c->mode = omode; | |
| 1998/0319/sys/src/9/port/devsrv.c:82,97 – 1999/0122/sys/src/9/port/devsrv.c:94,106 | ||
| 1991/0828 | nexterror(); } | |
| 1992/0622 |
| |
| 1999/0122 | sp = srvlookup(nil, c->qid.path); | |
| 1992/0622 | if(sp == 0 || sp->chan == 0) | |
| 1990/11211 | error(Eshutdown); | |
| 1992/0622 | ||
| 1991/0828 | if(omode&OTRUNC) | |
| 1990/11211 | error(Eperm); | |
| 1992/0622 |
| |
| 1999/0122 | if(openmode(omode)!=sp->chan->mode && sp->chan->mode!=ORDWR) | |
| 1990/11211 | error(Eperm); | |
| 1992/0622 | ||
| 1997/0327 | cclose(c); | |
| 1998/0319/sys/src/9/port/devsrv.c:106,114 – 1999/0122/sys/src/9/port/devsrv.c:115,126 | ||
| 1990/0227 | { | |
| 1991/1219 | Srv *sp; | |
| 1990/0227 | ||
| 1991/0828 |
| |
| 1999/0122 | if(openmode(omode) != OWRITE) | |
| 1991/0828 | error(Eperm); | |
| 1991/1219 | ||
| 1999/0122 | if(omode & OCEXEC) /* can't happen */ panic("someone broke namec"); | |
| 1992/0622 | sp = malloc(sizeof(Srv)); if(sp == 0) error(Enomem); | |
| 1998/0319/sys/src/9/port/devsrv.c:118,123 – 1999/0122/sys/src/9/port/devsrv.c:130,138 | ||
| 1992/0622 | qunlock(&srvlk); | |
| 1990/0227 | nexterror(); } | |
| 1999/0122 | if(srvlookup(name, -1)) error(Eexist); | |
| 1993/0501 | sp->path = qidpath++; | |
| 1992/0622 | sp->link = srv; c->qid.path = sp->path; | |
| 1998/0319/sys/src/9/port/devsrv.c:174,183 – 1999/0122/sys/src/9/port/devsrv.c:189,196 | ||
| 1994/1018 | Dir d; Srv *sp; | |
| 1999/0122 | if(c->qid.path & CHDIR) | |
| 1994/1018 | error(Eperm); | |
| 1998/0319/sys/src/9/port/devsrv.c:185,195 – 1999/0122/sys/src/9/port/devsrv.c:198,210 | ||
| 1994/1018 | nexterror(); } | |
| 1999/0122 | sp = srvlookup(nil, c->qid.path); if(sp == 0) error(Enonexist); if(strcmp(sp->owner, up->user) && !iseve()) error(Eperm); | |
| 1994/1018 | convM2D(dp, &d); d.mode &= 0777; sp->perm = d.mode; | |
| 1998/0319/sys/src/9/port/devsrv.c:199,206 – 1999/0122/sys/src/9/port/devsrv.c:214,229 | ||
| 1990/0227 | } | |
| 1997/0327 | static void | |
| 1995/0804 |
| |
| 1999/0122 | srvclose(Chan *c) | |
| 1990/0227 | { | |
| 1999/0122 | /* * errors from srvremove will be caught by cclose and ignored. * in theory we need to override any changes in removability * since open, but since all that's checked is the owner, * which is immutable, all is well. */ if(c->flag & CRCLOSE) srvremove(c); | |
| 1990/0227 | } | |
| 1997/0327 | static long | |
| 1998/0319/sys/src/9/port/devsrv.c:232,246 – 1999/0122/sys/src/9/port/devsrv.c:255,266 | ||
| 1997/0327 | cclose(c1); | |
| 1992/0520 | nexterror(); } | |
| 1992/0622 |
| |
| 1992/0620 | ||
| 1999/0122 | sp = srvlookup(nil, c->qid.path); | |
| 1992/0622 | if(sp == 0) error(Enonexist); if(sp->chan) | |
| 1999/0122 | error(Ebadusefd); | |
| 1992/0622 | sp->chan = c1; qunlock(&srvlk); | |