qemu driver implementation of new APIs.
* src/qemu/qemu_driver.c: qemu driver implementation
Signed-off-by: Hong Xiang <hxiang(a)linux.vnet.ibm.com>
---
src/qemu/qemu_driver.c | 253 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 253 insertions(+), 0 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 36d6284..0dc0530 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3113,6 +3113,128 @@ cleanup:
return ret;
}
+static int
+qemuNumOfCoreDumps(virConnectPtr conn)
+{
+ struct qemud_driver *driver = conn->privateData;
+ DIR * dir = NULL;
+ struct dirent * ent;
+ int num = 0;
+
+ qemuDriverLock(driver);
+ if (NULL == (dir = opendir(driver->coreDumpDir))) {
+ qemuReportError(VIR_ERR_OPEN_FAILED, _("cannot open directory
'%s'"),
+ driver->coreDumpDir);
+ goto cleanup;
+ }
+ while (NULL != (ent = readdir(dir))) {
+ if('.' == ent->d_name[0])
+ continue;
+ num ++;
+ }
+ closedir(dir);
+ qemuDriverUnlock(driver);
+ return num;
+
+cleanup:
+ if (NULL != dir)
+ closedir(dir);
+ qemuDriverUnlock(driver);
+ return -1;
+}
+
+static int
+qemuListCoreDumps(virConnectPtr conn,
+ char **const files,
+ int maxfiles)
+{
+ struct qemud_driver *driver = conn->privateData;
+ DIR * dir = NULL;
+ struct dirent * ent;
+ int num = 0;
+
+ qemuDriverLock(driver);
+ if (NULL == (dir = opendir(driver->coreDumpDir))) {
+ qemuReportError(VIR_ERR_SYSTEM_ERROR, _("cannot open directory
'%s'"),
+ driver->coreDumpDir);
+ goto cleanup;
+ }
+ while (NULL != (ent = readdir(dir))) {
+ int res;
+ if ('.' == ent->d_name[0])
+ continue;
+ if (num >= maxfiles)
+ break;
+ res = virBase64DecodePathname(ent->d_name, &(files[num]));
+ if (-2 == res) {
+ VIR_WARN("Invalid coredump name '%s'", ent->d_name);
+ continue;
+ } else if (0 > res) {
+ goto cleanup;
+ }
+ num ++;
+ }
+ closedir(dir);
+ qemuDriverUnlock(driver);
+ return num;
+
+cleanup:
+ for ( ; num > 0; num --) {
+ VIR_FREE(files[num - 1]);
+ }
+ if (NULL != dir)
+ closedir(dir);
+ qemuDriverUnlock(driver);
+ return -1;
+}
+
+static int
+qemuCoreDumpRemove(virConnectPtr conn,
+ const char *file)
+{
+ struct qemud_driver *driver = conn->privateData;
+ char *path = NULL;
+
+ qemuDriverLock(driver);
+ if (NULL == (path = qemuCoreDumpPath(driver, file)))
+ goto cleanup;
+ if (unlink(path)) {
+ qemuReportError(VIR_ERR_SYSTEM_ERROR, _("cannot remove '%s'"),
path);
+ goto cleanup;
+ }
+ VIR_FREE(path);
+ qemuDriverUnlock(driver);
+ return 0;
+
+cleanup:
+ VIR_FREE(path);
+ qemuDriverUnlock(driver);
+ return -1;
+}
+
+static int
+qemuCoreDumpDownload(virConnectPtr conn,
+ virStreamPtr stream,
+ const char *file)
+{
+ struct qemud_driver *driver = conn->privateData;
+ char *path = NULL;
+
+ qemuDriverLock(driver);
+ if (NULL == (path = qemuCoreDumpPath(driver, file)))
+ goto cleanup;
+ if (virFDStreamOpenFile(stream, path, 0, 0, O_RDONLY))
+ goto cleanup;
+ VIR_FREE(path);
+ qemuDriverUnlock(driver);
+ return 0;
+
+cleanup:
+ VIR_FREE(path);
+ qemuDriverUnlock(driver);
+ return -1;
+}
+
static char *
qemuDomainScreenshot(virDomainPtr dom,
virStreamPtr st,
@@ -4439,6 +4561,129 @@ cleanup:
return ret;
}
+static int
+qemuNumOfSavedImages(virConnectPtr conn)
+{
+ struct qemud_driver *driver = conn->privateData;
+ DIR * dir = NULL;
+ struct dirent * ent;
+ int num = 0;
+
+ qemuDriverLock(driver);
+ if (NULL == (dir = opendir(driver->savedImageDir))) {
+ qemuReportError(VIR_ERR_OPEN_FAILED, _("cannot open directory
'%s'"),
+ driver->savedImageDir);
+ goto cleanup;
+ }
+ while (NULL != (ent = readdir(dir))) {
+ if ('.' == ent->d_name[0])
+ continue;
+ num ++;
+ }
+ closedir(dir);
+ qemuDriverUnlock(driver);
+ return num;
+
+cleanup:
+ if (NULL != dir)
+ closedir(dir);
+ qemuDriverUnlock(driver);
+ return -1;
+}
+
+static int
+qemuListSavedImages(virConnectPtr conn,
+ char **const files,
+ int maxfiles)
+{
+ struct qemud_driver *driver = conn->privateData;
+ DIR * dir = NULL;
+ struct dirent * ent;
+ int num = 0;
+
+ qemuDriverLock(driver);
+ if (NULL == (dir = opendir(driver->savedImageDir))) {
+ qemuReportError(VIR_ERR_SYSTEM_ERROR, _("cannot open directory
'%s'"),
+ driver->savedImageDir);
+ goto cleanup;
+ }
+ while (NULL != (ent = readdir(dir))) {
+ int res;
+
+ if ('.' == ent->d_name[0])
+ continue;
+ if (num >= maxfiles)
+ break;
+ res = virBase64DecodePathname(ent->d_name, &(files[num]));
+ if (-2 == res) {
+ VIR_WARN("Invalid saved image name '%s'", ent->d_name);
+ continue;
+ } else if (0 > res) {
+ goto cleanup;
+ }
+ num ++;
+ }
+ closedir(dir);
+ qemuDriverUnlock(driver);
+ return num;
+
+cleanup:
+ for ( ; num > 0; num --) {
+ VIR_FREE(files[num - 1]);
+ }
+ if (NULL != dir)
+ closedir(dir);
+ qemuDriverUnlock(driver);
+ return -1;
+}
+
+static int
+qemuSavedImageRemove(virConnectPtr conn,
+ const char *file)
+{
+ struct qemud_driver *driver = conn->privateData;
+ char *path = NULL;
+
+ qemuDriverLock(driver);
+ if (NULL == (path = qemuSavedImagePath(driver, file)))
+ goto cleanup;
+ if (unlink(path)) {
+ qemuReportError(VIR_ERR_SYSTEM_ERROR, _("cannot remove '%s'"),
path);
+ goto cleanup;
+ }
+ VIR_FREE(path);
+ qemuDriverUnlock(driver);
+ return 0;
+
+cleanup:
+ VIR_FREE(path);
+ qemuDriverUnlock(driver);
+ return -1;
+}
+
+static int
+qemuSavedImageDownload(virConnectPtr conn,
+ virStreamPtr stream,
+ const char *file)
+{
+ struct qemud_driver *driver = conn->privateData;
+ char *path = NULL;
+
+ qemuDriverLock(driver);
+ if (NULL == (path = qemuSavedImagePath(driver, file)))
+ goto cleanup;
+ if (virFDStreamOpenFile(stream, path, 0, 0, O_RDONLY))
+ goto cleanup;
+ VIR_FREE(path);
+ qemuDriverUnlock(driver);
+ return 0;
+
+cleanup:
+ VIR_FREE(path);
+ qemuDriverUnlock(driver);
+ return -1;
+}
+
/* Return 0 on success, 1 if incomplete saved image was silently unlinked,
* and -1 on failure with error raised. */
static int
@@ -10893,6 +11138,14 @@ static virDriver qemuDriver = {
.domainGetBlockJobInfo = qemuDomainGetBlockJobInfo, /* 0.9.4 */
.domainBlockJobSetSpeed = qemuDomainBlockJobSetSpeed, /* 0.9.4 */
.domainBlockPull = qemuDomainBlockPull, /* 0.9.4 */
+ .numOfSavedImages = qemuNumOfSavedImages, /* 0.9.8 */
+ .listSavedImages = qemuListSavedImages, /* 0.9.8 */
+ .savedImageRemove = qemuSavedImageRemove, /* 0.9.8 */
+ .savedImageDownload = qemuSavedImageDownload, /* 0.9.8 */
+ .numOfCoreDumps = qemuNumOfCoreDumps, /* 0.9.8 */
+ .listCoreDumps = qemuListCoreDumps, /* 0.9.8 */
+ .coreDumpRemove = qemuCoreDumpRemove, /* 0.9.8 */
+ .coreDumpDownload = qemuCoreDumpDownload, /* 0.9.8 */
};
--
1.7.1