3 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);
\r
5 /*#include <stdlib.h>
\r
10 #include <sys/types.h>
\r
11 #include <sys/stat.h>
\r
19 #include <getpath.h>
\r
22 #define PATH_MAX 255
\r
27 getpath(const char* file, char** path)
\r
29 char buffer1[PATH_MAX + 1] = {0};
\r
30 char buffer2[PATH_MAX + 1] = {0};
\r
31 char buffer3[PATH_MAX + 1] = {0};
\r
33 size_t len = strlen(file);
\r
34 char* last_delimiter = NULL;
\r
35 struct stat buffer = {0};
\r
37 strncpy(buffer1, file, len);
\r
39 /* remove the /////// */
\r
40 while((p1 = strstr(buffer1, "//")))
\r
43 strcpy(p1, p1 + 1);
\r
48 if(*buffer1 == '~')
\r
50 for(p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *p2++ = *p1++);
\r
53 if(buffer2[0] == '\0')
\r
55 char* home = getenv("HOME");
\r
59 strcpy(buffer2, home);
\r
63 struct passwd* pw = getpwuid(getuid());
\r
71 strcpy(buffer2,pw->pw_dir);
\r
74 strcat(buffer2, p1);
\r
78 else if (buffer1[0] != '/')
\r
81 getcwd(buffer2, PATH_MAX + 1);
\r
83 if(buffer1[0] == '.' && buffer1[1] == '/')
\r
85 strcat(buffer2, &buffer1[1]);
\r
89 strcat(buffer2, "/");
\r
90 strcat(buffer2, buffer1);
\r
95 strcpy(buffer2, buffer1); /* copy */
\r
101 while((p1 = strstr( buffer2, "/.." )))
\r
103 for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );
\r
106 memmove(p2, p1+3, strlen(p1+3)+1);
\r
112 * try to find links, and resolve them.
\r
114 p1 = strtok( buffer2, "/" );
\r
120 strcat( buffer3, "/" );
\r
121 strcat( buffer3, p1 );
\r
123 len = readlink(buffer3, buffer1, PATH_MAX);
\r
127 *(buffer1 + len) = '\0';
\r
128 strcpy(buffer3, buffer1 );
\r
131 p1 = strtok( NULL, "/" );
\r
134 if(stat(buffer3, &buffer) || !S_ISREG(buffer.st_mode))
\r
141 last_delimiter = strrchr(buffer3, '/');
\r
143 len = strlen(buffer3);
\r
146 len -=strlen(last_delimiter);
\r
148 *path = (char*) calloc(len + 1, sizeof(char));
\r
156 strncpy(*path, buffer3, len);
\r
162 translatepath(const char* totranslate, char** translated)
\r
164 char buffer1[PATH_MAX + 1] = {0};
\r
165 char buffer2[PATH_MAX + 1] = {0};
\r
166 char buffer3[PATH_MAX + 1] = {0};
\r
169 struct stat buffer = {0};
\r
171 len = strlen(totranslate);
\r
173 strncpy(buffer1, totranslate, len);
\r
175 if(!strcmp(buffer1,"."))
\r
177 *translated = getcwd(NULL,0);
\r
178 return strlen(*translated);
\r
180 else if(!strcmp(buffer1, "/.."))
\r
182 *translated = strdup("/");
\r
183 return strlen(*translated);
\r
186 while((p1 = strstr(buffer1, "//")))
\r
188 strcpy(p1, p1 + 1);
\r
192 if (buffer1[0] == '~')
\r
194 for (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *(p2++) = *(p1++));
\r
198 if(buffer2[0] == '\0')
\r
200 char* home = getenv("HOME");
\r
204 strcpy(buffer2, home);
\r
208 struct passwd* pw = getpwuid(getuid()); /* get entry */
\r
212 *translated = NULL;
\r
216 strcpy(buffer2,pw->pw_dir);
\r
219 strcat(buffer2, p1);
\r
222 else if (*buffer1 != '/')
\r
225 getcwd(buffer2, PATH_MAX + 1);
\r
227 if (*buffer1 == '.' && *(buffer1 + 1) == '/')
\r
229 strcat(buffer2, buffer1+1);
\r
233 strcat(buffer2, "/");
\r
234 strcat(buffer2, buffer1);
\r
239 strcpy(buffer2, buffer1);
\r
245 while((p1 = strstr( buffer2, "/.." )))
\r
247 for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );
\r
250 memmove(p2, p1+3, strlen(p1+3)+1);
\r
256 * try to find links.
\r
258 p1 = strtok( buffer2, "/" );
\r
265 strcat( buffer3, "/" );
\r
266 strcat( buffer3, p1 );
\r
268 len = readlink(buffer3, buffer1, PATH_MAX);
\r
272 *(buffer1 + len) = '\0';
\r
273 strcpy(buffer3, buffer1 );
\r
276 p1 = strtok( NULL, "/" );
\r
280 strcpy(buffer3, "/" );
\r
282 len = strlen(buffer3);
\r
284 if(stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))
\r
286 *translated = NULL;
\r
292 *translated = (char*) calloc(len + 1, sizeof(char));
\r
296 *translated = NULL;
\r
300 strncpy(*translated, buffer3, len);
\r
306 getpath(const char* file, char** path)
\r
310 char buffer[PATH_MAX + 1] = {0};
\r
311 struct stat info = {0};
\r
314 len = GetFullPathName(file, PATH_MAX, buffer, &part );
\r
322 if(stat(buffer, &info) || !S_ISREG(info.st_mode))
\r
329 *path = (char*)calloc(strlen(buffer) - strlen(part), sizeof(char));
\r
332 *path = strncpy(*path, buffer, strlen(buffer) - strlen(part) - 1);
\r
334 return (int)(strlen(buffer) - strlen(part) -1);
\r
338 getpath(const char* file, char** path)
\r
340 char buf1[PATH_MAX + 1] = {0};
\r
341 char buf2[PATH_MAX + 1] = {0};
\r
342 struct stat info = {0};
\r
352 delimiter = strrchr(file,'/');
355 delimiter = strrchr(file,'\\');
\r
359 *path = getcwd(NULL,0);
\r
363 strncpy(buf2, file, (delimiter - file));
\r
365 if(translatepath(buf2, path) < 0)
\r
369 sprintf(buf1,"%s\\%s", *path, delimiter ? delimiter + 1 : file);
\r
371 if(stat(buf1, &info) || !S_ISREG(info.st_mode))
\r
379 return (int) strlen(*path);
\r
384 translatepath(const char* totranslate, char** translated)
\r
386 char buffer1[PATH_MAX + 1] = {0};
\r
387 char buffer2[PATH_MAX + 1] = {0};
\r
391 struct stat stat_buf = {0};
\r
393 /* return the current directory */
\r
394 if(!strcmp(totranslate,".") || !strcmp(totranslate,"./"))
\r
396 *translated = getcwd(NULL,0);
\r
397 return (int)strlen(*translated);
\r
399 /* return the previous directory */
\r
400 else if(!strcmp(totranslate,"..") || !strcmp(totranslate,"../"))
\r
402 getcwd(buffer1, PATH_MAX + 1);
\r
403 p1 = strrchr(buffer1, '\\');
\r
404 *translated = (char*) calloc((p1 - buffer1) + 1, sizeof(char));
\r
405 strncpy(*translated, buffer1, (p1 - buffer1));
\r
407 return (int)strlen(*translated);
\r
409 /* return the root directory */
\r
410 else if(!strcmp(totranslate, "/"))
\r
412 *translated = getcwd(NULL,0);
\r
413 (*translated)[2] = '\0';
\r
415 return (int)strlen(*translated);
\r
417 /* it's a relative directory name build the full directory name */
\r
418 else if(!strchr(totranslate, '/') && !strchr(totranslate, '\\') && !stat(totranslate, &stat_buf) && S_ISDIR(stat_buf.st_mode))
\r
420 getcwd(buffer1, PATH_MAX + 1);
\r
421 strcat(buffer1,"\\");
\r
422 strcat(buffer1,totranslate);
\r
424 *translated = (char*) calloc(strlen(buffer1) + 1, sizeof(char));
\r
425 strcpy(*translated, buffer1);
\r
427 return (int)strlen(*translated);
\r
430 len = (int)strlen(totranslate);
\r
432 strncpy(buffer1, totranslate, len);
\r
434 if(buffer1[strlen(buffer1) - 1] == '/' || buffer1[strlen(buffer1) - 1] == '\\')
\r
435 buffer1[strlen(buffer1) - 1] = '\0';
\r
437 while((p1 = strstr(buffer1, "//")))
\r
439 strcpy(p1, p1 + 1);
\r
443 for(i = 0, j = 0; buffer1[i] !='\0'; i++)
\r
445 if(buffer1[i] == '/')
\r
454 if(j == 1 && buffer1[i - 1] == '/')
\r
456 /* perhaps it's a relative directory : `dir/' */
\r
457 strncpy(buffer2, buffer1, strlen(buffer1) - 1);
\r
459 if(!stat(buffer2, &stat_buf) && S_ISDIR(stat_buf.st_mode))
\r
461 getcwd(buffer1, PATH_MAX + 1);
\r
462 strcat(buffer1,"\\");
\r
463 strcat(buffer1,buffer2);
\r
465 *translated = (char*) calloc(strlen(buffer1) + 1, sizeof(char));
\r
466 strcpy(*translated, buffer1);
\r
468 return (int)strlen(*translated);
\r
471 memset(buffer2, 0, PATH_MAX + 1);
\r
475 if(buffer1[0] == '~')
\r
478 *translated = NULL;
\r
482 else if (*buffer1 == '.')
\r
484 _fullpath(buffer2, buffer1, sizeof(buffer1));
\r
487 strcpy(buffer2, buffer1);
\r
489 if(stat(buffer2, &stat_buf) || !S_ISDIR(stat_buf.st_mode))
\r
491 *translated = NULL;
\r
496 len = (int)strlen(buffer2);
\r
498 *translated = (char*) calloc(len + 1, sizeof(char));
\r
499 strcpy(*translated, buffer2);
\r
503 *translated = NULL;
\r