diff options
Diffstat (limited to 'util')
-rw-r--r-- | util/osdep.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/util/osdep.c b/util/osdep.c index 42a0a4986a..67fbf22778 100644 --- a/util/osdep.c +++ b/util/osdep.c @@ -33,6 +33,7 @@ extern int madvise(char *, size_t, int); #endif +#include <dirent.h> #include "qemu-common.h" #include "qemu/cutils.h" #include "qemu/sockets.h" @@ -615,3 +616,23 @@ writev(int fd, const struct iovec *iov, int iov_cnt) return readv_writev(fd, iov, iov_cnt, true); } #endif + +struct dirent * +qemu_dirent_dup(struct dirent *dent) +{ + size_t sz = 0; +#if defined _DIRENT_HAVE_D_RECLEN + /* Avoid use of strlen() if platform supports d_reclen. */ + sz = dent->d_reclen; +#endif + /* + * Test sz for zero even if d_reclen is available + * because some drivers may set d_reclen to zero. + */ + if (sz == 0) { + /* Fallback to the most portable way. */ + sz = offsetof(struct dirent, d_name) + + strlen(dent->d_name) + 1; + } + return g_memdup(dent, sz); +} |