Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
On Windows version of the function getpath(), translate the errno ENOTDIR to ENOENT...
authorcherierm <cherierm@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 25 Jun 2008 07:44:15 +0000 (07:44 +0000)
committercherierm <cherierm@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 25 Jun 2008 07:44:15 +0000 (07:44 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@5798 48e7efb5-ca39-0410-a469-dd3cf9ba447f

tools/tesh2/src/getpath.c

index 40b9880..ffd9e8c 100644 (file)
@@ -341,17 +341,17 @@ getpath(const char* file, char** path)
        char buf2[PATH_MAX + 1] = {0};\r
        struct stat info = {0};\r
 \r
-       char* delimiter;
-       
+       char* delimiter;\r
+       \r
        if(!file)\r
        {\r
                *path = NULL;\r
                return -1;\r
-       }
-
-       delimiter = strrchr(file,'/');
-
-       if(!delimiter)
+       }\r
+\r
+       delimiter = strrchr(file,'/');\r
+\r
+       if(!delimiter)\r
                delimiter = strrchr(file,'\\');\r
 \r
        if(!delimiter)\r
@@ -363,10 +363,16 @@ getpath(const char* file, char** path)
                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
@@ -386,9 +392,22 @@ translatepath(const char* totranslate, char** translated)
        char buffer1[PATH_MAX + 1] = {0};               \r
        char buffer2[PATH_MAX + 1] = {0};\r
        char *p1;\r
-       int i, j, len;\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
@@ -414,65 +433,28 @@ translatepath(const char* totranslate, char** translated)
 \r
                return (int)strlen(*translated);\r
        }\r
-       /* it's a relative directory name build the full directory name */\r
-       else if(!strchr(totranslate, '/') && !strchr(totranslate, '\\') && !stat(totranslate, &stat_buf) && S_ISDIR(stat_buf.st_mode))\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,totranslate);\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
-       \r
-       len = (int)strlen(totranslate);                                         \r
-       \r
-       strncpy(buffer1, totranslate, len);     \r
-       \r
-       if(buffer1[strlen(buffer1) - 1] == '/' || buffer1[strlen(buffer1) - 1] == '\\')\r
-               buffer1[strlen(buffer1) - 1] = '\0';\r
-       \r
-       while((p1 = strstr(buffer1, "//"))) \r
-               if(p1[2]) \r
-                       strcpy(p1, p1 + 1); \r
-               else \r
-                       p1[1] = '\0';\r
-       \r
-       for(i = 0, j = 0; buffer1[i] !='\0'; i++)\r
-       {\r
-               if(buffer1[i] == '/')\r
-               {\r
-                       j++;\r
-                       \r
-                       if(j > 1)\r
-                               break;\r
-               }\r
-       }\r
-\r
-       if(j == 1 && buffer1[i - 1] == '/')\r
-       {\r
-               /* perhaps it's a relative directory : `dir/' */\r
-               strncpy(buffer2, buffer1, strlen(buffer1) - 1);\r
-               \r
-               if(!stat(buffer2, &stat_buf) && S_ISDIR(stat_buf.st_mode))\r
-               {\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\r
-                       memset(buffer2, 0, PATH_MAX + 1);\r
-               \r
-       }\r
-       \r
-       if(buffer1[0] == '~') \r
+       else if(buffer1[0] == '~') \r
        {\r
                /* TODO */\r
                *translated = NULL;\r
@@ -481,7 +463,7 @@ translatepath(const char* totranslate, char** translated)
        }\r
        else if (*buffer1 == '.') \r
        {\r
-               _fullpath(buffer2, buffer1, sizeof(buffer1));   \r
+               _fullpath(buffer2, buffer1, sizeof(buffer1));\r
        } \r
        else \r
                strcpy(buffer2, buffer1);\r
@@ -492,9 +474,13 @@ translatepath(const char* totranslate, char** translated)
                errno = ENOTDIR;\r
                return -1;\r
        }\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