diff --git a/bootstrap b/bootstrap index 667af4fc8b..c07d85158e 100755 --- a/bootstrap +++ b/bootstrap @@ -65,6 +65,7 @@ gnulib_tool=$GNULIB_SRCDIR/gnulib-tool <$gnulib_tool || exit modules=' +areadlink base64 c-ctype close diff --git a/configure.in b/configure.in index 6135932c8f..6ed2efde58 100644 --- a/configure.in +++ b/configure.in @@ -83,7 +83,7 @@ dnl Use --disable-largefile if you don't want this. AC_SYS_LARGEFILE dnl Availability of various common functions (non-fatal if missing). -AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity getuid getgid posix_fallocate mmap readlink]) +AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity getuid getgid posix_fallocate mmap]) dnl Availability of various not common threadsafe functions AC_CHECK_FUNCS([strerror_r strtok_r getmntent_r getgrnam_r getpwuid_r]) diff --git a/src/util/util.c b/src/util/util.c index 694838a816..44a4b2fffb 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -64,6 +64,7 @@ #include #endif +#include "areadlink.h" #include "virterror_internal.h" #include "logging.h" #include "event.h" @@ -1059,10 +1060,7 @@ int virFileLinkPointsTo(const char *checkLink, int virFileResolveLink(const char *linkpath, char **resultpath) { -#ifdef HAVE_READLINK struct stat st; - char *buf; - int n; *resultpath = NULL; @@ -1075,28 +1073,9 @@ int virFileResolveLink(const char *linkpath, return 0; } - /* Posix says that 'st_size' field from - * result of an lstat() call is filled with - * number of bytes in the destination - * filename. - */ - if (VIR_ALLOC_N(buf, st.st_size + 1) < 0) - return -ENOMEM; + *resultpath = areadlink (linkpath); - if ((n = readlink(linkpath, buf, st.st_size)) < 0) { - VIR_FREE(buf); - return -errno; - } - - buf[n] = '\0'; - - *resultpath = buf; - return 0; -#else - if (!(*resultpath = strdup(linkpath))) - return -ENOMEM; - return 0; -#endif + return *resultpath == NULL ? -1 : 0; } /*