}
#ifdef LVS
-char *virStorageFileGetLVMKey(const char *path)
+int virStorageFileGetLVMKey(const char *path,
+ char **key)
{
/*
* # lvs --noheadings --unbuffered --nosuffix --options "uuid" LVNAME
* 06UgP5-2rhb-w3Bo-3mdR-WeoL-pytO-SAa2ky
*/
- char *key = NULL;
+ int status;
virCommandPtr cmd = virCommandNewArgList(
LVS,
"--noheadings", "--unbuffered", "--nosuffix",
"--options", "uuid", path,
NULL
);
+ int ret = -1;
+
+ *key = NULL;
/* Run the program and capture its output */
- virCommandSetOutputBuffer(cmd, &key);
- if (virCommandRun(cmd, NULL) < 0)
+ virCommandSetOutputBuffer(cmd, key);
+ if (virCommandRun(cmd, &status) < 0)
goto cleanup;
- if (key) {
+ /* Explicitly check status == 0, rather than passing NULL
+ * to virCommandRun because we don't want to raise an actual
+ * error in this scenario, just return a NULL key.
+ */
+
+ if (status == 0 && *key) {
char *nl;
- char *tmp = key;
+ char *tmp = *key;
/* Find first non-space character */
while (*tmp && c_isspace(*tmp)) {
tmp++;
}
/* Kill leading spaces */
- if (tmp != key)
- memmove(key, tmp, strlen(tmp)+1);
+ if (tmp != *key)
+ memmove(*key, tmp, strlen(tmp)+1);
/* Kill trailing newline */
- if ((nl = strchr(key, '\n')))
+ if ((nl = strchr(*key, '\n')))
*nl = '\0';
}
- if (key && STREQ(key, ""))
- VIR_FREE(key);
+ ret = 0;
cleanup:
+ if (*key && STREQ(*key, ""))
+ VIR_FREE(*key);
+
virCommandFree(cmd);
- return key;
+ return ret;
}
#else
-char *virStorageFileGetLVMKey(const char *path)
+int virStorageFileGetLVMKey(const char *path,
+ char **key ATTRIBUTE_UNUSED)
{
virReportSystemError(ENOSYS, _("Unable to get LVM key for %s"), path);
- return NULL;
+ return -1;
}
#endif
#ifdef HAVE_UDEV
-char *virStorageFileGetSCSIKey(const char *path)
+int virStorageFileGetSCSIKey(const char *path,
+ char **key)
{
- char *key = NULL;
+ int status;
virCommandPtr cmd = virCommandNewArgList(
"/lib/udev/scsi_id",
"--replace-whitespace",
"--device", path,
NULL
);
+ int ret = -1;
+
+ *key = NULL;
/* Run the program and capture its output */
- virCommandSetOutputBuffer(cmd, &key);
- if (virCommandRun(cmd, NULL) < 0)
+ virCommandSetOutputBuffer(cmd, key);
+ if (virCommandRun(cmd, &status) < 0)
goto cleanup;
- if (key && STRNEQ(key, "")) {
- char *nl = strchr(key, '\n');
+ /* Explicitly check status == 0, rather than passing NULL
+ * to virCommandRun because we don't want to raise an actual
+ * error in this scenario, just return a NULL key.
+ */
+ if (status == 0 && *key) {
+ char *nl = strchr(*key, '\n');
if (nl)
*nl = '\0';
- } else {
- VIR_FREE(key);
}
+ ret = 0;
+
cleanup:
+ if (*key && STREQ(*key, ""))
+ VIR_FREE(*key);
+
virCommandFree(cmd);
- return key;
+ return ret;
}
#else
-char *virStorageFileGetSCSIKey(const char *path)
+int virStorageFileGetSCSIKey(const char *path,
+ char **key ATTRIBUTE_UNUSED)
{
virReportSystemError(ENOSYS, _("Unable to get SCSI key for %s"), path);
- return NULL;
+ return -1;
}
#endif