Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
typo in comments (sorry for the noise)
[simgrid.git] / tools / tesh2 / src / getpath.c
index 728a88d941fd8a5769be877546cb7a8bdeef4a81..d3e9913a394e747fd5f097f7d66fd63f4b365adb 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)
+#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
 {
-       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;
-}
+  \rchar buffer1[PATH_MAX + 1] = { 0 };
+  \rchar buffer2[PATH_MAX + 1] = { 0 };
+  \rchar buffer3[PATH_MAX + 1] = { 0 };
+  \rchar *p1, *p2;
+  \rsize_t len = strlen(file);
+  \rchar *last_delimiter = NULL;
+  \rstruct stat buffer = { 0 };
+  \r\rstrncpy(buffer1, file, len);
+  \r\r
+      /* remove the /////// */ \r
+      while ((p1 = strstr(buffer1, "//")))
+    \r {
+    \rif (p1[2])
+      \rstrcpy(p1, p1 + 1);
+    \r
+    else
+      \rp1[1] = '\0';
+    \r}
+  \r\rif (*buffer1 == '~')
+    \r {
+    \rfor (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/');
+          *p2++ = *p1++);
+    \r*p2 = '\0';
+    \r\rif (buffer2[0] == '\0')
+      \r {
+      \rchar *home = getenv("HOME");
+      \r\rif (home)
+        \r {
+        \rstrcpy(buffer2, home);
+        \r}
+      \r
+      else
+        \r {
+        \rstruct passwd *pw = getpwuid(getuid());
+        \r\rif (!pw)
+          \r {
+          \r*path = NULL;
+          \rreturn -1;
+          \r}
+        \r\rstrcpy(buffer2, pw->pw_dir);
+        \r}
+      \r\rstrcat(buffer2, p1);
+      \r}
+    \r\r}
+  \r
+  else if (buffer1[0] != '/')
+    \r {
+    \r\rgetcwd(buffer2, PATH_MAX + 1);
+    \r\rif (buffer1[0] == '.' && buffer1[1] == '/')
+      \r {                       /* replace */
+      \rstrcat(buffer2, &buffer1[1]);
+      \r}
+    \r
+    else
+      \r {
+      \rstrcat(buffer2, "/");
+      \rstrcat(buffer2, buffer1);
+      \r}
+    \r}
+  \r
+  else
+    \r {
+    \rstrcpy(buffer2, buffer1);  /* copy */
+    \r}
+  \r\r
+      /*\r
+       * check for /..\r
+       */ \r
+      while ((p1 = strstr(buffer2, "/..")))
+    \r {
+    \rfor (p2 = p1; --p2 > buffer2 && *p2 != '/';);
+    \r\rif (*(p1 + 3))
+      \rmemmove(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\rwhile (p1)
+    \r {
+    \rstrcat(buffer3, "/");
+    \rstrcat(buffer3, p1);
+    \r\rlen = readlink(buffer3, buffer1, PATH_MAX);
+    \r\rif (len != -1)
+      \r {
+      \r*(buffer1 + len) = '\0';
+      \rstrcpy(buffer3, buffer1);
+      \r}
+    \r\rp1 = strtok(NULL, "/");
+    \r}
+  \r\rif (stat(buffer3, &buffer) || !S_ISREG(buffer.st_mode))
+    \r {
+    \r*path = NULL;
+    \rerrno = ENOENT;
+    \rreturn -1;
+    \r}
+  \r\rlast_delimiter = strrchr(buffer3, '/');
+  \r\rlen = strlen(buffer3);
+  \r\rif (last_delimiter)
+    \rlen -= strlen(last_delimiter);
+  \r\r*path = (char *) calloc(len + 1, sizeof(char));
+  \r\rif (!(*path))
+    \r {
+    \r*path = NULL;
+    \rreturn -1;
+    \r}
+  \r\rstrncpy(*path, buffer3, len);
+  \r\rreturn len;
+\r}
 
-#include <stdio.h>
-
-int
-translatepath(const char* totranslate, char** translated)
+\r\rint \r translatepath(const char *totranslate, char **translated) \r
 {
-       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;
-}
+  \rchar buffer1[PATH_MAX + 1] = { 0 };
+  \rchar buffer2[PATH_MAX + 1] = { 0 };
+  \rchar buffer3[PATH_MAX + 1] = { 0 };
+  \rchar *p1, *p2;
+  \rsize_t len;
+  \rstruct stat buffer = { 0 };
+  \r\rlen = strlen(totranslate);
+  \r\rstrncpy(buffer1, totranslate, len);
+  \r\rif (!strcmp(buffer1, "."))
+    \r {
+    \r*translated = getcwd(NULL, 0);
+    \rreturn strlen(*translated);
+    \r}
+  \r
+  else if (!strcmp(buffer1, "/.."))
+    \r {
+    \r*translated = strdup("/");
+    \rreturn strlen(*translated);
+    \r}
+  \r\rwhile ((p1 = strstr(buffer1, "//")))
+    \rif (p1[2])
+      \rstrcpy(p1, p1 + 1);
+  \r
+    else
+      \rp1[1] = '\0';
+  \r\rif (buffer1[0] == '~')
+    \r {
+    \rfor (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/');
+          *(p2++) = *(p1++));
+    \r\r*p2 = '\0';
+    \r\rif (buffer2[0] == '\0')
+      \r {
+      \rchar *home = getenv("HOME");
+      \r\rif (home)
+        \r {
+        \rstrcpy(buffer2, home);
+        \r}
+      \r
+      else
+        \r {
+        \rstruct passwd *pw = getpwuid(getuid());        /* get entry */
+        \r\rif (!pw)
+          \r {
+          \r*translated = NULL;
+          \rreturn -1;
+          \r}
+        \r\rstrcpy(buffer2, pw->pw_dir);
+        \r}
+      \r\rstrcat(buffer2, p1);
+      \r}
+    \r}
+  \r
+  else if (*buffer1 != '/')
+    \r {
+    \r\rgetcwd(buffer2, PATH_MAX + 1);
+    \r\rif (*buffer1 == '.' && *(buffer1 + 1) == '/')
+      \r {
+      \rstrcat(buffer2, buffer1 + 1);
+      \r}
+    \r
+    else
+      \r {
+      \rstrcat(buffer2, "/");
+      \rstrcat(buffer2, buffer1);
+      \r}
+    \r}
+  \r
+  else
+    \r {
+    \rstrcpy(buffer2, buffer1);
+    \r}
+  \r\r
+      /*\r
+       * check for /..\r
+       */ \r
+      while ((p1 = strstr(buffer2, "/..")))
+    \r {
+    \rfor (p2 = p1; --p2 > buffer2 && *p2 != '/';);
+    \r\rif (*(p1 + 3))
+      \rmemmove(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\rwhile (p1)
+    \r {
+    \rstrcat(buffer3, "/");
+    \rstrcat(buffer3, p1);
+    \r\rlen = readlink(buffer3, buffer1, PATH_MAX);
+    \r\rif (len != -1)
+      \r {
+      \r*(buffer1 + len) = '\0';
+      \rstrcpy(buffer3, buffer1);
+      \r}
+    \r\rp1 = strtok(NULL, "/");
+    \r}
+  \r\rif (!(*buffer3))
+    \rstrcpy(buffer3, "/");
+  \r\rlen = strlen(buffer3);
+  \r\rif (stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))
+    \r {
+    \r*translated = NULL;
+    \rerrno = ENOTDIR;
+    \rreturn -1;
+    \r}
+  \r\r\r*translated = (char *) calloc(len + 1, sizeof(char));
+  \r\rif (!(*translated))
+    \r {
+    \r*translated = NULL;
+    \rreturn -1;
+    \r}
+  \r\rstrncpy(*translated, buffer3, len);
+  \r\rreturn 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
+\rint \r getpath(const char *file, char **path) \r
+{
+  \rchar buf1[PATH_MAX + 1] = { 0 };
+  \rchar buf2[PATH_MAX + 1] = { 0 };
+  \rstruct stat info = { 0 };
+  \r\rchar *delimiter;
+  \r\rif (!file)
+    \r {
+    \r*path = NULL;
+    \rreturn -1;
+    \r}
+  \r\rdelimiter = strrchr(file, '/');
+  \r\rif (!delimiter)
+    \rdelimiter = strrchr(file, '\\');
+  \r\rif (!delimiter)
+    \r {
+    \r*path = getcwd(NULL, 0);
+    \r}
+  \r
+  else
+    \r {
+    \rstrncpy(buf2, file, (delimiter - file));
+    \r\rif (translatepath(buf2, path) < 0)
+      \r {
+      \rif (errno == ENOTDIR)
+        \rerrno = ENOENT;
+      \r\rreturn -1;
+      \r}
+    \r}
+  \r\rsprintf(buf1, "%s\\%s", *path, delimiter ? delimiter + 1 : file);
+  \r\r\rif (stat(buf1, &info) || !S_ISREG(info.st_mode))
+    \r {
+    \rfree(*path);
+    \r*path = NULL;
+    \rerrno = ENOENT;
+    \rreturn -1;
+    \r}
+  \r\rreturn (int) strlen(*path);
+\r\r\r\rint \r translatepath(const char *totranslate, char **translated) \r
+{
+  \rchar buffer1[PATH_MAX + 1] = { 0 };
+  \rchar buffer2[PATH_MAX + 1] = { 0 };
+  \rchar *p1;
+  \rint i, len;
+  \r\rstruct stat stat_buf = { 0 };
+  \r\rlen = (int) strlen(totranslate);
+  \r\rstrncpy(buffer1, totranslate, len);
+  \r\rwhile ((p1 = strstr(buffer1, "//")))
+    \rif (p1[2])
+      \rstrcpy(p1, p1 + 1);
+  \r
+    else
+      \rp1[1] = '\0';
+  \r\rif (buffer1[strlen(buffer1) - 1] == '/'
+        || buffer1[strlen(buffer1) - 1] == '\\')
+    \rbuffer1[strlen(buffer1) - 1] = '\0';
+  \r\r
+      /* return the current directory */ \r
+      if (!strcmp(totranslate, ".") || !strcmp(totranslate, "./"))
+    \r {
+    \r*translated = getcwd(NULL, 0);
+    \rreturn (int) strlen(*translated);
+    \r}
+  \r
+      /* return the previous directory */ \r
+      else if (!strcmp(totranslate, "..") || !strcmp(totranslate, "../"))
+    \r {
+    \rgetcwd(buffer1, PATH_MAX + 1);
+    \rp1 = strrchr(buffer1, '\\');
+    \r*translated = (char *) calloc((p1 - buffer1) + 1, sizeof(char));
+    \rstrncpy(*translated, buffer1, (p1 - buffer1));
+    \r\rreturn (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\rreturn (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 {
+    \rfor (i = 0; buffer1[i] != '\0'; i++)
+      \r {
+      \rif (buffer1[i] == '/')
+        \rbuffer2[i] = '\\';
+      \r
+      else
+        \rbuffer2[i] = buffer1[i];
+      \r}
+    \r\rmemset(buffer1, 0, PATH_MAX + 1);
+    \rgetcwd(buffer1, PATH_MAX + 1);
+    \rstrcat(buffer1, "\\");
+    \rstrcat(buffer1, buffer2);
+    \r\r*translated = (char *) calloc(strlen(buffer1) + 1, sizeof(char));
+    \rstrcpy(*translated, buffer1);
+    \r\rreturn (int) strlen(*translated);
+    \r}
+  \r
+  else if (buffer1[0] == '~')
+    \r {
+    \r
+        /* TODO */ \r
+        *translated = NULL;
+    \rerrno = ENOSYS;
+    \rreturn -1;
+    \r}
+  \r
+  else if (*buffer1 == '.')
+    \r {
+    \r_fullpath(buffer2, buffer1, sizeof(buffer1));
+    \r}
+  \r
+  else
+    \rstrcpy(buffer2, buffer1);
+  \r\rif (stat(buffer2, &stat_buf) || !S_ISDIR(stat_buf.st_mode))
+    \r {
+    \r*translated = NULL;
+    \rerrno = ENOTDIR;
+    \rreturn -1;
+    \r}
+  \r\r\r\rlen = (int) strlen(buffer2);
+  \r\r\r\r*translated = (char *) calloc(len + 1, sizeof(char));
+  \rstrcpy(*translated, buffer2);
+  \r\rif (!(*translated))
+    \r {
+    \r*translated = NULL;
+    \rreturn -1;
+    \r}
+  \r\rreturn len;
+\r}
 
+\r
+#endif  /* \r */
+    \r\r