util: Introduce virFileReadLink

We will need to traverse the symlinks one step at the time.
Therefore we need to see where a symlink is pointing to.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Michal Privoznik 2017-01-18 18:35:31 +01:00
parent 3172d26730
commit 6094169b83
3 changed files with 16 additions and 0 deletions

View File

@ -1616,6 +1616,7 @@ virFileReadAllQuiet;
virFileReadBufQuiet; virFileReadBufQuiet;
virFileReadHeaderFD; virFileReadHeaderFD;
virFileReadLimFD; virFileReadLimFD;
virFileReadLink;
virFileRelLinkPointsTo; virFileRelLinkPointsTo;
virFileRemove; virFileRemove;
virFileRemoveLastComponent; virFileRemoveLastComponent;

View File

@ -76,6 +76,7 @@
#include "virutil.h" #include "virutil.h"
#include "c-ctype.h" #include "c-ctype.h"
#include "areadlink.h"
#define VIR_FROM_THIS VIR_FROM_NONE #define VIR_FROM_THIS VIR_FROM_NONE
@ -1614,6 +1615,17 @@ virFileIsLink(const char *linkpath)
return S_ISLNK(st.st_mode) != 0; return S_ISLNK(st.st_mode) != 0;
} }
/*
* Read where symlink is pointing to.
*
* Returns 0 on success (@linkpath is a successfully read link),
* -1 with errno set upon error.
*/
int
virFileReadLink(const char *linkpath, char **resultpath)
{
return (*resultpath = areadlink(linkpath)) ? 0 : -1;
}
/* /*
* Finds a requested executable file in the PATH env. e.g.: * Finds a requested executable file in the PATH env. e.g.:

View File

@ -166,6 +166,9 @@ int virFileResolveAllLinks(const char *linkpath,
int virFileIsLink(const char *linkpath) int virFileIsLink(const char *linkpath)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
int virFileReadLink(const char *linkpath, char **resultpath)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
char *virFindFileInPath(const char *file); char *virFindFileInPath(const char *file);
char *virFileFindResource(const char *filename, char *virFileFindResource(const char *filename,