my $res;
eval {
if ($cmd eq 'M') { # rados monitor commands
- $res = pve_rados_mon_command($self->{conn}, [ $data ]);
+ $res = encode_json(pve_rados_mon_command($self->{conn}, [ $data ]));
} elsif ($cmd eq 'C') { # class methods
my $aref = decode_json($data);
my $method = shift @$aref;
my $json = encode_json($cmd);
- my $raw = eval { $sendcmd->($self, 'M', $json) };
+ my $ret = $sendcmd->($self, 'M', $json);
die "error with '$cmd->{prefix}': $@" if $@;
+ my $raw = decode_json($ret);
+
+ die "error with '$cmd->{prefix}': mon_command failed - $raw->{status_message}\n"
+ if $raw->{return_code} < 0;
+
+ my $data = '';
if ($cmd->{format} && $cmd->{format} eq 'json') {
- return length($raw) ? decode_json($raw) : undef;
+ $data = length($raw->{data}) ? decode_json($raw->{data}) : undef;
+ } else {
+ $data = $raw->{data};
}
- return $raw;
+ return {
+ return_code => $raw->{return_code},
+ status_message => $raw->{status_message},
+ data => $data,
+ };
}
rados_shutdown(cluster);
}
-SV *
+HV *
pve_rados_mon_command(cluster, cmds)
rados_t cluster
AV *cmds
&outslen
);
- if (ret < 0) {
- char msg[4096];
- if (outslen > sizeof(msg)) {
- outslen = sizeof(msg);
- }
- snprintf(msg, sizeof(msg), "mon_command failed - %.*s\n", (int)outslen, outs);
- rados_buffer_free(outs);
- rados_buffer_free(outbuf);
- die(msg);
- }
+ HV * rh = (HV *)sv_2mortal((SV *)newHV());
- RETVAL = newSVpv(outbuf, outbuflen);
+ (void)hv_store(rh, "return_code", 11, newSViv(ret), 0);
+ (void)hv_store(rh, "status_message", 14, newSVpv(outs, outslen), 0);
+ (void)hv_store(rh, "data", 4, newSVpv(outbuf, outbuflen), 0);
+ RETVAL = rh;
rados_buffer_free(outbuf);
rados_buffer_free(outs);