-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <pwd.h>
-#include <errno.h>
-#include <getpath.h>
-
-#ifndef MAX_PATH
-#define MAX_PATH 255
-#endif
-
-int
-getpath(const char* file, char** path)
-{
- char buffer1[MAX_PATH + 1] = {0};
- char buffer2[MAX_PATH + 1] = {0};
- char buffer3[MAX_PATH + 1] = {0};
- char *p1,*p2;
- size_t len = strlen(file);
- char* last_delimiter = NULL;
- struct stat buffer = {0};
-
- strncpy(buffer1, file, len);
-
- /* remove the /////// */
- while((p1 = strstr(buffer1, "//")))
- {
- if(p1[2])
- strcpy(p1, p1 + 1);
- else
- p1[1] = '\0';
- }
-
- if(*buffer1 == '~')
- {
- for(p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *p2++ = *p1++);
- *p2 = '\0';
-
- if(buffer2[0] == '\0')
- {
- char* home = getenv("HOME");
-
- if(home)
- {
- strcpy(buffer2, home);
- }
- else
- {
- struct passwd* pw = getpwuid(getuid());
-
- if(!pw)
- {
- *path = NULL;
- return -1;
- }
-
- strcpy(buffer2,pw->pw_dir);
- }
-
- strcat(buffer2, p1);
- }
-
- }
- else if (buffer1[0] != '/')
- {
-
- getcwd(buffer2, MAX_PATH + 1);
-
- if(buffer1[0] == '.' && buffer1[1] == '/')
- { /* replace */
- strcat(buffer2, &buffer1[1]);
- }
- else
- {
- strcat(buffer2, "/");
- strcat(buffer2, buffer1);
- }
- }
- else
- {
- strcpy(buffer2, buffer1); /* copy */
- }
-
- /*
- * check for /..
- */
- while((p1 = strstr( buffer2, "/.." )))
- {
- for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );
-
- if (*(p1 + 3))
- memmove(p2, p1+3, strlen(p1+3)+1);
- else
- *p2 = '\0';
- }
-
- /*
- * try to find links, and resolve them.
- */
- p1 = strtok( buffer2, "/" );
-
- *buffer3 = '\0';
-
- while(p1)
- {
- strcat( buffer3, "/" );
- strcat( buffer3, p1 );
-
- len = readlink(buffer3, buffer1, MAX_PATH);
-
- if (len != -1)
- {
- *(buffer1 + len) = '\0';
- strcpy(buffer3, buffer1 );
- }
-
- p1 = strtok( NULL, "/" );
- }
-
- if(stat(buffer3, &buffer) || !S_ISREG(buffer.st_mode))
- {
- *path = NULL;
- errno = ENOENT;
- return -1;
- }
-
- last_delimiter = strrchr(buffer3, '/');
-
- len = strlen(buffer3);
-
- if(last_delimiter)
- len -=strlen(last_delimiter);
-
- *path = (char*) calloc(len + 1, sizeof(char));
-
- if(!(*path))
- {
- *path = NULL;
- return -1;
- }
-
- strncpy(*path, buffer3, len);
-
- return len;
-}
-
-#include <stdio.h>
-
-int
-translatepath(const char* totranslate, char** translated)
-{
- char buffer1[MAX_PATH + 1] = {0};
- char buffer2[MAX_PATH + 1] = {0};
- char buffer3[MAX_PATH + 1] = {0};
- char *p1,*p2;
- size_t len;
- struct stat buffer = {0};
-
- len = strlen(totranslate);
-
- strncpy(buffer1, totranslate, len);
-
- if(!strcmp(buffer1,"."))
- {
- *translated = getcwd(NULL,0);
- return strlen(*translated);
- }
- else if(!strcmp(buffer1, "/.."))
- {
- *translated = strdup("/");
- return strlen(*translated);
- }
-
- while((p1 = strstr(buffer1, "//")))
- if(p1[2])
- strcpy(p1, p1 + 1);
- else
- p1[1] = '\0';
-
-
-
- if (buffer1[0] == '~')
- {
- for (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *(p2++) = *(p1++));
-
- *p2 = '\0';
-
- if(buffer2[0] == '\0')
- {
- char* home = getenv("HOME");
-
- if(home)
- {
- strcpy(buffer2, home);
- }
- else
- {
- struct passwd* pw = getpwuid(getuid()); /* get entry */
-
- if(!pw)
- {
- *translated = NULL;
- return -1;
- }
-
- strcpy(buffer2,pw->pw_dir);
- }
-
- strcat(buffer2, p1);
- }
- }
- else if (*buffer1 != '/')
- {
-
- getcwd(buffer2, MAX_PATH + 1);
-
- if (*buffer1 == '.' && *(buffer1 + 1) == '/')
- {
- strcat(buffer2, buffer1+1);
- }
- else
- {
- strcat(buffer2, "/");
- strcat(buffer2, buffer1);
- }
- }
- else
- {
- strcpy(buffer2, buffer1);
- }
-
- /*
- * check for /..
- */
- while((p1 = strstr( buffer2, "/.." )))
- {
- for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );
-
- if (*(p1 + 3))
- memmove(p2, p1+3, strlen(p1+3)+1);
- else
- *p2 = '\0';
- }
-
- /*
- * try to find links.
- */
- p1 = strtok( buffer2, "/" );
-
-
- *buffer3 = '\0';
-
- while(p1)
- {
- strcat( buffer3, "/" );
- strcat( buffer3, p1 );
-
- len = readlink(buffer3, buffer1, MAX_PATH);
-
- if (len != -1)
- {
- *(buffer1 + len) = '\0';
- strcpy(buffer3, buffer1 );
- }
-
- p1 = strtok( NULL, "/" );
- }
-
- if (!(*buffer3))
- strcpy(buffer3, "/" );
-
- len = strlen(buffer3);
-
- if(stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))
- {
- *translated = NULL;
- errno = ENOTDIR;
- return -1;
- }
-
-
- *translated = (char*) calloc(len + 1, sizeof(char));
-
- if(!(*translated))
- {
- *translated = NULL;
- return -1;
- }
-
- strncpy(*translated, buffer3, len);
-
- return len;
-}
-
-
+#include <com.h>\r
+\r
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);\r
+\r
+/*#include <stdlib.h>\r
+#include <string.h>\r
+\r
+*/\r
+\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+\r
+#ifndef _XBT_WIN32\r
+#include <pwd.h>\r
+#else\r
+#endif\r
+\r
+#include <errno.h>\r
+#include <getpath.h>\r
+\r
+#ifndef PATH_MAX\r
+#define PATH_MAX 255\r
+#endif\r
+\r
+#ifndef _XBT_WIN32\r
+int\r
+getpath(const char* file, char** path)\r
+{\r
+ char buffer1[PATH_MAX + 1] = {0};\r
+ char buffer2[PATH_MAX + 1] = {0};\r
+ char buffer3[PATH_MAX + 1] = {0}; \r
+ char *p1,*p2;\r
+ size_t len = strlen(file);\r
+ char* last_delimiter = NULL;\r
+ struct stat buffer = {0}; \r
+ \r
+ strncpy(buffer1, file, len); \r
+ \r
+ /* remove the /////// */\r
+ while((p1 = strstr(buffer1, "//"))) \r
+ {\r
+ if(p1[2]) \r
+ strcpy(p1, p1 + 1); \r
+ else \r
+ p1[1] = '\0';\r
+ }\r
+ \r
+ if(*buffer1 == '~') \r
+ {\r
+ for(p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *p2++ = *p1++);\r
+ *p2 = '\0'; \r
+ \r
+ if(buffer2[0] == '\0') \r
+ {\r
+ char* home = getenv("HOME");\r
+ \r
+ if(home) \r
+ {\r
+ strcpy(buffer2, home); \r
+ } \r
+ else \r
+ {\r
+ struct passwd* pw = getpwuid(getuid()); \r
+ \r
+ if(!pw) \r
+ {\r
+ *path = NULL;\r
+ return -1; \r
+ }\r
+ \r
+ strcpy(buffer2,pw->pw_dir); \r
+ }\r
+ \r
+ strcat(buffer2, p1);\r
+ } \r
+ \r
+ }\r
+ else if (buffer1[0] != '/') \r
+ {\r
+ \r
+ getcwd(buffer2, PATH_MAX + 1); \r
+ \r
+ if(buffer1[0] == '.' && buffer1[1] == '/') \r
+ { /* replace */\r
+ strcat(buffer2, &buffer1[1]); \r
+ } \r
+ else \r
+ { \r
+ strcat(buffer2, "/"); \r
+ strcat(buffer2, buffer1); \r
+ }\r
+ } \r
+ else \r
+ { \r
+ strcpy(buffer2, buffer1); /* copy */\r
+ }\r
+ \r
+ /*\r
+ * check for /..\r
+ */\r
+ while((p1 = strstr( buffer2, "/.." ))) \r
+ {\r
+ for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );\r
+ \r
+ if (*(p1 + 3)) \r
+ memmove(p2, p1+3, strlen(p1+3)+1);\r
+ else \r
+ *p2 = '\0';\r
+ }\r
+ \r
+ /*\r
+ * try to find links, and resolve them.\r
+ */\r
+ p1 = strtok( buffer2, "/" );\r
+ \r
+ *buffer3 = '\0';\r
+ \r
+ while(p1) \r
+ {\r
+ strcat( buffer3, "/" );\r
+ strcat( buffer3, p1 );\r
+ \r
+ len = readlink(buffer3, buffer1, PATH_MAX);\r
+ \r
+ if (len != -1) \r
+ {\r
+ *(buffer1 + len) = '\0';\r
+ strcpy(buffer3, buffer1 );\r
+ }\r
+ \r
+ p1 = strtok( NULL, "/" );\r
+ }\r
+ \r
+ if(stat(buffer3, &buffer) || !S_ISREG(buffer.st_mode))\r
+ {\r
+ *path = NULL;\r
+ errno = ENOENT;\r
+ return -1;\r
+ } \r
+ \r
+ last_delimiter = strrchr(buffer3, '/');\r
+ \r
+ len = strlen(buffer3);\r
+ \r
+ if(last_delimiter)\r
+ len -=strlen(last_delimiter); \r
+ \r
+ *path = (char*) calloc(len + 1, sizeof(char));\r
+ \r
+ if(!(*path))\r
+ {\r
+ *path = NULL;\r
+ return -1;\r
+ }\r
+ \r
+ strncpy(*path, buffer3, len);\r
+\r
+ return len;\r
+}\r
+\r
+int\r
+translatepath(const char* totranslate, char** translated)\r
+{\r
+ char buffer1[PATH_MAX + 1] = {0}; \r
+ char buffer2[PATH_MAX + 1] = {0};\r
+ char buffer3[PATH_MAX + 1] = {0}; \r
+ char *p1,*p2;\r
+ size_t len; \r
+ struct stat buffer = {0};\r
+ \r
+ len = strlen(totranslate); \r
+ \r
+ strncpy(buffer1, totranslate, len); \r
+ \r
+ if(!strcmp(buffer1,"."))\r
+ {\r
+ *translated = getcwd(NULL,0);\r
+ return strlen(*translated);\r
+ }\r
+ else if(!strcmp(buffer1, "/.."))\r
+ {\r
+ *translated = strdup("/");\r
+ return strlen(*translated);\r
+ }\r
+ \r
+ while((p1 = strstr(buffer1, "//"))) \r
+ if(p1[2]) \r
+ strcpy(p1, p1 + 1); \r
+ else \r
+ p1[1] = '\0';\r
+ \r
+ if (buffer1[0] == '~') \r
+ {\r
+ for (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *(p2++) = *(p1++));\r
+ \r
+ *p2 = '\0'; \r
+ \r
+ if(buffer2[0] == '\0') \r
+ {\r
+ char* home = getenv("HOME");\r
+ \r
+ if(home) \r
+ {\r
+ strcpy(buffer2, home);\r
+ } \r
+ else \r
+ {\r
+ struct passwd* pw = getpwuid(getuid()); /* get entry */\r
+ \r
+ if(!pw)\r
+ {\r
+ *translated = NULL; \r
+ return -1;\r
+ }\r
+ \r
+ strcpy(buffer2,pw->pw_dir); \r
+ }\r
+ \r
+ strcat(buffer2, p1);\r
+ } \r
+ }\r
+ else if (*buffer1 != '/') \r
+ {\r
+ \r
+ getcwd(buffer2, PATH_MAX + 1);\r
+ \r
+ if (*buffer1 == '.' && *(buffer1 + 1) == '/') \r
+ {\r
+ strcat(buffer2, buffer1+1); \r
+ } \r
+ else \r
+ { \r
+ strcat(buffer2, "/"); \r
+ strcat(buffer2, buffer1); \r
+ }\r
+ } \r
+ else \r
+ { \r
+ strcpy(buffer2, buffer1); \r
+ }\r
+ \r
+ /*\r
+ * check for /..\r
+ */\r
+ while((p1 = strstr( buffer2, "/.." ))) \r
+ {\r
+ for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );\r
+ \r
+ if (*(p1 + 3)) \r
+ memmove(p2, p1+3, strlen(p1+3)+1);\r
+ else \r
+ *p2 = '\0';\r
+ }\r
+ \r
+ /*\r
+ * try to find links.\r
+ */\r
+ p1 = strtok( buffer2, "/" );\r
+ \r
+ \r
+ *buffer3 = '\0';\r
+ \r
+ while(p1) \r
+ {\r
+ strcat( buffer3, "/" );\r
+ strcat( buffer3, p1 );\r
+ \r
+ len = readlink(buffer3, buffer1, PATH_MAX);\r
+ \r
+ if (len != -1) \r
+ {\r
+ *(buffer1 + len) = '\0';\r
+ strcpy(buffer3, buffer1 );\r
+ }\r
+ \r
+ p1 = strtok( NULL, "/" );\r
+ }\r
+ \r
+ if (!(*buffer3)) \r
+ strcpy(buffer3, "/" ); \r
+ \r
+ len = strlen(buffer3);\r
+ \r
+ if(stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))\r
+ {\r
+ *translated = NULL;\r
+ errno = ENOTDIR;\r
+ return -1;\r
+ }\r
+ \r
+ \r
+ *translated = (char*) calloc(len + 1, sizeof(char));\r
+ \r
+ if(!(*translated))\r
+ {\r
+ *translated = NULL;\r
+ return -1;\r
+ }\r
+ \r
+ strncpy(*translated, buffer3, len);\r
+ \r
+ return len;\r
+}\r
+#else\r
+/*int\r
+getpath(const char* file, char** path)\r
+{\r
+ DWORD len;\r
+ char* part = NULL;\r
+ char buffer[PATH_MAX + 1] = {0}; \r
+ struct stat info = {0};\r
+\r
+ \r
+ len = GetFullPathName(file, PATH_MAX, buffer, &part );\r
+ \r
+ if(!len)\r
+ {\r
+ *path = NULL;\r
+ return -1;\r
+ }\r
+ \r
+ if(stat(buffer, &info) || !S_ISREG(info.st_mode))\r
+ {\r
+ *path = NULL;\r
+ errno = ENOENT;\r
+ return -1;\r
+ } \r
+ \r
+ *path = (char*)calloc(strlen(buffer) - strlen(part), sizeof(char));\r
+\r
+\r
+ *path = strncpy(*path, buffer, strlen(buffer) - strlen(part) - 1);\r
+\r
+ return (int)(strlen(buffer) - strlen(part) -1);\r
+}*/\r
+\r
+int\r
+getpath(const char* file, char** path)\r
+{\r
+ char buf1[PATH_MAX + 1] = {0};\r
+ char buf2[PATH_MAX + 1] = {0};\r
+ struct stat info = {0};\r
+\r
+ char* delimiter;\r
+ \r
+ if(!file)\r
+ {\r
+ *path = NULL;\r
+ return -1;\r
+ }\r
+\r
+ delimiter = strrchr(file,'/');\r
+\r
+ if(!delimiter)\r
+ delimiter = strrchr(file,'\\');\r
+\r
+ if(!delimiter)\r
+ {\r
+ *path = getcwd(NULL,0);\r
+ }\r
+ else\r
+ {\r
+ strncpy(buf2, file, (delimiter - file));\r
+\r
+ if(translatepath(buf2, path) < 0)\r
+ {\r
+ if(errno == ENOTDIR)\r
+ errno = ENOENT;\r
+\r
+ return -1;\r
+ }\r
+ }\r
+\r
+ sprintf(buf1,"%s\\%s", *path, delimiter ? delimiter + 1 : file);\r
+\r
+ \r
+ if(stat(buf1, &info) || !S_ISREG(info.st_mode))\r
+ {\r
+ free(*path);\r
+ *path = NULL;\r
+ errno = ENOENT;\r
+ return -1;\r
+ } \r
+ \r
+ return (int) strlen(*path);\r
+}\r
+\r
+\r
+int\r
+translatepath(const char* totranslate, char** translated)\r
+{\r
+ char buffer1[PATH_MAX + 1] = {0}; \r
+ char buffer2[PATH_MAX + 1] = {0};\r
+ char *p1;\r
+ int i, len;\r
+ \r
+ struct stat stat_buf = {0};\r
+\r
+ len = (int)strlen(totranslate); \r
+ \r
+ strncpy(buffer1, totranslate, len);\r
+\r
+ while((p1 = strstr(buffer1, "//"))) \r
+ if(p1[2]) \r
+ strcpy(p1, p1 + 1); \r
+ else \r
+ p1[1] = '\0';\r
+\r
+ if(buffer1[strlen(buffer1) - 1] == '/' || buffer1[strlen(buffer1) - 1] == '\\')\r
+ buffer1[strlen(buffer1) - 1] = '\0';\r
+ \r
+ /* return the current directory */\r
+ if(!strcmp(totranslate,".") || !strcmp(totranslate,"./"))\r
+ {\r
+ *translated = getcwd(NULL,0);\r
+ return (int)strlen(*translated);\r
+ }\r
+ /* return the previous directory */\r
+ else if(!strcmp(totranslate,"..") || !strcmp(totranslate,"../"))\r
+ {\r
+ getcwd(buffer1, PATH_MAX + 1);\r
+ p1 = strrchr(buffer1, '\\');\r
+ *translated = (char*) calloc((p1 - buffer1) + 1, sizeof(char));\r
+ strncpy(*translated, buffer1, (p1 - buffer1));\r
+ \r
+ return (int)strlen(*translated);\r
+ }\r
+ /* return the root directory */\r
+ else if(!strcmp(totranslate, "/"))\r
+ {\r
+ *translated = getcwd(NULL,0);\r
+ (*translated)[2] = '\0';\r
+\r
+ return (int)strlen(*translated);\r
+ }\r
+ /* it's a relative directory name build the full directory name (directory)*/\r
+ else if( buffer1[0] != '.' && buffer1[0] != '/' && buffer1[1] != ':' && !stat(totranslate, &stat_buf) && S_ISDIR(stat_buf.st_mode))\r
+ {\r
+ for(i = 0; buffer1[i] !='\0'; i++)\r
+ {\r
+ if(buffer1[i] == '/')\r
+ buffer2[i] = '\\';\r
+ else\r
+ buffer2[i] = buffer1[i];\r
+ }\r
+ \r
+ memset(buffer1, 0, PATH_MAX + 1);\r
+ getcwd(buffer1, PATH_MAX + 1);\r
+ strcat(buffer1,"\\");\r
+ strcat(buffer1,buffer2);\r
+ \r
+ *translated = (char*) calloc(strlen(buffer1) + 1, sizeof(char));\r
+ strcpy(*translated, buffer1);\r
+\r
+ return (int)strlen(*translated);\r
+ }\r
+ else if(buffer1[0] == '~') \r
+ {\r
+ /* TODO */\r
+ *translated = NULL;\r
+ errno = ENOSYS;\r
+ return -1;\r
+ }\r
+ else if (*buffer1 == '.') \r
+ {\r
+ _fullpath(buffer2, buffer1, sizeof(buffer1));\r
+ } \r
+ else \r
+ strcpy(buffer2, buffer1);\r
+ \r
+ if(stat(buffer2, &stat_buf) || !S_ISDIR(stat_buf.st_mode))\r
+ {\r
+ *translated = NULL;\r
+ errno = ENOTDIR;\r
+ return -1;\r
+ }\r
+ \r
+\r
+ \r
+ len = (int)strlen(buffer2);\r
+ \r
+\r
+ \r
+ *translated = (char*) calloc(len + 1, sizeof(char));\r
+ strcpy(*translated, buffer2);\r
+ \r
+ if(!(*translated))\r
+ {\r
+ *translated = NULL;\r
+ return -1;\r
+ }\r
+\r
+ return len;\r
+}\r
+#endif\r
+\r
+\r