#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
+#include <stdlib.h>
#ifdef __linux__
# if HAVE_LINUX_MAGIC_H
# include <linux/magic.h>
absolutePathFromBaseFile(const char *base_file, const char *path)
{
char *res;
+ char *tmp;
size_t d_len = dir_len (base_file);
/* If path is already absolute, or if dirname(base_file) is ".",
just return a copy of path. */
if (*path == '/' || d_len == 0)
- return strdup(path);
+ return canonicalize_file_name(path);
/* Ensure that the following cast-to-int is valid. */
if (d_len > INT_MAX)
return NULL;
- ignore_value(virAsprintf(&res, "%.*s/%s", (int) d_len, base_file, path));
+ if (virAsprintf(&tmp, "%.*s/%s", (int) d_len, base_file, path) < 0)
+ return NULL;
+ res = canonicalize_file_name(tmp);
+ VIR_FREE(tmp);
return res;
}
meta->backingStoreIsFile = false;
if (backing != NULL) {
+ meta->backingStore = strdup(backing);
+ if (meta->backingStore == NULL) {
+ virReportOOMError();
+ VIR_FREE(backing);
+ return -1;
+ }
if (virBackingStoreIsFile(backing)) {
meta->backingStoreIsFile = true;
+ meta->backingStoreRaw = meta->backingStore;
meta->backingStore = absolutePathFromBaseFile(path, backing);
- } else {
- meta->backingStore = strdup(backing);
+ if (meta->backingStore == NULL) {
+ virReportOOMError();
+ VIR_FREE(backing);
+ return -1;
+ }
}
VIR_FREE(backing);
- if (meta->backingStore == NULL) {
- virReportOOMError();
- return -1;
- }
meta->backingStoreFormat = backingFormat;
} else {
meta->backingStore = NULL;
virStorageFileFreeMetadata(meta->backingMeta);
VIR_FREE(meta->backingStore);
+ VIR_FREE(meta->backingStoreRaw);
VIR_FREE(meta);
}
typedef struct _virStorageFileMetadata virStorageFileMetadata;
typedef virStorageFileMetadata *virStorageFileMetadataPtr;
struct _virStorageFileMetadata {
- char *backingStore;
+ char *backingStore; /* Canonical name (absolute file, or protocol) */
+ char *backingStoreRaw; /* If file, original name, possibly relative */
int backingStoreFormat; /* enum virStorageFileFormat */
bool backingStoreIsFile;
virStorageFileMetadataPtr backingMeta;