#include <stdio.h>
#include <string.h>
#include <errno.h>
+#include <limits.h>
+
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
-#ifdef _POSIX_VERSION
-#include <limits.h> /* for PATH_MAX */
-#else
-#include <sys/param.h> /* for MAXPATHLEN */
+
+#if defined (HAVE_SYS_PARAM_H)
+#include <sys/param.h>
#endif
#ifdef WINDOWSNT
#include <sys/stat.h> /* 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 [])
{
#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
*/
else if (*path == '/')
{
- getcwd(new_path, PATH_MAX - 1);
+ getcwd (new_path, PATH_MAX - 1);
new_path += 3;
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++ = '/';
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;
}
}
#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)
{