diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 37c729c725..57a6a6a988 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -445,6 +445,7 @@ virFileExists; virFileHasSuffix; virFileLinkPointsTo; virFileMakePath; +virFileAbsPath; virFileOpenTty; virFileReadLimFD; virFilePid; diff --git a/src/util/util.c b/src/util/util.c index f474ead9d6..81b743c95c 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -1402,6 +1402,42 @@ cleanup: #endif /* PROXY */ +/* + * Creates an absolute path for a potentialy realtive path. + * Return 0 if the path was not relative, or on success. + * Return -1 on error. + * + * You must free the result. + */ +int virFileAbsPath(const char *path, char **abspath) +{ + char *buf; + int cwdlen; + + if (path[0] == '/') { + buf = strdup(path); + if (buf == NULL) + return(-1); + } else { + buf = getcwd(NULL, 0); + if (buf == NULL) + return(-1); + + cwdlen = strlen(buf); + /* cwdlen includes the null terminator */ + if (VIR_REALLOC_N(buf, cwdlen + strlen(path) + 1) < 0) { + VIR_FREE(buf); + errno = ENOMEM; + return(-1); + } + + buf[cwdlen] = '/'; + strcpy(&buf[cwdlen + 1], path); + } + + *abspath = buf; + return 0; +} /* Like strtol, but produce an "int" result, and check more carefully. Return 0 upon success; return -1 to indicate failure. diff --git a/src/util/util.h b/src/util/util.h index 77f50edcac..8679636bde 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -115,6 +115,9 @@ int virFileBuildPath(const char *dir, char *buf, unsigned int buflen); +int virFileAbsPath(const char *path, + char **abspath); + int virFileOpenTty(int *ttymaster, char **ttyName, int rawmode);