X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Frealpath.c;h=08d32d7bf23f96af6d74dca2e304cc5d36812570;hb=4f29597e4f3696a59bb08ffece07183c1568c4a5;hp=f81bab663d12ce0b99bbb23dd37a7406d3ee299d;hpb=ea1ea793fe6e244ef5555ed983423a204101af13;p=chise%2Fxemacs-chise.git- diff --git a/src/realpath.c b/src/realpath.c index f81bab6..08d32d7 100644 --- a/src/realpath.c +++ b/src/realpath.c @@ -28,13 +28,14 @@ Boston, MA 02111-1307, USA. */ #include #include #include +#include + #ifdef HAVE_UNISTD_H #include #endif -#ifdef _POSIX_VERSION -#include /* for PATH_MAX */ -#else -#include /* for MAXPATHLEN */ + +#if defined (HAVE_SYS_PARAM_H) +#include #endif #ifdef WINDOWSNT @@ -43,20 +44,24 @@ Boston, MA 02111-1307, USA. */ #include /* for S_IFLNK */ -#ifndef PATH_MAX -#ifdef _POSIX_VERSION -#define PATH_MAX _POSIX_PATH_MAX -#else -#ifdef MAXPATHLEN -#define PATH_MAX MAXPATHLEN -#else -#define PATH_MAX 1024 -#endif +#if !defined (HAVE_GETCWD) && defined (HAVE_GETWD) +#undef getcwd +#define getcwd(buffer, len) getwd (buffer) #endif + +#ifndef PATH_MAX +# if defined (_POSIX_PATH_MAX) +# define PATH_MAX _POSIX_PATH_MAX +# elif defined (MAXPATHLEN) +# define PATH_MAX MAXPATHLEN +# else +# define PATH_MAX 1024 +# endif #endif #define MAX_READLINKS 32 +char * xrealpath (const char *path, char resolved_path []); char * xrealpath (const char *path, char resolved_path []) { @@ -70,7 +75,7 @@ xrealpath (const char *path, char resolved_path []) #endif /* Make a copy of the source path since we may need to modify it. */ - strcpy(copy_path, path); + strcpy (copy_path, path); path = copy_path; max_path = copy_path + PATH_MAX - 2; #ifdef WINDOWSNT @@ -99,7 +104,7 @@ xrealpath (const char *path, char resolved_path []) */ else if (*path == '/') { - getcwd(new_path, PATH_MAX - 1); + getcwd (new_path, PATH_MAX - 1); new_path += 3; path++; } @@ -109,21 +114,17 @@ xrealpath (const char *path, char resolved_path []) */ else { - getcwd(new_path, PATH_MAX - 1); + getcwd (new_path, PATH_MAX - 1); new_path += strlen(new_path); if (new_path[-1] != '/') *new_path++ = '/'; } #else - /* If it's a relative pathname use getwd for starters. */ + /* If it's a relative pathname use getcwd for starters. */ if (*path != '/') { -#ifdef HAVE_GETCWD - getcwd(new_path, PATH_MAX - 1); -#else - getwd(new_path); -#endif + getcwd (new_path, PATH_MAX - 1); new_path += strlen(new_path); if (new_path[-1] != '/') *new_path++ = '/'; @@ -153,21 +154,20 @@ xrealpath (const char *path, char resolved_path []) continue; } - if (path[1] == '.') + /* Handle ".." */ + if (path[1] == '.' && + (path[2] == '\0' || path[2] == '/')) { - if (path[2] == '\0' || path[2] == '/') - { - path += 2; - - /* Ignore ".." at root. */ - if (new_path == resolved_path + 1) - continue; - - /* Handle ".." by backing up. */ - while ((--new_path)[-1] != '/') - ; - continue; - } + path += 2; + + /* Ignore ".." at root. */ + if (new_path == resolved_path + 1) + continue; + + /* Handle ".." by backing up. */ + while ((--new_path)[-1] != '/') + ; + continue; } } @@ -185,7 +185,7 @@ xrealpath (const char *path, char resolved_path []) #ifdef S_IFLNK /* See if latest pathname component is a symlink. */ *new_path = '\0'; - n = readlink(resolved_path, link_path, PATH_MAX - 1); + n = readlink (resolved_path, link_path, PATH_MAX - 1); if (n < 0) {