X-Git-Url: https://git.proxmox.com/?p=librados2-perl.git;a=blobdiff_plain;f=RADOS.xs;h=7eca024c70b2ee808598b11475b7b392b3f38573;hp=438bcb716510687c9e7c375a80033e9ee161eb61;hb=HEAD;hpb=4bf97564124a2266fb8eca9cf021d45edfb261dc diff --git a/RADOS.xs b/RADOS.xs index 438bcb7..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,21 +48,40 @@ 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 +SV *path +PROTOTYPE: $$ +CODE: +{ + char *p = 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)); + } +} + +void +pve_rados_connect(cluster) rados_t cluster PROTOTYPE: $ CODE: { DPRINTF("pve_rados_connect\n"); - rados_conf_read_file(cluster, NULL); - int res = rados_connect(cluster); if (res < 0) { die("rados_connect failed - %s\n", strerror(-res)); @@ -63,7 +89,7 @@ CODE: } void -pve_rados_shutdown(cluster) +pve_rados_shutdown(cluster) rados_t cluster PROTOTYPE: $ CODE: @@ -72,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: $$ @@ -96,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: @@ -127,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;