#include <com.h>\r
-\r
+\r XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);
+\r\r
/*#include <stdlib.h>\r
#include <string.h>\r
\r
-*/\r
-\r
+*/ \r
+ \r
#include <sys/types.h>\r
#include <sys/stat.h>\r
-\r
-#ifndef WIN32\r
+ \r
+#ifndef _XBT_WIN32\r
#include <pwd.h>\r
-#else\r
-#endif\r
-\r
+#else /* \r */
+#endif /* \r */
+ \r
#include <errno.h>\r
#include <getpath.h>\r
-\r
+ \r
#ifndef PATH_MAX\r
#define PATH_MAX 255\r
-#endif\r
+#endif /* \r */
+ \r
+#ifndef _XBT_WIN32\r
+int \r getpath(const char *file, char **path) \r
+{
+ \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}
+
+\r\rint \r translatepath(const char *totranslate, char **translated) \r
+{
+ \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
-#ifndef 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
+#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
*path = NULL;\r
return -1;\r
}\r
-\r
\r
if(stat(buffer, &info) || !S_ISREG(info.st_mode))\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
-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, j, len;\r
- \r
- struct stat stat_buf = {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
- 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
- {\r
- getcwd(buffer1, PATH_MAX + 1);\r
- strcat(buffer1,"\\");\r
- strcat(buffer1,totranslate);\r
- \r
- *translated = (char*) calloc(strlen(buffer1) + 1, sizeof(char));\r
- strcpy(*translated, buffer1);\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
- return (int)strlen(*translated);\r
- }\r
- else\r
- memset(buffer2, 0, PATH_MAX + 1);\r
- \r
- }\r
- \r
- 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
- len = (int)strlen(buffer2);\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, buffer2, len);\r
- \r
- return len;\r
-}\r
-#endif\r
-\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