1 | // RUN: %clangxx -O1 %s -o %t |
2 | // RUN: rm -rf %t.tmp |
3 | // RUN: %run %t 1 |
4 | // RUN: %run %t 2 |
5 | |
6 | #include <assert.h> |
7 | #include <errno.h> |
8 | #include <fcntl.h> |
9 | #include <stdio.h> |
10 | #include <stdlib.h> |
11 | #include <string.h> |
12 | #include <sys/stat.h> |
13 | #include <unistd.h> |
14 | |
15 | void test(const char *path, int flags) { |
16 | int fd = open(file: path, oflag: flags, 0600); |
17 | if (fd == -1) { |
18 | perror(s: path); |
19 | if (errno == EOPNOTSUPP || errno == EINVAL) |
20 | return; |
21 | } |
22 | assert(fd != -1); |
23 | struct stat info; |
24 | int result = fstat(fd: fd, buf: &info); |
25 | assert((info.st_mode & ~S_IFMT) == 0600); |
26 | assert(result == 0); |
27 | close(fd: fd); |
28 | } |
29 | |
30 | int main(int argc, char *argv[]) { |
31 | assert(argc == 2); |
32 | char buff[10000]; |
33 | sprintf(s: buff, format: "%s.tmp" , argv[0]); |
34 | if (atoi(nptr: argv[1]) == 1) { |
35 | unlink(name: buff); |
36 | test(path: buff, O_RDWR | O_CREAT); |
37 | } |
38 | |
39 | #ifdef O_TMPFILE |
40 | if (atoi(nptr: argv[1]) == 2) { |
41 | char *last = strrchr(s: buff, c: '/'); |
42 | assert(last); |
43 | *last = 0; |
44 | test(path: buff, O_RDWR | O_TMPFILE); |
45 | } |
46 | #endif |
47 | } |
48 | |