## diffname port/sysfile.c 1990/0227
## diff -e /dev/null /n/bootesdump/1990/0227/sys/src/9/mips/sysfile.c
0a
#include "u.h"
#include "lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "errno.h"
#include "fcall.h"
/*
* The sys*() routines needn't poperror() as they return directly to syscall().
*/
int
newfd(void)
{
int i;
for(i=0; i<NFD; i++)
if(u->fd[i] == 0){
if(i > u->maxfd)
u->maxfd = i;
return i;
}
error(0, Enofd);
}
Chan*
fdtochan(int fd, int mode)
{
Chan *c;
if(fd<0 || NFD<=fd || (c=u->fd[fd])==0)
error(0, Ebadfd);
if(mode<0 || c->mode == 2)
return c;
if((mode&16) && c->mode==0)
err:
error(0, Ebadusefd);
if((mode&~16) != c->mode)
goto err;
return c;
}
int
openmode(ulong o)
{
if(o >= (OTRUNC|OEXEC))
Err:
error(0, Ebadarg);
o &= ~OTRUNC;
if(o > OEXEC)
goto Err;
if(o == OEXEC)
return OREAD;
return o;
}
long
sysdup(ulong *arg)
{
int fd;
Chan *c, *oc;
/*
* Close after dup'ing, so date > #d/1 works
*/
c = fdtochan(arg[0], -1);
fd = arg[1];
if(fd != -1)
oc = u->fd[fd];
else{
oc = 0;
fd = newfd();
}
u->fd[fd] = c;
incref(c);
if(oc)
close(oc);
return fd;
}
long
sysopen(ulong *arg)
{
int fd;
Chan *c;
openmode(arg[1]); /* error check only */
fd = newfd();
validaddr(arg[0], 1, 0);
c = namec((char*)arg[0], Aopen, arg[1], 0);
u->fd[fd] = c;
return fd;
}
void
fdclose(int fd)
{
int i;
u->fd[fd] = 0;
if(fd == u->maxfd)
for(i=fd; --i>=0 && u->fd[i]==0; )
u->maxfd = i;
}
long
sysclose(ulong *arg)
{
Chan *c;
c = fdtochan(arg[0], -1);
close(c);
fdclose(arg[0]);
return 0;
}
long
unionread(Chan *c, void *va, long n)
{
Mount *mnt;
Chan *mc, *nc;
Pgrp *pg = u->p->pgrp;
long nr;
mnt = c->mnt;
lock(pg);
if(c->mountid != mnt->mountid){
print("unionread: changed underfoot?\n");
unlock(pg);
return 0;
}
Again:
mc = mnt->c;
incref(mc);
unlock(pg);
if(waserror()){
close(mc);
nexterror();
}
nc = clone(mc, 0);
close(mc);
poperror();
if(waserror()){
close(nc);
nexterror();
}
nc = (*devtab[nc->type].open)(nc, OREAD);
nc->offset = c->offset;
nr = (*devtab[nc->type].read)(nc, va, n);
close(nc);
poperror();
if(nr > 0)
return nr;
/*
* Advance to next element
*/
lock(pg);
mnt = c->mnt;
if(c->mountid != mnt->mountid){
print("unionread: changed underfoot?\n");
unlock(pg);
return 0;
}
if(mnt->term){
unlock(pg);
return 0;
}
mnt = mnt->next;
c->mnt = mnt;
c->mountid = mnt->mountid;
c->offset = 0;
goto Again;
}
long
sysread(ulong *arg)
{
Chan *c;
long n;
c = fdtochan(arg[0], 0);
validaddr(arg[1], arg[2], 0);
qlock(c);
if(waserror()){
qunlock(c);
nexterror();
}
n = arg[2];
if(c->qid&CHDIR){
n -= n%DIRLEN;
if(c->offset%DIRLEN || n==0)
error(0, Ebaddirread);
}
if((c->qid&CHDIR) && c->flag&CMOUNT)
n = unionread(c, (void*)arg[1], n);
else
n = (*devtab[c->type].read)(c, (void*)arg[1], n);
c->offset += n;
qunlock(c);
return n;
}
long
syswrite(ulong *arg)
{
Chan *c;
long n;
c = fdtochan(arg[0], 1);
validaddr(arg[1], arg[2], 0);
qlock(c);
if(waserror()){
qunlock(c);
nexterror();
}
if(c->qid & CHDIR)
error(0, Eisdir);
n = (*devtab[c->type].write)(c, (void*)arg[1], arg[2]);
c->offset += n;
qunlock(c);
return n;
}
long
sysseek(ulong *arg)
{
Chan *c;
char buf[DIRLEN];
Dir dir;
long off;
c = fdtochan(arg[0], -1);
if(c->qid & CHDIR)
error(0, Eisdir);
qlock(c);
if(waserror()){
qunlock(c);
nexterror();
}
switch(arg[2]){
case 0:
c->offset = arg[1];
break;
case 1:
c->offset += (long)arg[1];
break;
case 2:
(*devtab[c->type].stat)(c, buf);
convM2D(buf, &dir);
c->offset = dir.length + (long)arg[1];
break;
}
off = c->offset;
qunlock(c);
poperror();
return off;
}
long
sysfstat(ulong *arg)
{
Chan *c;
long n;
validaddr(arg[1], DIRLEN, 1);
evenaddr(arg[1]);
c = fdtochan(arg[0], -1);
(*devtab[c->type].stat)(c, (char*)arg[1]);
return 0;
}
long
sysstat(ulong *arg)
{
Chan *c;
long n;
validaddr(arg[1], DIRLEN, 1);
evenaddr(arg[1]);
validaddr(arg[0], 1, 0);
c = namec((char*)arg[0], Aaccess, 0, 0);
if(waserror()){
close(c);
nexterror();
}
(*devtab[c->type].stat)(c, (char*)arg[1]);
poperror();
close(c);
return 0;
}
long
sysaccess(ulong *arg)
{
Chan *c;
long mode;
validaddr(arg[0], 1, 0);
c = namec((char*)arg[0], Aaccess, 0, 0);
mode = c->mode;
close(c);
/* BUG: check modes */
return 0;
}
long
syschdir(ulong *arg)
{
Chan *c;
validaddr(arg[0], 1, 0);
c = namec((char*)arg[0], Atodir, 0, 0);
close(u->dot);
u->dot = c;
return 0;
}
long
bindmount(ulong *arg, int ismount)
{
Chan *c0, *c1;
ulong flag;
long ret;
struct{
Chan *chan;
char *spec;
}bogus;
flag = arg[2];
if(flag>MMASK || (flag&MORDER)==(MBEFORE|MAFTER))
error(0, Ebadarg);
if(ismount){
bogus.chan = fdtochan(arg[0], 2);
/*BUG: check validaddr for ALL of arg[3]!! */
validaddr(arg[3], 1, 0);
bogus.spec = (char*)arg[3];
ret = devno('M', 0);
c0 = (*devtab[ret].attach)((char*)&bogus);
}else{
validaddr(arg[0], 1, 0);
c0 = namec((char*)arg[0], Aaccess, 0, 0);
}
if(waserror()){
close(c0);
nexterror();
}
validaddr(arg[1], 1, 0);
c1 = namec((char*)arg[1], Amount, 0, 0);
if(waserror()){
close(c1);
nexterror();
}
if((c0->qid^c1->qid) & CHDIR)
error(0, Ebadmount);
if(flag && !(c0->qid&CHDIR))
error(0, Ebadmount);
ret = mount(c0, c1, flag);
close(c0);
close(c1);
if(ismount){
close(bogus.chan);
fdclose(arg[0]);
}
return ret;
}
long
sysbind(ulong *arg)
{
return bindmount(arg, 0);
}
long
sysmount(ulong *arg)
{
return bindmount(arg, 1);
}
long
syspipe(ulong *arg)
{
int fd[2];
Chan *c[2];
Dev *d;
validaddr(arg[0], 2*BY2WD, 1);
evenaddr(arg[0]);
d = &devtab[devno('|', 0)];
c[0] = (*d->attach)(0);
c[1] = 0;
fd[0] = -1;
fd[1] = -1;
if(waserror()){
close(c[0]);
if(c[1])
close(c[1]);
if(fd[0] >= 0)
u->fd[fd[0]]=0;
if(fd[1] >= 0)
u->fd[fd[1]]=0;
nexterror();
}
c[1] = (*d->clone)(c[0], 0);
c[0] = (*d->open)(c[0], ORDWR);
c[1] = (*d->open)(c[1], ORDWR);
c[0]->mode = 2;
c[1]->mode = 2;
c[0]->flag |= COPEN;
c[1]->flag |= COPEN;
fd[0] = newfd();
u->fd[fd[0]] = c[0];
fd[1] = newfd();
u->fd[fd[1]] = c[1];
((long*)arg[0])[0] = fd[0];
((long*)arg[0])[1] = fd[1];
poperror();
return 0;
}
long
syscreate(ulong *arg)
{
int fd;
Chan *c;
openmode(arg[1]); /* error check only */
fd = newfd();
validaddr(arg[0], 1, 0);
c = namec((char*)arg[0], Acreate, arg[1], arg[2]);
u->fd[fd] = c;
return fd;
}
long
sysuserstr(ulong *arg)
{
Error err;
char buf[NAMELEN];
validaddr(arg[0], sizeof(Error), 0);
validaddr(arg[1], NAMELEN, 1);
err = *(Error*)arg[0];
err.type = devno(err.type, 1);
if(err.type == -1)
strcpy((char*)arg[1], "*gok*");
else{
(*devtab[err.type].userstr)(&err, buf);
memcpy((char*)arg[1], buf, sizeof buf);
}
return 0;
}
long
sysremove(ulong *arg)
{
Chan *c;
validaddr(arg[0], 1, 0);
c = namec((char*)arg[0], Aaccess, 0, 0);
if(waserror()){
close(c);
nexterror();
}
(*devtab[c->type].remove)(c);
/*
* Remove clunks the fid, but we need to recover the Chan
* so fake it up. rootclose() is known to be a nop.
*/
c->type = 0;
close(c);
return 0;
}
long
syswstat(ulong *arg)
{
Chan *c;
long n;
validaddr(arg[1], DIRLEN, 0);
evenaddr(arg[1]);
validaddr(arg[0], 1, 0);
c = namec((char*)arg[0], Aaccess, 0, 0);
if(waserror()){
close(c);
nexterror();
}
(*devtab[c->type].wstat)(c, (char*)arg[1]);
poperror();
close(c);
return 0;
}
long
sysfwstat(ulong *arg)
{
Chan *c;
long n;
validaddr(arg[1], DIRLEN, 0);
evenaddr(arg[1]);
c = fdtochan(arg[0], -1);
(*devtab[c->type].wstat)(c, (char*)arg[1]);
return 0;
}
.
## diffname port/sysfile.c 1990/0321
## diff -e /n/bootesdump/1990/0227/sys/src/9/mips/sysfile.c /n/bootesdump/1990/0321/sys/src/9/mips/sysfile.c
129c
pprint("unionread: changed underfoot?\n");
.
## diffname port/sysfile.c 1990/03292
## diff -e /n/bootesdump/1990/0321/sys/src/9/mips/sysfile.c /n/bootesdump/1990/03292/sys/src/9/mips/sysfile.c
409,412d
## diffname port/sysfile.c 1990/0513
## diff -e /n/bootesdump/1990/03292/sys/src/9/mips/sysfile.c /n/bootesdump/1990/0513/sys/src/9/mips/sysfile.c
285a
print("stat error\n");
.
## diffname port/sysfile.c 1990/0617
## diff -e /n/bootesdump/1990/0513/sys/src/9/mips/sysfile.c /n/bootesdump/1990/0617/sys/src/9/mips/sysfile.c
286d
## diffname port/sysfile.c 1990/0703
## diff -e /n/bootesdump/1990/0617/sys/src/9/mips/sysfile.c /n/bootesdump/1990/0703/sys/src/9/mips/sysfile.c
459a
c->type = 0; /* see below */
.
## diffname port/sysfile.c 1990/08141
## diff -e /n/bootesdump/1990/0703/sys/src/9/mips/sysfile.c /n/bootesdump/1990/08141/sys/src/9/mips/sysfile.c
50c
o &= ~(OTRUNC|OCEXEC|ORCLOSE);
.
47c
if(o >= (OTRUNC|OCEXEC|ORCLOSE|OEXEC))
.
## diffname port/sysfile.c 1990/0821
## diff -e /n/bootesdump/1990/08141/sys/src/9/mips/sysfile.c /n/bootesdump/1990/0821/sys/src/9/mips/sysfile.c
195c
if((c->qid&CHDIR) && (c->flag&CMOUNT))
.
150a
c->offset = nc->offset; /* devdirread e.g. changes it */
.
## diffname port/sysfile.c 1990/0822
## diff -e /n/bootesdump/1990/0821/sys/src/9/mips/sysfile.c /n/bootesdump/1990/0822/sys/src/9/mips/sysfile.c
302,306c
postnote(u->p, 1, "access is deprecated", NDebug);
.
## diffname port/sysfile.c 1990/0918
## diff -e /n/bootesdump/1990/0822/sys/src/9/mips/sysfile.c /n/bootesdump/1990/0918/sys/src/9/mips/sysfile.c
334,335c
p = (char*)arg[3];
t = BY2PG-((ulong)p&(BY2PG-1));
while(vmemchr(p, 0, t) == 0){
p += t;
t = BY2PG;
}
.
323a
char *p;
int t;
.
## diffname port/sysfile.c 1990/1004
## diff -e /n/bootesdump/1990/0918/sys/src/9/mips/sysfile.c /n/bootesdump/1990/1004/sys/src/9/mips/sysfile.c
184c
validaddr(arg[1], arg[2], 1);
.
## diffname port/sysfile.c 1990/1009
## diff -e /n/bootesdump/1990/1004/sys/src/9/mips/sysfile.c /n/bootesdump/1990/1009/sys/src/9/mips/sysfile.c
383,419d
211c
c = fdtochan(arg[0], OWRITE);
.
183c
c = fdtochan(arg[0], OREAD);
.
58a
syspipe(ulong *arg)
{
int fd[2];
Chan *c[2];
Dev *d;
validaddr(arg[0], 2*BY2WD, 1);
evenaddr(arg[0]);
d = &devtab[devno('|', 0)];
c[0] = (*d->attach)(0);
c[1] = 0;
fd[0] = -1;
fd[1] = -1;
if(waserror()){
close(c[0]);
if(c[1])
close(c[1]);
if(fd[0] >= 0)
u->fd[fd[0]]=0;
if(fd[1] >= 0)
u->fd[fd[1]]=0;
nexterror();
}
c[1] = (*d->clone)(c[0], 0);
(*d->walk)(c[0], "data");
(*d->walk)(c[1], "data1");
c[0] = (*d->open)(c[0], ORDWR);
c[1] = (*d->open)(c[1], ORDWR);
fd[0] = newfd();
u->fd[fd[0]] = c[0];
fd[1] = newfd();
u->fd[fd[1]] = c[1];
((long*)arg[0])[0] = fd[0];
((long*)arg[0])[1] = fd[1];
poperror();
return 0;
}
long
.
39c
if((mode&~OTRUNC) != c->mode)
.
36c
if((mode&OTRUNC) && c->mode==OREAD)
.
34c
if(mode<0 || c->mode==ORDWR)
.
## diffname port/sysfile.c 1990/11211
## diff -e /n/bootesdump/1990/1009/sys/src/9/mips/sysfile.c /n/bootesdump/1990/11211/sys/src/9/mips/sysfile.c
436,454d
398,401c
if((c0->qid.path^c1->qid.path) & CHDIR)
error(Ebadmount);
if(flag && !(c0->qid.path&CHDIR))
error(Ebadmount);
.
381a
validaddr(arg[4], 1, 0);
p = (char*)arg[4];
t = BY2PG-((ulong)p&(BY2PG-1));
while(vmemchr(p, 0, t) == 0){
p += t;
t = BY2PG;
}
bogus.auth = (char*)arg[4];
.
374a
validaddr(arg[3], 1, 0);
.
372c
error(Ebadarg);
.
367a
char *auth;
.
274,275c
if(c->qid.path & CHDIR)
error(Eisdir);
.
257,258c
if(c->qid.path & CHDIR)
error(Eisdir);
.
235c
if((c->qid.path&CHDIR) && (c->flag&CMOUNT))
.
233c
error(Ebaddirread);
.
230c
if(c->qid.path & CHDIR){
.
49c
error(Ebadarg);
.
38c
error(Ebadusefd);
.
33c
error(Ebadfd);
.
24c
error(Enofd);
.
## diffname port/sysfile.c 1990/1126
## diff -e /n/bootesdump/1990/11211/sys/src/9/mips/sysfile.c /n/bootesdump/1990/1126/sys/src/9/mips/sysfile.c
332,341d
31a
c = 0; /* set */
.
## diffname port/sysfile.c 1990/1210
## diff -e /n/bootesdump/1990/1210/sys/src/9/mips/sysfile.c /n/bootesdump/1990/1210/sys/src/9/port/sysfile.c
492a
#ifdef asdf
long
sysfilsys(ulong *arg)
{
Chan *cin, *cout;
cin = fdtochan(arg[0], OREAD);
cout = fdtochan(arg[1], OWRITE);
validaddr(arg[2], 1, 0);
if((cin->qid.path&CHDIR) || (cout->qid.path&CHDIR))
error(Ebadarg);
service((char *)arg[2], cin, cout, filsys);
return 0;
}
#endif
.
32c
c = 0; /* set */
.
## diffname port/sysfile.c 1991/0221
## diff -e /n/bootesdump/1990/1210/sys/src/9/port/sysfile.c /n/bootesdump/1991/0221/sys/src/9/port/sysfile.c
111c
}else{
.
109c
if(fd != -1){
if(fd<0 || NFD<=fd)
error(Ebadfd);
if(fd > u->maxfd)
u->maxfd = fd;
.
## diffname port/sysfile.c 1991/0319
## diff -e /n/bootesdump/1991/0221/sys/src/9/port/sysfile.c /n/bootesdump/1991/0319/sys/src/9/port/sysfile.c
280a
if(devchar[c->type] == '|')
error(Eisstream);
.
## diffname port/sysfile.c 1991/0411
## diff -e /n/bootesdump/1991/0319/sys/src/9/port/sysfile.c /n/bootesdump/1991/0411/sys/src/9/port/sysfile.c
304c
qunlock(&c->rdl);
qunlock(&c->wrl);
.
285c
qunlock(&c->rdl);
qunlock(&c->wrl);
.
283c
qlock(&c->rdl);
qlock(&c->wrl);
.
266c
qunlock(&c->wrl);
.
264c
n = (*devtab[c->type].write)(c, (void*)arg[1], arg[2], c->offset);
.
259c
qunlock(&c->wrl);
.
257c
qlock(&c->wrl);
.
245c
qunlock(&c->rdl);
.
243c
n = (*devtab[c->type].read)(c, (void*)arg[1], n, c->offset);
.
231c
qunlock(&c->rdl);
.
229c
qlock(&c->rdl);
.
194c
nr = (*devtab[nc->type].read)(nc, va, n, nc->offset);
.
## diffname port/sysfile.c 1991/0417
## diff -e /n/bootesdump/1991/0411/sys/src/9/port/sysfile.c /n/bootesdump/1991/0417/sys/src/9/port/sysfile.c
265a
qunlock(&c->rdl); /* BUG BUG BUG */
.
258a
qunlock(&c->rdl); /* BUG BUG BUG */
.
256a
qlock(&c->rdl); /* BUG BUG BUG */
.
245a
qunlock(&c->wrl); /* BUG BUG BUG */
.
231a
qunlock(&c->wrl); /* BUG BUG BUG */
.
229a
qlock(&c->wrl); /* BUG BUG BUG */
.
## diffname port/sysfile.c 1991/0419
## diff -e /n/bootesdump/1991/0417/sys/src/9/port/sysfile.c /n/bootesdump/1991/0419/sys/src/9/port/sysfile.c
271d
263d
260d
248d
233d
230d
## diffname port/sysfile.c 1991/0501
## diff -e /n/bootesdump/1991/0419/sys/src/9/port/sysfile.c /n/bootesdump/1991/0501/sys/src/9/port/sysfile.c
257a
.
229a
.
## diffname port/sysfile.c 1991/0614
## diff -e /n/bootesdump/1991/0501/sys/src/9/port/sysfile.c /n/bootesdump/1991/0614/sys/src/9/port/sysfile.c
467a
poperror();
.
416a
poperror();
close(c0);
.
415c
poperror();
.
310d
307a
poperror();
.
267a
poperror();
.
245a
poperror();
.
## diffname port/sysfile.c 1991/0615
## diff -e /n/bootesdump/1991/0614/sys/src/9/port/sysfile.c /n/bootesdump/1991/0615/sys/src/9/port/sysfile.c
389,394c
if(vmemchr((char*)arg[4], '\0', NAMELEN) == 0)
error(Ebadarg);
.
381,386c
if(vmemchr((char*)arg[3], '\0', NAMELEN) == 0)
error(Ebadarg);
.
367,368d
## diffname port/sysfile.c 1991/0705
## diff -e /n/bootesdump/1991/0615/sys/src/9/port/sysfile.c /n/bootesdump/1991/0705/sys/src/9/port/sysfile.c
440c
fd = newfd(c);
poperror();
.
437c
if(waserror()) {
if(c)
close(c);
nexterror();
}
.
434c
Chan *c = 0;
.
411,414c
if(ismount)
fdclose(arg[0], 0);
.
366a
char *p;
int t;
.
197a
close(nc);
.
196d
187a
close(mc);
.
186d
157,158c
fdclose(arg[0], 0);
.
145,148c
lock(f);
c = f->fd[fd];
if(flag){
if(c==0 || !(c->flag&flag)){
unlock(f);
return;
}
}
f->fd[fd] = 0;
if(fd == f->maxfd)
for(i=fd; --i>=0 && f->fd[i]==0; )
f->maxfd = i;
unlock(f);
close(c);
.
143a
Chan *c;
Fgrp *f = u->p->fgrp;
.
141c
fdclose(int fd, int flag)
.
136c
fd = newfd(c);
poperror();
.
133c
if(waserror()) {
if(c)
close(c);
nexterror();
}
.
130c
Chan *c = 0;
.
119,122c
.
112,117c
lock(f);
if(fd > f->maxfd)
f->maxfd = fd;
incref(c);
oc = f->fd[fd];
f->fd[fd] = c;
unlock(f);
if(oc)
close(oc);
}else {
if(waserror()) {
close(c);
nexterror();
}
incref(c);
fd = newfd(c);
poperror();
.
102a
Fgrp *f = u->p->fgrp;
.
88,91c
fd[0] = newfd(c[0]);
fd[1] = newfd(c[1]);
.
80c
f->fd[fd[1]]=0;
.
78c
f->fd[fd[0]]=0;
.
64a
Fgrp *f = u->p->fgrp;
.
32,33c
USED(c);
if(fd<0 || NFD<=fd || (c = u->p->fgrp->fd[fd])==0)
.
23a
unlock(f);
.
19,21c
if(f->fd[i] == 0){
if(i > f->maxfd)
f->maxfd = i;
f->fd[i] = c;
unlock(f);
.
17a
lock(f);
.
15a
Fgrp *f = u->p->fgrp;
.
14c
newfd(Chan *c)
.
## diffname port/sysfile.c 1991/0706
## diff -e /n/bootesdump/1991/0705/sys/src/9/port/sysfile.c /n/bootesdump/1991/0706/sys/src/9/port/sysfile.c
147c
if(waserror()){
.
127c
}else{
.
## diffname port/sysfile.c 1991/0904
## diff -e /n/bootesdump/1991/0706/sys/src/9/port/sysfile.c /n/bootesdump/1991/0904/sys/src/9/port/sysfile.c
186,188c
fdtochan(arg[0], -1);
.
37c
c = 0;
.
## diffname port/sysfile.c 1991/1011
## diff -e /n/bootesdump/1991/0904/sys/src/9/port/sysfile.c /n/bootesdump/1991/1011/sys/src/9/port/sysfile.c
535,550d
531c
c = fdtochan(arg[0], -1, 1);
.
461a
sysunmount(ulong *arg)
{
Chan *cmount, *cmounted;
cmounted = 0;
validaddr(arg[1], 1, 0);
cmount = namec((char *)arg[1], Amount, 0, 0);
if(arg[0]) {
if(waserror()) {
close(cmount);
nexterror();
}
validaddr(arg[0], 1, 0);
cmounted = namec((char*)arg[0], Aaccess, 0, 0);
poperror();
}
if(waserror()) {
close(cmount);
if(cmounted)
close(cmounted);
nexterror();
}
unmount(cmount, cmounted);
close(cmount);
if(cmounted)
close(cmounted);
poperror();
return 0;
}
long
.
409c
bogus.chan = fdtochan(arg[0], 2, 0);
.
354c
c = fdtochan(arg[0], -1, 0);
.
312c
c = fdtochan(arg[0], -1, 1);
.
287c
c = fdtochan(arg[0], OWRITE, 1);
.
271c
if((c->qid.path&CHDIR) && c->mnt)
.
257c
c = fdtochan(arg[0], OREAD, 1);
.
222,248c
runlock(&pg->ns);
return 0;
.
220c
if(nr > 0) {
runlock(&pg->ns);
return nr;
}
/*
* Advance to next element
*/
c->mnt = c->mnt->next;
if(c->mnt == 0)
break;
c->mountid = c->mnt->mountid;
c->offset = 0;
.
200,218c
rlock(&pg->ns);
for(;;) {
if(waserror()) {
runlock(&pg->ns);
nexterror();
}
nc = clone(c->mnt->to, 0);
poperror();
if(c->mountid != c->mnt->mountid){
pprint("unionread: changed underfoot?\n");
runlock(&pg->ns);
close(nc);
return 0;
}
if(waserror()){
runlock(&pg->ns);
close(nc);
nexterror();
}
nc = (*devtab[nc->type].open)(nc, OREAD);
nc->offset = c->offset;
nr = (*devtab[nc->type].read)(nc, va, n, nc->offset);
/* devdirread e.g. changes it */
c->offset = nc->offset;
poperror();
.
195d
186c
fdtochan(arg[0], -1, 0);
.
112c
c = fdtochan(arg[0], -1, 0);
.
46c
error(Ebadusefd);
.
43d
39a
if(chkmnt && (c->flag&CMSG))
errors("channel is mounted");
.
33c
fdtochan(int fd, int mode, int chkmnt)
.
## diffname port/sysfile.c 1991/1018
## diff -e /n/bootesdump/1991/1011/sys/src/9/port/sysfile.c /n/bootesdump/1991/1018/sys/src/9/port/sysfile.c
59c
error(Ebadarg);
.
55d
## diffname port/sysfile.c 1991/1101
## diff -e /n/bootesdump/1991/1018/sys/src/9/port/sysfile.c /n/bootesdump/1991/1101/sys/src/9/port/sysfile.c
335,338d
332a
off = c->offset;
.
326a
off = c->offset;
unlock(&c->offl);
.
325a
lock(&c->offl); /* lock for read/write update */
.
322c
off = c->offset = arg[1];
.
313,319c
off = 0;
.
296a
poperror();
lock(&c->offl);
c->offset += n;
unlock(&c->offl);
.
294,295d
273a
poperror();
lock(&c->offl);
c->offset += n;
unlock(&c->offl);
.
271,272d
## diffname port/sysfile.c 1991/1107
## diff -e /n/bootesdump/1991/1101/sys/src/9/port/sysfile.c /n/bootesdump/1991/1107/sys/src/9/port/sysfile.c
558c
nameok((char*)arg[1]);
.
538c
nameok((char*)arg[1]);
.
## diffname port/sysfile.c 1992/0111
## diff -e /n/bootesdump/1991/1107/sys/src/9/port/sysfile.c /n/bootesdump/1992/0111/sys/src/9/port/sysfile.c
6c
#include "../port/error.h"
.
## diffname port/sysfile.c 1992/0114
## diff -e /n/bootesdump/1992/0111/sys/src/9/port/sysfile.c /n/bootesdump/1992/0114/sys/src/9/port/sysfile.c
431c
error(Emount);
.
429c
error(Emount);
.
265c
error(Etoosmall);
.
41c
error(Ebadusefd);
.
29c
exhausted("file descriptors");
.
## diffname port/sysfile.c 1992/0312
## diff -e /n/bootesdump/1992/0114/sys/src/9/port/sysfile.c /n/bootesdump/1992/0312/sys/src/9/port/sysfile.c
411c
bogus.serv = (char*)arg[4];
.
396c
char *serv;
.
## diffname port/sysfile.c 1992/0321
## diff -e /n/bootesdump/1992/0312/sys/src/9/port/sysfile.c /n/bootesdump/1992/0321/sys/src/9/port/sysfile.c
2c
#include "../port/lib.h"
.
## diffname port/sysfile.c 1992/0520
## diff -e /n/bootesdump/1992/0321/sys/src/9/port/sysfile.c /n/bootesdump/1992/0520/sys/src/9/port/sysfile.c
29a
return 0; /* not reached */
.
## diffname port/sysfile.c 1992/0607
## diff -e /n/bootesdump/1992/0520/sys/src/9/port/sysfile.c /n/bootesdump/1992/0607/sys/src/9/port/sysfile.c
439,440c
fdclose(fd, 0);
.
404c
bogus.chan = fdtochan(fd, 2, 0);
.
400a
fd = arg[0];
.
393c
int t, fd;
.
180a
if(c == 0)
panic("fdclose");
.
## diffname port/sysfile.c 1992/0619
## diff -e /n/bootesdump/1992/0607/sys/src/9/port/sysfile.c /n/bootesdump/1992/0619/sys/src/9/port/sysfile.c
7d
## diffname port/sysfile.c 1992/0711
## diff -e /n/bootesdump/1992/0619/sys/src/9/port/sysfile.c /n/bootesdump/1992/0711/sys/src/9/port/sysfile.c
557d
537d
393,394c
int fd;
.
359d
346d
197c
Chan *nc;
.
## diffname port/sysfile.c 1992/0720
## diff -e /n/bootesdump/1992/0711/sys/src/9/port/sysfile.c /n/bootesdump/1992/0720/sys/src/9/port/sysfile.c
236,238c
/* Advance to next element */
next:
.
221c
goto next;
.
218,219c
/* Error causes component of union to be skipped */
if(waserror()) {
.
211c
if(c->mountid != c->mnt->mountid) {
.
200a
pg = u->p->pgrp;
.
199a
Chan *nc;
Pgrp *pg;
.
197,198d
29c
return 0;
.
## diffname port/sysfile.c 1992/0817
## diff -e /n/bootesdump/1992/0720/sys/src/9/port/sysfile.c /n/bootesdump/1992/0817/sys/src/9/port/sysfile.c
180,181d
167a
if(c == 0){
/* can happen for users with shared fd tables */
unlock(f);
return;
}
.
## diffname port/sysfile.c 1992/0825
## diff -e /n/bootesdump/1992/0817/sys/src/9/port/sysfile.c /n/bootesdump/1992/0825/sys/src/9/port/sysfile.c
560a
poperror();
close(c);
.
559c
c = fdtochan(arg[0], -1, 1, 1);
if(waserror()) {
close(c);
nexterror();
}
.
417c
poperror();
close(bc);
}
else {
.
413a
.
409a
.
406c
bc = fdtochan(fd, 2, 0, 1);
if(waserror()) {
close(bc);
nexterror();
}
bogus.chan = bc;
.
391c
Chan *c0, *c1, *bc;
.
353a
poperror();
close(c);
.
352c
c = fdtochan(arg[0], -1, 0, 1);
if(waserror()) {
close(c);
nexterror();
}
.
332c
unlock(c);
.
329c
lock(c); /* lock for read/write update */
.
321a
.
319a
.
317c
c = fdtochan(arg[0], -1, 1, 0);
.
305c
unlock(c);
poperror();
close(c);
.
301,303c
lock(c);
.
299a
.
297a
.
292,295c
c = fdtochan(arg[0], OWRITE, 1, 1);
if(waserror()) {
close(c);
.
290d
280c
unlock(c);
poperror();
close(c);
.
276,278c
lock(c);
.
272c
if(dir && c->mnt)
.
267c
dir = c->qid.path&CHDIR;
if(dir) {
.
265a
.
260,263c
c = fdtochan(arg[0], OREAD, 1, 1);
if(waserror()) {
close(c);
.
258d
256a
Chan *c;
.
255c
int dir;
.
191c
fdtochan(arg[0], -1, 0, 0);
.
132d
121c
.
117c
}
.
115c
if(fd<0 || NFD<=fd) {
close(c);
.
112c
c = fdtochan(arg[0], -1, 0, 1);
.
47a
}
.
46c
}
if((mode&~OTRUNC) != c->mode) {
if(iref)
close(c);
.
44c
if((mode&OTRUNC) && c->mode==OREAD) {
if(iref)
close(c);
.
41a
}
.
40c
}
if(iref)
incref(c);
unlock(f);
if(chkmnt && (c->flag&CMSG)) {
if(iref)
close(c);
.
38c
f = u->p->fgrp;
lock(f);
if(fd<0 || NFD<=fd || (c = f->fd[fd])==0) {
unlock(f);
.
35a
Fgrp *f;
.
33c
fdtochan(int fd, int mode, int chkmnt, int iref)
.
## diffname port/sysfile.c 1993/0209
## diff -e /n/bootesdump/1992/0825/sys/src/9/port/sysfile.c /n/bootesdump/1993/0209/sys/src/9/port/sysfile.c
87a
sysfsession(ulong *arg)
{
USED(arg);
return 0;
}
long
.
## diffname port/sysfile.c 1993/0317
## diff -e /n/bootesdump/1993/0209/sys/src/9/port/sysfile.c /n/bootesdump/1993/0317/sys/src/9/port/sysfile.c
278c
qunlock(&pg->nsh);
.
272c
c->mnt = c->mnt->mount;
.
267c
qunlock(&pg->nsh);
.
261c
/*
* devdirread e.g. changes it
*/
.
252c
/*
* Error causes component of union to be skipped
*/
.
246,247c
pprint("unionread: changed underfoot\n");
qunlock(&pg->nsh);
.
242c
nc = clone(c->mnt->cmnt, 0);
.
239c
qunlock(&pg->nsh);
.
235c
qlock(&pg->nsh);
.
## diffname port/sysfile.c 1993/0318
## diff -e /n/bootesdump/1993/0317/sys/src/9/port/sysfile.c /n/bootesdump/1993/0318/sys/src/9/port/sysfile.c
282c
runlock(&pg->ns);
.
276c
c->mnt = c->mnt->next;
.
271c
runlock(&pg->ns);
.
263,265c
/* devdirread e.g. changes it */
.
252,254c
/* Error causes component of union to be skipped */
.
246,247c
pprint("unionread: changed underfoot?\n");
runlock(&pg->ns);
.
242c
nc = clone(c->mnt->to, 0);
.
239c
runlock(&pg->ns);
.
235c
rlock(&pg->ns);
.
## diffname port/sysfile.c 1993/0330
## diff -e /n/bootesdump/1993/0318/sys/src/9/port/sysfile.c /n/bootesdump/1993/0330/sys/src/9/port/sysfile.c
469d
465,467d
445d
88,94d
## diffname port/sysfile.c 1993/0501
## diff -e /n/bootesdump/1993/0330/sys/src/9/port/sysfile.c /n/fornaxdump/1993/0501/sys/src/brazil/port/sysfile.c
478,482c
ret = mount(c0, c1, flag, bogus.spec);
.
471a
.
467a
.
464a
bogus.spec = 0;
.
445c
bc = fdtochan(fd, ORDWR, 0, 1);
.
443a
bogus.recov = flag&MRECOV;
.
437a
char recov;
.
433,434c
int fd, ret;
Chan *c0, *c1, *bc;
.
431d
423,424c
close(up->dot);
up->dot = c;
.
421a
.
227c
pg = up->pgrp;
.
187c
Fgrp *f = up->fgrp;
.
130c
Fgrp *f = up->fgrp;
.
112,114c
c[1] = clone(c[0], 0);
walk(c[0], "data", 1);
walk(c[1], "data1", 1);
.
98c
c[0] = namec("#|", Atodir, 0, 0);
.
93c
Fgrp *f = up->fgrp;
.
39c
f = up->fgrp;
.
15c
Fgrp *f = up->fgrp;
.
## diffname port/sysfile.c 1993/1004
## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/sysfile.c /n/fornaxdump/1993/1004/sys/src/brazil/port/sysfile.c
87a
syspath(ulong *arg)
{
Chan *c;
validaddr(arg[1], 1, 0);
if(vmemchr((char*)arg[1], '\0', arg[2]) == 0)
error(Ebadarg);
c = fdtochan(arg[0], -1, 0, 0);
ptpath(c->path, (char*)arg[1], arg[2]);
return 0;
}
long
.
## diffname port/sysfile.c 1993/1014
## diff -e /n/fornaxdump/1993/1004/sys/src/brazil/port/sysfile.c /n/fornaxdump/1993/1014/sys/src/brazil/port/sysfile.c
461c
bogus.flags = flag & (MRECOV|MCACHE);
.
453c
int flags;
.
## diffname port/sysfile.c 1993/1111
## diff -e /n/fornaxdump/1993/1014/sys/src/brazil/port/sysfile.c /n/fornaxdump/1993/1111/sys/src/brazil/port/sysfile.c
540c
cmounted = namec((char*)arg[0], Aopen, OREAD, 0);
.
## diffname port/sysfile.c 1994/0321
## diff -e /n/fornaxdump/1993/1111/sys/src/brazil/port/sysfile.c /n/fornaxdump/1994/0321/sys/src/brazil/port/sysfile.c
88c
sysfd2path(ulong *arg)
.
## diffname port/sysfile.c 1994/0402
## diff -e /n/fornaxdump/1994/0321/sys/src/brazil/port/sysfile.c /n/fornaxdump/1994/0402/sys/src/brazil/port/sysfile.c
328a
syswrite9p(ulong *arg)
{
Chan *c;
long n;
validaddr(arg[1], arg[2], 0);
c = fdtochan(arg[0], OWRITE, 1, 1);
if(waserror()) {
close(c);
nexterror();
}
if(c->qid.path & CHDIR)
error(Eisdir);
if(devchar[c->type] != L'M')
n = (*devtab[c->type].write)(c, (void*)arg[1], arg[2], c->offset);
else
n = mntwrite9p(c, (void*)arg[1], arg[2], c->offset);
lock(c);
c->offset += n;
unlock(c);
poperror();
close(c);
return n;
}
long
.
## diffname port/sysfile.c 1994/0405
## diff -e /n/fornaxdump/1994/0402/sys/src/brazil/port/sysfile.c /n/fornaxdump/1994/0405/sys/src/brazil/port/sysfile.c
348d
290a
sysread9p(ulong *arg)
{
int dir;
long n;
Chan *c;
validaddr(arg[1], arg[2], 1);
c = fdtochan(arg[0], OREAD, 1, 1);
if(waserror()) {
close(c);
nexterror();
}
n = arg[2];
dir = c->qid.path&CHDIR;
if(dir) {
n -= n%DIRLEN;
if(c->offset%DIRLEN || n==0)
error(Etoosmall);
}
if(dir && c->mnt)
n = unionread(c, (void*)arg[1], n);
else if(devchar[c->type] != L'M')
n = (*devtab[c->type].read)(c, (void*)arg[1], n, c->offset);
else
n = mntread9p(c, (void*)arg[1], n, c->offset);
lock(c);
c->offset += n;
unlock(c);
poperror();
close(c);
return n;
}
long
.
## diffname port/sysfile.c 1994/0406
## diff -e /n/fornaxdump/1994/0405/sys/src/brazil/port/sysfile.c /n/fornaxdump/1994/0406/sys/src/brazil/port/sysfile.c
320d
## diffname port/sysfile.c 1994/0611
## diff -e /n/fornaxdump/1994/0406/sys/src/brazil/port/sysfile.c /n/fornaxdump/1994/0611/sys/src/brazil/port/sysfile.c
97c
/* If we used open the chan will be at the first element
* of a union rather than the mhead of the union. undomount
* will make it look like we used Atodir rather than Aopen.
*/
if(c->qid.path & CHDIR)
c = undomount(c);
.
## diffname port/sysfile.c 1994/0616
## diff -e /n/fornaxdump/1994/0611/sys/src/brazil/port/sysfile.c /n/fornaxdump/1994/0616/sys/src/brazil/port/sysfile.c
550a
nameok(bogus.spec);
.
## diffname port/sysfile.c 1994/0622
## diff -e /n/fornaxdump/1994/0616/sys/src/brazil/port/sysfile.c /n/fornaxdump/1994/0622/sys/src/brazil/port/sysfile.c
551c
if(strchr(bogus.spec, ' '))
error(Ebadspec);
.
## diffname port/sysfile.c 1997/0327
## diff -e /n/fornaxdump/1994/0622/sys/src/brazil/port/sysfile.c /n/emeliedump/1997/0327/sys/src/brazil/port/sysfile.c
710c
cclose(c);
.
708c
devtab[c->type]->wstat(c, (char*)arg[1]);
.
705c
cclose(c);
.
692c
cclose(c);
.
690c
devtab[c->type]->wstat(c, (char*)arg[1]);
.
687c
cclose(c);
.
673c
cclose(c);
.
666c
devtab[c->type]->remove(c);
.
663c
cclose(c);
.
644c
cclose(c);
.
630c
cclose(cmounted);
.
627,628c
cunmount(cmount, cmounted);
cclose(cmount);
.
624c
cclose(cmounted);
.
622c
cclose(cmount);
.
613c
cclose(cmount);
.
583c
cclose(c0);
.
581c
cclose(c1);
.
578c
ret = cmount(c0, c1, flag, bogus.spec);
.
574c
cclose(c1);
.
567c
cclose(c0);
.
558c
cclose(bc);
.
555c
c0 = devtab[ret]->attach((char*)&bogus);
.
541c
cclose(bc);
.
514c
cclose(up->dot);
.
502c
cclose(c);
.
500c
devtab[c->type]->stat(c, (char*)arg[1]);
.
497c
cclose(c);
.
483c
cclose(c);
.
481c
devtab[c->type]->stat(c, (char*)arg[1]);
.
478c
cclose(c);
.
460c
devtab[c->type]->stat(c, buf);
.
426c
cclose(c);
.
419c
n = devtab[c->type]->write(c, (void*)arg[1], arg[2], c->offset);
.
412c
cclose(c);
.
398c
cclose(c);
.
390c
n = devtab[c->type]->write(c, (void*)arg[1], arg[2], c->offset);
.
382c
cclose(c);
.
368c
cclose(c);
.
361c
n = devtab[c->type]->read(c, (void*)arg[1], n, c->offset);
.
345c
cclose(c);
.
330c
cclose(c);
.
321c
n = devtab[c->type]->read(c, (void*)arg[1], n, c->offset);
.
305c
cclose(c);
.
278c
cclose(nc);
.
273c
nr = devtab[nc->type]->read(nc, va, n, nc->offset);
.
271c
nc = devtab[nc->type]->open(nc, OREAD);
.
267c
cclose(nc);
.
261c
cclose(nc);
.
255c
nc = cclone(c->mnt->to, 0);
.
228c
cclose(c);
.
192c
cclose(c);
.
173c
cclose(c);
.
170c
cclose(oc);
.
159c
cclose(c);
.
135,136c
c[0] = d->open(c[0], ORDWR);
c[1] = d->open(c[1], ORDWR);
.
132c
c[1] = cclone(c[0], 0);
.
125c
cclose(c[1]);
.
123c
cclose(c[0]);
.
117c
d = devtab[devno('|', 0)];
.
67c
cclose(c);
.
61c
cclose(c);
.
52c
cclose(c);
.
16a
Fgrp *f = up->fgrp;
.
15d
## diffname port/sysfile.c 1997/0408
## diff -e /n/emeliedump/1997/0327/sys/src/brazil/port/sysfile.c /n/emeliedump/1997/0408/sys/src/brazil/port/sysfile.c
443c
if(devtab[c->type]->dc == '|')
.
389c
if(devtab[c->type]->dc != L'M')
.
320c
else if(devtab[c->type]->dc != L'M')
.
## diffname port/sysfile.c 1997/0529
## diff -e /n/emeliedump/1997/0408/sys/src/brazil/port/sysfile.c /n/emeliedump/1997/0529/sys/src/brazil/port/sysfile.c
27a
print("process %d (%s) out of file descriptors\n", up->pid, up->text);
.
## diffname port/sysfile.c 1997/0603
## diff -e /n/emeliedump/1997/0529/sys/src/brazil/port/sysfile.c /n/emeliedump/1997/0603/sys/src/brazil/port/sysfile.c
159c
if(fd<0 || f->nfd<=fd) {
.
43c
if(fd<0 || f->nfd<=fd || (c = f->fd[fd])==0) {
.
28,30c
free(oldfd);
if(i%100 == 0)
pprint("warning: process exceeds %d file descriptors\n", i);
return i;
.
26a
/*
* Unbounded allocation is unwise; besides, there are only 16 bits
* of fid in 9P
*/
if(f->nfd >= 5000){
unlock(f);
exhausted("file descriptors");
return -1;
}
newfd = smalloc((f->nfd+DELTAFD)*sizeof(Chan*));
oldfd = f->fd;
memmove(newfd, oldfd, f->nfd*sizeof(Chan*));
f->fd = newfd;
f->nfd += DELTAFD;
f->maxfd = i;
f->fd[i] = c;
.
19c
for(i=0; i<f->nfd; i++)
.
16a
Chan **newfd, **oldfd;
.
## diffname port/sysfile.c 1997/0606
## diff -e /n/emeliedump/1997/0603/sys/src/brazil/port/sysfile.c /n/emeliedump/1997/0606/sys/src/brazil/port/sysfile.c
37c
newfd = malloc((f->nfd+DELTAFD)*sizeof(Chan*));
if(newfd == 0)
goto Exhausted;
.
32a
Exhausted:
.
## diffname port/sysfile.c 1997/1104
## diff -e /n/emeliedump/1997/0606/sys/src/brazil/port/sysfile.c /n/emeliedump/1997/1104/sys/src/brazil/port/sysfile.c
7a
void
poot(char *s, int d)
{
if(up->slash->type<0||up->slash->type>50||(up->slash->flag&COPEN))
panic("poot: %s %d=%lux\n", s, d, d);
}
.
## diffname port/sysfile.c 1997/1105
## diff -e /n/emeliedump/1997/1104/sys/src/brazil/port/sysfile.c /n/emeliedump/1997/1105/sys/src/brazil/port/sysfile.c
8,14d
## diffname port/sysfile.c 1997/1203
## diff -e /n/emeliedump/1997/1105/sys/src/brazil/port/sysfile.c /n/emeliedump/1997/1203/sys/src/brazil/port/sysfile.c
184d
180a
unlock(f);
.
179a
lock(f);
.
## diffname port/sysfile.c 1997/1205
## diff -e /n/emeliedump/1997/1203/sys/src/brazil/port/sysfile.c /n/emeliedump/1997/1205/sys/src/brazil/port/sysfile.c
124a
poperror();
if(c == oc)
cclose(c);
.
122a
oc = c;
.
118c
/*
* Undomount below may cclose the chan so bump the
* reference count to guard against it going to zero
* and being freed.
*/
c = fdtochan(arg[0], -1, 0, 1);
if(waserror()) {
cclose(c);
nexterror();
}
.
112c
Chan *c, *oc;
.
## diffname port/sysfile.c 1997/1208
## diff -e /n/emeliedump/1997/1205/sys/src/brazil/port/sysfile.c /n/emeliedump/1997/1208/sys/src/brazil/port/sysfile.c
518a
okchan("after stat routine", c->type);
.
517a
okchan("before stat routine", c->type);
.
233a
okchan("after open namec", 0);
.
232a
okchan("before open namec", 0);
.
## diffname port/sysfile.c 1998/0221
## diff -e /n/emeliedump/1997/1208/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0221/sys/src/brazil/port/sysfile.c
522d
520d
235d
233d
## diffname port/sysfile.c 1998/0224
## diff -e /n/emeliedump/1998/0221/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0224/sys/src/brazil/port/sysfile.c
169,170c
if(walk(&c[0], "data", 1) < 0)
error(Egreg);
if(walk(&c[1], "data1", 1) < 0)
error(Egreg);
.
## diffname port/sysfile.c 1998/0319
## diff -e /n/emeliedump/1998/0224/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0319/sys/src/brazil/port/sysfile.c
505a
}
long
sysseek(ulong *arg)
{
union {
vlong v;
ulong u[2];
} o;
ulong a[4];
o.v = arg[1];
a[0] = arg[0];
a[1] = o.u[0];
a[2] = o.u[1];
a[3] = arg[2];
return sysvseek(a);
.
501,502c
off = (long)dir.length2 + o.v; /* BOTCH */
c->offset = off;
.
493,494c
off = o.v + c->offset;
c->offset = off;
.
488c
off = o.v;
c->offset = off;
.
486c
o.u[0] = arg[1];
o.u[1] = arg[2];
switch(arg[3]){
.
476c
vlong off;
union {
vlong v;
ulong u[2];
} o;
.
471c
sysvseek(ulong *arg)
.
## diffname port/sysfile.c 1998/0320
## diff -e /n/emeliedump/1998/0319/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0320/sys/src/brazil/port/sysfile.c
508c
off = (long)dir.length1 + o.v; /* BOTCH */
.
## diffname port/sysfile.c 1998/0326
## diff -e /n/emeliedump/1998/0320/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0326/sys/src/brazil/port/sysfile.c
525,529c
a[0] = (ulong)&o.v;
a[1] = arg[0];
a[2] = o.u[0];
a[3] = o.u[1];
a[4] = arg[2];
sseek(a);
return o.v;
.
522c
ulong a[5];
.
515a
sysvseek(ulong *arg)
{
validaddr(arg[0], BY2V, 1);
sseek(arg);
return 0;
}
long
.
512c
*(vlong*)arg[0] = off;
.
508c
off = dir.length + o.v;
.
490,492c
o.u[0] = arg[2];
o.u[1] = arg[3];
switch(arg[4]){
.
482c
c = fdtochan(arg[1], -1, 1, 0);
.
470,471c
static void
sseek(ulong *arg)
.
## diffname port/sysfile.c 1998/0403
## diff -e /n/emeliedump/1998/0326/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0403/sys/src/brazil/port/sysfile.c
512a
cclose(c);
poperror();
.
482c
c = fdtochan(arg[1], -1, 1, 1);
if(waserror()){
cclose(c);
nexterror();
}
.
## diffname port/sysfile.c 1998/0512
## diff -e /n/emeliedump/1998/0403/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0512/sys/src/brazil/port/sysfile.c
711c
poperror();
.
314c
c->offset = nc->offset;
.
305c
if(waserror()) {
.
## diffname port/sysfile.c 1998/0829
## diff -e /n/emeliedump/1998/0512/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0829/sys/src/brazil/port/sysfile.c
516a
c->uri = 0;
.
397c
if(dir && c->mh)
.
357c
if(dir && c->mh)
.
330c
runlock(&m->lock);
.
327d
324,325c
c->uri++;
mount = mount->next;
if(mount == nil)
.
319c
runlock(&m->lock);
.
297,303d
294c
nc = cclone(mount->to, 0);
.
291c
runlock(&m->lock);
.
286,287c
m = c->mh;
rlock(&m->lock);
mount = m->mount;
for(i = 0; mount != nil && i < c->uri; i++)
mount = mount->next;
.
284c
Mhead *m;
Mount *mount;
.
281a
int i;
.
## diffname port/sysfile.c 1998/0901
## diff -e /n/emeliedump/1998/0829/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0901/sys/src/brazil/port/sysfile.c
298a
if(mount->to == nil)
goto next;
.
294c
while(mount != nil) {
.
## diffname port/sysfile.c 1998/0915
## diff -e /n/emeliedump/1998/0901/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0915/sys/src/brazil/port/sysfile.c
531c
sysoseek(ulong *arg)
.
523c
sysseek(ulong *arg)
.
## diffname port/sysfile.c 1998/0922
## diff -e /n/emeliedump/1998/0915/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0922/sys/src/brazil/port/sysfile.c
462a
m = devtab[c->type]->write(c, (void*)arg[1], n, oo);
if(m < n){
lock(c);
c->offset = oo + m;
unlock(c);
}
.
460a
oo = c->offset;
.
458,459d
451a
lock(c);
c->offset -= n;
unlock(c);
.
448a
n = arg[2];
.
446c
long m, n;
uvlong oo;
.
388d
382a
.
381c
n = arg[2];
validaddr(arg[1], n, 1);
.
## diffname port/sysfile.c 1998/0923
## diff -e /n/emeliedump/1998/0922/sys/src/brazil/port/sysfile.c /n/emeliedump/1998/0923/sys/src/brazil/port/sysfile.c
473c
c->offset -= n - m;
.
## diffname port/sysfile.c 1999/0122
## diff -e /n/emeliedump/1998/0923/sys/src/brazil/port/sysfile.c /n/emeliedump/1999/0122/sys/src/brazil/port/sysfile.c
99,100d
## diffname port/sysfile.c 1999/0528
## diff -e /n/emeliedump/1999/0122/sys/src/brazil/port/sysfile.c /n/emeliedump/1999/0528/sys/src/brazil/port/sysfile.c
112,114c
validaddr(arg[1], arg[2], 1);
.
## diffname port/sysfile.c 1999/0629
## diff -e /n/emeliedump/1999/0528/sys/src/brazil/port/sysfile.c /n/emeliedump/1999/0629/sys/src/brazil/port/sysfile.c
167c
if(walkname(&c[1], "data1", 1) < 0)
.
165c
if(walkname(&c[0], "data", 1) < 0)
.
135c
if(c->name == nil)
snprint((char*)arg[1], arg[2], "<null>");
else
snprint((char*)arg[1], arg[2], "%s", c->name->s);
poperror();
.
124,133d
110c
Chan *c;
.
## diffname port/sysfile.c 1999/0709
## diff -e /n/emeliedump/1999/0629/sys/src/brazil/port/sysfile.c /n/emeliedump/1999/0709/sys/src/brazil/port/sysfile.c
129,130c
cclose(c);
.
120,123d
114,118d
## diffname port/sysfile.c 1999/0717
## diff -e /n/emeliedump/1999/0709/sys/src/brazil/port/sysfile.c /n/emeliedump/1999/0717/sys/src/brazil/port/sysfile.c
626a
nameok(bogus.spec);
poperror();
.
625c
if(waserror())
.
## diffname port/sysfile.c 1999/0718
## diff -e /n/emeliedump/1999/0717/sys/src/brazil/port/sysfile.c /n/emeliedump/1999/0718/sys/src/brazil/port/sysfile.c
779c
nameok((char*)arg[1], 0);
.
760c
nameok((char*)arg[1], 0);
.
627c
nameok(bogus.spec, 1);
.
## diffname port/sysfile.c 1999/0811
## diff -e /n/emeliedump/1999/0718/sys/src/brazil/port/sysfile.c /n/emeliedump/1999/0811/sys/src/brazil/port/sysfile.c
152c
if(walk(&c[1], "data1", 1) < 0)
.
150c
if(walk(&c[0], "data", 1) < 0)
.
## diffname port/sysfile.c 1999/0812
## diff -e /n/emeliedump/1999/0811/sys/src/brazil/port/sysfile.c /n/emeliedump/1999/0812/sys/src/brazil/port/sysfile.c
789a
long
sysexportfs(ulong*)
{
error("exportfs not implemented");
return -1;
}
long
systunnel(ulong*)
{
error("tunnel not implemented");
return -1;
}
.
## diffname port/sysfile.c 1999/1105
## diff -e /n/emeliedump/1999/0812/sys/src/brazil/port/sysfile.c /n/emeliedump/1999/1105/sys/src/9/port/sysfile.c
610c
bogus.flags = flag & MCACHE;
.
## diffname port/sysfile.c 2000/0209
## diff -e /n/emeliedump/1999/1105/sys/src/9/port/sysfile.c /n/emeliedump/2000/0209/sys/src/9/port/sysfile.c
790,803d
## diffname port/sysfile.c 2000/0215
## diff -e /n/emeliedump/2000/0209/sys/src/9/port/sysfile.c /n/emeliedump/2000/0215/sys/src/9/port/sysfile.c
726a
if(fd < 0)
error(Enofd);
.
217a
if(fd < 0)
error(Enofd);
.
196a
if(fd < 0)
error(Enofd);
.
178c
if(fd<0 || growfd(f, fd)<0) {
.
157a
if(fd[0] < 0 || fd[1] < 0)
error(Enofd);
.
48,51c
return fd;
.
45,46c
if(fd > f->maxfd)
f->maxfd = fd;
return 1;
}
int
newfd(Chan *c)
{
int fd;
Fgrp *f;
f = up->fgrp;
lock(f);
for(fd=0; fd<f->nfd; fd++)
if(f->fd[fd] == 0)
break;
if(fd >= f->nfd && growfd(f, fd) < 0){
unlock(f);
return -1;
}
if(fd > f->maxfd)
f->maxfd = fd;
f->fd[fd] = c;
.
43a
free(oldfd);
.
33,34c
Exhausted:
.
19,27c
if(fd < f->nfd)
return 0;
if(fd >= f->nfd+DELTAFD)
return -1; /* out of range */
if(fd % 100 == 0)
pprint("warning: process exceeds %d file descriptors\n", fd);
.
15,16d
13c
growfd(Fgrp *f, int fd) /* fd is always >= 0 */
.
## diffname port/sysfile.c 2000/0322
## diff -e /n/emeliedump/2000/0215/sys/src/9/port/sysfile.c /n/emeliedump/2000/0322/sys/src/9/port/sysfile.c
631a
if(up->pgrp->noattach)
error(Enoattach);
.
## diffname port/sysfile.c 2000/0505
## diff -e /n/emeliedump/2000/0322/sys/src/9/port/sysfile.c /n/emeliedump/2000/0505/sys/src/9/port/sysfile.c
480c
return m;
.
## diffname port/sysfile.c 2000/0719
## diff -e /n/emeliedump/2000/0505/sys/src/9/port/sysfile.c /n/emeliedump/2000/0719/sys/src/9/port/sysfile.c
29c
print("no free file descriptors\n");
.
## diffname port/sysfile.c 2000/0814
## diff -e /n/emeliedump/2000/0719/sys/src/9/port/sysfile.c /n/emeliedump/2000/0814/sys/src/9/port/sysfile.c
175d
172a
poperror();
.
169,171c
if(newfd2(fd, c) < 0)
.
156,159d
151a
.
143d
66a
int
newfd2(int fd[2], Chan *c[2])
{
Fgrp *f;
f = up->fgrp;
lock(f);
fd[0] = findfreefd(f, 0);
if(fd[0] < 0){
unlock(f);
return -1;
}
fd[1] = findfreefd(f, fd[0]+1);
if(fd[1] < 0){
unlock(f);
return -1;
}
if(fd[1] > f->maxfd)
f->maxfd = fd[1];
f->fd[fd[0]] = c[0];
f->fd[fd[1]] = c[1];
unlock(f);
return 0;
}
.
53,56c
fd = findfreefd(f, 0);
if(fd < 0){
.
45a
findfreefd(Fgrp *f, int start)
{
int fd;
for(fd=start; fd<f->nfd; fd++)
if(f->fd[fd] == 0)
break;
if(fd >= f->nfd && growfd(f, fd) < 0)
return -1;
return fd;
}
int
.
44a
/*
* this assumes that the fgrp is locked
*/
.
## diffname port/sysfile.c 2001/0207
## diff -e /n/emeliedump/2000/0814/sys/src/9/port/sysfile.c /n/emeliedump/2001/0207/sys/src/9/port/sysfile.c
587c
o.v = (long)arg[1];
.
## diffname port/sysfile.c 2001/0223
## diff -e /n/emeliedump/2001/0207/sys/src/9/port/sysfile.c /n/emeliedump/2001/0223/sys/src/9/port/sysfile.c
510a
poperror();
cclose(c);
return m;
}
long
syspwrite(ulong *arg)
{
Chan *c;
long m, n;
union {
uvlong v;
ulong u[2];
} o;
validaddr(arg[1], arg[2], 0);
n = arg[2];
c = fdtochan(arg[0], OWRITE, 1, 1);
o.u[0] = arg[3];
o.u[1] = arg[4];
if(waserror()) {
cclose(c);
nexterror();
}
if(c->qid.path & CHDIR)
error(Eisdir);
m = devtab[c->type]->write(c, (void*)arg[1], n, o.v);
.
448a
syspread(ulong *arg)
{
long n;
Chan *c;
union {
uvlong v;
ulong u[2];
} o;
n = arg[2];
validaddr(arg[1], n, 1);
c = fdtochan(arg[0], OREAD, 1, 1);
o.u[0] = arg[3];
o.u[1] = arg[4];
if(waserror()) {
cclose(c);
nexterror();
}
if(c->qid.path&CHDIR)
error(Eisdir);
n = devtab[c->type]->read(c, (void*)arg[1], n, o.v);
poperror();
cclose(c);
return n;
}
long
.
## diffname port/sysfile.c 2001/0502
## diff -e /n/emeliedump/2001/0223/sys/src/9/port/sysfile.c /n/emeliedump/2001/0502/sys/src/9/port/sysfile.c
558a
if(arg[3] == ~0UL && arg[4] == ~0UL)
return syswrite(arg);
.
457a
if(arg[3] == ~0UL && arg[4] == ~0UL)
return sysread(arg);
.
## diffname port/sysfile.c 2001/0527
## diff -e /n/emeliedump/2001/0502/sys/src/9/port/sysfile.c /n/emeliedump/2001/0527/sys/src/9/port/sysfile.c
916a
}
long
sys_fstat(ulong *arg)
{
Chan *c;
uint l;
uchar buf[128]; /* old DIRLEN plus a little should be plenty */
char strs[128];
Dir d;
char old[] = "old fstat system call - recompile";
validaddr(arg[1], 116, 1);
c = fdtochan(arg[0], -1, 0, 1);
if(waserror()){
cclose(c);
nexterror();
}
l = devtab[c->type]->stat(c, buf, sizeof buf);
/* buf contains a new stat buf; convert to old. yuck. */
if(l <= BIT16SZ) /* buffer too small; time to face reality */
error(old);
l = convM2D(buf, l, &d, strs);
if(l == 0)
error(old);
packoldstat((uchar*)arg[1], &d);
poperror();
cclose(c);
return 0;
}
long
sys_wstat(ulong *)
{
error("old wstat system call - recompile");
return -1;
}
long
sys_fwstat(ulong *)
{
error("old fwstat system call - recompile");
return -1;
.
915a
return l;
}
static void
packoldstat(uchar *buf, Dir *d)
{
uchar *p;
ulong q;
/* lay down old stat buffer - grotty code but it's temporary */
p = buf;
strncpy((char*)p, d->name, 28);
p += 28;
strncpy((char*)p, d->uid, 28);
p += 28;
strncpy((char*)p, d->gid, 28);
p += 28;
q = d->qid.path & ~DMDIR; /* make sure doesn't accidentally look like directory */
if(d->qid.type & QTDIR) /* this is the real test of a new directory */
q |= DMDIR;
PBIT32(p, q);
p += BIT32SZ;
PBIT32(p, d->qid.vers);
p += BIT32SZ;
PBIT32(p, d->mode);
p += BIT32SZ;
PBIT32(p, d->atime);
p += BIT32SZ;
PBIT32(p, d->mtime);
p += BIT32SZ;
PBIT64(p, d->length);
p += BIT64SZ;
PBIT16(p, d->type);
p += BIT16SZ;
PBIT16(p, d->dev);
}
long
sys_stat(ulong *arg)
{
Chan *c;
uint l;
uchar buf[128]; /* old DIRLEN plus a little should be plenty */
char strs[128];
Dir d;
char old[] = "old stat system call - recompile";
validaddr(arg[1], 116, 1);
validaddr(arg[0], 1, 0);
c = namec((char*)arg[0], Aaccess, 0, 0);
if(waserror()){
cclose(c);
nexterror();
}
l = devtab[c->type]->stat(c, buf, sizeof buf);
/* buf contains a new stat buf; convert to old. yuck. */
if(l <= BIT16SZ) /* buffer too small; time to face reality */
error(old);
l = convM2D(buf, l, &d, strs);
if(l == 0)
error(old);
packoldstat((uchar*)arg[1], &d);
poperror();
cclose(c);
.
913c
l = devtab[c->type]->wstat(c, (uchar*)arg[1], l);
.
906,907c
l = arg[2];
validaddr(arg[1], l, 0);
validstat((uchar*)arg[1], l);
.
904a
uint l;
.
898c
return l;
.
895c
l = devtab[c->type]->wstat(c, (uchar*)arg[1], l);
.
887,888c
l = arg[2];
validaddr(arg[1], l, 0);
validstat((uchar*)arg[1], l);
.
885a
uint l;
.
865c
c = namec((char*)arg[0], Aremove, 0, 0);
.
780c
ret = cmount(&c0, c1, flag, bogus.spec);
.
765c
c0 = namec((char*)arg[0], Amount, 0, 0);
.
753c
validname(bogus.spec, 1);
.
747,748c
validname((char*)arg[3], 1);
.
700c
return l;
.
697c
l = devtab[c->type]->stat(c, (uchar*)arg[1], l);
.
689,690c
l = arg[2];
validaddr(arg[1], l, 1);
.
687a
uint l;
.
681c
return l;
.
678c
l = devtab[c->type]->stat(c, (uchar*)arg[1], l);
.
671,672c
l = arg[2];
validaddr(arg[1], l, 1);
.
669a
uint l;
.
665a
void
validstat(uchar *s, int n)
{
int m;
char buf[64];
if(statcheck(s, n) < 0)
error(Ebadstat);
/* verify that name entry is acceptable */
s += STATFIXLEN - 4*BIT16SZ; /* location of first string */
/*
* s now points at count for first string.
* if it's too long, let the server decide; this is
* only for his protection anyway. otherwise
* we'd have to allocate and waserror.
*/
m = GBIT16(s);
s += BIT16SZ;
if(m+1 > sizeof buf)
return;
memmove(buf, s, m);
buf[m] = '\0';
/* name could be '/' */
if(strcmp(buf, "/") != 0)
validname(buf, 0);
}
.
631a
default:
error(Ebadarg);
.
627,628c
if(c->qid.type & QTDIR)
error(Eisdir);
n = devtab[c->type]->stat(c, buf, sizeof buf);
if(convM2D(buf, n, &dir, nil) == 0)
error("internal error: stat error in seek");
.
619a
if(c->qid.type & QTDIR)
error(Eisdir);
.
615a
if((c->qid.type & QTDIR) && off != 0)
error(Eisdir);
.
604,606d
592a
int n;
.
591c
uchar buf[sizeof(Dir)+100];
.
576,584c
return write(arg, &o.v);
.
571,574d
566,568d
563,564c
if(arg[3]==~0UL && arg[4]==~0UL)
return write(arg, nil);
.
556,557d
553a
sys_write(ulong *arg)
{
return write(arg, nil);
}
long
.
534,541c
if(offp == nil && m < n){
.
531,532c
m = devtab[c->type]->write(c, (void*)arg[1], n, off);
.
528,529c
}else
off = *offp;
.
526c
off = c->offset;
c->offset += n;
.
522,524c
if(offp == nil){ /* use and maintain channel's offset */
.
499,520d
496c
if(c->qid.type & QTDIR)
.
491a
if(offp == nil){
lock(c);
c->offset -= n;
unlock(c);
}
.
489a
n = 0;
.
487c
long m, n;
uvlong off;
.
483,484c
static long
write(ulong *arg, uvlong *offp)
.
467,480c
return read(arg, &o.v);
.
461,463d
458,459c
if(arg[3]==~0UL && arg[4]==~0UL)
return read(arg, nil);
.
451,452d
412,445c
return read(arg, nil);
.
410c
sys_read(ulong *arg)
.
399,401c
if(offp == nil){
lock(c);
c->offset += n;
unlock(c);
}
.
397c
n = devtab[c->type]->read(c, (void*)arg[1], n, off);
.
394,395d
392c
if(dir && c->umh)
.
386,390c
if(offp == nil) /* use and maintain channel's offset */
off = c->offset;
else
off = *offp;
.
383,384c
dir = c->qid.type&QTDIR;
/*
* The offset is passed through on directories, normally. sysseek complains but
* pread is used by servers and e.g. exportfs that shouldn't need to worry about this issue.
*/
.
377a
.
376c
n = arg[2];
validaddr(arg[1], n, 1);
.
374a
uvlong off;
.
369,370c
static long
read(ulong *arg, uvlong *offp)
.
366c
qunlock(&c->umqlock);
return nr;
.
361,363d
359a
if(c->umc) {
cclose(c->umc);
c->umc = nil;
}
.
358d
345,356d
343a
if(nr > 0)
break;
.
340,342c
if(mount->to && !waserror()) {
if(c->umc == nil){
c->umc = cclone(mount->to);
c->umc = devtab[c->umc->type]->open(c->umc, OREAD);
}
nr = devtab[c->umc->type]->read(c->umc, va, n, c->umc->offset);
c->umc->offset += nr;
poperror();
.
330,338d
328a
nr = 0;
.
325a
/* bring mount in sync with c->uri and c->umc */
.
323c
qlock(&c->umqlock);
m = c->umh;
.
319d
201c
if(walk(&c[1], datastr+1, 1, 1) < 0)
.
198,199c
c[1] = cclone(c[0]);
if(walk(&c[0], datastr+0, 1, 1) < 0)
.
182a
static char *datastr[] = {"data", "data1"};
.
## diffname port/sysfile.c 2001/0528
## diff -e /n/emeliedump/2001/0527/sys/src/9/port/sysfile.c /n/emeliedump/2001/0528/sys/src/9/port/sysfile.c
459a
if(off < 0)
error(Enegoff);
.
433c
vlong off;
.
387a
if(off < 0)
error(Enegoff);
.
366c
vlong off;
.
## diffname port/sysfile.c 2001/0727
## diff -e /n/emeliedump/2001/0528/sys/src/9/port/sysfile.c /n/emeliedump/2001/0727/sys/src/9/port/sysfile.c
498,501c
return write(arg, &v);
.
495c
va_start(list, arg[2]);
v = va_arg(list, uvlong);
va_end(list);
if(v ==~0ULL)
.
490,493c
uvlong v;
va_list list;
.
425,428c
return read(arg, &v);
.
422c
va_start(list, arg[2]);
v = va_arg(list, uvlong);
va_end(list);
if(v ==~0ULL)
.
417,420c
uvlong v;
va_list list;
.
## diffname port/sysfile.c 2001/0728
## diff -e /n/emeliedump/2001/0727/sys/src/9/port/sysfile.c /n/emeliedump/2001/0728/sys/src/9/port/sysfile.c
491a
/* use varargs to guarantee alignment of vlong */
.
419a
/* use varargs to guarantee alignment of vlong */
.
## diffname port/sysfile.c 2001/0731
## diff -e /n/emeliedump/2001/0728/sys/src/9/port/sysfile.c /n/emeliedump/2001/0731/sys/src/9/port/sysfile.c
498c
if(v == ~0ULL)
.
495c
v = va_arg(list, vlong);
.
490c
vlong v;
.
432c
write(ulong *arg, vlong *offp)
.
425c
if(v == ~0ULL)
.
422c
v = va_arg(list, vlong);
.
417c
vlong v;
.
361c
read(ulong *arg, vlong *offp)
.
## diffname port/sysfile.c 2001/0819
## diff -e /n/emeliedump/2001/0731/sys/src/9/port/sysfile.c /n/emeliedump/2001/0819/sys/src/9/port/sysfile.c
753c
return bindmount(1, arg[0], arg[1], nil, (char*)arg[2], arg[3], (char*)arg[4]);
}
long
sys_mount(ulong *arg)
{
return bindmount(1, arg[0], -1, nil, (char*)arg[1], arg[2], (char*)arg[3]);
.
747c
return bindmount(0, -1, -1, (char*)arg[0], (char*)arg[1], arg[2], nil);
.
740a
.
726,727c
validaddr((ulong)arg1, 1, 0);
c1 = namec(arg1, Amount, 0, 0);
.
717,718c
validaddr((ulong)arg0, 1, 0);
c0 = namec(arg0, Amount, 0, 0);
.
712a
if(ac)
cclose(ac);
.
706d
703c
bogus.spec = spec;
.
700,701c
validaddr((ulong)spec, 1, 0);
validname(spec, 1);
.
698a
bogus.authchan = ac;
.
697a
if(afd >= 0)
ac = fdtochan(afd, ORDWR, 0, 1);
.
694a
if(ac)
cclose(ac);
.
692a
ac = nil;
.
682,683d
677a
Chan *authchan;
.
673,675c
int ret;
Chan *c0, *c1, *ac, *bc;
.
671c
bindmount(int ismount, int fd, int afd, char* arg0, char* arg1, ulong flag, char* spec)
.
273a
if(strstr(up->text, "syscall")!=0) pprint("open %s ref count %d\n", c2name(c), c->ref); // BUG
.
## diffname port/sysfile.c 2001/0820
## diff -e /n/emeliedump/2001/0819/sys/src/9/port/sysfile.c /n/emeliedump/2001/0820/sys/src/9/port/sysfile.c
274d
## diffname port/sysfile.c 2001/0822
## diff -e /n/emeliedump/2001/0820/sys/src/9/port/sysfile.c /n/emeliedump/2001/0822/sys/src/9/port/sysfile.c
786c
cmounted = namec((char*)arg[0], Aaccess, OREAD, 0);
.
559a
c->dri = 0;
.
## diffname port/sysfile.c 2001/0912
## diff -e /n/emeliedump/2001/0822/sys/src/9/port/sysfile.c /n/emeliedump/2001/0912/sys/src/9/port/sysfile.c
787c
/*
* This has to be namec(..., Aopen, ...) because
* if arg[0] is something like /srv/cs or /fd/0,
* opening it is the only way to get at the real
* Chan underneath.
*/
cmounted = namec((char*)arg[0], Aopen, OREAD, 0);
.
## diffname port/sysfile.c 2001/0919
## diff -e /n/emeliedump/2001/0912/sys/src/9/port/sysfile.c /n/emeliedump/2001/0919/sys/src/9/port/sysfile.c
726c
c0 = namec(arg0, Abind, 0, 0);
.
722,723c
}else{
.
## diffname port/sysfile.c 2001/1111
## diff -e /n/emeliedump/2001/0919/sys/src/9/port/sysfile.c /n/emeliedump/2001/1111/sys/src/9/port/sysfile.c
551a
if(off < 0)
error(Enegoff);
.
540a
if(off < 0)
error(Enegoff);
.
532a
if(off < 0)
error(Enegoff);
.
## diffname port/sysfile.c 2001/1118
## diff -e /n/emeliedump/2001/1111/sys/src/9/port/sysfile.c /n/emeliedump/2001/1118/sys/src/9/port/sysfile.c
823c
openmode(arg[1]&~OEXCL); /* error check only; OEXCL okay here */
.
## diffname port/sysfile.c 2001/1212
## diff -e /n/emeliedump/2001/1118/sys/src/9/port/sysfile.c /n/emeliedump/2001/1212/sys/src/9/port/sysfile.c
689c
if((flag&~MMASK) || (flag&MORDER)==(MBEFORE|MAFTER))
.
## diffname port/sysfile.c 2001/1230
## diff -e /n/emeliedump/2001/1212/sys/src/9/port/sysfile.c /n/emeliedump/2001/1230/sys/src/9/port/sysfile.c
718a
validname(spec, 1);
.
714,715d
## diffname port/sysfile.c 2002/0104
## diff -e /n/emeliedump/2001/1230/sys/src/9/port/sysfile.c /n/emeliedump/2002/0104/sys/src/9/port/sysfile.c
202c
if(walk(&c[1], datastr+1, 1, 1, nil) < 0)
.
200c
if(walk(&c[0], datastr+0, 1, 1, nil) < 0)
.
## diffname port/sysfile.c 2003/0326
## diff -e /n/emeliedump/2002/0104/sys/src/9/port/sysfile.c /n/emeliedump/2003/0326/sys/src/9/port/sysfile.c
239c
unlockfgrp(f);
.
230c
unlockfgrp(f);
.
102c
unlockfgrp(f);
.
95c
unlockfgrp(f);
.
90c
unlockfgrp(f);
.
77c
unlockfgrp(f);
.
71c
unlockfgrp(f);
.
41a
}
.
40c
if(fd > f->maxfd){
if(fd/100 > f->maxfd/100)
f->exceed = (fd/100)*100;
.
21,22d
11a
static void
unlockfgrp(Fgrp *f)
{
int ex;
ex = f->exceed;
f->exceed = 0;
unlock(f);
if(ex)
pprint("warning: process exceeds %d file descriptors\n", ex);
}
.
## diffname port/sysfile.c 2003/0509
## diff -e /n/emeliedump/2003/0326/sys/src/9/port/sysfile.c /n/emeliedump/2003/0509/sys/src/9/port/sysfile.c
998a
name = cnamelast(c->name);
if(name)
l = dirsetname(name, strlen(name), (uchar*)arg[1], l, arg[2]);
.
982a
char *name;
.
904,911c
return wstat(c, (uchar*)arg[1], l);
.
884,891c
return wstat(c, (uchar*)arg[1], l);
.
872a
static long
wstat(Chan *c, uchar *d, int nd)
{
long l;
int namelen;
if(waserror()){
cclose(c);
nexterror();
}
if(c->ismtpt){
/*
* Renaming mount points is disallowed to avoid surprises
* (which should be renamed: the mount point or the mounted Chan?).
*/
dirname(d, &namelen);
if(namelen)
nameerror(channame(c), Eismtpt);
}
l = devtab[c->type]->wstat(c, d, nd);
poperror();
cclose(c);
return l;
}
.
861a
/*
* Removing mount points is disallowed to avoid surprises
* (which should be removed: the mount point or the mounted Chan?).
*/
if(c->ismtpt)
error(Eismtpt);
.
671a
name = cnamelast(c->name);
if(name)
l = dirsetname(name, strlen(name), (uchar*)arg[1], l, arg[2]);
.
659a
char *name;
.
637a
static char*
cnamelast(Cname *n)
{
char *s;
if(n == nil)
return nil;
if(n->len == 0)
return nil;
s = strrchr(n->s, '/');
if(s)
return s+1;
return n->s;
}
.
418c
return nnn;
.
414a
lock(c);
c->devoffset += nn;
c->offset += nnn;
unlock(c);
.
413a
if(dir)
nnn = mountfix(c, p, nn, n);
else
nnn = nn;
.
409,412c
dir = c->qid.type&QTDIR;
if(dir && mountrockread(c, p, n, &nn)){
/* do nothing: mountrockread filled buffer */
}else{
if(dir && c->umh)
nn = unionread(c, p, n);
else
nn = devtab[c->type]->read(c, p, n, off);
.
404,407c
if(off == 0){ /* rewind to the beginning of the directory */
if(offp == nil){
c->offset = 0;
c->devoffset = 0;
}
mountrewind(c);
unionrewind(c);
}
.
400d
395d
392,393c
* The offset is passed through on directories, normally.
* Sysseek complains, but pread is used by servers like exportfs,
* that shouldn't need to worry about this issue.
*
* Notice that c->devoffset is the offset that c's dev is seeing.
* The number of bytes read on this fd (c->offset) may be different
* due to rewritings in rockfix.
.
390d
385c
if(waserror()){
.
382a
p = (void*)arg[1];
.
377c
long n, nn, nnn;
uchar *p;
.
373a
dirsetname(char *name, int len, uchar *p, long n, long maxn)
{
char *oname;
int olen;
long nn;
if(n == BIT16SZ)
return BIT16SZ;
oname = dirname(p, &olen);
nn = n+len-olen;
PBIT16(p, nn-BIT16SZ);
if(nn > maxn)
return BIT16SZ;
if(len != olen)
memmove(oname+len, oname+olen, p+n-(uchar*)(oname+olen));
PBIT16((uchar*)(oname-2), len);
memmove(oname, name, len);
return nn;
}
/*
* Mountfix might have caused the fixed results of the directory read
* to overflow the buffer. Catch the overflow in c->dirrock.
*/
static void
mountrock(Chan *c, uchar *p, uchar **pe)
{
uchar *e, *r;
int len, n;
e = *pe;
/* find last directory entry */
for(;;){
len = BIT16SZ+GBIT16(p);
if(p+len >= e)
break;
p += len;
}
/* save it away */
qlock(&c->rockqlock);
if(c->nrock+len > c->mrock){
n = ROUND(c->nrock+len, 1024);
r = smalloc(n);
memmove(r, c->dirrock, c->nrock);
free(c->dirrock);
c->dirrock = r;
c->mrock = n;
}
memmove(c->dirrock+c->nrock, p, len);
c->nrock += len;
qunlock(&c->rockqlock);
/* drop it */
*pe = p;
}
/*
* Satisfy a directory read with the results saved in c->dirrock.
*/
static int
mountrockread(Chan *c, uchar *op, long n, long *nn)
{
long dirlen;
uchar *rp, *erp, *ep, *p;
/* common case */
if(c->nrock == 0)
return 0;
/* copy out what we can */
qlock(&c->rockqlock);
rp = c->dirrock;
erp = rp+c->nrock;
p = op;
ep = p+n;
while(rp+BIT16SZ <= erp){
dirlen = BIT16SZ+GBIT16(rp);
if(p+dirlen > ep)
break;
memmove(p, rp, dirlen);
p += dirlen;
rp += dirlen;
}
if(p == op){
qunlock(&c->rockqlock);
return 0;
}
/* shift the rest */
if(rp != erp)
memmove(c->dirrock, rp, erp-rp);
c->nrock = erp - rp;
*nn = p - op;
qunlock(&c->rockqlock);
return 1;
}
static void
mountrewind(Chan *c)
{
c->nrock = 0;
}
/*
* Rewrite the results of a directory read to reflect current
* name space bindings and mounts. Specifically, replace
* directory entries for bind and mount points with the results
* of statting what is mounted there. Except leave the old names.
*/
static long
mountfix(Chan *c, uchar *op, long n, long maxn)
{
char *name;
int nbuf, nname;
Chan *nc;
Mhead *mh;
Mount *m;
uchar *p;
int dirlen, rest;
long l;
Qid q;
uchar *buf, *e;
p = op;
buf = nil;
nbuf = 0;
for(e=&p[n]; p+BIT16SZ<e; p+=dirlen){
dirlen = BIT16SZ+GBIT16(p);
if(p+dirlen > e)
break;
dirqid(p, &q);
nc = nil;
mh = nil;
if(findmount(&nc, &mh, c->type, c->dev, q)){
/*
* If it's a union directory and the original is
* in the union, don't rewrite anything.
*/
for(m=mh->mount; m; m=m->next)
if(eqchantdqid(m->to, c->type, c->dev, q, 1))
goto Norewrite;
name = dirname(p, &nname);
// print("mnted %.*s\n", utfnlen(name, nname), name);
/*
* Do the stat but fix the name. If it fails, leave old entry.
* BUG: If it fails because there isn't room for the entry,
* what can we do? Nothing, really. Might as well skip it.
*/
if(buf == nil){
buf = smalloc(4096);
nbuf = 4096;
}
if(waserror())
goto Norewrite;
l = devtab[nc->type]->stat(nc, buf, nbuf);
l = dirsetname(name, nname, buf, l, nbuf);
if(l == BIT16SZ)
goto Norewrite;
poperror();
/*
* Shift data in buffer to accomodate new entry,
* possibly overflowing into rock.
*/
rest = e - (p+dirlen);
if(l > dirlen){
while(p+l+rest > op+maxn){
mountrock(c, p, &e);
if(e == p){
dirlen = 0;
goto Norewrite;
}
rest = e - (p+dirlen);
}
}
if(l != dirlen){
memmove(p+l, p+dirlen, rest);
dirlen = l;
e = p+dirlen+rest;
}
/*
* Rewrite directory entry.
*/
memmove(p, buf, l);
Norewrite:
cclose(nc);
putmhead(mh);
}
}
if(buf)
free(buf);
if(p != e)
error("oops in rockfix");
return e-op;
}
static long
.
372a
static void
unionrewind(Chan *c)
{
qlock(&c->umqlock);
c->uri = 0;
if(c->umc){
cclose(c->umc);
c->umc = nil;
}
qunlock(&c->umqlock);
}
static void
dirqid(uchar *p, Qid *q)
{
p += BIT16SZ+BIT16SZ+BIT32SZ;
q->type = GBIT8(p);
p += BIT8SZ;
q->vers = GBIT32(p);
p += BIT32SZ;
q->path = GBIT64(p);
}
static char*
dirname(uchar *p, int *n)
{
p += BIT16SZ+BIT16SZ+BIT32SZ+BIT8SZ+BIT32SZ+BIT64SZ
+ BIT32SZ+BIT32SZ+BIT32SZ+BIT64SZ;
*n = GBIT16(p);
return (char*)p+BIT16SZ;
}
.
362c
if(c->umc){
.
347c
if(mount->to && !waserror()){
.
345c
while(mount != nil){
.
## diffname port/sysfile.c 2003/0510
## diff -e /n/emeliedump/2003/0509/sys/src/9/port/sysfile.c /n/emeliedump/2003/0510/sys/src/9/port/sysfile.c
1301c
l = dirsetname(name, strlen(name), buf, l, sizeof buf);
.
1267a
name = cnamelast(c->name);
if(name)
l = dirsetname(name, strlen(name), buf, l, sizeof buf);
.
1253c
char strs[128], *name;
.
|