// RUN: %clangxx -O1 %s -o %t // RUN: rm -rf %t.tmp // RUN: %run %t 1 // RUN: %run %t 2 #include #include #include #include #include #include #include #include void test(const char *path, int flags) { int fd = open(path, flags, 0600); if (fd == -1) { perror(path); if (errno == EOPNOTSUPP || errno == EINVAL) return; } assert(fd != -1); struct stat info; int result = fstat(fd, &info); assert((info.st_mode & ~S_IFMT) == 0600); assert(result == 0); close(fd); } int main(int argc, char *argv[]) { assert(argc == 2); char buff[10000]; sprintf(buff, "%s.tmp", argv[0]); if (atoi(argv[1]) == 1) { unlink(buff); test(buff, O_RDWR | O_CREAT); } #ifdef O_TMPFILE if (atoi(argv[1]) == 2) { char *last = strrchr(buff, '/'); assert(last); *last = 0; test(buff, O_RDWR | O_TMPFILE); } #endif }