| plan 9 kernel history: overview | file list | diff list |
1996/0223/port/dev.c (diff list | history)
| 1990/0227/sys/src/9/port/dev.c:76,81 – 1990/0303/sys/src/9/port/dev.c:76,83 (short | long) | ||
| 1990/0227 | nc->dev = c->dev; nc->flag = c->flag; nc->mnt = c->mnt; | |
| 1990/0303 | nc->mchan = c->mchan; nc->mqid = c->mqid; | |
| 1990/0227 | return nc; } | |
| 1990/0303/sys/src/9/port/dev.c:67,72 – 1990/0329/sys/src/9/port/dev.c:67,74 (short | long) | ||
| 1990/0227 | Chan * devclone(Chan *c, Chan *nc) { | |
| 1990/0329 | if(c->flag & COPEN) panic("clone of open file type %c\n", devchar[c->type]); | |
| 1990/0227 | if(nc == 0) nc = newchan(); nc->type = c->type; | |
| 1990/0329/sys/src/9/port/dev.c:143,158 – 1990/0821/sys/src/9/port/dev.c:143,156 (short | long) | ||
| 1990/0227 | long devdirread(Chan *c, char *d, long n, Dirtab *tab, int ntab, Devgen *gen) { | |
| 1990/0821 | long k, m; | |
| 1990/0227 | Dir dir; k = c->offset/DIRLEN; | |
| 1990/0821 | for(m=0; m<n; k++) | |
| 1990/0227 | switch((*gen)(c, tab, ntab, k, &dir)){ case -1: | |
| 1990/0821 | return m; | |
| 1990/0227 | case 0: c->offset += DIRLEN; | |
| 1990/0329/sys/src/9/port/dev.c:160,171 – 1990/0821/sys/src/9/port/dev.c:158,168 | ||
| 1990/0227 | case 1: convD2M(&dir, d); | |
| 1990/0821 | m += DIRLEN; | |
| 1990/0227 | d += DIRLEN; | |
| 1990/0821 | return m; | |
| 1990/0227 | } Chan * | |
| 1990/0821/sys/src/9/port/dev.c:4,10 – 1990/11211/sys/src/9/port/dev.c:4,9 (short | long) | ||
| 1990/0227 | #include "dat.h" #include "fns.h" #include "errno.h" | |
| 1990/0821/sys/src/9/port/dev.c:25,37 – 1990/11211/sys/src/9/port/dev.c:24,36 | ||
| 1990/0227 | } void | |
| 1990/11211 | devdir(Chan *c, Qid qid, char *n, long length, long perm, Dir *db) | |
| 1990/0227 | { strcpy(db->name, n); db->qid = qid; db->type = devchar[c->type]; db->dev = c->dev; | |
| 1990/11211 | if(qid.path & CHDIR) | |
| 1990/0227 | db->mode = CHDIR|perm; else db->mode = perm; | |
| 1990/0821/sys/src/9/port/dev.c:39,46 – 1990/11211/sys/src/9/port/dev.c:38,45 | ||
| 1990/0227 | db->mtime = db->atime; db->hlength = 0; db->length = length; | |
| 1990/11211 | memcpy(db->uid, user, NAMELEN); memcpy(db->gid, user, NAMELEN); | |
| 1990/0227 | } int | |
| 1990/0821/sys/src/9/port/dev.c:59,65 – 1990/11211/sys/src/9/port/dev.c:58,64 | ||
| 1990/0227 | Chan *c; c = newchan(); | |
| 1990/11211 | c->qid = (Qid){CHDIR, 0}; | |
| 1990/0227 | c->type = devno(tc, 0); return c; } | |
| 1990/0821/sys/src/9/port/dev.c:95,103 – 1990/11211/sys/src/9/port/dev.c:94,100 | ||
| 1990/0227 | for(i=0;; i++) switch((*gen)(c, tab, ntab, i, &dir)){ case -1: | |
| 1990/11211 | strncpy(u->error, errstrtab[Enonexist], NAMELEN); | |
| 1990/0227 | return 0; case 0: continue; | |
| 1990/0821/sys/src/9/port/dev.c:123,129 – 1990/11211/sys/src/9/port/dev.c:120,126 | ||
| 1990/0227 | * devices with interesting directories usually don't get * here, which is good because we've lost the name by now. */ | |
| 1990/11211 | if(c->qid.path & CHDIR){ | |
| 1990/0227 | devdir(c, c->qid, ".", 0L, CHDIR|0700, &dir); convD2M(&dir, db); return; | |
| 1990/0821/sys/src/9/port/dev.c:132,138 – 1990/11211/sys/src/9/port/dev.c:129,135 | ||
| 1990/0227 | case 0: break; case 1: | |
| 1990/11211 | if(eqqid(c->qid, dir.qid)){ | |
| 1990/0227 | convD2M(&dir, db); return; } | |
| 1990/0821/sys/src/9/port/dev.c:180,196 – 1990/11211/sys/src/9/port/dev.c:177,193 | ||
| 1990/0227 | case 0: break; case 1: | |
| 1990/11211 | if(eqqid(c->qid, dir.qid)){ | |
| 1990/0227 | if((access[omode&3] & dir.mode) == access[omode&3]) goto Return; | |
| 1990/11211 | error(Eperm); | |
| 1990/0227 | } break; } Return: c->offset = 0; | |
| 1990/11211 | if((c->qid.path&CHDIR) && omode!=OREAD) error(Eperm); | |
| 1990/0227 | c->mode = openmode(omode); c->flag |= COPEN; return c; | |
| 1990/11211/sys/src/9/port/dev.c:38,45 – 1991/0318/sys/src/9/port/dev.c:38,45 (short | long) | ||
|
Eliminate memcpy.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | db->mtime = db->atime; db->hlength = 0; db->length = length; | |
| 1990/11211 |
| |
| 1991/0318 | memmove(db->uid, user, NAMELEN); memmove(db->gid, user, NAMELEN); | |
| 1990/0227 | } int | |
| 1991/0318/sys/src/9/port/dev.c:107,112 – 1991/0411/sys/src/9/port/dev.c:107,118 (short | long) | ||
|
Add devclwalk.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | } } | |
| 1991/0411 | int devclwalk(Chan *c, Chan *nc, char *name, Dirtab *tab, int ntab, Devgen *gen) { c = devclone(c, nc); return devwalk(c, name, tab, ntab, gen); } | |
| 1990/0227 | void devstat(Chan *c, char *db, Dirtab *tab, int ntab, Devgen *gen) { | |
| 1991/0411/sys/src/9/port/dev.c:107,116 – 1991/0414/sys/src/9/port/dev.c:107,127 (short | long) | ||
|
Bug fix: close nc if walk errors out.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | } } | |
| 1991/0411 |
| |
| 1991/0414 | Chan* devclwalk(Chan *c, char *name) | |
| 1991/0411 | { | |
| 1991/0414 | Chan *nc; nc = 0; if(waserror()){ if(nc) close(nc); return 0; } nc = (*devtab[c->type].clone)(c, 0); (*devtab[nc->type].walk)(nc, name); poperror(); return nc; | |
| 1991/0411 | } | |
| 1990/0227 | void | |
| 1991/0414/sys/src/9/port/dev.c:71,82 – 1991/0421/sys/src/9/port/dev.c:71,83 (short | long) | ||
|
Copy nc->aux in devclone. Bug fix confusion: now walk is returning on error.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | if(nc == 0) nc = newchan(); nc->type = c->type; | |
| 1991/0421 | nc->dev = c->dev; | |
| 1990/0227 | nc->mode = c->mode; nc->qid = c->qid; nc->offset = c->offset; | |
| 1991/0421 | nc->aux = c->aux; | |
| 1990/0303 | nc->mchan = c->mchan; nc->mqid = c->mqid; | |
| 1990/0227 | return nc; | |
| 1991/0414/sys/src/9/port/dev.c:119,125 – 1991/0421/sys/src/9/port/dev.c:120,129 | ||
| 1991/0414 | return 0; } nc = (*devtab[c->type].clone)(c, 0); | |
| 1991/0421 | if((*devtab[nc->type].walk)(nc, name) == 0){ close(nc); nc = 0; } | |
| 1991/0414 | poperror(); return nc; | |
| 1991/0411 | } | |
| 1991/0421/sys/src/9/port/dev.c:77,82 – 1991/0427/sys/src/9/port/dev.c:77,83 (short | long) | ||
|
Copy mountid in devclone. Remove devclwalk entirely.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | nc->offset = c->offset; nc->flag = c->flag; nc->mnt = c->mnt; | |
| 1991/0427 | nc->mountid = c->mountid; | |
| 1991/0421 | nc->aux = c->aux; | |
| 1990/0303 | nc->mchan = c->mchan; nc->mqid = c->mqid; | |
| 1991/0421/sys/src/9/port/dev.c:106,131 – 1991/0427/sys/src/9/port/dev.c:107,112 | ||
| 1990/0227 | } continue; } | |
| 1991/0414 |
| |
| 1991/0411 |
| |
| 1991/0414 |
| |
| 1991/0421 |
| |
| 1991/0414 |
| |
| 1991/0411 | } | |
| 1990/0227 | void | |
| 1991/0427/sys/src/9/port/dev.c:127,133 – 1991/0626/sys/src/9/port/dev.c:127,134 (short | long) | ||
|
Debugging: print when gen is broken, instead of panicking.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | convD2M(&dir, db); return; } | |
| 1991/0626 | print("devstat %c %lux\n", devchar[c->type], c->qid.path); error(Enonexist); | |
| 1990/0227 | case 0: break; case 1: | |
| 1991/0626/sys/src/9/port/dev.c:24,30 – 1991/1109/sys/src/9/port/dev.c:24,30 (short | long) | ||
|
Add user to devdir parameters.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | } void | |
| 1990/11211 |
| |
| 1991/1109 | devdir(Chan *c, Qid qid, char *n, long length, char *user, long perm, Dir *db) | |
| 1990/0227 | { strcpy(db->name, n); db->qid = qid; | |
| 1991/0626/sys/src/9/port/dev.c:48,54 – 1991/1109/sys/src/9/port/dev.c:48,54 | ||
| 1990/0227 | if(tab==0 || i>=ntab) return -1; tab += i; | |
| 1991/1109 | devdir(c, tab->qid, tab->name, tab->length, eve, tab->perm, dp); | |
| 1990/0227 | return 1; } | |
| 1991/0626/sys/src/9/port/dev.c:123,129 – 1991/1109/sys/src/9/port/dev.c:123,129 | ||
| 1990/0227 | * here, which is good because we've lost the name by now. */ | |
| 1990/11211 | if(c->qid.path & CHDIR){ | |
| 1990/0227 |
| |
| 1991/1109 | devdir(c, c->qid, ".", 0L, eve, CHDIR|0700, &dir); | |
| 1990/0227 | convD2M(&dir, db); return; } | |
| 1991/1109/sys/src/9/port/dev.c:38,45 – 1991/1112/sys/src/9/port/dev.c:38,45 (short | long) | ||
|
Performance: replace memmove with strncpy. Compute access modes for permission.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | db->mtime = db->atime; db->hlength = 0; db->length = length; | |
| 1991/0318 |
| |
| 1991/1112 | strncpy(db->uid, user, NAMELEN); strncpy(db->gid, eve, NAMELEN); | |
| 1990/0227 | } int | |
| 1991/1109/sys/src/9/port/dev.c:170,175 – 1991/1112/sys/src/9/port/dev.c:170,176 | ||
| 1990/0227 | { int i; Dir dir; | |
| 1991/1112 | ulong t, mode; | |
| 1990/0227 | static int access[] = { 0400, 0200, 0600, 0100 }; for(i=0;; i++) | |
| 1991/1109/sys/src/9/port/dev.c:180,187 – 1991/1112/sys/src/9/port/dev.c:181,196 | ||
| 1990/0227 | case 0: break; case 1: | |
| 1990/11211 |
| |
| 1990/0227 |
| |
| 1991/1112 | if(eqqid(c->qid, dir.qid)) { if(strcmp(u->p->user, dir.uid) == 0) /* User */ mode = dir.mode; else if(strcmp(u->p->user, eve) == 0) /* Bootes is group */ mode = dir.mode<<3; else mode = dir.mode<<6; /* Other */ t = access[omode&3]; if((t & mode) == t) | |
| 1990/0227 | goto Return; | |
| 1990/11211 | error(Eperm); | |
| 1990/0227 | } | |
| 1991/1112/sys/src/9/port/dev.c:127,133 – 1991/1120/sys/src/9/port/dev.c:127,134 (short | long) | ||
|
Debugging: print more info about broken gen functions.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | convD2M(&dir, db); return; } | |
| 1991/0626 |
| |
| 1991/1120 | print("%s %s: devstat %c %lux\n", u->p->text, u->p->user, devchar[c->type], c->qid.path); | |
| 1991/0626 | error(Enonexist); | |
| 1990/0227 | case 0: break; | |
| 1991/1120/sys/src/9/port/dev.c:119,126 – 1991/1206/sys/src/9/port/dev.c:119,127 (short | long) | ||
|
Comment edit.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | switch((*gen)(c, tab, ntab, i, &dir)){ case -1: /* | |
| 1991/1206 | * given a channel, we cannot derive the directory name * that the channel was generated from since it was lost * by namec. | |
| 1990/0227 | */ | |
| 1990/11211 | if(c->qid.path & CHDIR){ | |
| 1991/1109 | devdir(c, c->qid, ".", 0L, eve, CHDIR|0700, &dir); | |
| 1991/1120/sys/src/9/port/dev.c:177,183 – 1991/1206/sys/src/9/port/dev.c:178,183 | ||
| 1990/0227 | for(i=0;; i++) switch((*gen)(c, tab, ntab, i, &dir)){ case -1: | |
| 1991/1120/sys/src/9/port/dev.c:185,191 – 1991/1206/sys/src/9/port/dev.c:185,191 | ||
| 1991/1112 | if(eqqid(c->qid, dir.qid)) { if(strcmp(u->p->user, dir.uid) == 0) /* User */ mode = dir.mode; | |
| 1991/1206 | else if(strcmp(u->p->user, eve) == 0) /* eve is group */ | |
| 1991/1112 | mode = dir.mode<<3; else mode = dir.mode<<6; /* Other */ | |
| 1991/1206/sys/src/9/port/dev.c:9,14 – 1991/1220/sys/src/9/port/dev.c:9,16 (short | long) | ||
|
Add kerndate.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | #include "fcall.h" | |
| 1991/1220 | extern ulong kerndate; | |
| 1990/0227 | int devno(int c, int user) { | |
| 1991/1206/sys/src/9/port/dev.c:35,41 – 1991/1220/sys/src/9/port/dev.c:37,43 | ||
| 1990/0227 | else db->mode = perm; db->atime = seconds(); | |
| 1991/1220 | db->mtime = kerndate; | |
| 1990/0227 | db->hlength = 0; db->length = length; | |
| 1991/1112 | strncpy(db->uid, user, NAMELEN); | |
| 1991/1220/sys/src/9/port/dev.c:3,9 – 1992/0111/sys/src/9/port/dev.c:3,9 (short | long) | ||
|
Move error.h to ../port. Change errors to actual strings.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | #include "mem.h" #include "dat.h" #include "fns.h" | |
| 1992/0111 | #include "../port/error.h" | |
| 1990/0227 | #define DEVTAB #include "devtab.h" | |
| 1991/1220/sys/src/9/port/dev.c:98,104 – 1992/0111/sys/src/9/port/dev.c:98,104 | ||
| 1990/0227 | for(i=0;; i++) switch((*gen)(c, tab, ntab, i, &dir)){ case -1: | |
| 1990/11211 |
| |
| 1992/0111 | strncpy(u->error, Enonexist, NAMELEN); | |
| 1990/0227 | return 0; case 0: continue; | |
| 1992/0111/sys/src/9/port/dev.c:1,5 – 1992/0321/sys/src/9/port/dev.c:1,5 (short | long) | ||
|
Move lib.h to ../port. XXX get copies of old lib.h
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | #include "u.h" | |
| 1992/0321 | #include "../port/lib.h" | |
| 1990/0227 | #include "mem.h" #include "dat.h" #include "fns.h" | |
| 1992/0321/sys/src/9/port/dev.c:109,114 – 1992/0520/sys/src/9/port/dev.c:109,115 (short | long) | ||
|
Silence compiler warning.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | } continue; } | |
| 1992/0520 | return 1; /* not reached */ | |
| 1991/0411 | } | |
| 1990/0227 | void | |
| 1992/0520/sys/src/9/port/dev.c:7,14 – 1992/0619/sys/src/9/port/dev.c:7,12 (short | long) | ||
|
Remove "fcall.h".
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | #define DEVTAB #include "devtab.h" | |
| 1991/1220 | extern ulong kerndate; | |
| 1990/0227 | int | |
| 1992/0619/sys/src/9/port/dev.c:57,62 – 1992/0711/sys/src/9/port/dev.c:57,63 (short | long) | ||
|
Silence compiler warning.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | { Chan *c; | |
| 1992/0711 | USED(spec); | |
| 1990/0227 | c = newchan(); | |
| 1990/11211 | c->qid = (Qid){CHDIR, 0}; | |
| 1990/0227 | c->type = devno(tc, 0); | |
| 1992/0711/sys/src/9/port/dev.c:12,26 – 1992/1217/sys/src/9/port/dev.c:12,33 (short | long) | ||
|
Change: devchar is now a Rune string
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | int devno(int c, int user) { | |
| 1992/1217 | Rune *s; int i; | |
| 1990/0227 |
| |
| 1992/1217 | s = devchar; i = 0; while(*s){ if(c == *s) return i; i++; s++; | |
| 1990/0227 | } | |
| 1992/1217 | if(user) return -1; panic("devno %C 0x%ux", c, c); return 0; | |
| 1990/0227 | } void | |
| 1992/0711/sys/src/9/port/dev.c:68,74 – 1992/1217/sys/src/9/port/dev.c:75,81 | ||
| 1990/0227 | devclone(Chan *c, Chan *nc) { | |
| 1990/0329 | if(c->flag & COPEN) | |
| 1992/1217 | panic("clone of open file type %C\n", devchar[c->type]); | |
| 1990/0227 | if(nc == 0) nc = newchan(); nc->type = c->type; | |
| 1992/0711/sys/src/9/port/dev.c:130,136 – 1992/1217/sys/src/9/port/dev.c:137,143 | ||
| 1990/0227 | convD2M(&dir, db); return; } | |
| 1991/1120 |
| |
| 1992/1217 | print("%s %s: devstat %C %lux\n", u->p->text, u->p->user, | |
| 1991/1120 | devchar[c->type], c->qid.path); | |
| 1991/0626 | error(Enonexist); | |
| 1990/0227 | case 0: | |
| 1992/1217/sys/src/9/port/dev.c:124,131 – 1993/0321/sys/src/9/port/dev.c:124,133 (short | long) | ||
|
Format edit.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | int i; Dir dir; | |
| 1993/0321 | for(i=0;; i++) { | |
| 1990/0227 | switch((*gen)(c, tab, ntab, i, &dir)){ | |
| 1993/0321 | case 0: break; | |
| 1990/0227 | case -1: /* | |
| 1991/1206 | * given a channel, we cannot derive the directory name | |
| 1992/1217/sys/src/9/port/dev.c:138,154 – 1993/0321/sys/src/9/port/dev.c:140,155 | ||
| 1990/0227 | return; } | |
| 1992/1217 | print("%s %s: devstat %C %lux\n", u->p->text, u->p->user, | |
| 1991/1120 |
| |
| 1993/0321 | devchar[c->type], c->qid.path); | |
| 1991/0626 | error(Enonexist); | |
| 1990/0227 |
| |
| 1990/11211 |
| |
| 1993/0321 | if(eqqid(c->qid, dir.qid)) { | |
| 1990/0227 | convD2M(&dir, db); return; } break; } | |
| 1993/0321 | } | |
| 1990/0227 | } long | |
| 1993/0321/sys/src/9/port/dev.c:41,46 – 1993/0323/sys/src/9/port/dev.c:41,48 (short | long) | ||
|
Add CHMOUNT bit to mounted channels.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | db->mode = CHDIR|perm; else db->mode = perm; | |
| 1993/0323 | if(c->flag&CMSG) db->mode |= CHMOUNT; | |
| 1990/0227 | db->atime = seconds(); | |
| 1991/1220 | db->mtime = kerndate; | |
| 1990/0227 | db->hlength = 0; | |
| 1993/0321/sys/src/9/port/dev.c:144,149 – 1993/0323/sys/src/9/port/dev.c:146,153 | ||
| 1991/0626 | error(Enonexist); | |
| 1990/0227 | case 1: | |
| 1993/0321 | if(eqqid(c->qid, dir.qid)) { | |
| 1993/0323 | if(c->flag&CMSG) dir.mode |= CHMOUNT; | |
| 1990/0227 | convD2M(&dir, db); return; } | |
| 1993/0323/sys/src/9/port/dev.c:126,135 – 1993/0330/sys/src/9/port/dev.c:126,133 (short | long) | ||
|
Confusion over whether braces should stay. Use mode 775 not 700 for device directories.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | int i; Dir dir; | |
| 1993/0321 |
| |
| 1993/0330 | for(i=0;; i++) | |
| 1990/0227 | switch((*gen)(c, tab, ntab, i, &dir)){ | |
| 1993/0321 |
| |
| 1990/0227 | case -1: /* | |
| 1991/1206 | * given a channel, we cannot derive the directory name | |
| 1993/0323/sys/src/9/port/dev.c:137,151 – 1993/0330/sys/src/9/port/dev.c:135,151 | ||
| 1991/1206 | * by namec. | |
| 1990/0227 | */ | |
| 1990/11211 | if(c->qid.path & CHDIR){ | |
| 1991/1109 |
| |
| 1993/0330 | devdir(c, c->qid, ".", 0L, eve, CHDIR|0775, &dir); | |
| 1990/0227 | convD2M(&dir, db); return; } | |
| 1992/1217 | print("%s %s: devstat %C %lux\n", u->p->text, u->p->user, | |
| 1993/0321 |
| |
| 1993/0330 | devchar[c->type], c->qid.path); | |
| 1991/0626 | error(Enonexist); | |
| 1993/0330 | case 0: break; | |
| 1990/0227 | case 1: | |
| 1993/0321 |
| |
| 1993/0330 | if(eqqid(c->qid, dir.qid)){ | |
| 1993/0323 | if(c->flag&CMSG) dir.mode |= CHMOUNT; | |
| 1990/0227 | convD2M(&dir, db); | |
| 1993/0323/sys/src/9/port/dev.c:153,159 – 1993/0330/sys/src/9/port/dev.c:153,158 | ||
| 1990/0227 | } break; } | |
| 1993/0321 |
| |
| 1990/0227 | } long | |
| 1993/0330/sys/src/9/port/dev.c:65,75 – 1993/0501/sys/src/9/port/dev.c:65,80 (short | long) | ||
|
Convert to Brazil: add Path, up, format edits.
Directory mode back to 0700.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/0227 | devattach(int tc, char *spec) { Chan *c; | |
| 1993/0501 | char buf[NAMELEN+4]; | |
| 1990/0227 | ||
| 1992/0711 | USED(spec); | |
| 1990/0227 | c = newchan(); | |
| 1990/11211 | c->qid = (Qid){CHDIR, 0}; | |
| 1990/0227 | c->type = devno(tc, 0); | |
| 1993/0501 | if(tc != 'M') { sprint(buf, "#%C%s", tc, spec); c->path = ptenter(&syspt, 0, buf); } | |
| 1990/0227 | return c; } | |
| 1993/0330/sys/src/9/port/dev.c:78,85 – 1993/0501/sys/src/9/port/dev.c:83,92 | ||
| 1990/0227 | { | |
| 1990/0329 | if(c->flag & COPEN) | |
| 1992/1217 | panic("clone of open file type %C\n", devchar[c->type]); | |
| 1993/0501 | ||
| 1990/0227 | if(nc == 0) nc = newchan(); | |
| 1993/0501 | ||
| 1990/0227 | nc->type = c->type; | |
| 1991/0421 | nc->dev = c->dev; | |
| 1990/0227 | nc->mode = c->mode; | |
| 1993/0330/sys/src/9/port/dev.c:91,96 – 1993/0501/sys/src/9/port/dev.c:98,105 | ||
| 1991/0421 | nc->aux = c->aux; | |
| 1990/0303 | nc->mchan = c->mchan; nc->mqid = c->mqid; | |
| 1993/0501 | nc->path = c->path; incref(nc->path); | |
| 1990/0227 | return nc; } | |
| 1993/0330/sys/src/9/port/dev.c:99,112 – 1993/0501/sys/src/9/port/dev.c:108,122 | ||
| 1990/0227 | { long i; Dir dir; | |
| 1993/0501 | Path *op; | |
| 1990/0227 | isdir(c); if(name[0]=='.' && name[1]==0) return 1; | |
| 1993/0501 | for(i=0;; i++) { | |
| 1990/0227 | switch((*gen)(c, tab, ntab, i, &dir)){ case -1: | |
| 1992/0111 |
| |
| 1993/0501 | strncpy(up->error, Enonexist, NAMELEN); | |
| 1990/0227 | return 0; case 0: continue; | |
| 1993/0330/sys/src/9/port/dev.c:113,123 – 1993/0501/sys/src/9/port/dev.c:123,137 | ||
| 1990/0227 | case 1: if(strcmp(name, dir.name) == 0){ c->qid = dir.qid; | |
| 1993/0501 | op = c->path; c->path = ptenter(&syspt, op, name); decref(op); | |
| 1990/0227 | return 1; } continue; } | |
| 1992/0520 |
| |
| 1993/0501 | } return 0; /* not reached */ | |
| 1991/0411 | } | |
| 1990/0227 | void | |
| 1993/0330/sys/src/9/port/dev.c:129,151 – 1993/0501/sys/src/9/port/dev.c:143,165 | ||
| 1993/0330 | for(i=0;; i++) | |
| 1990/0227 | switch((*gen)(c, tab, ntab, i, &dir)){ case -1: | |
| 1991/1206 |
| |
| 1990/0227 |
| |
| 1993/0501 | /* * given a channel, we cannot derive the directory name * that the channel was generated from since it was lost * by namec. */ | |
| 1990/11211 | if(c->qid.path & CHDIR){ | |
| 1993/0330 |
| |
| 1993/0501 | devdir(c, c->qid, c->path->elem, i*DIRLEN, eve, CHDIR|0700, &dir); | |
| 1990/0227 | convD2M(&dir, db); return; } | |
| 1992/1217 |
| |
| 1993/0330 |
| |
| 1993/0501 | print("%s %s: devstat %C %lux\n", up->text, up->user, devchar[c->type], c->qid.path); | |
| 1991/0626 | error(Enonexist); | |
| 1993/0330 | case 0: break; | |
| 1990/0227 | case 1: | |
| 1993/0330 |
| |
| 1993/0501 | if(eqqid(c->qid, dir.qid)) { | |
| 1993/0323 | if(c->flag&CMSG) dir.mode |= CHMOUNT; | |
| 1990/0227 | convD2M(&dir, db); | |
| 1993/0330/sys/src/9/port/dev.c:162,168 – 1993/0501/sys/src/9/port/dev.c:176,182 | ||
| 1990/0227 | Dir dir; k = c->offset/DIRLEN; | |
| 1990/0821 |
| |
| 1993/0501 | for(m=0; m<n; k++) { | |
| 1990/0227 | switch((*gen)(c, tab, ntab, k, &dir)){ case -1: | |
| 1990/0821 | return m; | |
| 1993/0330/sys/src/9/port/dev.c:177,182 – 1993/0501/sys/src/9/port/dev.c:191,198 | ||
| 1990/0227 | d += DIRLEN; break; } | |
| 1993/0501 | } | |
| 1990/0821 | return m; | |
| 1990/0227 | } | |
| 1993/0330/sys/src/9/port/dev.c:188,194 – 1993/0501/sys/src/9/port/dev.c:204,210 | ||
| 1991/1112 | ulong t, mode; | |
| 1990/0227 | static int access[] = { 0400, 0200, 0600, 0100 }; | |
| 1993/0501 | for(i=0;; i++) { | |
| 1990/0227 | switch((*gen)(c, tab, ntab, i, &dir)){ case -1: goto Return; | |
| 1993/0330/sys/src/9/port/dev.c:196,207 – 1993/0501/sys/src/9/port/dev.c:212,224 | ||
| 1990/0227 | break; case 1: | |
| 1991/1112 | if(eqqid(c->qid, dir.qid)) { | |
| 1993/0501 | if(strcmp(up->user, dir.uid) == 0) | |
| 1991/1112 | mode = dir.mode; | |
| 1991/1206 |
| |
| 1993/0501 | else if(strcmp(up->user, eve) == 0) | |
| 1991/1112 | mode = dir.mode<<3; else | |
| 1993/0501 | mode = dir.mode<<6; | |
| 1991/1112 | t = access[omode&3]; if((t & mode) == t) | |
| 1993/0330/sys/src/9/port/dev.c:210,216 – 1993/0501/sys/src/9/port/dev.c:227,234 | ||
| 1990/0227 | } break; } | |
| 1993/0501 | } Return: | |
| 1990/0227 | c->offset = 0; | |
| 1990/11211 | if((c->qid.path&CHDIR) && omode!=OREAD) error(Eperm); | |
| Too many diffs (26 > 25). Stopping. | ||