1 /*
2 *
3 * Copyright (c) International Business Machines Corp., 2002
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13 * the GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20 /* 10/31/2002 Port to LTP robbiew@us.ibm.com */
21 /* 06/30/2001 Port to Linux nsharoff@us.ibm.com */
22
23 /*
24 * NAME
25 * tools.c - Supporting functions for nftw.c
26 */
27
28 #include "nftw.h"
29
30 extern pathdata pathdat[];
31 extern struct list mnem[];
32 extern char ebuf[ERR_BUF_SIZ];
33 extern int npathdats, ngoods, nbads, nmnem;
34 extern FILE *temp;
35 void fail_exit(void);
36
37 /*
38 * Function: void cleanup_function(void)
39 *
40 * Description:
41 * Cleans the residues$
42 *
43 * Returns :
44 * Nothing
45 */
46
cleanup_function(void)47 void cleanup_function(void)
48 {
49 chmod("./tmp/data/d333", (mode_t) S_IRWXU | S_IRWXG | S_IRWXO);
50 chmod("./tmp/data/d666", (mode_t) S_IRWXU | S_IRWXG | S_IRWXO);
51 chmod("./tmp/data/dirg/dir_right.1", (mode_t) S_IRWXU | S_IRWXG |
52 S_IRWXO);
53 system("rm -rf ./tmp");
54 wait(NULL);
55 }
56
57 /*
58 * Function: void setup_path(void)
59 *
60 * Description:
61 * Setup the environment to run the nftw.c
62 *
63 * Returns :
64 * Nothing
65 */
66
setup_path(void)67 void setup_path(void)
68 {
69 int i, fd;
70 FILE *temp = stderr;
71
72 if (mkdir("./tmp", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1) {
73 sprintf(ebuf, "Can't mkdir ./tmp");
74 perror(ebuf);
75 fprintf(temp, "ERROR: setup_path function failed\n");
76 fail_exit();
77 }
78 for (i = 0; i < npathdats; i++) {
79 if (pathdat[i].type == DIR) {
80 if (mkdir(pathdat[i].name, pathdat[i].mode) == -1) {
81 sprintf(ebuf, "Can't mkdir %s %d",
82 pathdat[i].name, i);
83 perror(ebuf);
84 fprintf(temp,
85 "ERROR: setup_path function failed\n");
86 cleanup_function();
87 fail_exit();
88 }
89 } else if (pathdat[i].type == SYM) {
90 if (symlink(pathdat[i].contents, pathdat[i].name) == -1) {
91 sprintf(ebuf, "Can't symlink %s ",
92 pathdat[i].name);
93 perror(ebuf);
94 fprintf(temp,
95 "ERROR: setup_path function failed\n");
96 cleanup_function();
97 fail_exit();
98 }
99 } else {
100 if ((fd = open(pathdat[i].name, O_WRONLY | O_CREAT,
101 pathdat[i].mode)) == -1) {
102 sprintf(ebuf, "Can't open %s", pathdat[i].name);
103 perror(ebuf);
104 fprintf(temp,
105 "ERROR: setup_path function failed\n");
106 cleanup_function();
107 fail_exit();
108 }
109 if (write(fd, pathdat[i].contents,
110 strlen(pathdat[i].contents)) == -1) {
111 perror("Can't write");
112 close(fd);
113 fprintf(temp,
114 "ERROR: setup_path function failed\n");
115 cleanup_function();
116 fail_exit();
117 }
118 close(fd);
119 }
120 }
121
122 if (chmod("./tmp/data/d333", (mode_t) S_IWUSR | S_IXUSR | S_IWGRP |
123 S_IXGRP | S_IWOTH | S_IXOTH) == -1) {
124 sprintf(ebuf, "Can't chmod %s ", "./tmp/data/d333");
125 perror(ebuf);
126 fprintf(temp, "ERROR: setup_path function failed\n");
127 cleanup_function();
128 fail_exit();
129 }
130 if (chmod("./tmp/data/d666", (mode_t) S_IRUSR | S_IWUSR | S_IRGRP |
131 S_IWGRP | S_IROTH | S_IWOTH) == -1) {
132 sprintf(ebuf, "Can't chmod %s ", "./tmp/data/d666");
133 perror(ebuf);
134 fprintf(temp, "ERROR: setup_path function failed\n");
135 cleanup_function();
136 fail_exit();
137 }
138 if (chmod("./tmp/data/dirg/dir_right.1", (mode_t) S_IWUSR | S_IXUSR |
139 S_IWGRP | S_IXGRP | S_IWOTH | S_IXOTH) == -1) {
140 sprintf(ebuf, "Can't chmod %s ", "./tmp/data/dirg/dir_right.1");
141 perror(ebuf);
142 fprintf(temp, "ERROR: setup_path function failed\n");
143 cleanup_function();
144 fail_exit();
145 }
146 }
147
148 /*
149 * Function: int nftw_fn(const char, const struct stat, int, struct FTW )
150 *
151 * Description:
152 * Dummy function for errno tests
153 *
154 * Returns :
155 * 0
156 */
157
nftw_fn(const char * path,const struct stat * st,int ival,struct FTW * FTWS)158 int nftw_fn(const char *path, const struct stat *st, int ival, struct FTW *FTWS)
159 {
160 return (0);
161 }
162
163 /*
164 * Function: int callback(char *)
165 *
166 * Description:
167 * Dummy function for errno tests
168 *
169 * Returns :
170 * nftw()
171 */
172
callback(const char * path)173 int callback(const char *path)
174 {
175 return nftw(path, nftw_fn, 10, FTW_MOUNT);
176 }
177
178 /*
179 * Function: char * ftw_mnemonic(int)
180 *
181 * Description:
182 * Conversion function for printing
183 *
184 * Returns:
185 * String for printing
186 */
187
ftw_mnemonic(int x)188 char *ftw_mnemonic(int x)
189 {
190 static char s[STRLEN];
191 int i;
192
193 for (i = 0; i < nmnem; i++)
194 if (x == mnem[i].i)
195 return (mnem[i].s);
196
197 sprintf(s, "Unknown value for third argument to fn(): %d\n", x);
198 return (s);
199 }
200
201 /*
202 * Function: int getbase(char *)
203 *
204 * Description:
205 * Find basename
206 *
207 * Returns:
208 * Position of filename in path
209 */
210
getbase(const char * s)211 int getbase(const char *s)
212 {
213 int i, last = 0;
214
215 for (i = 0; *s != '\0'; s++, i++)
216 if (*s == '/')
217 last = i;
218 return (last ? last + 1 : 0);
219 }
220
221 /*
222 * Function: int getlev( char *);
223 *
224 * Description:
225 * Find level
226 *
227 * Returns:
228 * Number of /'s in path
229 */
230
getlev(const char * s)231 int getlev(const char *s)
232 {
233 int i;
234 for (i = 0; *s != '\0'; s++)
235 if (*s == '/')
236 i++;
237 return (i);
238 }
239
240 /*
241 * Function: void doinfo(char *);
242 *
243 * Description:
244 * print the file being visited
245 *
246 * Returns:
247 * Nothing
248 */
249
do_info(const char * path_name)250 void do_info(const char *path_name)
251 {
252
253 #ifdef DEBUG
254 fprintf(temp, "INFO: Call to fn() at %s\n", path_name);
255 #endif
256
257 }
258
259 /** LTP Port **/
260 /*
261 * fail_exit()
262 *
263 * Exit on failure
264 */
fail_exit(void)265 void fail_exit(void)
266 {
267 tst_brkm(TFAIL, NULL, "Test failed");
268 }
269
270 /**************/
271