fdopendir.c raw

   1  #include <dirent.h>
   2  #include <fcntl.h>
   3  #include <sys/stat.h>
   4  #include <errno.h>
   5  #include <stdlib.h>
   6  #include "__dirent.h"
   7  
   8  DIR *fdopendir(int fd)
   9  {
  10  	DIR *dir;
  11  	struct stat st;
  12  
  13  	if (fstat(fd, &st) < 0) {
  14  		return 0;
  15  	}
  16  	if (fcntl(fd, F_GETFL) & O_PATH) {
  17  		errno = EBADF;
  18  		return 0;
  19  	}
  20  	if (!S_ISDIR(st.st_mode)) {
  21  		errno = ENOTDIR;
  22  		return 0;
  23  	}
  24  	if (!(dir = calloc(1, sizeof *dir))) {
  25  		return 0;
  26  	}
  27  
  28  	fcntl(fd, F_SETFD, FD_CLOEXEC);
  29  	dir->fd = fd;
  30  	return dir;
  31  }
  32