mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-02 13:47:13 +03:00
remote generator: Handle stream-using functions
Extend procedure annotation in the .x file for stream handling. Adds a missing remoteStreamRelease call to remoteDomainScreenshot error path.
This commit is contained in:
parent
77582e7f3f
commit
c2de9f4a15
238
daemon/remote.c
238
daemon/remote.c
@ -1174,50 +1174,6 @@ cleanup:
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int
|
||||
remoteDispatchDomainMigratePrepareTunnel(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
struct qemud_client *client,
|
||||
virConnectPtr conn,
|
||||
remote_message_header *hdr,
|
||||
remote_error *rerr,
|
||||
remote_domain_migrate_prepare_tunnel_args *args,
|
||||
void *ret ATTRIBUTE_UNUSED)
|
||||
{
|
||||
char *dname;
|
||||
struct qemud_client_stream *stream = NULL;
|
||||
int rv = -1;
|
||||
|
||||
if (!conn) {
|
||||
virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
dname = args->dname == NULL ? NULL : *args->dname;
|
||||
|
||||
if (!(stream = remoteCreateClientStream(conn, hdr)))
|
||||
goto cleanup;
|
||||
|
||||
if (virDomainMigratePrepareTunnel(conn, stream->st,
|
||||
args->flags, dname, args->resource,
|
||||
args->dom_xml) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (remoteAddClientStream(client, stream, 0) < 0)
|
||||
goto cleanup;
|
||||
|
||||
rv = 0;
|
||||
|
||||
cleanup:
|
||||
if (rv < 0) {
|
||||
remoteDispatchError(rerr);
|
||||
if (stream) {
|
||||
virStreamAbort(stream->st);
|
||||
remoteFreeClientStream(client, stream);
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int
|
||||
remoteDispatchDomainPinVcpu(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
struct qemud_client *client ATTRIBUTE_UNUSED,
|
||||
@ -2611,96 +2567,6 @@ cleanup:
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int remoteDispatchStorageVolUpload(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
struct qemud_client *client,
|
||||
virConnectPtr conn,
|
||||
remote_message_header *hdr,
|
||||
remote_error *rerr,
|
||||
remote_storage_vol_upload_args *args,
|
||||
void *ret ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct qemud_client_stream *stream = NULL;
|
||||
virStorageVolPtr vol = NULL;
|
||||
int rv = -1;
|
||||
|
||||
if (!conn) {
|
||||
virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(vol = get_nonnull_storage_vol(conn, args->vol)))
|
||||
goto cleanup;
|
||||
|
||||
if (!(stream = remoteCreateClientStream(conn, hdr)))
|
||||
goto cleanup;
|
||||
|
||||
if (virStorageVolUpload(vol, stream->st,
|
||||
args->offset, args->length,
|
||||
args->flags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (remoteAddClientStream(client, stream, 0) < 0)
|
||||
goto cleanup;
|
||||
|
||||
rv = 0;
|
||||
|
||||
cleanup:
|
||||
if (rv < 0)
|
||||
remoteDispatchError(rerr);
|
||||
if (vol)
|
||||
virStorageVolFree(vol);
|
||||
if (stream && rv != 0) {
|
||||
virStreamAbort(stream->st);
|
||||
remoteFreeClientStream(client, stream);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int remoteDispatchStorageVolDownload(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
struct qemud_client *client,
|
||||
virConnectPtr conn,
|
||||
remote_message_header *hdr,
|
||||
remote_error *rerr,
|
||||
remote_storage_vol_download_args *args,
|
||||
void *ret ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct qemud_client_stream *stream = NULL;
|
||||
virStorageVolPtr vol = NULL;
|
||||
int rv = -1;
|
||||
|
||||
if (!conn) {
|
||||
virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(vol = get_nonnull_storage_vol(conn, args->vol)))
|
||||
goto cleanup;
|
||||
|
||||
if (!(stream = remoteCreateClientStream(conn, hdr)))
|
||||
goto cleanup;
|
||||
|
||||
if (virStorageVolDownload(vol, stream->st,
|
||||
args->offset, args->length,
|
||||
args->flags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (remoteAddClientStream(client, stream, 1) < 0)
|
||||
goto cleanup;
|
||||
|
||||
rv = 0;
|
||||
|
||||
cleanup:
|
||||
if (rv < 0)
|
||||
remoteDispatchError(rerr);
|
||||
if (vol)
|
||||
virStorageVolFree(vol);
|
||||
if (stream && rv != 0) {
|
||||
virStreamAbort(stream->st);
|
||||
remoteFreeClientStream(client, stream);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
/***************************
|
||||
* Register / deregister events
|
||||
@ -3034,53 +2900,6 @@ cleanup:
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
remoteDispatchDomainOpenConsole(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
struct qemud_client *client,
|
||||
virConnectPtr conn,
|
||||
remote_message_header *hdr,
|
||||
remote_error *rerr,
|
||||
remote_domain_open_console_args *args,
|
||||
void *ret ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct qemud_client_stream *stream = NULL;
|
||||
virDomainPtr dom = NULL;
|
||||
int rv = -1;
|
||||
|
||||
if (!conn) {
|
||||
virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(dom = get_nonnull_domain(conn, args->dom)))
|
||||
goto cleanup;
|
||||
|
||||
if (!(stream = remoteCreateClientStream(conn, hdr)))
|
||||
goto cleanup;
|
||||
|
||||
if (virDomainOpenConsole(dom,
|
||||
args->devname ? *args->devname : NULL,
|
||||
stream->st,
|
||||
args->flags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (remoteAddClientStream(client, stream, 1) < 0)
|
||||
goto cleanup;
|
||||
|
||||
rv = 0;
|
||||
|
||||
cleanup:
|
||||
if (rv < 0)
|
||||
remoteDispatchError(rerr);
|
||||
if (stream && rv < 0) {
|
||||
virStreamAbort(stream->st);
|
||||
remoteFreeClientStream(client, stream);
|
||||
}
|
||||
if (dom)
|
||||
virDomainFree(dom);
|
||||
return rv;
|
||||
}
|
||||
|
||||
#include "remote_dispatch_bodies.h"
|
||||
#include "qemu_dispatch_bodies.h"
|
||||
|
||||
@ -3192,63 +3011,6 @@ cleanup:
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int
|
||||
remoteDispatchDomainMigratePrepareTunnel3(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
struct qemud_client *client,
|
||||
virConnectPtr conn,
|
||||
remote_message_header *hdr,
|
||||
remote_error *rerr,
|
||||
remote_domain_migrate_prepare_tunnel3_args *args,
|
||||
remote_domain_migrate_prepare_tunnel3_ret *ret)
|
||||
{
|
||||
char *dname;
|
||||
char *cookieout = NULL;
|
||||
int cookieoutlen = 0;
|
||||
struct qemud_client_stream *stream = NULL;
|
||||
int rv = -1;
|
||||
|
||||
if (!conn) {
|
||||
virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
dname = args->dname == NULL ? NULL : *args->dname;
|
||||
|
||||
if (!(stream = remoteCreateClientStream(conn, hdr))) {
|
||||
virReportOOMError();
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virDomainMigratePrepareTunnel3(conn, stream->st,
|
||||
args->cookie_in.cookie_in_val,
|
||||
args->cookie_in.cookie_in_len,
|
||||
&cookieout, &cookieoutlen,
|
||||
args->flags, dname, args->resource,
|
||||
args->dom_xml) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (remoteAddClientStream(client, stream, 0) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* remoteDispatchClientRequest will free cookie
|
||||
*/
|
||||
ret->cookie_out.cookie_out_len = cookieoutlen;
|
||||
ret->cookie_out.cookie_out_val = cookieout;
|
||||
|
||||
rv = 0;
|
||||
|
||||
cleanup:
|
||||
if (rv < 0) {
|
||||
remoteDispatchError(rerr);
|
||||
VIR_FREE(cookieout);
|
||||
}
|
||||
if (stream && rv < 0) {
|
||||
virStreamAbort(stream->st);
|
||||
remoteFreeClientStream(client, stream);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int
|
||||
remoteDispatchDomainMigratePerform3(struct qemud_server *server ATTRIBUTE_UNUSED,
|
||||
struct qemud_client *client ATTRIBUTE_UNUSED,
|
||||
|
@ -43,7 +43,7 @@ sub name_to_ProcName {
|
||||
|
||||
# Read the input file (usually remote_protocol.x) and form an
|
||||
# opinion about the name, args and return type of each RPC.
|
||||
my ($name, $ProcName, $id, $flags, $gen, %calls, @calls);
|
||||
my ($name, $ProcName, $id, $flags, %calls, @calls);
|
||||
|
||||
# only generate a close method if -c was passed
|
||||
if ($opt_c) {
|
||||
@ -135,19 +135,31 @@ while (<PROTOCOL>) {
|
||||
$ProcName = name_to_ProcName ($name);
|
||||
|
||||
if ($opt_b or $opt_k) {
|
||||
if (!($flags =~ m/^\s*\/\*\s*(\S+)\s+(\S+)\s*\*\/\s*$/)) {
|
||||
if (!($flags =~ m/^\s*\/\*\s*(\S+)\s+(\S+)\s*(.*)\*\/\s*$/)) {
|
||||
die "invalid generator flags for ${procprefix}_PROC_${name}"
|
||||
}
|
||||
|
||||
$gen = $opt_b ? $1 : $2;
|
||||
my $genmode = $opt_b ? $1 : $2;
|
||||
my $genflags = $3;
|
||||
|
||||
if ($gen eq "autogen") {
|
||||
if ($genmode eq "autogen") {
|
||||
push(@autogen, $ProcName);
|
||||
} elsif ($gen eq "skipgen") {
|
||||
} elsif ($genmode eq "skipgen") {
|
||||
# ignore it
|
||||
} else {
|
||||
die "invalid generator flags for ${procprefix}_PROC_${name}"
|
||||
}
|
||||
|
||||
if (defined $genflags and $genflags ne "") {
|
||||
if ($genflags =~ m/^\|\s*(read|write)stream@(\d+)\s*$/) {
|
||||
$calls{$name}->{streamflag} = $1;
|
||||
$calls{$name}->{streamoffset} = int($2);
|
||||
} else {
|
||||
die "invalid generator flags for ${procprefix}_PROC_${name}"
|
||||
}
|
||||
} else {
|
||||
$calls{$name}->{streamflag} = "none";
|
||||
}
|
||||
}
|
||||
|
||||
$calls[$id] = $calls{$name};
|
||||
@ -531,6 +543,18 @@ elsif ($opt_b) {
|
||||
} else {
|
||||
$single_ret_by_ref = 1;
|
||||
}
|
||||
} elsif ($ret_member =~ m/^opaque (\S+)<(\S+)>;\s*\/\*\s*insert@(\d+)\s*\*\//) {
|
||||
push(@vars_list, "char *$1 = NULL");
|
||||
push(@vars_list, "int $1_len = 0");
|
||||
splice(@args_list, int($3), 0, ("&$1", "&$1_len"));
|
||||
push(@ret_list, "ret->$1.$1_val = $1;");
|
||||
push(@ret_list, "ret->$1.$1_len = $1_len;");
|
||||
push(@free_list_on_error, "VIR_FREE($1);");
|
||||
$single_ret_var = undef;
|
||||
$single_ret_by_ref = 1;
|
||||
} elsif ($ret_member =~ m/^opaque (\S+)<\S+>;/) {
|
||||
# error out on unannotated arrays
|
||||
die "opaque array without insert@<offset> annotation: $ret_member";
|
||||
} elsif ($ret_member =~ m/^(\/)?\*/) {
|
||||
# ignore comments
|
||||
} else {
|
||||
@ -569,6 +593,14 @@ elsif ($opt_b) {
|
||||
push(@vars_list, "vir$struct_name tmp");
|
||||
}
|
||||
|
||||
if ($call->{streamflag} ne "none") {
|
||||
splice(@args_list, $call->{streamoffset}, 0, ("stream->st"));
|
||||
push(@free_list_on_error, "if (stream) {");
|
||||
push(@free_list_on_error, " virStreamAbort(stream->st);");
|
||||
push(@free_list_on_error, " remoteFreeClientStream(client, stream);");
|
||||
push(@free_list_on_error, "}");
|
||||
}
|
||||
|
||||
# print functions signature
|
||||
print "\n";
|
||||
print "static int\n";
|
||||
@ -601,6 +633,10 @@ elsif ($opt_b) {
|
||||
print " $var;\n";
|
||||
}
|
||||
|
||||
if ($call->{streamflag} ne "none") {
|
||||
print " struct qemud_client_stream *stream = NULL;\n";
|
||||
}
|
||||
|
||||
print "\n";
|
||||
print " if (!conn) {\n";
|
||||
print " virNetError(VIR_ERR_INTERNAL_ERROR, \"%s\", _(\"connection not open\"));\n";
|
||||
@ -631,6 +667,12 @@ elsif ($opt_b) {
|
||||
print "\n";
|
||||
}
|
||||
|
||||
if ($call->{streamflag} ne "none") {
|
||||
print " if (!(stream = remoteCreateClientStream(conn, hdr)))\n";
|
||||
print " goto cleanup;\n";
|
||||
print "\n";
|
||||
}
|
||||
|
||||
if ($call->{ret} eq "void") {
|
||||
print " if (vir$call->{ProcName}(";
|
||||
print join(', ', @args_list);
|
||||
@ -691,25 +733,30 @@ elsif ($opt_b) {
|
||||
|
||||
print " goto cleanup;\n";
|
||||
print "\n";
|
||||
|
||||
if (@ret_list) {
|
||||
print " ";
|
||||
}
|
||||
|
||||
print join("\n ", @ret_list);
|
||||
print "\n";
|
||||
} else {
|
||||
print " if (vir$call->{ProcName}(";
|
||||
print join(', ', @args_list);
|
||||
print ") < 0)\n";
|
||||
|
||||
print " goto cleanup;\n";
|
||||
print "\n";
|
||||
}
|
||||
|
||||
if (@ret_list) {
|
||||
print " ";
|
||||
if ($call->{streamflag} ne "none") {
|
||||
print " if (remoteAddClientStream(client, stream, ";
|
||||
|
||||
if ($call->{streamflag} eq "write") {
|
||||
print "0";
|
||||
} else {
|
||||
print "1";
|
||||
}
|
||||
|
||||
print ") < 0)\n";
|
||||
print " goto cleanup;\n";
|
||||
print "\n";
|
||||
}
|
||||
|
||||
if (@ret_list) {
|
||||
print " ";
|
||||
print join("\n ", @ret_list);
|
||||
print "\n";
|
||||
}
|
||||
@ -865,9 +912,14 @@ elsif ($opt_k) {
|
||||
}
|
||||
}
|
||||
|
||||
if ($call->{ProcName} eq "DomainMigrateSetMaxDowntime" and
|
||||
$arg_name eq "downtime") {
|
||||
$type_name = "unsigned long long";
|
||||
# SPECIAL: some hyper parameters map to long longs
|
||||
if (($call->{ProcName} eq "DomainMigrateSetMaxDowntime" and
|
||||
$arg_name eq "downtime") or
|
||||
($call->{ProcName} eq "StorageVolUpload" and
|
||||
($arg_name eq "offset" or $arg_name eq "length")) or
|
||||
($call->{ProcName} eq "StorageVolDownload" and
|
||||
($arg_name eq "offset" or $arg_name eq "length"))) {
|
||||
$type_name .= " long";
|
||||
}
|
||||
|
||||
push(@args_list, "$type_name $arg_name");
|
||||
@ -1004,6 +1056,7 @@ elsif ($opt_k) {
|
||||
$single_ret_type = "int";
|
||||
} elsif ($ret_member =~ m/^unsigned hyper (\S+);/) {
|
||||
my $arg_name = $1;
|
||||
|
||||
if ($call->{ProcName} =~ m/Get(Lib)?Version/) {
|
||||
push(@args_list, "unsigned long *$arg_name");
|
||||
push(@ret_list, "if ($arg_name) *$arg_name = ret.$arg_name;");
|
||||
@ -1053,6 +1106,10 @@ elsif ($opt_k) {
|
||||
}
|
||||
}
|
||||
|
||||
if ($call->{streamflag} ne "none") {
|
||||
splice(@args_list, $call->{streamoffset}, 0, ("virStreamPtr st"));
|
||||
}
|
||||
|
||||
# print function
|
||||
print "\n";
|
||||
print "static $single_ret_type\n";
|
||||
@ -1073,9 +1130,22 @@ elsif ($opt_k) {
|
||||
print " int i;\n";
|
||||
}
|
||||
|
||||
if ($call->{streamflag} ne "none") {
|
||||
print " struct private_stream_data *privst = NULL;\n";
|
||||
}
|
||||
|
||||
print "\n";
|
||||
print " remoteDriverLock(priv);\n";
|
||||
|
||||
if ($call->{streamflag} ne "none") {
|
||||
print "\n";
|
||||
print " if (!(privst = remoteStreamOpen(st, REMOTE_PROC_$call->{UC_NAME}, priv->counter)))\n";
|
||||
print " goto done;\n";
|
||||
print "\n";
|
||||
print " st->driver = &remoteStreamDrv;\n";
|
||||
print " st->privateData = privst;\n";
|
||||
}
|
||||
|
||||
if ($call->{ProcName} eq "SupportsFeature") {
|
||||
# SPECIAL: VIR_DRV_FEATURE_REMOTE feature is handled directly
|
||||
print "\n";
|
||||
@ -1124,8 +1194,14 @@ elsif ($opt_k) {
|
||||
print "\n";
|
||||
print " if (call($priv_src, priv, 0, ${procprefix}_PROC_$call->{UC_NAME},\n";
|
||||
print " (xdrproc_t)xdr_$call->{args}, (char *)$call_args,\n";
|
||||
print " (xdrproc_t)xdr_$call->{ret}, (char *)$call_ret) == -1)\n";
|
||||
print " (xdrproc_t)xdr_$call->{ret}, (char *)$call_ret) == -1) {\n";
|
||||
|
||||
if ($call->{streamflag} ne "none") {
|
||||
print " remoteStreamRelease(st);\n";
|
||||
}
|
||||
|
||||
print " goto done;\n";
|
||||
print " }\n";
|
||||
print "\n";
|
||||
|
||||
if ($single_ret_as_list) {
|
||||
|
@ -4606,48 +4606,6 @@ static virStreamDriver remoteStreamDrv = {
|
||||
.streamRemoveCallback = remoteStreamEventRemoveCallback,
|
||||
};
|
||||
|
||||
|
||||
static int
|
||||
remoteDomainMigratePrepareTunnel(virConnectPtr conn,
|
||||
virStreamPtr st,
|
||||
unsigned long flags,
|
||||
const char *dname,
|
||||
unsigned long resource,
|
||||
const char *dom_xml)
|
||||
{
|
||||
struct private_data *priv = conn->privateData;
|
||||
struct private_stream_data *privst = NULL;
|
||||
int rv = -1;
|
||||
remote_domain_migrate_prepare_tunnel_args args;
|
||||
|
||||
remoteDriverLock(priv);
|
||||
|
||||
if (!(privst = remoteStreamOpen(st, REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL, priv->counter)))
|
||||
goto done;
|
||||
|
||||
st->driver = &remoteStreamDrv;
|
||||
st->privateData = privst;
|
||||
|
||||
args.flags = flags;
|
||||
args.dname = dname == NULL ? NULL : (char **) &dname;
|
||||
args.resource = resource;
|
||||
args.dom_xml = (char *) dom_xml;
|
||||
|
||||
if (call(conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL,
|
||||
(xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel_args, (char *) &args,
|
||||
(xdrproc_t) xdr_void, NULL) == -1) {
|
||||
remoteStreamRelease(st);
|
||||
goto done;
|
||||
}
|
||||
|
||||
rv = 0;
|
||||
|
||||
done:
|
||||
remoteDriverUnlock(priv);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int remoteDomainEventRegisterAny(virConnectPtr conn,
|
||||
virDomainPtr dom,
|
||||
int eventID,
|
||||
@ -4742,171 +4700,6 @@ done:
|
||||
return rv;
|
||||
}
|
||||
|
||||
static char *
|
||||
remoteDomainScreenshot (virDomainPtr domain,
|
||||
virStreamPtr st,
|
||||
unsigned int screen,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct private_data *priv = domain->conn->privateData;
|
||||
struct private_stream_data *privst = NULL;
|
||||
remote_domain_screenshot_args args;
|
||||
remote_domain_screenshot_ret ret;
|
||||
char *rv = NULL;
|
||||
|
||||
remoteDriverLock(priv);
|
||||
|
||||
if (!(privst = remoteStreamOpen(st,
|
||||
REMOTE_PROC_DOMAIN_SCREENSHOT,
|
||||
priv->counter)))
|
||||
goto done;
|
||||
|
||||
st->driver = &remoteStreamDrv;
|
||||
st->privateData = privst;
|
||||
|
||||
make_nonnull_domain(&args.dom, domain);
|
||||
args.flags = flags;
|
||||
args.screen = screen;
|
||||
|
||||
memset(&ret, 0, sizeof(ret));
|
||||
if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_SCREENSHOT,
|
||||
(xdrproc_t) xdr_remote_domain_screenshot_args, (char *) &args,
|
||||
(xdrproc_t) xdr_remote_domain_screenshot_ret, (char *) &ret) == -1)
|
||||
goto done;
|
||||
|
||||
rv = ret.mime ? *ret.mime : NULL;
|
||||
VIR_FREE(ret.mime);
|
||||
|
||||
done:
|
||||
remoteDriverUnlock(priv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int
|
||||
remoteStorageVolUpload(virStorageVolPtr vol,
|
||||
virStreamPtr st,
|
||||
unsigned long long offset,
|
||||
unsigned long long length,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct private_data *priv = vol->conn->privateData;
|
||||
struct private_stream_data *privst = NULL;
|
||||
int rv = -1;
|
||||
remote_storage_vol_upload_args args;
|
||||
|
||||
remoteDriverLock(priv);
|
||||
|
||||
if (!(privst = remoteStreamOpen(st,
|
||||
REMOTE_PROC_STORAGE_VOL_UPLOAD,
|
||||
priv->counter)))
|
||||
goto done;
|
||||
|
||||
st->driver = &remoteStreamDrv;
|
||||
st->privateData = privst;
|
||||
|
||||
make_nonnull_storage_vol(&args.vol, vol);
|
||||
args.offset = offset;
|
||||
args.length = length;
|
||||
args.flags = flags;
|
||||
|
||||
if (call (vol->conn, priv, 0, REMOTE_PROC_STORAGE_VOL_UPLOAD,
|
||||
(xdrproc_t) xdr_remote_storage_vol_upload_args, (char *) &args,
|
||||
(xdrproc_t) xdr_void, NULL) == -1) {
|
||||
remoteStreamRelease(st);
|
||||
goto done;
|
||||
}
|
||||
|
||||
rv = 0;
|
||||
|
||||
done:
|
||||
remoteDriverUnlock(priv);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
remoteStorageVolDownload(virStorageVolPtr vol,
|
||||
virStreamPtr st,
|
||||
unsigned long long offset,
|
||||
unsigned long long length,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct private_data *priv = vol->conn->privateData;
|
||||
struct private_stream_data *privst = NULL;
|
||||
int rv = -1;
|
||||
remote_storage_vol_download_args args;
|
||||
|
||||
remoteDriverLock(priv);
|
||||
|
||||
if (!(privst = remoteStreamOpen(st,
|
||||
REMOTE_PROC_STORAGE_VOL_DOWNLOAD,
|
||||
priv->counter)))
|
||||
goto done;
|
||||
|
||||
st->driver = &remoteStreamDrv;
|
||||
st->privateData = privst;
|
||||
|
||||
make_nonnull_storage_vol(&args.vol, vol);
|
||||
args.offset = offset;
|
||||
args.length = length;
|
||||
args.flags = flags;
|
||||
|
||||
if (call (vol->conn, priv, 0, REMOTE_PROC_STORAGE_VOL_DOWNLOAD,
|
||||
(xdrproc_t) xdr_remote_storage_vol_download_args, (char *) &args,
|
||||
(xdrproc_t) xdr_void, NULL) == -1) {
|
||||
remoteStreamRelease(st);
|
||||
goto done;
|
||||
}
|
||||
|
||||
rv = 0;
|
||||
|
||||
done:
|
||||
remoteDriverUnlock(priv);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
remoteDomainOpenConsole(virDomainPtr dom,
|
||||
const char *devname,
|
||||
virStreamPtr st,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct private_data *priv = dom->conn->privateData;
|
||||
struct private_stream_data *privst = NULL;
|
||||
int rv = -1;
|
||||
remote_domain_open_console_args args;
|
||||
|
||||
remoteDriverLock(priv);
|
||||
|
||||
if (!(privst = remoteStreamOpen(st, REMOTE_PROC_DOMAIN_OPEN_CONSOLE, priv->counter)))
|
||||
goto done;
|
||||
|
||||
st->driver = &remoteStreamDrv;
|
||||
st->privateData = privst;
|
||||
|
||||
make_nonnull_domain (&args.dom, dom);
|
||||
args.devname = devname ? (char **)&devname : NULL;
|
||||
args.flags = flags;
|
||||
|
||||
if (call(dom->conn, priv, 0, REMOTE_PROC_DOMAIN_OPEN_CONSOLE,
|
||||
(xdrproc_t) xdr_remote_domain_open_console_args, (char *) &args,
|
||||
(xdrproc_t) xdr_void, NULL) == -1) {
|
||||
remoteStreamRelease(st);
|
||||
goto done;
|
||||
}
|
||||
|
||||
rv = 0;
|
||||
|
||||
done:
|
||||
remoteDriverUnlock(priv);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
static int
|
||||
|
@ -2058,7 +2058,14 @@ const REMOTE_PROTOCOL_VERSION = 1;
|
||||
enum remote_procedure {
|
||||
/* Each function must have a two-word comment. The first word is
|
||||
* whether remote_generator.pl handles daemon, the second whether
|
||||
* it handles src/remote. */
|
||||
* it handles src/remote. Additional flags can be specified after a
|
||||
* pipe.
|
||||
*
|
||||
* The (readstream|writestream)@<offset> flag lets daemon and src/remote
|
||||
* create a stream. The direction is defined from the src/remote point
|
||||
* of view. A readstream transfers data from daemon to src/remote. The
|
||||
* <offset> specifies at which offset the stream parameter is inserted
|
||||
* in the function parameter list. */
|
||||
REMOTE_PROC_OPEN = 1, /* skipgen skipgen */
|
||||
REMOTE_PROC_CLOSE = 2, /* skipgen skipgen */
|
||||
REMOTE_PROC_GET_TYPE = 3, /* autogen skipgen */
|
||||
@ -2220,7 +2227,7 @@ enum remote_procedure {
|
||||
REMOTE_PROC_SECRET_GET_VALUE = 145, /* skipgen skipgen */
|
||||
REMOTE_PROC_SECRET_UNDEFINE = 146, /* autogen autogen */
|
||||
REMOTE_PROC_SECRET_LOOKUP_BY_USAGE = 147, /* autogen autogen */
|
||||
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL = 148, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL = 148, /* autogen autogen | writestream@1 */
|
||||
REMOTE_PROC_IS_SECURE = 149, /* autogen skipgen */
|
||||
REMOTE_PROC_DOMAIN_IS_ACTIVE = 150, /* autogen autogen */
|
||||
|
||||
@ -2279,35 +2286,40 @@ enum remote_procedure {
|
||||
REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199, /* autogen autogen */
|
||||
REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200, /* autogen autogen */
|
||||
|
||||
REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_OPEN_CONSOLE = 201, /* autogen autogen | readstream@2 */
|
||||
REMOTE_PROC_DOMAIN_IS_UPDATED = 202, /* autogen autogen */
|
||||
REMOTE_PROC_GET_SYSINFO = 203, /* autogen autogen */
|
||||
REMOTE_PROC_DOMAIN_SET_MEMORY_FLAGS = 204, /* autogen autogen */
|
||||
REMOTE_PROC_DOMAIN_SET_BLKIO_PARAMETERS = 205, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_GET_BLKIO_PARAMETERS = 206, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_MIGRATE_SET_MAX_SPEED = 207, /* autogen autogen */
|
||||
REMOTE_PROC_STORAGE_VOL_UPLOAD = 208, /* skipgen skipgen */
|
||||
REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209, /* skipgen skipgen */
|
||||
REMOTE_PROC_STORAGE_VOL_UPLOAD = 208, /* autogen autogen | writestream@1 */
|
||||
REMOTE_PROC_STORAGE_VOL_DOWNLOAD = 209, /* autogen autogen | readstream@1 */
|
||||
REMOTE_PROC_DOMAIN_INJECT_NMI = 210, /* autogen autogen */
|
||||
|
||||
REMOTE_PROC_DOMAIN_SCREENSHOT = 211, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_SCREENSHOT = 211, /* skipgen autogen | readstream@1 */
|
||||
REMOTE_PROC_DOMAIN_GET_STATE = 212, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_MIGRATE_BEGIN3 = 213, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE3 = 214, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3 = 215, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3 = 215, /* autogen skipgen | writestream@1 */
|
||||
REMOTE_PROC_DOMAIN_MIGRATE_PERFORM3 = 216, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_MIGRATE_FINISH3 = 217, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_MIGRATE_CONFIRM3 = 218, /* skipgen skipgen */
|
||||
REMOTE_PROC_DOMAIN_SET_SCHEDULER_PARAMETERS_FLAGS = 219 /* skipgen skipgen */
|
||||
|
||||
/*
|
||||
* Notice how the entries are grouped in sets of 10 ?
|
||||
/* Notice how the entries are grouped in sets of 10 ?
|
||||
* Nice isn't it. Please keep it this way when adding more.
|
||||
*/
|
||||
|
||||
/* Each function must have a two-word comment. The first word is
|
||||
*
|
||||
* Each function must have a two-word comment. The first word is
|
||||
* whether remote_generator.pl handles daemon, the second whether
|
||||
* it handles src/remote. */
|
||||
* it handles src/remote. Additional flags can be specified after a
|
||||
* pipe.
|
||||
*
|
||||
* The (readstream|writestream)@<offset> flag lets daemon and src/remote
|
||||
* create a stream. The direction is defined from the src/remote point
|
||||
* of view. A readstream transfers data from daemon to src/remote. The
|
||||
* <offset> specifies at which offset the stream parameter is inserted
|
||||
* in the function parameter list. */
|
||||
};
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user