version 1.106, 2009/03/15 17:22:37 |
version 1.107, 2009/05/24 21:41:26 |
Line 276 fdesc_lookup(void *v) |
|
Line 276 fdesc_lookup(void *v) |
|
struct lwp *l = curlwp; |
struct lwp *l = curlwp; |
const char *pname = cnp->cn_nameptr; |
const char *pname = cnp->cn_nameptr; |
struct proc *p = l->l_proc; |
struct proc *p = l->l_proc; |
filedesc_t *fdp = p->p_fd; |
|
int numfiles = fdp->fd_nfiles; |
|
unsigned fd = 0; |
unsigned fd = 0; |
int error; |
int error; |
struct vnode *fvp; |
struct vnode *fvp; |
const char *ln; |
const char *ln; |
|
fdtab_t *dt; |
|
|
|
dt = curlwp->l_fd->fd_dt; |
|
|
if (cnp->cn_namelen == 1 && *pname == '.') { |
if (cnp->cn_namelen == 1 && *pname == '.') { |
*vpp = dvp; |
*vpp = dvp; |
Line 370 fdesc_lookup(void *v) |
|
Line 371 fdesc_lookup(void *v) |
|
fd = 0; |
fd = 0; |
while (*pname >= '0' && *pname <= '9') { |
while (*pname >= '0' && *pname <= '9') { |
fd = 10 * fd + *pname++ - '0'; |
fd = 10 * fd + *pname++ - '0'; |
if (fd >= numfiles) |
if (fd >= dt->dt_nfiles) |
break; |
break; |
} |
} |
|
|
Line 379 fdesc_lookup(void *v) |
|
Line 380 fdesc_lookup(void *v) |
|
goto bad; |
goto bad; |
} |
} |
|
|
mutex_enter(&fdp->fd_lock); |
if (fd >= dt->dt_nfiles || dt->dt_ff[fd] == NULL || |
if (fd >= numfiles ||fdp->fd_ofiles[fd] == NULL || |
dt->dt_ff[fd]->ff_file == NULL) { |
fdp->fd_ofiles[fd]->ff_file == NULL) { |
|
mutex_exit(&fdp->fd_lock); |
|
error = EBADF; |
error = EBADF; |
goto bad; |
goto bad; |
} |
} |
mutex_exit(&fdp->fd_lock); |
|
|
|
error = fdesc_allocvp(Fdesc, FD_DESC+fd, dvp->v_mount, &fvp); |
error = fdesc_allocvp(Fdesc, FD_DESC+fd, dvp->v_mount, &fvp); |
if (error) |
if (error) |
Line 650 fdesc_readdir(void *v) |
|
Line 648 fdesc_readdir(void *v) |
|
} */ *ap = v; |
} */ *ap = v; |
struct uio *uio = ap->a_uio; |
struct uio *uio = ap->a_uio; |
struct dirent d; |
struct dirent d; |
filedesc_t *fdp; |
|
off_t i; |
off_t i; |
int j; |
int j; |
int error; |
int error; |
off_t *cookies = NULL; |
off_t *cookies = NULL; |
int ncookies; |
int ncookies; |
|
fdtab_t *dt; |
|
|
switch (VTOFDESC(ap->a_vp)->fd_type) { |
switch (VTOFDESC(ap->a_vp)->fd_type) { |
case Fctty: |
case Fctty: |
Line 668 fdesc_readdir(void *v) |
|
Line 666 fdesc_readdir(void *v) |
|
break; |
break; |
} |
} |
|
|
fdp = curproc->p_fd; |
dt = curlwp->l_fd->fd_dt; |
|
|
if (uio->uio_resid < UIO_MX) |
if (uio->uio_resid < UIO_MX) |
return EINVAL; |
return EINVAL; |
Line 709 fdesc_readdir(void *v) |
|
Line 707 fdesc_readdir(void *v) |
|
case FD_STDIN: |
case FD_STDIN: |
case FD_STDOUT: |
case FD_STDOUT: |
case FD_STDERR: |
case FD_STDERR: |
if (fdp == NULL) |
|
continue; |
|
if ((ft->ft_fileno - FD_STDIN) >= |
if ((ft->ft_fileno - FD_STDIN) >= |
fdp->fd_nfiles) |
dt->dt_nfiles) |
continue; |
continue; |
membar_consumer(); |
if (dt->dt_ff[ft->ft_fileno - FD_STDIN] |
if (fdp->fd_ofiles[ft->ft_fileno - FD_STDIN] |
== NULL || dt->dt_ff[ft->ft_fileno - |
== NULL || fdp->fd_ofiles[ft->ft_fileno - |
|
FD_STDIN]->ff_file == NULL) |
FD_STDIN]->ff_file == NULL) |
continue; |
continue; |
break; |
break; |
Line 733 fdesc_readdir(void *v) |
|
Line 728 fdesc_readdir(void *v) |
|
*cookies++ = i + 1; |
*cookies++ = i + 1; |
} |
} |
} else { |
} else { |
int nfdp = fdp ? fdp->fd_nfiles : 0; |
|
membar_consumer(); |
membar_consumer(); |
if (ap->a_ncookies) { |
if (ap->a_ncookies) { |
ncookies = min(ncookies, nfdp + 2); |
ncookies = min(ncookies, dt->dt_nfiles + 2); |
cookies = malloc(ncookies * sizeof(off_t), |
cookies = malloc(ncookies * sizeof(off_t), |
M_TEMP, M_WAITOK); |
M_TEMP, M_WAITOK); |
*ap->a_cookies = cookies; |
*ap->a_cookies = cookies; |
*ap->a_ncookies = ncookies; |
*ap->a_ncookies = ncookies; |
} |
} |
for (; i - 2 < nfdp && uio->uio_resid >= UIO_MX; i++) { |
for (; i - 2 < dt->dt_nfiles && uio->uio_resid >= UIO_MX; i++) { |
switch (i) { |
switch (i) { |
case 0: |
case 0: |
case 1: |
case 1: |
Line 754 fdesc_readdir(void *v) |
|
Line 748 fdesc_readdir(void *v) |
|
break; |
break; |
|
|
default: |
default: |
KASSERT(fdp != NULL); |
|
j = (int)i - 2; |
j = (int)i - 2; |
if (fdp == NULL || fdp->fd_ofiles[j] == NULL || |
if (dt->dt_ff[j] == NULL || |
fdp->fd_ofiles[j]->ff_file == NULL) |
dt->dt_ff[j]->ff_file == NULL) |
continue; |
continue; |
d.d_fileno = j + FD_STDIN; |
d.d_fileno = j + FD_STDIN; |
d.d_namlen = sprintf(d.d_name, "%d", j); |
d.d_namlen = sprintf(d.d_name, "%d", j); |