]> git.proxmox.com Git - librados2-perl.git/blob - RADOS.xs
avoid memory leak, add debug helper DPRINTF
[librados2-perl.git] / RADOS.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #include "ppport.h"
6
7 #include <rados/librados.h>
8
9 #define DEBUG_RADOS 0
10
11 #define DPRINTF(fmt, ...)\
12 do { if (DEBUG_RADOS) { printf("debug: " fmt, ## __VA_ARGS__); } } while (0)
13
14 MODULE = PVE::RADOS PACKAGE = PVE::RADOS
15
16 rados_t
17 pve_rados_create()
18 PROTOTYPE:
19 CODE:
20 {
21 rados_t clu = NULL;
22 int ret = rados_create(&clu, NULL);
23
24 if (ret == 0)
25 RETVAL = clu;
26 else {
27 die("rados_create failed - %s\n", strerror(-ret));
28 RETVAL = NULL;
29 }
30 }
31 OUTPUT: RETVAL
32
33 void
34 pve_rados_conf_set(cluster, key, value)
35 rados_t cluster
36 char *key
37 char *value
38 PROTOTYPE: $$$
39 CODE:
40 {
41 DPRINTF("pve_rados_conf_set %s = %s\n", key, value);
42
43 int res = rados_conf_set(cluster, key, value);
44 if (res < 0) {
45 die("rados_conf_set failed - %s\n", strerror(-res));
46 }
47 }
48
49 void
50 pve_rados_connect(cluster)
51 rados_t cluster
52 PROTOTYPE: $
53 CODE:
54 {
55 DPRINTF("pve_rados_connect\n");
56
57 rados_conf_read_file(cluster, NULL);
58
59 int res = rados_connect(cluster);
60 if (res < 0) {
61 die("rados_connect failed - %s\n", strerror(-res));
62 }
63 }
64
65 void
66 pve_rados_shutdown(cluster)
67 rados_t cluster
68 PROTOTYPE: $
69 CODE:
70 {
71 DPRINTF("pve_rados_shutdown");
72 rados_shutdown(cluster);
73 }
74
75 SV *
76 pve_rados_mon_command(cluster, cmds)
77 rados_t cluster
78 AV *cmds
79 PROTOTYPE: $$
80 CODE:
81 {
82 const char *cmd[64];
83 size_t cmdlen = 0;
84
85 char *outbuf =NULL;
86 size_t outbuflen = 0;
87 char *outs = NULL;
88 size_t outslen = 0;
89
90 SV *arg;
91
92 while ((arg = av_pop(cmds)) && (arg != &PL_sv_undef)) {
93 if (cmdlen >= 63) {
94 die("too many arguments");
95 }
96 cmd[cmdlen] = SvPV_nolen(arg);
97 DPRINTF("pve_rados_mon_command%zd %s\n", cmdlen, cmd[cmdlen]);
98 cmdlen++;
99 }
100
101 int ret = rados_mon_command(cluster, cmd, cmdlen,
102 NULL, 0,
103 &outbuf, &outbuflen,
104 &outs, &outslen);
105
106 if (ret < 0) {
107 char msg[4096];
108 snprintf(msg, sizeof(msg), "mon_command failed - %s\n", outs);
109 rados_buffer_free(outs);
110 die(msg);
111 }
112
113 RETVAL = newSVpv(outbuf, outbuflen);
114
115 rados_buffer_free(outbuf);
116 }
117 OUTPUT: RETVAL
118
119 HV *
120 pve_rados_cluster_stat(cluster)
121 rados_t cluster
122 PROTOTYPE: $
123 CODE:
124 {
125 struct rados_cluster_stat_t result;
126
127 DPRINTF("pve_rados_cluster_stat");
128
129 int ret = rados_cluster_stat(cluster, &result);
130
131 if(ret != 0) {
132 warn("rados_cluster_stat failed (ret=%d)\n", ret);
133 XSRETURN_UNDEF;
134 }
135 HV * rh = (HV *)sv_2mortal((SV *)newHV());
136
137 (void)hv_store(rh, "kb", 2, newSViv(result.kb), 0);
138 (void)hv_store(rh, "kb_used", 7, newSViv(result.kb_used), 0);
139 (void)hv_store(rh, "kb_avail", 8, newSViv(result.kb_avail), 0);
140 (void)hv_store(rh, "num_objects", 11, newSViv(result.num_objects), 0);
141
142 RETVAL = rh;
143 }
144 OUTPUT: RETVAL