Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
sanitize the use of logs in unit testing of parmap to fix supernovae
[simgrid.git] / tools / tesh2 / src / getpath.c
1 #include <com.h>\r
2 \r XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);
3 \r\r
4 /*#include <stdlib.h>\r
5 #include <string.h>\r
6 \r
7 */ \r
8     \r
9 #include <sys/types.h>\r
10 #include <sys/stat.h>\r
11     \r
12 #ifndef _XBT_WIN32\r
13 #include <pwd.h>\r
14 #else   /* \r */
15 #endif  /* \r */
16     \r
17 #include <errno.h>\r
18 #include <getpath.h>\r
19     \r
20 #ifndef PATH_MAX\r
21 #define PATH_MAX 255\r
22 #endif  /* \r */
23     \r
24 #ifndef _XBT_WIN32\r
25 int \r getpath(const char *file, char **path) \r
26 {
27   \rchar buffer1[PATH_MAX + 1] = { 0 };
28   \rchar buffer2[PATH_MAX + 1] = { 0 };
29   \rchar buffer3[PATH_MAX + 1] = { 0 };
30   \rchar *p1, *p2;
31   \rsize_t len = strlen(file);
32   \rchar *last_delimiter = NULL;
33   \rstruct stat buffer = { 0 };
34   \r\rstrncpy(buffer1, file, len);
35   \r\r
36       /* remove the /////// */ \r
37       while ((p1 = strstr(buffer1, "//")))
38     \r {
39     \rif (p1[2])
40       \rstrcpy(p1, p1 + 1);
41     \r
42     else
43       \rp1[1] = '\0';
44     \r}
45   \r\rif (*buffer1 == '~')
46     \r {
47     \rfor (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/');
48           *p2++ = *p1++);
49     \r*p2 = '\0';
50     \r\rif (buffer2[0] == '\0')
51       \r {
52       \rchar *home = getenv("HOME");
53       \r\rif (home)
54         \r {
55         \rstrcpy(buffer2, home);
56         \r}
57       \r
58       else
59         \r {
60         \rstruct passwd *pw = getpwuid(getuid());
61         \r\rif (!pw)
62           \r {
63           \r*path = NULL;
64           \rreturn -1;
65           \r}
66         \r\rstrcpy(buffer2, pw->pw_dir);
67         \r}
68       \r\rstrcat(buffer2, p1);
69       \r}
70     \r\r}
71   \r
72   else if (buffer1[0] != '/')
73     \r {
74     \r\rgetcwd(buffer2, PATH_MAX + 1);
75     \r\rif (buffer1[0] == '.' && buffer1[1] == '/')
76       \r {                       /* replace */
77       \rstrcat(buffer2, &buffer1[1]);
78       \r}
79     \r
80     else
81       \r {
82       \rstrcat(buffer2, "/");
83       \rstrcat(buffer2, buffer1);
84       \r}
85     \r}
86   \r
87   else
88     \r {
89     \rstrcpy(buffer2, buffer1);  /* copy */
90     \r}
91   \r\r
92       /*\r
93        * check for /..\r
94        */ \r
95       while ((p1 = strstr(buffer2, "/..")))
96     \r {
97     \rfor (p2 = p1; --p2 > buffer2 && *p2 != '/';);
98     \r\rif (*(p1 + 3))
99       \rmemmove(p2, p1 + 3, strlen(p1 + 3) + 1);
100     \r
101     else
102       \r*p2 = '\0';
103     \r}
104   \r\r
105       /*\r
106        * try to find links, and resolve them.\r
107        */ \r
108       p1 = strtok(buffer2, "/");
109   \r\r*buffer3 = '\0';
110   \r\rwhile (p1)
111     \r {
112     \rstrcat(buffer3, "/");
113     \rstrcat(buffer3, p1);
114     \r\rlen = readlink(buffer3, buffer1, PATH_MAX);
115     \r\rif (len != -1)
116       \r {
117       \r*(buffer1 + len) = '\0';
118       \rstrcpy(buffer3, buffer1);
119       \r}
120     \r\rp1 = strtok(NULL, "/");
121     \r}
122   \r\rif (stat(buffer3, &buffer) || !S_ISREG(buffer.st_mode))
123     \r {
124     \r*path = NULL;
125     \rerrno = ENOENT;
126     \rreturn -1;
127     \r}
128   \r\rlast_delimiter = strrchr(buffer3, '/');
129   \r\rlen = strlen(buffer3);
130   \r\rif (last_delimiter)
131     \rlen -= strlen(last_delimiter);
132   \r\r*path = (char *) calloc(len + 1, sizeof(char));
133   \r\rif (!(*path))
134     \r {
135     \r*path = NULL;
136     \rreturn -1;
137     \r}
138   \r\rstrncpy(*path, buffer3, len);
139   \r\rreturn len;
140 \r}
141
142 \r\rint \r translatepath(const char *totranslate, char **translated) \r
143 {
144   \rchar buffer1[PATH_MAX + 1] = { 0 };
145   \rchar buffer2[PATH_MAX + 1] = { 0 };
146   \rchar buffer3[PATH_MAX + 1] = { 0 };
147   \rchar *p1, *p2;
148   \rsize_t len;
149   \rstruct stat buffer = { 0 };
150   \r\rlen = strlen(totranslate);
151   \r\rstrncpy(buffer1, totranslate, len);
152   \r\rif (!strcmp(buffer1, "."))
153     \r {
154     \r*translated = getcwd(NULL, 0);
155     \rreturn strlen(*translated);
156     \r}
157   \r
158   else if (!strcmp(buffer1, "/.."))
159     \r {
160     \r*translated = strdup("/");
161     \rreturn strlen(*translated);
162     \r}
163   \r\rwhile ((p1 = strstr(buffer1, "//")))
164     \rif (p1[2])
165       \rstrcpy(p1, p1 + 1);
166   \r
167     else
168       \rp1[1] = '\0';
169   \r\rif (buffer1[0] == '~')
170     \r {
171     \rfor (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/');
172           *(p2++) = *(p1++));
173     \r\r*p2 = '\0';
174     \r\rif (buffer2[0] == '\0')
175       \r {
176       \rchar *home = getenv("HOME");
177       \r\rif (home)
178         \r {
179         \rstrcpy(buffer2, home);
180         \r}
181       \r
182       else
183         \r {
184         \rstruct passwd *pw = getpwuid(getuid());        /* get entry */
185         \r\rif (!pw)
186           \r {
187           \r*translated = NULL;
188           \rreturn -1;
189           \r}
190         \r\rstrcpy(buffer2, pw->pw_dir);
191         \r}
192       \r\rstrcat(buffer2, p1);
193       \r}
194     \r}
195   \r
196   else if (*buffer1 != '/')
197     \r {
198     \r\rgetcwd(buffer2, PATH_MAX + 1);
199     \r\rif (*buffer1 == '.' && *(buffer1 + 1) == '/')
200       \r {
201       \rstrcat(buffer2, buffer1 + 1);
202       \r}
203     \r
204     else
205       \r {
206       \rstrcat(buffer2, "/");
207       \rstrcat(buffer2, buffer1);
208       \r}
209     \r}
210   \r
211   else
212     \r {
213     \rstrcpy(buffer2, buffer1);
214     \r}
215   \r\r
216       /*\r
217        * check for /..\r
218        */ \r
219       while ((p1 = strstr(buffer2, "/..")))
220     \r {
221     \rfor (p2 = p1; --p2 > buffer2 && *p2 != '/';);
222     \r\rif (*(p1 + 3))
223       \rmemmove(p2, p1 + 3, strlen(p1 + 3) + 1);
224     \r
225     else
226       \r*p2 = '\0';
227     \r}
228   \r\r
229       /*\r
230        * try to find links.\r
231        */ \r
232       p1 = strtok(buffer2, "/");
233   \r\r\r*buffer3 = '\0';
234   \r\rwhile (p1)
235     \r {
236     \rstrcat(buffer3, "/");
237     \rstrcat(buffer3, p1);
238     \r\rlen = readlink(buffer3, buffer1, PATH_MAX);
239     \r\rif (len != -1)
240       \r {
241       \r*(buffer1 + len) = '\0';
242       \rstrcpy(buffer3, buffer1);
243       \r}
244     \r\rp1 = strtok(NULL, "/");
245     \r}
246   \r\rif (!(*buffer3))
247     \rstrcpy(buffer3, "/");
248   \r\rlen = strlen(buffer3);
249   \r\rif (stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))
250     \r {
251     \r*translated = NULL;
252     \rerrno = ENOTDIR;
253     \rreturn -1;
254     \r}
255   \r\r\r*translated = (char *) calloc(len + 1, sizeof(char));
256   \r\rif (!(*translated))
257     \r {
258     \r*translated = NULL;
259     \rreturn -1;
260     \r}
261   \r\rstrncpy(*translated, buffer3, len);
262   \r\rreturn len;
263 \r}
264
265 \r
266 #else   /* \r */
267 /*int\r
268 getpath(const char* file, char** path)\r
269 {\r
270         DWORD len;\r
271         char* part = NULL;\r
272         char buffer[PATH_MAX + 1] = {0}; \r
273         struct stat info = {0};\r
274 \r
275         \r
276         len = GetFullPathName(file, PATH_MAX, buffer, &part );\r
277         \r
278         if(!len)\r
279         {\r
280                 *path = NULL;\r
281                 return -1;\r
282         }\r
283         \r
284         if(stat(buffer, &info) || !S_ISREG(info.st_mode))\r
285         {\r
286                 *path = NULL;\r
287                 errno = ENOENT;\r
288                 return -1;\r
289         }               \r
290         \r
291         *path = (char*)calloc(strlen(buffer) - strlen(part), sizeof(char));\r
292 \r
293 \r
294         *path = strncpy(*path, buffer, strlen(buffer) - strlen(part) - 1);\r
295 \r
296         return (int)(strlen(buffer) - strlen(part) -1);\r
297 }*/ \r
298 \rint \r getpath(const char *file, char **path) \r
299 {
300   \rchar buf1[PATH_MAX + 1] = { 0 };
301   \rchar buf2[PATH_MAX + 1] = { 0 };
302   \rstruct stat info = { 0 };
303   \r\rchar *delimiter;
304   \r\rif (!file)
305     \r {
306     \r*path = NULL;
307     \rreturn -1;
308     \r}
309   \r\rdelimiter = strrchr(file, '/');
310   \r\rif (!delimiter)
311     \rdelimiter = strrchr(file, '\\');
312   \r\rif (!delimiter)
313     \r {
314     \r*path = getcwd(NULL, 0);
315     \r}
316   \r
317   else
318     \r {
319     \rstrncpy(buf2, file, (delimiter - file));
320     \r\rif (translatepath(buf2, path) < 0)
321       \r {
322       \rif (errno == ENOTDIR)
323         \rerrno = ENOENT;
324       \r\rreturn -1;
325       \r}
326     \r}
327   \r\rsprintf(buf1, "%s\\%s", *path, delimiter ? delimiter + 1 : file);
328   \r\r\rif (stat(buf1, &info) || !S_ISREG(info.st_mode))
329     \r {
330     \rfree(*path);
331     \r*path = NULL;
332     \rerrno = ENOENT;
333     \rreturn -1;
334     \r}
335   \r\rreturn (int) strlen(*path);
336 \r\r\r\rint \r translatepath(const char *totranslate, char **translated) \r
337 {
338   \rchar buffer1[PATH_MAX + 1] = { 0 };
339   \rchar buffer2[PATH_MAX + 1] = { 0 };
340   \rchar *p1;
341   \rint i, len;
342   \r\rstruct stat stat_buf = { 0 };
343   \r\rlen = (int) strlen(totranslate);
344   \r\rstrncpy(buffer1, totranslate, len);
345   \r\rwhile ((p1 = strstr(buffer1, "//")))
346     \rif (p1[2])
347       \rstrcpy(p1, p1 + 1);
348   \r
349     else
350       \rp1[1] = '\0';
351   \r\rif (buffer1[strlen(buffer1) - 1] == '/'
352         || buffer1[strlen(buffer1) - 1] == '\\')
353     \rbuffer1[strlen(buffer1) - 1] = '\0';
354   \r\r
355       /* return the current directory */ \r
356       if (!strcmp(totranslate, ".") || !strcmp(totranslate, "./"))
357     \r {
358     \r*translated = getcwd(NULL, 0);
359     \rreturn (int) strlen(*translated);
360     \r}
361   \r
362       /* return the previous directory */ \r
363       else if (!strcmp(totranslate, "..") || !strcmp(totranslate, "../"))
364     \r {
365     \rgetcwd(buffer1, PATH_MAX + 1);
366     \rp1 = strrchr(buffer1, '\\');
367     \r*translated = (char *) calloc((p1 - buffer1) + 1, sizeof(char));
368     \rstrncpy(*translated, buffer1, (p1 - buffer1));
369     \r\rreturn (int) strlen(*translated);
370     \r}
371   \r
372       /* return the root directory */ \r
373       else if (!strcmp(totranslate, "/"))
374     \r {
375     \r*translated = getcwd(NULL, 0);
376     \r(*translated)[2] = '\0';
377     \r\rreturn (int) strlen(*translated);
378     \r}
379   \r
380       /* it's a relative directory name build the full directory name (directory) */ \r
381       else if (buffer1[0] != '.' && buffer1[0] != '/' && buffer1[1] != ':'
382                && !stat(totranslate, &stat_buf)
383                && S_ISDIR(stat_buf.st_mode))
384     \r {
385     \rfor (i = 0; buffer1[i] != '\0'; i++)
386       \r {
387       \rif (buffer1[i] == '/')
388         \rbuffer2[i] = '\\';
389       \r
390       else
391         \rbuffer2[i] = buffer1[i];
392       \r}
393     \r\rmemset(buffer1, 0, PATH_MAX + 1);
394     \rgetcwd(buffer1, PATH_MAX + 1);
395     \rstrcat(buffer1, "\\");
396     \rstrcat(buffer1, buffer2);
397     \r\r*translated = (char *) calloc(strlen(buffer1) + 1, sizeof(char));
398     \rstrcpy(*translated, buffer1);
399     \r\rreturn (int) strlen(*translated);
400     \r}
401   \r
402   else if (buffer1[0] == '~')
403     \r {
404     \r
405         /* TODO */ \r
406         *translated = NULL;
407     \rerrno = ENOSYS;
408     \rreturn -1;
409     \r}
410   \r
411   else if (*buffer1 == '.')
412     \r {
413     \r_fullpath(buffer2, buffer1, sizeof(buffer1));
414     \r}
415   \r
416   else
417     \rstrcpy(buffer2, buffer1);
418   \r\rif (stat(buffer2, &stat_buf) || !S_ISDIR(stat_buf.st_mode))
419     \r {
420     \r*translated = NULL;
421     \rerrno = ENOTDIR;
422     \rreturn -1;
423     \r}
424   \r\r\r\rlen = (int) strlen(buffer2);
425   \r\r\r\r*translated = (char *) calloc(len + 1, sizeof(char));
426   \rstrcpy(*translated, buffer2);
427   \r\rif (!(*translated))
428     \r {
429     \r*translated = NULL;
430     \rreturn -1;
431     \r}
432   \r\rreturn len;
433 \r}
434
435 \r
436 #endif  /* \r */
437     \r\r