Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Define correctly variables for windows.
[simgrid.git] / tools / tesh2 / src / getpath.c
index 728a88d..4f768d7 100644 (file)
-#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