X-Git-Url: https://git.proxmox.com/?p=librados2-perl.git;a=blobdiff_plain;f=RADOS.xs;h=7eca024c70b2ee808598b11475b7b392b3f38573;hp=e5c4ab4c3b12742cc3d984eeb8410bcf64140e51;hb=HEAD;hpb=612779b19b808d1ac7bc23eb5ba7eb62657114dc diff --git a/RADOS.xs b/RADOS.xs index e5c4ab4..45f634c 100644 --- a/RADOS.xs +++ b/RADOS.xs @@ -6,66 +6,100 @@ #include +#define DEBUG_RADOS 0 + +#define DPRINTF(fmt, ...)\ + do { if (DEBUG_RADOS) { printf("debug: " fmt, ## __VA_ARGS__); } } while (0) + 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 { - warn("rados_create failed (ret=%d)\n", ret); + die("rados_create failed - %s\n", strerror(-ret)); RETVAL = NULL; } } OUTPUT: RETVAL -int -pve_rados_conf_set(cluster, key, value) +void +pve_rados_conf_set(cluster, key, value) rados_t cluster char *key char *value PROTOTYPE: $$$ CODE: { - RETVAL = rados_conf_set(cluster, key, value); - if (RETVAL < 0) { - die("rados_conf_set failed - %s\n", strerror(-RETVAL)); - } + DPRINTF("pve_rados_conf_set %s = %s\n", key, value); + + int res = rados_conf_set(cluster, key, value); + if (res < 0) { + die("rados_conf_set failed - %s\n", strerror(-res)); + } } -OUTPUT: RETVAL +void +pve_rados_conf_read_file(cluster, path) +rados_t cluster +SV *path +PROTOTYPE: $$ +CODE: +{ + char *p = NULL; -int pve_rados_connect(cluster) + 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: { - rados_conf_read_file(cluster, NULL); - - RETVAL = rados_connect(cluster); - if (RETVAL < 0) { - die("rados_connect failed - %s\n", strerror(-RETVAL)); + DPRINTF("pve_rados_connect\n"); + + int res = rados_connect(cluster); + if (res < 0) { + die("rados_connect failed - %s\n", strerror(-res)); } } -OUTPUT: RETVAL void -pve_rados_shutdown(cluster) +pve_rados_shutdown(cluster) rados_t cluster PROTOTYPE: $ CODE: { + DPRINTF("pve_rados_shutdown"); rados_shutdown(cluster); } -SV * -pve_rados_mon_command(cluster, cmds) +HV * +pve_rados_mon_command(cluster, cmds) rados_t cluster AV *cmds PROTOTYPE: $$ @@ -86,46 +120,56 @@ CODE: die("too many arguments"); } 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); + int ret = rados_mon_command( + cluster, + cmd, + cmdlen, + NULL, + 0, + &outbuf, + &outbuflen, + &outs, + &outslen + ); - if (ret < 0) { - die("mon_command failed - %s\n", outs); - rados_buffer_free(outs); - } - - printf("TEST %d %d %d\n", ret, outbuflen, outslen); + 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); } OUTPUT: RETVAL -HV * -pve_rados_cluster_stat(cluster) +HV * +pve_rados_cluster_stat(cluster) rados_t cluster PROTOTYPE: $ CODE: { struct rados_cluster_stat_t result; + + 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; } HV * rh = (HV *)sv_2mortal((SV *)newHV()); - hv_store(rh, "kb", 2, newSViv(result.kb), 0); - hv_store(rh, "kb_used", 7, newSViv(result.kb_used), 0); - hv_store(rh, "kb_avail", 8, newSViv(result.kb_avail), 0); - hv_store(rh, "num_objects", 11, newSViv(result.num_objects), 0); + (void)hv_store(rh, "kb", 2, newSViv(result.kb), 0); + (void)hv_store(rh, "kb_used", 7, newSViv(result.kb_used), 0); + (void)hv_store(rh, "kb_avail", 8, newSViv(result.kb_avail), 0); + (void)hv_store(rh, "num_objects", 11, newSViv(result.num_objects), 0); RETVAL = rh; }