VOP_READDIR(9)

명칭
VOP_READDIR - 디렉토리 내용의 독포함

서식
<sys/param.h> <sys/dirent.h> <sys/vnode.h> int VOP_READDIR(struct vnode *vp, struct uio *uio, struct ucred *cred, int *eofflag, int *ncookies, u_long **cookies)

해설
디렉토리 엔트리를 독 붐빕니다.

vp  디렉토리의 vnode 입니다.

uio 디렉토리 내용을 독 붐비는 장소입니다.

cred
    호출측의 증명입니다.

eofflag
    파일 종단 상태를 돌려줍니다 (필요한 차면 NULL).

ncookies
    NFS 를 위해서(때문에) 작성된 디렉토리 쿠키의 수입니다 (필요한 차면 NULL).

cookies
    NFS 를 위한 디렉토리 검색 쿠키입니다 (필요한 차면 NULL).

디렉토리 내용은 struct dirent 구조체에 독 붐비어집니다. 디스크상의 구조체가 이것과 다른 경우, 변환이 필요합니다.

락
디렉토리는 엔트리시에 락 되고 있어야 하는 것이어, 종료시까지 락 됩니다.

반환값
성공시에는 0 이 돌려주어져 그렇지 않으면 에러 코드가 돌려주어집니다.

NFS 서버로부터 불려 갔을 경우에는, 추가의 인수 eofflag, ncookies 및 cookies 하지만 주어집니다. *eofflag 의 값은, 독포함중에 디렉토리의 마지막에 달했을 경우에는, TRUE 로 설정되어야 합니다. 디렉토리 검색 쿠키는 NFS 클라이언트에 돌려주어져 다음에 그 디렉토리를 통해 디렉토리의 독포함을 재개하기 위해서 사용될 수가 있습니다. 디렉토리 엔트리마다 1 개의 쿠키가 돌려주어져야 합니다. 쿠키의 값은, 디렉토리내의 오프셋(offset)이며, 대응하는 디스크상의 디렉토리 엔트리가 거기로부터 개시합니다. 쿠키를 위한 메모리는 이하를 사용해 할당할 수 있어야 합니다.

    	...;
    	*ncookies = number of entries read;
    	*cookies = (u_int*)#
    		malloc(*ncookies * sizeof(u_int), M_TEMP, M_WAITOK);

유사 코드

    int
    vop_readdir(struct vnode *vp, struct uio *uio, struct ucred *cred,
    	    int *eofflag, int *ncookies, u_int **cookies)
    {
        off_t off;
        int error = 0;
        /*
         * 쿠키의 생성시에 다음에 사용하기 위해서(때문에) 원의 오프셋(offset)를 기억합니다.
         */
        off = uio->uio_offset;
        /*
         * uio->uio_offset 로부터 시작되는 디렉토리 내용을 uio 에 의해
         * 가리켜지는 버퍼에 독 붐빕니다.
         */
        ...;
        if (! error && ncookies ! = NULL) {
    	struct dirent *dpStart;
    	struct dirent *dpEnd;
    	struct dirent *dp;
    	int count;
    	u_int *cookiebuf;
    	u_int *cookiep;
    	if (uio->uio_segflg ! = UIO_SYSSPACE || uio->uio_iovcnt ! = 1)
    	    panic("vop_readdir: unexpected uio from NFS server");
    	/*
    	 * 지금 uio 에 독 붐빈 요소를 해석합니다.
    	 */
    	dpStart = (struct dirent *)
    	    ((char *) uio->uio_iov->iov_base - (uio->uio_offset - off));
    	dpEnd = (struct dirent *) uio->uio_iov->iov_base;
    	/*
    	 * 엔트리수가 열거하고
    	 */
    	for (dp = dpStart, count = 0;
    	     dp < dpEnd;
    	     dp = (struct dirent *)((caddr_t) dp + dp->d_reclen))
    	    count++;
    	cookiebuf = (u_int *) malloc(count * sizeof(u_int), M_TEMP, M_WAITOK);
    	for (dp = dpStart; cookiep = cookiebuf;
    	     dp < dpEnd;
    	     dp = (struct dirent *)((caddr_t) dp + dp->d_reclen)) {
    	    off += dp->d_reclen;
    	    *cookiep++ = (u_int) off;
    	}
    	*ncookies = count;
    	*cookies = cookiebuf;
        }
        if (eofflag && uio->uio_offset is past the end of the directory) {
    	*eofflag = TRUE;
        }
        return error;
    }

에러

[EINVAL]
    디렉토리내의 부정한 오프셋(offset)로부터 독 붐비려고 했습니다.

[EIO]
    디렉토리의 독포함중에, 읽기 에러가 발생했습니다.

관련 항목
vnode(9)

AUTHORS
이 메뉴얼 페이지는 Doug Rabson 하지만 썼습니다.