mirror of
https://github.com/opnsense/src.git
synced 2026-02-28 04:10:49 -05:00
Introduce vfs_read_dirent() which can help VOP_READDIR() implementations
by handling all the cookie stuff.
This commit is contained in:
parent
21806f30bc
commit
2883ba6668
2 changed files with 29 additions and 0 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -727,6 +727,8 @@ void vfs_hash_rehash(struct vnode *vp, u_int hash);
|
|||
void vfs_hash_remove(struct vnode *vp);
|
||||
|
||||
int vfs_kqfilter(struct vop_kqfilter_args *);
|
||||
struct dirent;
|
||||
int vfs_read_dirent(struct vop_readdir_args *ap, struct dirent *dp, off_t off);
|
||||
|
||||
#endif /* _KERNEL */
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue