version 1.144, 2006/12/09 16:11:52 |
version 1.145, 2006/12/26 14:50:08 |
Line 1595 ufs_readdir(void *v) |
|
Line 1595 ufs_readdir(void *v) |
|
int error; |
int error; |
size_t count, ccount, rcount; |
size_t count, ccount, rcount; |
off_t off, *ccp; |
off_t off, *ccp; |
|
off_t startoff; |
|
size_t skipbytes; |
struct ufsmount *ump = VFSTOUFS(vp->v_mount); |
struct ufsmount *ump = VFSTOUFS(vp->v_mount); |
int nswap = UFS_MPNEEDSWAP(ump); |
int nswap = UFS_MPNEEDSWAP(ump); |
#if BYTE_ORDER == LITTLE_ENDIAN |
#if BYTE_ORDER == LITTLE_ENDIAN |
Line 1609 ufs_readdir(void *v) |
|
Line 1611 ufs_readdir(void *v) |
|
if (rcount < _DIRENT_MINSIZE(cdp) || count < _DIRENT_MINSIZE(ndp)) |
if (rcount < _DIRENT_MINSIZE(cdp) || count < _DIRENT_MINSIZE(ndp)) |
return EINVAL; |
return EINVAL; |
|
|
|
startoff = uio->uio_offset & ~(ump->um_dirblksiz - 1); |
|
skipbytes = uio->uio_offset - startoff; |
|
rcount += skipbytes; |
|
|
auio.uio_iov = &aiov; |
auio.uio_iov = &aiov; |
auio.uio_iovcnt = 1; |
auio.uio_iovcnt = 1; |
auio.uio_offset = uio->uio_offset; |
auio.uio_offset = startoff; |
auio.uio_resid = rcount; |
auio.uio_resid = rcount; |
UIO_SETUP_SYSSPACE(&auio); |
UIO_SETUP_SYSSPACE(&auio); |
auio.uio_rw = UIO_READ; |
auio.uio_rw = UIO_READ; |
Line 1624 ufs_readdir(void *v) |
|
Line 1630 ufs_readdir(void *v) |
|
return error; |
return error; |
} |
} |
|
|
rcount = rcount - auio.uio_resid; |
rcount -= auio.uio_resid; |
|
|
cdp = (struct direct *)(void *)cdbuf; |
cdp = (struct direct *)(void *)cdbuf; |
ecdp = (struct direct *)(void *)&cdbuf[rcount]; |
ecdp = (struct direct *)(void *)&cdbuf[rcount]; |
Line 1646 ufs_readdir(void *v) |
|
Line 1652 ufs_readdir(void *v) |
|
|
|
while (cdp < ecdp) { |
while (cdp < ecdp) { |
cdp->d_reclen = ufs_rw16(cdp->d_reclen, nswap); |
cdp->d_reclen = ufs_rw16(cdp->d_reclen, nswap); |
|
if (skipbytes > 0) { |
|
if (cdp->d_reclen <= skipbytes) { |
|
skipbytes -= cdp->d_reclen; |
|
cdp = _DIRENT_NEXT(cdp); |
|
continue; |
|
} |
|
/* |
|
* invlid cookie. |
|
*/ |
|
error = EINVAL; |
|
goto out; |
|
} |
if (cdp->d_reclen == 0) { |
if (cdp->d_reclen == 0) { |
struct dirent *ondp = ndp; |
struct dirent *ondp = ndp; |
ndp->d_reclen = _DIRENT_MINSIZE(ndp); |
ndp->d_reclen = _DIRENT_MINSIZE(ndp); |
Line 1678 ufs_readdir(void *v) |
|
Line 1696 ufs_readdir(void *v) |
|
cdp = _DIRENT_NEXT(cdp); |
cdp = _DIRENT_NEXT(cdp); |
} |
} |
|
|
if (cdp >= ecdp) |
|
off = uio->uio_offset + rcount; |
|
|
|
count = ((char *)(void *)ndp - ndbuf); |
count = ((char *)(void *)ndp - ndbuf); |
error = uiomove(ndbuf, count, uio); |
error = uiomove(ndbuf, count, uio); |
|
out: |
if (ap->a_cookies) { |
if (ap->a_cookies) { |
if (error) |
if (error) |
free(*(ap->a_cookies), M_TEMP); |
free(*(ap->a_cookies), M_TEMP); |