This source file includes following definitions.
- do_readlink
- 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 (readlinkat, ssize_t, (int, char const *, char *, size_t));
25
26 #include <fcntl.h>
27 #include <errno.h>
28 #include <stdbool.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <sys/stat.h>
33
34 #include "ignore-value.h"
35 #include "macros.h"
36
37 #ifndef HAVE_SYMLINK
38 # define HAVE_SYMLINK 0
39 #endif
40
41 #define BASE "test-readlinkat.t"
42
43 #include "test-readlink.h"
44
45 static int dfd = AT_FDCWD;
46
47 static ssize_t
48 do_readlink (char const *name, char *buf, size_t len)
49 {
50 return readlinkat (dfd, name, buf, len);
51 }
52
53 int
54 main (void)
55 {
56 char buf[80];
57 int result;
58
59
60 ignore_value (system ("rm -rf " BASE "*"));
61
62
63 {
64 errno = 0;
65 ASSERT (readlinkat (-1, "foo", buf, sizeof buf) == -1);
66 ASSERT (errno == EBADF);
67 }
68 {
69 close (99);
70 errno = 0;
71 ASSERT (readlinkat (99, "foo", buf, sizeof buf) == -1);
72 ASSERT (errno == EBADF);
73 }
74
75
76 result = test_readlink (do_readlink, false);
77 dfd = openat (AT_FDCWD, ".", O_RDONLY);
78 ASSERT (0 <= dfd);
79 ASSERT (test_readlink (do_readlink, false) == result);
80
81
82
83 if (HAVE_SYMLINK)
84 {
85 const char *contents = "don't matter!";
86 ssize_t exp = strlen (contents);
87
88
89 ASSERT (symlinkat (contents, AT_FDCWD, BASE "link") == 0);
90 errno = 0;
91 ASSERT (symlinkat (contents, dfd, BASE "link") == -1);
92 ASSERT (errno == EEXIST);
93 ASSERT (chdir ("..") == 0);
94 errno = 0;
95 ASSERT (readlinkat (AT_FDCWD, BASE "link", buf, sizeof buf) == -1);
96 ASSERT (errno == ENOENT);
97 ASSERT (readlinkat (dfd, BASE "link", buf, sizeof buf) == exp);
98 ASSERT (strncmp (contents, buf, exp) == 0);
99 ASSERT (unlinkat (dfd, BASE "link", 0) == 0);
100
101
102 ASSERT (symlinkat (contents, dfd, BASE "link") == 0);
103 ASSERT (fchdir (dfd) == 0);
104 errno = 0;
105 ASSERT (symlinkat (contents, AT_FDCWD, BASE "link") == -1);
106 ASSERT (errno == EEXIST);
107 buf[0] = '\0';
108 ASSERT (readlinkat (AT_FDCWD, BASE "link", buf, sizeof buf) == exp);
109 ASSERT (strncmp (contents, buf, exp) == 0);
110 buf[0] = '\0';
111 ASSERT (readlinkat (dfd, BASE "link", buf, sizeof buf) == exp);
112 ASSERT (strncmp (contents, buf, exp) == 0);
113 ASSERT (unlink (BASE "link") == 0);
114 }
115
116 ASSERT (close (dfd) == 0);
117 if (result == 77)
118 fputs ("skipping test: symlinks not supported on this file system\n",
119 stderr);
120 return result;
121 }