2 \r XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);
4 /*#include <stdlib.h>
\r
9 #include <sys/types.h>
\r
10 #include <sys/stat.h>
\r
18 #include <getpath.h>
\r
21 #define PATH_MAX 255
\r
25 int
\r getpath(const char *file, char **path)
\r
27 \rchar buffer1[PATH_MAX + 1] = { 0 };
28 \rchar buffer2[PATH_MAX + 1] = { 0 };
29 \rchar buffer3[PATH_MAX + 1] = { 0 };
31 \rsize_t len = strlen(file);
32 \rchar *last_delimiter = NULL;
33 \rstruct stat buffer = { 0 };
34 \r\rstrncpy(buffer1, file, len);
36 /* remove the /////// */
\r
37 while ((p1 = strstr(buffer1, "//")))
45 \r\rif (*buffer1 == '~')
47 \rfor (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/');
50 \r\rif (buffer2[0] == '\0')
52 \rchar *home = getenv("HOME");
55 \rstrcpy(buffer2, home);
60 \rstruct passwd *pw = getpwuid(getuid());
66 \r\rstrcpy(buffer2, pw->pw_dir);
68 \r\rstrcat(buffer2, p1);
72 else if (buffer1[0] != '/')
74 \r\rgetcwd(buffer2, PATH_MAX + 1);
75 \r\rif (buffer1[0] == '.' && buffer1[1] == '/')
77 \rstrcat(buffer2, &buffer1[1]);
82 \rstrcat(buffer2, "/");
83 \rstrcat(buffer2, buffer1);
89 \rstrcpy(buffer2, buffer1); /* copy */
95 while ((p1 = strstr(buffer2, "/..")))
97 \rfor (p2 = p1; --p2 > buffer2 && *p2 != '/';);
99 \rmemmove(p2, p1 + 3, strlen(p1 + 3) + 1);
106 * try to find links, and resolve them.
\r
108 p1 = strtok(buffer2, "/");
112 \rstrcat(buffer3, "/");
113 \rstrcat(buffer3, p1);
114 \r\rlen = readlink(buffer3, buffer1, PATH_MAX);
117 \r*(buffer1 + len) = '\0';
118 \rstrcpy(buffer3, buffer1);
120 \r\rp1 = strtok(NULL, "/");
122 \r\rif (stat(buffer3, &buffer) || !S_ISREG(buffer.st_mode))
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));
138 \r\rstrncpy(*path, buffer3, len);
142 \r\rint
\r translatepath(const char *totranslate, char **translated)
\r
144 \rchar buffer1[PATH_MAX + 1] = { 0 };
145 \rchar buffer2[PATH_MAX + 1] = { 0 };
146 \rchar buffer3[PATH_MAX + 1] = { 0 };
149 \rstruct stat buffer = { 0 };
150 \r\rlen = strlen(totranslate);
151 \r\rstrncpy(buffer1, totranslate, len);
152 \r\rif (!strcmp(buffer1, "."))
154 \r*translated = getcwd(NULL, 0);
155 \rreturn strlen(*translated);
158 else if (!strcmp(buffer1, "/.."))
160 \r*translated = strdup("/");
161 \rreturn strlen(*translated);
163 \r\rwhile ((p1 = strstr(buffer1, "//")))
165 \rstrcpy(p1, p1 + 1);
169 \r\rif (buffer1[0] == '~')
171 \rfor (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/');
174 \r\rif (buffer2[0] == '\0')
176 \rchar *home = getenv("HOME");
179 \rstrcpy(buffer2, home);
184 \rstruct passwd *pw = getpwuid(getuid()); /* get entry */
187 \r*translated = NULL;
190 \r\rstrcpy(buffer2, pw->pw_dir);
192 \r\rstrcat(buffer2, p1);
196 else if (*buffer1 != '/')
198 \r\rgetcwd(buffer2, PATH_MAX + 1);
199 \r\rif (*buffer1 == '.' && *(buffer1 + 1) == '/')
201 \rstrcat(buffer2, buffer1 + 1);
206 \rstrcat(buffer2, "/");
207 \rstrcat(buffer2, buffer1);
213 \rstrcpy(buffer2, buffer1);
219 while ((p1 = strstr(buffer2, "/..")))
221 \rfor (p2 = p1; --p2 > buffer2 && *p2 != '/';);
223 \rmemmove(p2, p1 + 3, strlen(p1 + 3) + 1);
230 * try to find links.
\r
232 p1 = strtok(buffer2, "/");
233 \r\r\r*buffer3 = '\0';
236 \rstrcat(buffer3, "/");
237 \rstrcat(buffer3, p1);
238 \r\rlen = readlink(buffer3, buffer1, PATH_MAX);
241 \r*(buffer1 + len) = '\0';
242 \rstrcpy(buffer3, buffer1);
244 \r\rp1 = strtok(NULL, "/");
247 \rstrcpy(buffer3, "/");
248 \r\rlen = strlen(buffer3);
249 \r\rif (stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))
251 \r*translated = NULL;
255 \r\r\r*translated = (char *) calloc(len + 1, sizeof(char));
256 \r\rif (!(*translated))
258 \r*translated = NULL;
261 \r\rstrncpy(*translated, buffer3, len);
268 getpath(const char* file, char** path)
\r
272 char buffer[PATH_MAX + 1] = {0};
\r
273 struct stat info = {0};
\r
276 len = GetFullPathName(file, PATH_MAX, buffer, &part );
\r
284 if(stat(buffer, &info) || !S_ISREG(info.st_mode))
\r
291 *path = (char*)calloc(strlen(buffer) - strlen(part), sizeof(char));
\r
294 *path = strncpy(*path, buffer, strlen(buffer) - strlen(part) - 1);
\r
296 return (int)(strlen(buffer) - strlen(part) -1);
\r
298 \rint
\r getpath(const char *file, char **path)
\r
300 \rchar buf1[PATH_MAX + 1] = { 0 };
301 \rchar buf2[PATH_MAX + 1] = { 0 };
302 \rstruct stat info = { 0 };
309 \r\rdelimiter = strrchr(file, '/');
311 \rdelimiter = strrchr(file, '\\');
314 \r*path = getcwd(NULL, 0);
319 \rstrncpy(buf2, file, (delimiter - file));
320 \r\rif (translatepath(buf2, path) < 0)
322 \rif (errno == ENOTDIR)
327 \r\rsprintf(buf1, "%s\\%s", *path, delimiter ? delimiter + 1 : file);
328 \r\r\rif (stat(buf1, &info) || !S_ISREG(info.st_mode))
335 \r\rreturn (int) strlen(*path);
336 \r}
\r\r\rint
\r translatepath(const char *totranslate, char **translated)
\r
338 \rchar buffer1[PATH_MAX + 1] = { 0 };
339 \rchar buffer2[PATH_MAX + 1] = { 0 };
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, "//")))
347 \rstrcpy(p1, p1 + 1);
351 \r\rif (buffer1[strlen(buffer1) - 1] == '/'
352 || buffer1[strlen(buffer1) - 1] == '\\')
353 \rbuffer1[strlen(buffer1) - 1] = '\0';
355 /* return the current directory */
\r
356 if (!strcmp(totranslate, ".") || !strcmp(totranslate, "./"))
358 \r*translated = getcwd(NULL, 0);
359 \rreturn (int) strlen(*translated);
362 /* return the previous directory */
\r
363 else if (!strcmp(totranslate, "..") || !strcmp(totranslate, "../"))
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);
372 /* return the root directory */
\r
373 else if (!strcmp(totranslate, "/"))
375 \r*translated = getcwd(NULL, 0);
376 \r(*translated)[2] = '\0';
377 \r\rreturn (int) strlen(*translated);
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))
385 \rfor (i = 0; buffer1[i] != '\0'; i++)
387 \rif (buffer1[i] == '/')
391 \rbuffer2[i] = buffer1[i];
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);
402 else if (buffer1[0] == '~')
411 else if (*buffer1 == '.')
413 \r_fullpath(buffer2, buffer1, sizeof(buffer1));
417 \rstrcpy(buffer2, buffer1);
418 \r\rif (stat(buffer2, &stat_buf) || !S_ISDIR(stat_buf.st_mode))
420 \r*translated = NULL;
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))
429 \r*translated = NULL;