## diffname port/devdup.c 1990/0227 ## diff -e /dev/null /n/bootesdump/1990/0227/sys/src/9/mips/devdup.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "errno.h" #include "devtab.h" int dupgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp) { char buf[8]; Chan *f; static int perm[] = { 0400, 0200, 0600, 0 }; if(s >= NFD) return -1; if((f=u->fd[s]) == 0) return 0; sprint(buf, "%ld", s); devdir(c, s, buf, 0, perm[f->mode&3], dp); return 1; } void dupinit(void) { } void dupreset(void) { } Chan * dupattach(char *spec) { return devattach('d', spec); } Chan * dupclone(Chan *c, Chan *nc) { return devclone(c, nc); } int dupwalk(Chan *c, char *name) { return devwalk(c, name, (Dirtab *)0, 0, dupgen); } void dupstat(Chan *c, char *db) { devstat(c, db, (Dirtab *)0, 0L, dupgen); } Chan * dupopen(Chan *c, int omode) { Chan *f; if(c->qid == CHDIR){ if(omode != 0) error(0, Eisdir); c->mode = 0; c->flag |= COPEN; c->offset = 0; return c; } fdtochan(c->qid, openmode(omode)); /* error check only */ f = u->fd[c->qid]; close(c); incref(f); return f; } void dupcreate(Chan *c, char *name, int omode, ulong perm) { error(0, Eperm); } void dupremove(Chan *c) { error(0, Eperm); } void dupwstat(Chan *c, char *dp) { error(0, Egreg); } void dupclose(Chan *c) { } long dupread(Chan *c, void *va, long n) { char *a = va; if(c->qid != CHDIR) panic("dupread"); return devdirread(c, a, n, (Dirtab *)0, 0L, dupgen); } long dupwrite(Chan *c, void *va, long n) { panic("dupwrite"); } void duperrstr(Error *e, char *buf) { rooterrstr(e, buf); } void dupuserstr(Error *e, char *buf) { consuserstr(e, buf); } . ## diffname port/devdup.c 1990/11211 ## diff -e /n/bootesdump/1990/0227/sys/src/9/mips/devdup.c /n/bootesdump/1990/11211/sys/src/9/mips/devdup.c 118,129d 109c if(c->qid.path != CHDIR) . 96c error(Egreg); . 90c error(Eperm); . 84c error(Eperm); . 74,75c fdtochan(c->qid.path, openmode(omode)); /* error check only */ f = u->fd[c->qid.path]; . 68c error(Eisdir); . 66c if(c->qid.path == CHDIR){ . 23c devdir(c, (Qid){s, 0}, buf, 0, perm[f->mode&3], dp); . ## diffname port/devdup.c 1991/0320 ## diff -e /n/bootesdump/1990/1210/sys/src/9/mips/devdup.c /n/bootesdump/1991/0320/sys/src/9/port/devdup.c 77a if(omode & OCEXEC) f->flag |= CCEXEC; . ## diffname port/devdup.c 1991/0411 ## diff -e /n/bootesdump/1991/0320/sys/src/9/port/devdup.c /n/bootesdump/1991/0411/sys/src/9/port/devdup.c 117c dupwrite(Chan *c, void *va, long n, ulong offset) . 107c dupread(Chan *c, void *va, long n, ulong offset) . ## diffname port/devdup.c 1991/0419 ## diff -e /n/bootesdump/1991/0411/sys/src/9/port/devdup.c /n/bootesdump/1991/0419/sys/src/9/port/devdup.c 48a Chan* dupclwalk(Chan *c, char *name) { return devclwalk(c, name); } . ## diffname port/devdup.c 1991/0425 ## diff -e /n/bootesdump/1991/0419/sys/src/9/port/devdup.c /n/bootesdump/1991/0425/sys/src/9/port/devdup.c 64c int fd; Chan *f; if(c->qid.path == CHDIR){ devstat(c, db, (Dirtab *)0, 0L, dupgen); }else{ fd = c->qid.path; SET(f); if(fd<0 || NFD<=fd || (f=u->fd[fd])==0) error(Ebadfd); (*devtab[f->type].stat)(f, (char*)db); } . ## diffname port/devdup.c 1991/0426 ## diff -e /n/bootesdump/1991/0425/sys/src/9/port/devdup.c /n/bootesdump/1991/0426/sys/src/9/port/devdup.c 64,75c devstat(c, db, (Dirtab *)0, 0L, dupgen); . ## diffname port/devdup.c 1991/0427 ## diff -e /n/bootesdump/1991/0426/sys/src/9/port/devdup.c /n/bootesdump/1991/0427/sys/src/9/port/devdup.c 49,54d ## diffname port/devdup.c 1991/0705 ## diff -e /n/bootesdump/1991/0427/sys/src/9/port/devdup.c /n/bootesdump/1991/0705/sys/src/9/port/devdup.c 75c f = u->p->fgrp->fd[c->qid.path]; . 20c if((f=fgrp->fd[s]) == 0) . 14a Fgrp *fgrp = u->p->fgrp; . ## diffname port/devdup.c 1991/1011 ## diff -e /n/bootesdump/1991/0705/sys/src/9/port/devdup.c /n/bootesdump/1991/1011/sys/src/9/port/devdup.c 75c fdtochan(c->qid.path, openmode(omode), 0); /* error check only */ . ## diffname port/devdup.c 1991/1109 ## diff -e /n/bootesdump/1991/1011/sys/src/9/port/devdup.c /n/bootesdump/1991/1109/sys/src/9/port/devdup.c 24c devdir(c, (Qid){s, 0}, buf, 0, eve, perm[f->mode&3], dp); . ## diffname port/devdup.c 1991/1115 ## diff -e /n/bootesdump/1991/1109/sys/src/9/port/devdup.c /n/bootesdump/1991/1115/sys/src/9/port/devdup.c 119a USED(c, va, n, offset); . 104a USED(c); . 98a USED(c); . 92a USED(c); . 86a USED(c, name, omode, perm); . ## diffname port/devdup.c 1992/0111 ## diff -e /n/bootesdump/1991/1115/sys/src/9/port/devdup.c /n/bootesdump/1992/0111/sys/src/9/port/devdup.c 6c #include "../port/error.h" . ## diffname port/devdup.c 1992/0321 ## diff -e /n/bootesdump/1992/0111/sys/src/9/port/devdup.c /n/bootesdump/1992/0321/sys/src/9/port/devdup.c 2c #include "../port/lib.h" . ## diffname port/devdup.c 1992/0520 ## diff -e /n/bootesdump/1992/0321/sys/src/9/port/devdup.c /n/bootesdump/1992/0520/sys/src/9/port/devdup.c 125a return 0; /* not reached */ . ## diffname port/devdup.c 1992/0711 ## diff -e /n/bootesdump/1992/0520/sys/src/9/port/devdup.c /n/bootesdump/1992/0711/sys/src/9/port/devdup.c 115a USED(offset); . 101a USED(dp); . 18a USED(tab); USED(ntab); . ## diffname port/devdup.c 1992/0825 ## diff -e /n/bootesdump/1992/0711/sys/src/9/port/devdup.c /n/bootesdump/1992/0825/sys/src/9/port/devdup.c 77c fdtochan(c->qid.path, openmode(omode), 0, 0); /* error check only */ . ## diffname port/devdup.c 1993/0501 ## diff -e /n/bootesdump/1992/0825/sys/src/9/port/devdup.c /n/fornaxdump/1993/0501/sys/src/brazil/port/devdup.c 78c f = up->fgrp->fd[c->qid.path]; . 15c Fgrp *fgrp = up->fgrp; . ## diffname port/devdup.c 1995/0108 ## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/devdup.c /n/fornaxdump/1995/0108/sys/src/brazil/port/devdup.c 130a } long dupbwrite(Chan *c, Block *bp, ulong offset) { return devbwrite(c, bp, offset); . 124a Block* dupbread(Chan *c, long n, ulong offset) { return devbread(c, n, offset); } . ## diffname port/devdup.c 1995/0804 ## diff -e /n/fornaxdump/1995/0108/sys/src/brazil/port/devdup.c /n/fornaxdump/1995/0804/sys/src/brazil/port/devdup.c 134d 132c dupwrite(Chan*, void*, long, ulong) . 119d 115c dupread(Chan *c, void *va, long n, ulong) . 111d 109c dupclose(Chan*) . 103,104d 101c dupwstat(Chan*, char*) . 96d 94c dupremove(Chan*) . 89d 87c dupcreate(Chan*, char*, int, ulong) . 19,20d 12c dupgen(Chan *c, Dirtab*, int, int s, Dir *dp) . ## diffname port/devdup.c 1996/0223 ## diff -e /n/fornaxdump/1995/0804/sys/src/brazil/port/devdup.c /n/fornaxdump/1996/0223/sys/src/brazil/port/devdup.c 8d ## diffname port/devdup.c 1997/0327 ## diff -e /n/fornaxdump/1996/0223/sys/src/brazil/port/devdup.c /n/emeliedump/1997/0327/sys/src/brazil/port/devdup.c 129,133c Dev dupdevtab = { devreset, devinit, dupattach, devclone, dupwalk, dupstat, dupopen, devcreate, dupclose, dupread, devbread, dupwrite, devbwrite, devremove, devwstat, }; . 116,122c static long . 106c static long . 83,101c static void . 76c cclose(c); . 61c static Chan* . 55c static void . 43,49c static int . 27,37c static Chan* . 8,10c static int . ## diffname port/devdup.c 1997/0408 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/port/devdup.c /n/emeliedump/1997/0408/sys/src/brazil/port/devdup.c 87a 'd', "dup", . ## diffname port/devdup.c 1997/0603 ## diff -e /n/emeliedump/1997/0408/sys/src/brazil/port/devdup.c /n/emeliedump/1997/0603/sys/src/brazil/port/devdup.c 16c if(s >= fgrp->maxfd) . ## diffname port/devdup.c 1997/0606 ## diff -e /n/emeliedump/1997/0603/sys/src/brazil/port/devdup.c /n/emeliedump/1997/0606/sys/src/brazil/port/devdup.c 16c if(s > fgrp->maxfd) . ## diffname port/devdup.c 1998/0319 ## diff -e /n/emeliedump/1997/0606/sys/src/brazil/port/devdup.c /n/emeliedump/1998/0319/sys/src/brazil/port/devdup.c 81c dupwrite(Chan*, void*, long, vlong) . 71c dupread(Chan *c, void *va, long n, vlong) . ## diffname port/devdup.c 1998/0825 ## diff -e /n/emeliedump/1998/0319/sys/src/brazil/port/devdup.c /n/emeliedump/1998/0825/sys/src/brazil/port/devdup.c 20c sprint(buf, "%d", s); . ## diffname port/devdup.c 1999/1230 ## diff -e /n/emeliedump/1998/0825/sys/src/brazil/port/devdup.c /n/emeliedump/1999/1230/sys/src/9/port/devdup.c 15a if(s == DEVDOTDOT){ devdir(c, c->qid, "#d", 0, eve, 0555, dp); return 1; } . ## diffname port/devdup.c 2001/0527 ## diff -e /n/emeliedump/1999/1230/sys/src/9/port/devdup.c /n/emeliedump/2001/0527/sys/src/9/port/devdup.c 98d 86a if(c->qid.path & 1){ print("do ctl write\n"); return -1; } . 85c dupwrite(Chan *c, void *va, long n, vlong) . 79,81c if(c->qid.type == QTDIR) return devdirread(c, a, n, (Dirtab *)0, 0L, dupgen); twicefd = c->qid.path - 1; fd = twicefd/2; f = up->fgrp; if(twicefd & 1){ if(fd<0 || f->nfd<=fd) error(Ebadfd); c = fdtochan(fd, -1, 0, 0); snprint(buf, sizeof buf, "%d %ld", fd, c->iounit); return readstr((ulong)offset, va, n, buf); } panic("dupread"); return 0; . 77a char buf[256]; int fd, twicefd; Fgrp *f; . 75c dupread(Chan *c, void *va, long n, vlong offset) . 60,63c twicefd = c->qid.path - 1; fd = twicefd/2; if((twicefd & 1)){ /* ctl file */ f = c; }else{ /* fd file */ fdtochan(fd, openmode(omode), 0, 0); /* error check only */ f = up->fgrp->fd[fd]; cclose(c); incref(f); } . 52c if(c->qid.type == QTDIR){ . 50a int fd, twicefd; . 44c return devstat(c, db, n, (Dirtab *)0, 0L, dupgen); . 41,42c static int dupstat(Chan *c, uchar *db, int n) . 38c return devwalk(c, nc, name, nname, (Dirtab *)0, 0, dupgen); . 35,36c static Walkqid* dupwalk(Chan *c, Chan *nc, char **name, int nname) . 24,25c if(s & 1){ p = 0600; sprint(up->genbuf, "%dctl", s/2); }else{ p = perm[f->mode&3]; sprint(up->genbuf, "%d", s/2); } mkqid(&q, s+1, 0, QTFILE); devdir(c, q, up->genbuf, 0, eve, p, dp); . 22c if((f=fgrp->fd[s/2]) == nil) . 20c if(s == 0) return 0; s--; if(s > 2*fgrp->maxfd) . 17c devdir(c, c->qid, ".", 0, eve, DMDIR|0555, dp); . 14a int p; Qid q; . 11d 9c dupgen(Chan *c, char *, Dirtab*, int, int s, Dir *dp) . 7a /* Qid is (2*fd + (file is ctl))+1 */ . ## diffname port/devdup.c 2001/0712 ## diff -e /n/emeliedump/2001/0527/sys/src/9/port/devdup.c /n/emeliedump/2001/0712/sys/src/9/port/devdup.c 121c dupwrite(Chan *c, void*, long, vlong) . ## diffname port/devdup.c 2001/0802 ## diff -e /n/emeliedump/2001/0712/sys/src/9/port/devdup.c /n/emeliedump/2001/0802/sys/src/9/port/devdup.c 123c int fd, twicefd; twicefd = c->qid.path - 1; fd = twicefd/2; if(twicefd & 1){ print("writing ctl file\n"); . 78a f->mode = openmode(omode); f->flag |= COPEN; f->offset = 0; . ## diffname port/devdup.c 2001/0803 ## diff -e /n/emeliedump/2001/0802/sys/src/9/port/devdup.c /n/emeliedump/2001/0803/sys/src/9/port/devdup.c 126,134d 124c dupwrite(Chan*, void*, long, vlong) . 116c procfdprint(c, fd, 0, buf, sizeof buf); . 104c int fd, twicefd, m; . 31c p = 0400; . ## diffname port/devdup.c 2001/0819 ## diff -e /n/emeliedump/2001/0803/sys/src/9/port/devdup.c /n/emeliedump/2001/0819/sys/src/9/port/devdup.c 73a if(c->qid.type & QTAUTH) error(Eperm); . 66c if(c->qid.type & QTDIR){ . ## diffname port/devdup.c 2001/0820 ## diff -e /n/emeliedump/2001/0819/sys/src/9/port/devdup.c /n/emeliedump/2001/0820/sys/src/9/port/devdup.c 26c if(s/2 > fgrp->maxfd) . ## diffname port/devdup.c 2001/0822 ## diff -e /n/emeliedump/2001/0820/sys/src/9/port/devdup.c /n/emeliedump/2001/0822/sys/src/9/port/devdup.c 106c int fd, twicefd; . ## diffname port/devdup.c 2001/1005 ## diff -e /n/emeliedump/2001/0822/sys/src/9/port/devdup.c /n/emeliedump/2001/1005/sys/src/9/port/devdup.c 118a cclose(c); . 115,117c c = fdtochan(fd, -1, 0, 1); . 113d 107d 89d 86,87c f = fdtochan(fd, openmode(omode), 0, 1); . ## diffname port/devdup.c 2002/0109 ## diff -e /n/emeliedump/2001/1005/sys/src/9/port/devdup.c /n/emeliedump/2002/0109/sys/src/9/port/devdup.c 132a devshutdown, .