storage_backend: Convert virRunWithHook usage to virCommand

virRunWithHook is now unused, so we can drop it. Tested w/ raw + qcow2
volume creation and copying.

v2:
    Use opaque data to skip hook second time around
    Simply command building

v3:
    Drop explicit FindFileInPath
This commit is contained in:
Cole Robinson 2011-05-06 14:35:51 -04:00
parent 51622f21a2
commit 1ccc16c603
4 changed files with 66 additions and 116 deletions

View File

@ -967,7 +967,6 @@ virPipeReadUntilEOF;
virRandom;
virRandomInitialize;
virRun;
virRunWithHook;
virSetBlocking;
virSetCloseExec;
virSetInherit;

View File

@ -523,8 +523,17 @@ cleanup:
return ret;
}
struct hookdata {
virStorageVolDefPtr vol;
bool skip;
};
static int virStorageBuildSetUIDHook(void *data) {
virStorageVolDefPtr vol = data;
struct hookdata *tmp = data;
virStorageVolDefPtr vol = tmp->vol;
if (tmp->skip)
return 0;
if ((vol->target.perms.gid != -1)
&& (setgid(vol->target.perms.gid) != 0)) {
@ -545,11 +554,12 @@ static int virStorageBuildSetUIDHook(void *data) {
static int virStorageBackendCreateExecCommand(virStoragePoolObjPtr pool,
virStorageVolDefPtr vol,
const char **cmdargv) {
virCommandPtr cmd) {
struct stat st;
gid_t gid;
uid_t uid;
int filecreated = 0;
struct hookdata data = {vol, false};
if ((pool->def->type == VIR_STORAGE_POOL_NETFS)
&& (((getuid() == 0)
@ -557,21 +567,25 @@ static int virStorageBackendCreateExecCommand(virStoragePoolObjPtr pool,
&& (vol->target.perms.uid != 0))
|| ((vol->target.perms.gid != -1)
&& (vol->target.perms.gid != getgid())))) {
if (virRunWithHook(cmdargv,
virStorageBuildSetUIDHook, vol, NULL) == 0) {
virCommandSetPreExecHook(cmd, virStorageBuildSetUIDHook, &data);
if (virCommandRun(cmd, NULL) == 0) {
/* command was successfully run, check if the file was created */
if (stat(vol->target.path, &st) >=0)
filecreated = 1;
}
}
data.skip = true;
if (!filecreated) {
if (virRun(cmdargv, NULL) < 0) {
if (virCommandRun(cmd, NULL) < 0) {
return -1;
}
if (stat(vol->target.path, &st) < 0) {
virReportSystemError(errno,
_("%s failed to create %s"),
cmdargv[0], vol->target.path);
_("failed to create %s"), vol->target.path);
return -1;
}
}
@ -644,6 +658,8 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
char *size = NULL;
char *create_tool;
int imgformat = -1;
virCommandPtr cmd = NULL;
bool do_encryption = (vol->target.encryption != NULL);
const char *type = virStorageFileFormatTypeToString(vol->target.format);
const char *backingType = vol->backingStore.path ?
@ -716,7 +732,7 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
}
}
if (vol->target.encryption != NULL) {
if (do_encryption) {
virStorageEncryptionPtr enc;
if (vol->target.format != VIR_STORAGE_FILE_QCOW &&
@ -767,114 +783,66 @@ virStorageBackendCreateQemuImg(virConnectPtr conn,
if (imgformat < 0)
goto cleanup;
if (inputvol) {
const char *imgargv[] = {
create_tool,
"convert",
"-f", inputType,
"-O", type,
inputPath,
vol->target.path,
NULL,
NULL,
NULL
};
cmd = virCommandNew(create_tool);
if (vol->target.encryption != NULL) {
if (inputvol) {
virCommandAddArgList(cmd, "convert", "-f", inputType, "-O", type,
inputPath, vol->target.path, NULL);
if (do_encryption) {
if (imgformat == QEMU_IMG_BACKING_FORMAT_OPTIONS) {
imgargv[8] = "-o";
imgargv[9] = "encryption=on";
virCommandAddArgList(cmd, "-o", "encryption=on", NULL);
} else {
imgargv[8] = "-e";
virCommandAddArg(cmd, "-e");
}
}
ret = virStorageBackendCreateExecCommand(pool, vol, imgargv);
} else if (vol->backingStore.path) {
const char *imgargv[] = {
create_tool,
"create",
"-f", type,
"-b", vol->backingStore.path,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
};
virCommandAddArgList(cmd, "create", "-f", type,
"-b", vol->backingStore.path, NULL);
char *optflag = NULL;
switch (imgformat) {
case QEMU_IMG_BACKING_FORMAT_FLAG:
imgargv[6] = "-F";
imgargv[7] = backingType;
imgargv[8] = vol->target.path;
imgargv[9] = size;
if (vol->target.encryption != NULL)
imgargv[10] = "-e";
virCommandAddArgList(cmd, "-F", backingType, vol->target.path,
size, NULL);
if (do_encryption)
virCommandAddArg(cmd, "-e");
break;
case QEMU_IMG_BACKING_FORMAT_OPTIONS:
if (virAsprintf(&optflag, "backing_fmt=%s", backingType) < 0) {
virReportOOMError();
goto cleanup;
}
if (vol->target.encryption != NULL) {
char *tmp = NULL;
if (virAsprintf(&tmp, "%s,%s", optflag, "encryption=on") < 0) {
virReportOOMError();
goto cleanup;
}
VIR_FREE(optflag);
optflag = tmp;
}
imgargv[6] = "-o";
imgargv[7] = optflag;
imgargv[8] = vol->target.path;
imgargv[9] = size;
virCommandAddArg(cmd, "-o");
virCommandAddArgFormat(cmd, "backing_fmt=%s%s", backingType,
do_encryption ? ",encryption=on" : "");
virCommandAddArgList(cmd, vol->target.path, size, NULL);
break;
default:
VIR_INFO("Unable to set backing store format for %s with %s",
vol->target.path, create_tool);
imgargv[6] = vol->target.path;
imgargv[7] = size;
if (vol->target.encryption != NULL)
imgargv[8] = "-e";
virCommandAddArgList(cmd, vol->target.path, size, NULL);
if (do_encryption)
virCommandAddArg(cmd, "-e");
}
ret = virStorageBackendCreateExecCommand(pool, vol, imgargv);
VIR_FREE(optflag);
} else {
/* The extra NULL field is for indicating encryption (-e). */
const char *imgargv[] = {
create_tool,
"create",
"-f", type,
vol->target.path,
size,
NULL,
NULL,
NULL
};
virCommandAddArgList(cmd, "create", "-f", type,
vol->target.path, size, NULL);
if (vol->target.encryption != NULL) {
if (do_encryption) {
if (imgformat == QEMU_IMG_BACKING_FORMAT_OPTIONS) {
imgargv[6] = "-o";
imgargv[7] = "encryption=on";
virCommandAddArgList(cmd, "-o", "encryption=on", NULL);
} else {
imgargv[6] = "-e";
virCommandAddArg(cmd, "-e");
}
}
ret = virStorageBackendCreateExecCommand(pool, vol, imgargv);
}
cleanup:
ret = virStorageBackendCreateExecCommand(pool, vol, cmd);
cleanup:
VIR_FREE(size);
VIR_FREE(create_tool);
virCommandFree(cmd);
return ret;
}
@ -892,7 +860,7 @@ virStorageBackendCreateQcowCreate(virConnectPtr conn ATTRIBUTE_UNUSED,
{
int ret;
char *size;
const char *imgargv[4];
virCommandPtr cmd;
if (inputvol) {
virStorageReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@ -926,13 +894,10 @@ virStorageBackendCreateQcowCreate(virConnectPtr conn ATTRIBUTE_UNUSED,
return -1;
}
imgargv[0] = virFindFileInPath("qcow-create");
imgargv[1] = size;
imgargv[2] = vol->target.path;
imgargv[3] = NULL;
cmd = virCommandNewArgList("qcow-create", size, vol->target.path, NULL);
ret = virStorageBackendCreateExecCommand(pool, vol, imgargv);
VIR_FREE(imgargv[0]);
ret = virStorageBackendCreateExecCommand(pool, vol, cmd);
virCommandFree(cmd);
VIR_FREE(size);
return ret;

View File

@ -787,10 +787,8 @@ virExec(const char *const*argv,
* only if the command could not be run.
*/
int
virRunWithHook(const char *const*argv,
virExecHook hook,
void *data,
int *status) {
virRun(const char *const*argv, int *status)
{
pid_t childpid;
int exitstatus, execret, waitret;
int ret = -1;
@ -807,7 +805,7 @@ virRunWithHook(const char *const*argv,
if ((execret = virExecWithHook(argv, NULL, NULL,
&childpid, -1, &outfd, &errfd,
VIR_EXEC_NONE, hook, data, NULL)) < 0) {
VIR_EXEC_NONE, NULL, NULL, NULL)) < 0) {
ret = execret;
goto error;
}
@ -871,17 +869,14 @@ int virSetInherit(int fd ATTRIBUTE_UNUSED, bool inherit ATTRIBUTE_UNUSED)
return -1;
}
int
virRunWithHook(const char *const *argv ATTRIBUTE_UNUSED,
virExecHook hook ATTRIBUTE_UNUSED,
void *data ATTRIBUTE_UNUSED,
int *status)
virRun(const char *const *argv ATTRIBUTE_UNUSED,
int *status)
{
if (status)
*status = ENOTSUP;
else
virUtilError(VIR_ERR_INTERNAL_ERROR,
"%s", _("virRunWithHook is not implemented for WIN32"));
"%s", _("virRun is not implemented for WIN32"));
return -1;
}
@ -1018,12 +1013,6 @@ error:
return -1;
}
int
virRun(const char *const*argv,
int *status) {
return virRunWithHook(argv, NULL, NULL, status);
}
/* Like gnulib's fread_file, but read no more than the specified maximum
number of bytes. If the length of the input is <= max_len, and
upon error while reading that data, it works just like fread_file. */

View File

@ -78,9 +78,6 @@ int virExec(const char *const*argv,
int *errfd,
int flags) ATTRIBUTE_RETURN_CHECK;
int virRun(const char *const*argv, int *status) ATTRIBUTE_RETURN_CHECK;
int virRunWithHook(const char *const*argv,
virExecHook hook, void *data,
int *status) ATTRIBUTE_RETURN_CHECK;
int virPipeReadUntilEOF(int outfd, int errfd,
char **outbuf, char **errbuf);
int virFork(pid_t *pid);