#include #include #include #include #include #include #include #include #include #define TIMEOUT 5 #define BUF_SIZE 256 static sig_atomic_t end; int test_getcwd(char *init_cwd) { int i = 0; char cur_cwd[BUF_SIZE]; while (1) { getcwd(cur_cwd, BUF_SIZE); if (strncmp(init_cwd, cur_cwd, BUF_SIZE)) { printf("[%u] %s != %s\n", i, init_cwd, cur_cwd); return 1; } if (end) break; i++; } return 0; } void do_rename(char *prefix) { int i = 0; int fd; char c_name[BUF_SIZE]; char n_name[BUF_SIZE]; strncpy(c_name, prefix, BUF_SIZE); fd = open(c_name, O_CREAT | O_RDWR, 0644); if (fd < 0) { fprintf(stderr, "failed to create file %s: %s\n", c_name, strerror(errno)); exit(1); } close(fd); while (1) { i++; snprintf(n_name, BUF_SIZE, "%s%u", prefix, i); rename(c_name, n_name); strncpy(c_name, n_name, BUF_SIZE); } } void sigproc(int sig) { end = 1; } int main(int argc, char *argv[]) { char *init_cwd; pid_t pid; int status; int ret = 1; if (argc != 2) { printf("Usage: %s \n", argv[0]); exit(1); } init_cwd = argv[1]; ret = chdir(init_cwd); if (ret < 0) { perror("chdir failed"); exit(1); } if (signal(SIGALRM, sigproc) == SIG_ERR) { perror("signal failed"); exit(1); } alarm(TIMEOUT); pid = fork(); if (pid < 0) { perror("fork failed"); exit(1); } else if (pid == 0) { do_rename("t_getcwd_testfile"); } else { ret = test_getcwd(init_cwd); kill(pid, SIGTERM); waitpid(pid, &status, 0); } exit(ret); }