The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Интерактивная система просмотра системных руководств (man-ов)

 ТемаНаборКатегория 
 
 [Cписок руководств | Печать]

VOP_READDIR (9)
  • >> VOP_READDIR (9) ( FreeBSD man: Ядро )

  • BSD mandoc
     

    NAME

    VOP_READDIR
    
     - read contents of a directory
    
     
    

    SYNOPSIS

       #include <sys/param.h>
       #include <sys/dirent.h>
       #include <sys/vnode.h>
    int VOP_READDIR (struct vnode *vp struct uio *uio struct ucred *cred int *eofflag int *ncookies u_long **cookies);
     

    DESCRIPTION

    Read directory entries.

    Fa vp
    The vnode of the directory.
    Fa uio
    Where to read the directory contents.
    Fa cred
    The caller's credentials.
    Fa eofflag
    Return end of file status ( NULL if not wanted).
    Fa ncookies
    Number of directory cookies generated for NFS ( NULL if not wanted).
    Fa cookies
    Directory seek cookies generated for NFS ( NULL if not wanted).

    The directory contents are read into Vt struct dirent structures. If the on-disc data structures differ from this then they should be translated.  

    LOCKS

    The directory should be locked on entry and will still be locked on exit.  

    RETURN VALUES

    Zero is returned on success, otherwise an error code is returned.

    If this is called from the NFS server, the extra arguments Fa eofflag , Fa ncookies and Fa cookies are given. The value of Fa *eofflag should be set to TRUE if the end of the directory is reached while reading. The directory seek cookies are returned to the NFS client and may be used later to restart a directory read part way through the directory. There should be one cookie returned per directory entry. The value of the cookie should be the offset within the directory where the on-disc version of the appropriate directory entry starts. Memory for the cookies should be allocated using:

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

    PSEUDOCODE

    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;
    
        /*
         * Remember the original offset to use later in generating cookies.
         */
        off = uio->uio_offset;
    
        /*
         * Read directory contents starting at uio->uio_offset into buffer
         * pointed to by 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");
    
            /*
             * Parse the stuff just read into the uio.
             */
            dpStart = (struct dirent *)
                ((char *)uio->uio_iov->iov_base - (uio->uio_offset - off));
            dpEnd = (struct dirent *) uio->uio_iov->iov_base;
    
            /*
             * Count number of entries.
             */
            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;
    }
    
     

    ERRORS

    Bq Er EINVAL
    An attempt was made to read from an illegal offset in the directory.
    Bq Er EIO
    A read error occurred while reading the directory.

     

    SEE ALSO

    vnode(9)  

    AUTHORS

    This manual page was written by An Doug Rabson .


     

    Index

    NAME
    SYNOPSIS
    DESCRIPTION
    LOCKS
    RETURN VALUES
    PSEUDOCODE
    ERRORS
    SEE ALSO
    AUTHORS


    Поиск по тексту MAN-ов: 




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру