1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <sys/xattr.h>
7 #include <fcntl.h>
8 #include <errno.h>
9 #include <string.h>
10 #include <time.h>
11 #include <err.h>
12
13 /* backward compat in case it's not defined */
14 #ifndef O_TMPFILE
15 #define O_TMPFILE (020000000|O_DIRECTORY)
16 #endif
17
18 /*
19 * DESCRIPTION:
20 * Verify we can create tmpfile.
21 *
22 * STRATEGY:
23 * 1. open(2) with O_TMPFILE.
24 * 2. write(2) random data to it, then read(2) and compare.
25 * 3. fsetxattr(2) random data, then fgetxattr(2) and compare.
26 * 4. Verify the above operations run successfully.
27 *
28 */
29
30 #define BSZ 64
31
32 static void
fill_random(char * buf,int len)33 fill_random(char *buf, int len)
34 {
35 srand(time(NULL));
36 for (int i = 0; i < len; i++)
37 buf[i] = (char)(rand() % 0xFF);
38 }
39
40 int
main(void)41 main(void)
42 {
43 char buf1[BSZ], buf2[BSZ] = {0};
44
45 (void) fprintf(stdout, "Verify O_TMPFILE is working properly.\n");
46
47 const char *testdir = getenv("TESTDIR");
48 if (testdir == NULL)
49 errx(1, "getenv(\"TESTDIR\")");
50
51 fill_random(buf1, BSZ);
52
53 int fd = open(testdir, O_RDWR|O_TMPFILE, 0666);
54 if (fd < 0)
55 err(2, "open(%s)", testdir);
56
57 if (write(fd, buf1, BSZ) < 0)
58 err(3, "write");
59
60 if (pread(fd, buf2, BSZ, 0) < 0)
61 err(4, "pread");
62
63 if (memcmp(buf1, buf2, BSZ) != 0)
64 errx(5, "data corrupted");
65
66 memset(buf2, 0, BSZ);
67
68 if (fsetxattr(fd, "user.test", buf1, BSZ, 0) < 0)
69 err(6, "pread");
70
71 if (fgetxattr(fd, "user.test", buf2, BSZ) < 0)
72 err(7, "fgetxattr");
73
74 if (memcmp(buf1, buf2, BSZ) != 0)
75 errx(8, "xattr corrupted\n");
76
77 return (0);
78 }
79