• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) International Business Machines  Corp., 2001
3  *
4  * This program is free software;  you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY;  without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
12  * the GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.
16  */
17 
18 /*
19  * DESCRIPTION
20  * Testcase to check the basic functionality of the getcwd(2)
21  * system call on a symbolic link.
22  *
23  * ALGORITHM
24  * 1) create a directory, and create a symbolic link to it at the
25  *    same directory level.
26  * 2) get the working directory of a directory, and its pathname.
27  * 3) get the working directory of a symbolic link, and its pathname,
28  *    and its readlink info.
29  * 4) compare the working directories and link information.
30  */
31 
32 #define _GNU_SOURCE 1
33 #include <errno.h>
34 #include <stdio.h>
35 #include <string.h>
36 #include <stdlib.h>
37 #include <sys/stat.h>
38 #include <sys/types.h>
39 #include <stdlib.h>
40 #include "tst_test.h"
41 
42 static char dir[BUFSIZ], dir_link[BUFSIZ];
43 
verify_getcwd(void)44 static void verify_getcwd(void)
45 {
46 	char link[BUFSIZ];
47 	char *res1 = NULL;
48 	char *res2 = NULL;
49 
50 	SAFE_CHDIR(dir);
51 
52 	res1 = getcwd(NULL, 0);
53 	if (!res1) {
54 		tst_res(TFAIL | TERRNO, "getcwd() failed to "
55 			"get working directory of a directory");
56 		goto end;
57 	}
58 
59 	SAFE_CHDIR("..");
60 	SAFE_CHDIR(dir_link);
61 
62 	res2 = getcwd(NULL, 0);
63 	if (!res2) {
64 		tst_res(TFAIL | TERRNO, "getcwd() failed to get "
65 			"working directory of a symbolic link");
66 		goto end;
67 	}
68 
69 	if (strcmp(res1, res2)) {
70 		tst_res(TFAIL,
71 			"getcwd() got mismatched working directories (%s, %s)",
72 			res1, res2);
73 		goto end;
74 	}
75 
76 	SAFE_CHDIR("..");
77 	SAFE_READLINK(dir_link, link, sizeof(link));
78 
79 	if (strcmp(link, SAFE_BASENAME(res1))) {
80 		tst_res(TFAIL,
81 			"link information didn't match the working directory");
82 		goto end;
83 	}
84 
85 	tst_res(TPASS, "getcwd() succeeded on a symbolic link");
86 
87 end:
88 	free(res1);
89 	free(res2);
90 }
91 
setup(void)92 static void setup(void)
93 {
94 	sprintf(dir, "getcwd1.%d", getpid());
95 	sprintf(dir_link, "getcwd2.%d", getpid());
96 	SAFE_MKDIR(dir, 0755);
97 	SAFE_SYMLINK(dir, dir_link);
98 }
99 
100 static struct tst_test test = {
101 	.needs_tmpdir = 1,
102 	.setup = setup,
103 	.test_all = verify_getcwd
104 };
105