1 #define _GNU_SOURCE 2 #include <dirent.h> 3 #include <fcntl.h> 4 #include <stdlib.h> 5 #include <stdio.h> 6 #include "__dirent.h" 7 #include "syscall.h" 8 __get_dir_tag(DIR * dir)9uint64_t __get_dir_tag(DIR* dir) 10 { 11 return fdsan_create_owner_tag(FDSAN_OWNER_TYPE_DIRECTORY, (uint64_t)dir); 12 } 13 opendir(const char * name)14DIR *opendir(const char *name) 15 { 16 int fd; 17 DIR *dir; 18 19 if ((fd = open(name, O_RDONLY|O_DIRECTORY|O_CLOEXEC)) < 0) 20 return 0; 21 if (!(dir = calloc(1, sizeof *dir))) { 22 __syscall(SYS_close, fd); 23 return 0; 24 } 25 dir->fd = fd; 26 fdsan_exchange_owner_tag(fd, 0, __get_dir_tag(dir)); 27 return dir; 28 } 29