This source file includes following definitions.
- do_chown
- do_lchown
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <config.h>
20
21 #include <unistd.h>
22
23 #include "signature.h"
24 SIGNATURE_CHECK (fchownat, int, (int, char const *, uid_t, gid_t, int));
25
26 #include <fcntl.h>
27 #include <errno.h>
28 #include <stdbool.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <sys/stat.h>
32
33 #include "mgetgroups.h"
34 #include "openat.h"
35 #include "stat-time.h"
36 #include "ignore-value.h"
37 #include "macros.h"
38
39 #ifndef BASE
40 # define BASE "test-fchownat.t"
41 #endif
42
43 #include "test-chown.h"
44 #include "test-lchown.h"
45
46 static int dfd = AT_FDCWD;
47
48
49 static int
50 do_chown (char const *name, uid_t user, gid_t group)
51 {
52 #ifdef TEST_CHOWNAT
53 return chownat (dfd, name, user, group);
54 #else
55 return fchownat (dfd, name, user, group, 0);
56 #endif
57 }
58
59
60 static int
61 do_lchown (char const *name, uid_t user, gid_t group)
62 {
63 #ifdef TEST_CHOWNAT
64 return lchownat (dfd, name, user, group);
65 #else
66 return fchownat (dfd, name, user, group, AT_SYMLINK_NOFOLLOW);
67 #endif
68 }
69
70 int
71 main (_GL_UNUSED int argc, char *argv[])
72 {
73 int result1;
74 int result2;
75
76
77 ignore_value (system ("rm -rf " BASE "*"));
78
79
80 {
81 errno = 0;
82 ASSERT (fchownat (-1, "foo", getuid (), getgid (), 0) == -1);
83 ASSERT (errno == EBADF);
84 }
85 {
86 close (99);
87 errno = 0;
88 ASSERT (fchownat (99, "foo", getuid (), getgid (), 0) == -1);
89 ASSERT (errno == EBADF);
90 }
91
92
93 result1 = test_chown (do_chown, true);
94 result2 = test_lchown (do_lchown, result1 == 0);
95 dfd = open (".", O_RDONLY);
96 ASSERT (0 <= dfd);
97 ASSERT (test_chown (do_chown, false) == result1);
98 ASSERT (test_lchown (do_lchown, false) == result2);
99
100 ASSERT (result1 <= result2);
101 ASSERT (close (dfd) == 0);
102
103
104 return result1 | result2;
105 }