* src/virsh.c: Implement 'put' and 'get' commands * .x-sc_avoid_write: Ignore src/virsh.c --- .x-sc_avoid_write | 1 + src/virsh.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+), 0 deletions(-) diff --git a/.x-sc_avoid_write b/.x-sc_avoid_write index c5a7535..c37574d 100644 --- a/.x-sc_avoid_write +++ b/.x-sc_avoid_write @@ -2,5 +2,6 @@ ^src/xend_internal\.c$ ^src/util-lib\.c$ ^src/libvirt\.c$ +^src/virsh\.c$ ^qemud/qemud.c$ ^gnulib/ diff --git a/src/virsh.c b/src/virsh.c index 2d0cf81..6387a3c 100644 --- a/src/virsh.c +++ b/src/virsh.c @@ -6780,6 +6780,167 @@ cmdEdit (vshControl *ctl, const vshCmd *cmd) } /* + * "put" command + */ +static const vshCmdInfo info_put[] = { + {"help", gettext_noop("upload a file")}, + {"desc", gettext_noop("Upload a file")}, + {NULL, NULL} +}; + +static const vshCmdOptDef opts_put[] = { + {"file", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("file")}, + {"name", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("name")}, + {NULL, 0, 0, NULL} +}; + + +static int +cmdPutSource(virStreamPtr st ATTRIBUTE_UNUSED, + char *bytes, size_t nbytes, void *opaque) +{ + int *fd = opaque; + + return read(*fd, bytes, nbytes); +} + +/* + */ +static int +cmdPut (vshControl *ctl, const vshCmd *cmd) +{ + char *file = NULL; + char *name = NULL; + int ret = FALSE; + int fd = -1; + virStreamPtr st = NULL; + + if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) + goto cleanup; + + name = vshCommandOptString (cmd, "name", NULL); + if (name == NULL) + goto cleanup; + file = vshCommandOptString (cmd, "file", NULL); + if (file == NULL) + goto cleanup; + + if ((fd = open(file, O_RDONLY)) < 0) { + vshError(ctl, FALSE, "cannot read %s", name); + goto cleanup; + } + + st = virStreamNew(ctl->conn, 0); + if (virConnectPutFile(ctl->conn, name, st) < 0) + goto cleanup; + + if (virStreamSendAll(st, cmdPutSource, &fd) < 0) + goto cleanup; + + if (close(fd) < 0) { + virStreamAbort(st); + goto cleanup; + } + fd = -1; + if (virStreamFinish(st) < 0) + goto cleanup; + + ret = TRUE; + +cleanup: + if (st) + virStreamFree(st); + free(name); + free(file); + if (fd != -1) + close(fd); + return ret; +} + + + +/* + * "get" command + */ +static const vshCmdInfo info_get[] = { + {"help", gettext_noop("upload a file")}, + {"desc", gettext_noop("Upload a file")}, + {NULL, NULL} +}; + +static const vshCmdOptDef opts_get[] = { + {"file", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("file")}, + {"name", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("name")}, + {NULL, 0, 0, NULL} +}; + + +static int +cmdGetSink(virStreamPtr st ATTRIBUTE_UNUSED, + const char *bytes, size_t nbytes, void *opaque) +{ + int *fd = opaque; + + return write(*fd, bytes, nbytes); +} + +/* + */ +static int +cmdGet (vshControl *ctl, const vshCmd *cmd) +{ + char *file = NULL; + char *name = NULL; + int ret = FALSE; + int fd = -1; + virStreamPtr st = NULL; + + if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) + goto cleanup; + + name = vshCommandOptString (cmd, "name", NULL); + if (name == NULL) + goto cleanup; + file = vshCommandOptString (cmd, "file", NULL); + if (file == NULL) + goto cleanup; + + if ((fd = open(file, O_WRONLY|O_TRUNC|O_CREAT,0700)) < 0) { + vshError(ctl, FALSE, "cannot create %s", name); + goto cleanup; + } + + st = virStreamNew(ctl->conn, 0); + if (virConnectGetFile(ctl->conn, name, st) < 0) + goto cleanup; + + if (virStreamRecvAll(st, cmdGetSink, &fd) < 0) + goto cleanup; + + if (close(fd) < 0) { + virStreamAbort(st); + goto cleanup; + } + fd = -1; + if (virStreamFinish(st) < 0) + goto cleanup; + + ret = TRUE; + +cleanup: + if (ret == FALSE) + unlink(file); + if (st) + virStreamFree(st); + free(name); + free(file); + if (fd != -1) + close(fd); + return ret; +} + + +/* * "net-edit" command */ static const vshCmdInfo info_network_edit[] = { @@ -6958,6 +7119,9 @@ static const vshCmdDef commands[] = { {"vcpupin", cmdVcpupin, opts_vcpupin, info_vcpupin}, {"version", cmdVersion, NULL, info_version}, {"vncdisplay", cmdVNCDisplay, opts_vncdisplay, info_vncdisplay}, + + {"put", cmdPut, opts_put, info_put}, + {"get", cmdGet, opts_get, info_get}, {NULL, NULL, NULL, NULL} }; -- 1.6.2.5 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list