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,'/');
\r
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
367 if(errno == ENOTDIR)
\r
374 sprintf(buf1,"%s\\%s", *path, delimiter ? delimiter + 1 : file);
\r
377 if(stat(buf1, &info) || !S_ISREG(info.st_mode))
\r
385 return (int) strlen(*path);
\r
390 translatepath(const char* totranslate, char** translated)
\r
392 char buffer1[PATH_MAX + 1] = {0};
\r
393 char buffer2[PATH_MAX + 1] = {0};
\r
397 struct stat stat_buf = {0};
\r
399 len = (int)strlen(totranslate);
\r
401 strncpy(buffer1, totranslate, len);
\r
403 while((p1 = strstr(buffer1, "//")))
\r
405 strcpy(p1, p1 + 1);
\r
409 if(buffer1[strlen(buffer1) - 1] == '/' || buffer1[strlen(buffer1) - 1] == '\\')
\r
410 buffer1[strlen(buffer1) - 1] = '\0';
\r
412 /* return the current directory */
\r
413 if(!strcmp(totranslate,".") || !strcmp(totranslate,"./"))
\r
415 *translated = getcwd(NULL,0);
\r
416 return (int)strlen(*translated);
\r
418 /* return the previous directory */
\r
419 else if(!strcmp(totranslate,"..") || !strcmp(totranslate,"../"))
\r
421 getcwd(buffer1, PATH_MAX + 1);
\r
422 p1 = strrchr(buffer1, '\\');
\r
423 *translated = (char*) calloc((p1 - buffer1) + 1, sizeof(char));
\r
424 strncpy(*translated, buffer1, (p1 - buffer1));
\r
426 return (int)strlen(*translated);
\r
428 /* return the root directory */
\r
429 else if(!strcmp(totranslate, "/"))
\r
431 *translated = getcwd(NULL,0);
\r
432 (*translated)[2] = '\0';
\r
434 return (int)strlen(*translated);
\r
436 /* it's a relative directory name build the full directory name (directory)*/
\r
437 else if( buffer1[0] != '.' && buffer1[0] != '/' && buffer1[1] != ':' && !stat(totranslate, &stat_buf) && S_ISDIR(stat_buf.st_mode))
\r
439 for(i = 0; buffer1[i] !='\0'; i++)
\r
441 if(buffer1[i] == '/')
\r
444 buffer2[i] = buffer1[i];
\r
447 memset(buffer1, 0, PATH_MAX + 1);
\r
448 getcwd(buffer1, PATH_MAX + 1);
\r
449 strcat(buffer1,"\\");
\r
450 strcat(buffer1,buffer2);
\r
452 *translated = (char*) calloc(strlen(buffer1) + 1, sizeof(char));
\r
453 strcpy(*translated, buffer1);
\r
455 return (int)strlen(*translated);
\r
457 else if(buffer1[0] == '~')
\r
460 *translated = NULL;
\r
464 else if (*buffer1 == '.')
\r
466 _fullpath(buffer2, buffer1, sizeof(buffer1));
\r
469 strcpy(buffer2, buffer1);
\r
471 if(stat(buffer2, &stat_buf) || !S_ISDIR(stat_buf.st_mode))
\r
473 *translated = NULL;
\r
480 len = (int)strlen(buffer2);
\r
484 *translated = (char*) calloc(len + 1, sizeof(char));
\r
485 strcpy(*translated, buffer2);
\r
489 *translated = NULL;
\r