generic: new case to test getcwd(2)
[xfstests-dev.git] / src / t_getcwd.c
1 #include <sys/types.h>
2 #include <sys/wait.h>
3 #include <errno.h>
4 #include <fcntl.h>
5 #include <signal.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <unistd.h>
10
11 #define TIMEOUT 5
12 #define BUF_SIZE 256
13
14 static sig_atomic_t end;
15
16 int test_getcwd(char *init_cwd)
17 {
18         int i = 0;
19         char cur_cwd[BUF_SIZE];
20         while (1) {
21                 getcwd(cur_cwd, BUF_SIZE);
22                 if (strncmp(init_cwd, cur_cwd, BUF_SIZE)) {
23                         printf("[%u] %s != %s\n", i, init_cwd, cur_cwd);
24                         return 1;
25                 }
26                 if (end)
27                         break;
28                 i++;
29         }
30         return 0;
31 }
32
33 void do_rename(char *prefix)
34 {
35         int i = 0;
36         int fd;
37         char c_name[BUF_SIZE];
38         char n_name[BUF_SIZE];
39
40         strncpy(c_name, prefix, BUF_SIZE);
41
42         fd = open(c_name, O_CREAT | O_RDWR, 0644);
43         if (fd < 0) {
44                 fprintf(stderr, "failed to create file %s: %s\n",
45                         c_name, strerror(errno));
46                 exit(1);
47         }
48         close(fd);
49
50         while (1) {
51                 i++;
52                 snprintf(n_name, BUF_SIZE, "%s%u", prefix, i);
53                 rename(c_name, n_name);
54                 strncpy(c_name, n_name, BUF_SIZE);
55         }
56 }
57
58 void sigproc(int sig)
59 {
60         end = 1;
61 }
62
63 int main(int argc, char *argv[])
64 {
65         char *init_cwd;
66         pid_t pid;
67         int status;
68         int ret = 1;
69
70         if (argc != 2) {
71                 printf("Usage: %s <dir>\n", argv[0]);
72                 exit(1);
73         }
74
75         init_cwd = argv[1];
76         ret = chdir(init_cwd);
77         if (ret < 0) {
78                 perror("chdir failed");
79                 exit(1);
80         }
81
82         if (signal(SIGALRM, sigproc) == SIG_ERR) {
83                 perror("signal failed");
84                 exit(1);
85         }
86
87         alarm(TIMEOUT);
88
89         pid = fork();
90         if (pid < 0) {
91                 perror("fork failed");
92                 exit(1);
93         } else if (pid == 0) {
94                 do_rename("t_getcwd_testfile");
95         } else {
96                 ret = test_getcwd(init_cwd);
97                 kill(pid, SIGTERM);
98                 waitpid(pid, &status, 0);
99         }
100
101         exit(ret);
102 }