llvm/compiler-rt/test/sanitizer_common/TestCases/Posix/variadic-open.cpp

// RUN: %clangxx -O1 %s -o %t
// RUN: rm -rf %t.tmp
// RUN: %run %t 1
// RUN: %run %t 2

#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>

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
}