Fgrp *f = up->fgrp;
lock(f);
- c = f->fd[fd];
+ c = fd <= f->maxfd ? f->fd[fd] : nil;
if(c == nil || (flag != 0 && (c->flag&flag) == 0)){
unlock(f);
return;
}
long
-bindmount(int ismount, int fd, int afd, char* arg0, char* arg1, ulong flag, char* spec)
+bindmount(int ismount, int fd, int afd, char* arg0, char* arg1, int flag, char* spec)
{
int ret;
Chan *c0, *c1, *ac, *bc;
- struct{
- Chan *chan;
- Chan *authchan;
- char *spec;
- int flags;
- }bogus;
if((flag&~MMASK) || (flag&MORDER)==(MBEFORE|MAFTER))
error(Ebadarg);
if(afd >= 0)
ac = fdtochan(afd, ORDWR, 0, 1);
- bogus.flags = flag & MCACHE;
- bogus.chan = bc;
- bogus.authchan = ac;
- bogus.spec = spec;
- ret = devno('M', 0);
- c0 = devtab[ret]->attach((char*)&bogus);
+ c0 = mntattach(bc, ac, spec, flag&MCACHE);
poperror(); /* ac bc */
if(ac != nil)
cclose(ac);
sysbind(va_list list)
{
char *arg0, *arg1;
- ulong flag;
+ int flag;
arg0 = va_arg(list, char*);
arg1 = va_arg(list, char*);
- flag = va_arg(list, ulong);
+ flag = va_arg(list, int);
return (uintptr)bindmount(0, -1, -1, arg0, arg1, flag, nil);
}
sysmount(va_list list)
{
char *arg1, *spec;
- ulong flag;
+ int flag;
int fd, afd;
fd = va_arg(list, int);
afd = va_arg(list, int);
arg1 = va_arg(list, char*);
- flag = va_arg(list, ulong);
+ flag = va_arg(list, int);
spec = va_arg(list, char*);
return (uintptr)bindmount(1, fd, afd, nil, arg1, flag, spec);
}
sys_mount(va_list list)
{
char *arg1, *spec;
- ulong flag;
+ int flag;
int fd;
fd = va_arg(list, int);
arg1 = va_arg(list, char*);
- flag = va_arg(list, ulong);
+ flag = va_arg(list, int);
spec = va_arg(list, char*);
return (uintptr)bindmount(1, fd, -1, nil, arg1, flag, spec);
}