X-Git-Url: https://git.proxmox.com/?p=librados2-perl.git;a=blobdiff_plain;f=RADOS.xs;h=7eca024c70b2ee808598b11475b7b392b3f38573;hp=a9f6bc36c55337a9b0c565fc3819401a345c439c;hb=HEAD;hpb=9539bd37001b473802f2d54d5eee4a99f165c750 diff --git a/RADOS.xs b/RADOS.xs index a9f6bc3..45f634c 100644 --- a/RADOS.xs +++ b/RADOS.xs @@ -13,14 +13,21 @@ MODULE = PVE::RADOS PACKAGE = PVE::RADOS -rados_t -pve_rados_create() -PROTOTYPE: +rados_t +pve_rados_create(user) +SV *user +PROTOTYPE: $ CODE: -{ - rados_t clu = NULL; - int ret = rados_create(&clu, NULL); - +{ + char *u = NULL; + rados_t clu = NULL; + + if (SvOK(user)) { + u = SvPV_nolen(user); + } + + int ret = rados_create(&clu, u); + if (ret == 0) RETVAL = clu; else { @@ -31,7 +38,7 @@ CODE: OUTPUT: RETVAL void -pve_rados_conf_set(cluster, key, value) +pve_rados_conf_set(cluster, key, value) rados_t cluster char *key char *value @@ -41,32 +48,48 @@ CODE: DPRINTF("pve_rados_conf_set %s = %s\n", key, value); int res = rados_conf_set(cluster, key, value); - if (res < 0) { + if (res < 0) { die("rados_conf_set failed - %s\n", strerror(-res)); } } void -pve_rados_connect(cluster) +pve_rados_conf_read_file(cluster, path) rados_t cluster -PROTOTYPE: $ +SV *path +PROTOTYPE: $$ CODE: { - DPRINTF("pve_rados_connect\n"); + char *p = NULL; - int res = rados_conf_read_file(cluster, NULL); + if (SvOK(path)) { + p = SvPV_nolen(path); + } + + DPRINTF("pve_rados_conf_read_file %s\n", p); + + int res = rados_conf_read_file(cluster, p); if (res < 0) { die("rados_conf_read_file failed - %s\n", strerror(-res)); } - - res = rados_connect(cluster); +} + +void +pve_rados_connect(cluster) +rados_t cluster +PROTOTYPE: $ +CODE: +{ + DPRINTF("pve_rados_connect\n"); + + int res = rados_connect(cluster); if (res < 0) { die("rados_connect failed - %s\n", strerror(-res)); } } void -pve_rados_shutdown(cluster) +pve_rados_shutdown(cluster) rados_t cluster PROTOTYPE: $ CODE: @@ -75,8 +98,8 @@ CODE: rados_shutdown(cluster); } -SV * -pve_rados_mon_command(cluster, cmds) +HV * +pve_rados_mon_command(cluster, cmds) rados_t cluster AV *cmds PROTOTYPE: $$ @@ -99,28 +122,34 @@ CODE: cmd[cmdlen] = SvPV_nolen(arg); DPRINTF("pve_rados_mon_command%zd %s\n", cmdlen, cmd[cmdlen]); cmdlen++; - } - - int ret = rados_mon_command(cluster, cmd, cmdlen, - NULL, 0, - &outbuf, &outbuflen, - &outs, &outslen); - - if (ret < 0) { - char msg[4096]; - snprintf(msg, sizeof(msg), "mon_command failed - %s\n", outs); - rados_buffer_free(outs); - die(msg); } - - RETVAL = newSVpv(outbuf, outbuflen); + + int ret = rados_mon_command( + cluster, + cmd, + cmdlen, + NULL, + 0, + &outbuf, + &outbuflen, + &outs, + &outslen + ); + + HV * rh = (HV *)sv_2mortal((SV *)newHV()); + + (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); } OUTPUT: RETVAL -HV * -pve_rados_cluster_stat(cluster) +HV * +pve_rados_cluster_stat(cluster) rados_t cluster PROTOTYPE: $ CODE: @@ -130,7 +159,7 @@ CODE: DPRINTF("pve_rados_cluster_stat"); int ret = rados_cluster_stat(cluster, &result); - + if(ret != 0) { warn("rados_cluster_stat failed (ret=%d)\n", ret); XSRETURN_UNDEF;