diff options
author | Poul-Henning Kamp <phk@FreeBSD.org> | 2005-09-12 08:46:07 +0000 |
---|---|---|
committer | Poul-Henning Kamp <phk@FreeBSD.org> | 2005-09-12 08:46:07 +0000 |
commit | 2883ba6668871d6b3ffcdfdce4fac26d64321e63 (patch) | |
tree | 7f8b642fd395417090848de585ef5194b216f583 /sys/kern/vfs_subr.c | |
parent | 21806f30bc79a63a3af027a6b7429f979c5e0c88 (diff) | |
download | src-2883ba6668871d6b3ffcdfdce4fac26d64321e63.tar.gz src-2883ba6668871d6b3ffcdfdce4fac26d64321e63.zip |
Introduce vfs_read_dirent() which can help VOP_READDIR() implementations
by handling all the cookie stuff.
Notes
Notes:
svn path=/head/; revision=150020
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r-- | sys/kern/vfs_subr.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 19dc5380a54e..461ed1a45f2b 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$"); #include <sys/bio.h> #include <sys/buf.h> #include <sys/conf.h> +#include <sys/dirent.h> #include <sys/event.h> #include <sys/eventhandler.h> #include <sys/extattr.h> @@ -3838,3 +3839,29 @@ filt_vfsvnode(struct knote *kn, long hint) } return (kn->kn_fflags != 0); } + +int +vfs_read_dirent(struct vop_readdir_args *ap, struct dirent *dp, off_t off) +{ + int error; + + if (dp->d_reclen > ap->a_uio->uio_resid) + return (ENAMETOOLONG); + error = uiomove(dp, dp->d_reclen, ap->a_uio); + if (error) { + if (ap->a_ncookies != NULL) { + if (ap->a_cookies != NULL) + free(ap->a_cookies, M_TEMP); + ap->a_cookies = NULL; + *ap->a_ncookies = 0; + } + return (error); + } + if (ap->a_ncookies == NULL) + return (0); + *ap->a_cookies = realloc(*ap->a_cookies, + (*ap->a_ncookies + 1) * sizeof(u_long), M_TEMP, M_WAITOK | M_ZERO); + (*ap->a_cookies)[*ap->a_ncookies] = off; + return (0); +} + |