1 #include <stdio.h>
2 #include <unistd.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <fcntl.h>
6 #include <errno.h>
7 
8 /* backward compat in case it's not defined */
9 #ifndef O_TMPFILE
10 #define	O_TMPFILE	(020000000|O_DIRECTORY)
11 #endif
12 
13 /*
14  * DESCRIPTION:
15  *	Check if the kernel support O_TMPFILE.
16  */
17 
18 int
19 main(int argc, char *argv[])
20 {
21 	int fd;
22 	struct stat buf;
23 
24 	if (argc < 2) {
25 		fprintf(stderr, "Usage: %s dir\n", argv[0]);
26 		return (2);
27 	}
28 	if (stat(argv[1], &buf) < 0) {
29 		perror("stat");
30 		return (2);
31 	}
32 	if (!S_ISDIR(buf.st_mode)) {
33 		fprintf(stderr, "\"%s\" is not a directory\n", argv[1]);
34 		return (2);
35 	}
36 
37 	fd = open(argv[1], O_TMPFILE | O_WRONLY, 0666);
38 	if (fd < 0) {
39 		if (errno == EISDIR) {
40 			fprintf(stderr,
41 			    "The kernel doesn't support O_TMPFILE\n");
42 			return (1);
43 		} else if (errno == EOPNOTSUPP) {
44 			fprintf(stderr,
45 			    "The filesystem doesn't support O_TMPFILE\n");
46 			return (2);
47 		}
48 		perror("open");
49 	} else {
50 		close(fd);
51 	}
52 	return (0);
53 }
54