#ifndef H_DIRINFO #define H_DIRINFO #include #include #include #include struct dirinfo { int fd; DIR* dp; struct stat stat; }; static inline void close_dirinfo(struct dirinfo* dirinfo) { if (dirinfo->fd > 0) close(dirinfo->fd); if (dirinfo->dp) closedir(dirinfo->dp); } static inline int openat_dirinfo(int dirfd, const char* path, struct dirinfo* dirinfo) { if ((dirinfo->fd = openat(dirfd, path, O_DIRECTORY|O_RDONLY)) == -1) goto err; if ((dirinfo->dp = fdopendir(dirinfo->fd)) == NULL) goto err; if (fstat(dirinfo->fd, &dirinfo->stat) == -1) goto err; return 1; err: close_dirinfo(dirinfo); return 0; } static inline int open_dirinfo(const char* path, struct dirinfo* dirinfo) { if ((dirinfo->fd = open(path, O_DIRECTORY|O_RDONLY)) == -1) goto err; if ((dirinfo->dp = fdopendir(dirinfo->fd)) == NULL) goto err; if (fstat(dirinfo->fd, &dirinfo->stat) == -1) goto err; return 1; err: close_dirinfo(dirinfo); return 0; } #endif