blob: 872426e1214014a39ee6a13b9b383984170f6329 [file] [log] [blame]
sewardj8eb8bab2015-07-21 14:44:28 +00001/* Test whether /proc/{self,$PID}/path/a.out is correctly simulated. */
2
3#include <limits.h>
4#include <stdio.h>
5#include <strings.h>
6#include <unistd.h>
7#include <sys/fcntl.h>
8
9static void test_readlink(const char *cwd, const char *label,
10 const char *path)
11{
12 char buf[PATH_MAX];
13 int n;
14
15 if ((n = readlink(path, buf, sizeof(buf) - 1)) >= 0) {
16 const char *p;
17 size_t len = strlen(cwd);
18
19 buf[n] = '\0';
20
21 p = buf;
22 if (!strncmp(buf, cwd, len))
23 p += len;
24 printf("Result of readlink(\"%s\"): %s\n", label, p);
25 }
26 else
27 perror("readlink");
28}
29
30static void test_readlinkat(const char *cwd, const char *label,
31 const char *path)
32{
33 char buf[PATH_MAX];
34 int n;
35
36 if ((n = readlinkat(AT_FDCWD, path, buf, sizeof(buf) - 1)) >= 0) {
37 const char *p;
38 size_t len = strlen(cwd);
39
40 buf[n] = '\0';
41
42 p = buf;
43 if (!strncmp(buf, cwd, len))
44 p += len;
45 printf("Result of readlinkat(\"%s\"): %s\n", label, p);
46 }
47 else
48 perror("readlinkat");
49}
50
51int main(void)
52{
53 char cwd[PATH_MAX];
54 char path[PATH_MAX];
55
56 cwd[0] = '\0';
57 if (!getcwd(cwd, sizeof(cwd) - 1)) /* '-1' to make room for '/' */
58 perror("getcwd");
59 strcat(cwd, "/");
60
61 snprintf(path, sizeof(path), "/proc/%ld/path/a.out", (long)getpid());
62
63 test_readlink(cwd, "/proc/self/path/a.out", "/proc/self/path/a.out");
64 test_readlink(cwd, "/proc/<pid>/path/a.out", path);
65
66 test_readlinkat(cwd, "/proc/self/path/a.out", "/proc/self/path/a.out");
67 test_readlinkat(cwd, "/proc/<pid>/path/a.out", path);
68
69 return 0;
70}
71