virsh: Pass virshStreamCallbackDataPtr to virshStreamSink() and virshStreamSkip()

These callback will need to know more that the FD they are
working on. Pass the structure that is passed to other stream
callbacks (e.g. virshStreamSource() or virshStreamSourceSkip())
instead of inventing a new one.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
Michal Privoznik 2020-07-02 08:42:44 +02:00
parent 70b67c98d9
commit 9e745a9717
2 changed files with 10 additions and 6 deletions

View File

@ -146,9 +146,9 @@ virshStreamSink(virStreamPtr st G_GNUC_UNUSED,
size_t nbytes,
void *opaque)
{
int *fd = opaque;
virshStreamCallbackDataPtr cbData = opaque;
return safewrite(*fd, bytes, nbytes);
return safewrite(cbData->fd, bytes, nbytes);
}
@ -186,13 +186,13 @@ virshStreamSkip(virStreamPtr st G_GNUC_UNUSED,
long long offset,
void *opaque)
{
int *fd = opaque;
virshStreamCallbackDataPtr cbData = opaque;
off_t cur;
if ((cur = lseek(*fd, offset, SEEK_CUR)) == (off_t) -1)
if ((cur = lseek(cbData->fd, offset, SEEK_CUR)) == (off_t) -1)
return -1;
if (ftruncate(*fd, cur) < 0)
if (ftruncate(cbData->fd, cur) < 0)
return -1;
return 0;

View File

@ -790,6 +790,7 @@ cmdVolDownload(vshControl *ctl, const vshCmd *cmd)
unsigned long long offset = 0, length = 0;
bool created = false;
virshControlPtr priv = ctl->privData;
virshStreamCallbackData cbData;
unsigned int flags = 0;
if (vshCommandOptULongLong(ctl, cmd, "offset", &offset) < 0)
@ -817,6 +818,9 @@ cmdVolDownload(vshControl *ctl, const vshCmd *cmd)
created = true;
}
cbData.ctl = ctl;
cbData.fd = fd;
if (!(st = virStreamNew(priv->conn, 0))) {
vshError(ctl, _("cannot create a new stream"));
goto cleanup;
@ -827,7 +831,7 @@ cmdVolDownload(vshControl *ctl, const vshCmd *cmd)
goto cleanup;
}
if (virStreamSparseRecvAll(st, virshStreamSink, virshStreamSkip, &fd) < 0) {
if (virStreamSparseRecvAll(st, virshStreamSink, virshStreamSkip, &cbData) < 0) {
vshError(ctl, _("cannot receive data from volume %s"), name);
goto cleanup;
}