fuse_fill_dir_t filler, off_t offset,
struct fuse_file_info *fi)
{
- __do_closedir DIR *dir = NULL;
+ __do_closedir DIR *dirp = NULL;
struct dirent *dirent;
struct file_info *f = INTTYPE_TO_PTR(fi->fh);
return filler_sys_devices_system_cpu(path, buf, filler);
case LXC_TYPE_SYS_DEVICES_SYSTEM_CPU_SUBDIR: {
- dir = opendir(path);
- if (!dir)
- return -ENOENT;
+ dirp = opathdir(path);
+ if (!dirp)
+ return -errno;
- while ((dirent = readdir(dir))) {
- if (dirent_fillerat(filler, dir, dirent, buf, 0) != 0)
+ while ((dirent = readdir(dirp))) {
+ if (dirent_fillerat(filler, dirp, dirent, buf, 0) != 0)
return -ENOENT;
}
return move_ptr(buf);
}
+
+DIR *opathdir(const char *path)
+{
+ __do_close int dfd = -EBADF;
+ DIR *dirp;
+
+ dfd = open(path, O_DIRECTORY | O_PATH | O_CLOEXEC | O_NOFOLLOW);
+ if (dfd < 0)
+ return NULL;
+
+ dirp = fdopendir(dfd);
+ if (dirp)
+ move_fd(dfd); /* Transfer ownership to fdopendir(). */
+
+ return dirp;
+}
extern FILE *fopen_cached(const char *path, const char *mode,
void **caller_freed_buffer);
extern FILE *fdopen_cached(int fd, const char *mode, void **caller_freed_buffer);
+extern DIR *opathdir(const char *path);
extern ssize_t write_nointr(int fd, const void *buf, size_t count);
extern int safe_uint64(const char *numstr, uint64_t *converted, int base);
extern char *trim_whitespace_in_place(char *buffer);