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
15void 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
30int 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

source code of compiler-rt/test/sanitizer_common/TestCases/Posix/variadic-open.cpp