[Location or name of the showmount program])
fi
-AC_PATH_PROG([QEMU_IMG], [qemu-img], [], [$PATH:/sbin:/usr/sbin:/bin:/usr/bin])
-if test -n "$QEMU_IMG" ; then
- AC_DEFINE_UNQUOTED([HAVE_QEMU_IMG], 1, [whether qemu-img is available for non-raw files])
- AC_DEFINE_UNQUOTED([QEMU_IMG],["$QEMU_IMG"],
- [Location or name of the qemu-img program])
-fi
-
-AC_PATH_PROG([QCOW_CREATE], [qcow-create], [], [$PATH:/sbin:/usr/sbin:/bin:/usr/bin])
-if test -n "$QCOW_CREATE" ; then
- AC_DEFINE_UNQUOTED([HAVE_QCOW_CREATE], 1, [whether qcow-create is available for non-raw files])
- AC_DEFINE_UNQUOTED([QCOW_CREATE],["$QCOW_CREATE"],
- [Location or name of the qcow-create program])
-fi
-
-
if test "$with_storage_lvm" = "yes" -o "$with_storage_lvm" = "check"; then
AC_PATH_PROG([PVCREATE], [pvcreate], [], [$PATH:/sbin:/usr/sbin])
AC_PATH_PROG([VGCREATE], [vgcreate], [], [$PATH:/sbin:/usr/sbin])
return 0;
}
-#if HAVE_QEMU_IMG
static int createQemuImg(virConnectPtr conn,
virStorageVolDefPtr vol,
virStorageVolDefPtr inputvol) {
char size[100];
+ char *create_tool;
+ short use_kvmimg;
const char *type = virStorageVolFormatFileSystemTypeToString(vol->target.format);
const char *backingType = vol->backingStore.path ?
const char **imgargv;
const char *imgargvnormal[] = {
- QEMU_IMG, "create",
+ NULL, "create",
"-f", type,
vol->target.path,
size,
NULL,
};
- /* XXX including "backingType" here too, once QEMU accepts
- * the patches to specify it. It'll probably be -F backingType */
+ /* Extra NULL fields are for including "backingType" when using
+ * kvm-img. It's -F backingType
+ */
const char *imgargvbacking[] = {
- QEMU_IMG, "create",
+ NULL, "create",
"-f", type,
"-b", vol->backingStore.path,
vol->target.path,
size,
NULL,
+ NULL,
+ NULL
};
const char *convargv[] = {
- QEMU_IMG, "convert",
+ NULL, "convert",
"-f", inputType,
"-O", type,
inputPath,
NULL,
};
- if (inputvol) {
- imgargv = convargv;
- } else if (vol->backingStore.path) {
- imgargv = imgargvbacking;
- } else {
- imgargv = imgargvnormal;
- }
-
if (type == NULL) {
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
_("unknown storage vol type %d"),
}
}
+ if ((create_tool = virFindFileInPath("kvm-img")) != NULL)
+ use_kvmimg = 1;
+ else if ((create_tool = virFindFileInPath("qemu-img")) != NULL)
+ use_kvmimg = 0;
+ else {
+ virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("unable to find kvm-img or qemu-img"));
+ return -1;
+ }
+
+ if (inputvol) {
+ convargv[0] = create_tool;
+ imgargv = convargv;
+ } else if (vol->backingStore.path) {
+ imgargvbacking[0] = create_tool;
+ if (use_kvmimg) {
+ imgargvbacking[6] = "-F";
+ imgargvbacking[7] = backingType;
+ imgargvbacking[8] = vol->target.path;
+ imgargvbacking[9] = size;
+ }
+ imgargv = imgargvbacking;
+ } else {
+ imgargvnormal[0] = create_tool;
+ imgargv = imgargvnormal;
+ }
+
+
/* Size in KB */
snprintf(size, sizeof(size), "%llu", vol->capacity/1024);
if (virRun(conn, imgargv, NULL) < 0) {
+ VIR_FREE(imgargv[0]);
return -1;
}
+ VIR_FREE(imgargv[0]);
+
return 0;
}
-#elif HAVE_QCOW_CREATE
/*
* Xen removed the fully-functional qemu-img, and replaced it
* with a partially functional qcow-create. Go figure ??!?
/* Size in MB - yes different units to qemu-img :-( */
snprintf(size, sizeof(size), "%llu", vol->capacity/1024/1024);
- imgargv[0] = QCOW_CREATE;
+ imgargv[0] = virFindFileInPath("qcow-create");
imgargv[1] = size;
imgargv[2] = vol->target.path;
imgargv[3] = NULL;
if (virRun(conn, imgargv, NULL) < 0) {
+ VIR_FREE(imgargv[0]);
return -1;
}
+ VIR_FREE(imgargv[0]);
+
return 0;
}
-#endif /* HAVE_QEMU_IMG, elif HAVE_QCOW_CREATE */
static int
_virStorageBackendFileSystemVolBuild(virConnectPtr conn,
{
int fd;
createFile create_func;
+ char *create_tool;
if (vol->target.format == VIR_STORAGE_VOL_FILE_RAW &&
(!inputvol ||
create_func = createRaw;
} else if (vol->target.format == VIR_STORAGE_VOL_FILE_DIR) {
create_func = createFileDir;
- } else {
-#if HAVE_QEMU_IMG
+ } else if ((create_tool = virFindFileInPath("kvm-img")) != NULL) {
+ VIR_FREE(create_tool);
+ create_func = createQemuImg;
+ } else if ((create_tool = virFindFileInPath("qemu-img")) != NULL) {
+ VIR_FREE(create_tool);
create_func = createQemuImg;
-#elif HAVE_QCOW_CREATE
+ } else if ((create_tool = virFindFileInPath("qcow-create")) != NULL) {
+ VIR_FREE(create_tool);
create_func = createQemuCreate;
-#else
+ } else {
virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
"%s", _("creation of non-raw images "
"is not supported without qemu-img"));
return -1;
-#endif
}
if (create_func(conn, vol, inputvol) < 0)
#endif
}
+/*
+ * Finds a requested file in the PATH env. e.g.:
+ * "kvm-img" will return "/usr/bin/kvm-img"
+ *
+ * You must free the result
+ */
+char *virFindFileInPath(const char *file)
+{
+ char pathenv[PATH_MAX];
+ char *penv = &pathenv; /* this is for glibc 2.10 strsep chnages */
+ char *pathseg;
+ char fullpath[PATH_MAX];
+
+ /* copy PATH env so we can tweak it */
+ strncpy(pathenv, getenv("PATH"), PATH_MAX);
+ pathenv[PATH_MAX - 1] = '\0';
+
+ /* for each path segment, append the file to search for and test for
+ * it. return it if found.
+ */
+ while ((pathseg = strsep(&penv, ":")) != NULL) {
+ snprintf(fullpath, PATH_MAX, "%s/%s", pathseg, file);
+ if (virFileExists(fullpath))
+ return strdup(fullpath);
+ }
+
+ return NULL;
+}
int virFileExists(const char *path)
{
struct stat st;