]> git.proxmox.com Git - librados2-perl.git/blob - RADOS.xs
Split method pve_rados_connect
[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_conf_read_file(cluster, path)
51 rados_t cluster
52 SV *path
53 PROTOTYPE: $$
54 CODE:
55 {
56 char *p = NULL;
57
58 if (SvOK(path)) {
59 p = SvPV_nolen(path);
60 }
61
62 DPRINTF("pve_rados_conf_read_file %s\n", p);
63
64 int res = rados_conf_read_file(cluster, p);
65 if (res < 0) {
66 die("rados_conf_read_file failed - %s\n", strerror(-res));
67 }
68 }
69
70 void
71 pve_rados_connect(cluster)
72 rados_t cluster
73 PROTOTYPE: $
74 CODE:
75 {
76 DPRINTF("pve_rados_connect\n");
77
78 int res = rados_connect(cluster);
79 if (res < 0) {
80 die("rados_connect failed - %s\n", strerror(-res));
81 }
82 }
83
84 void
85 pve_rados_shutdown(cluster)
86 rados_t cluster
87 PROTOTYPE: $
88 CODE:
89 {
90 DPRINTF("pve_rados_shutdown");
91 rados_shutdown(cluster);
92 }
93
94 SV *
95 pve_rados_mon_command(cluster, cmds)
96 rados_t cluster
97 AV *cmds
98 PROTOTYPE: $$
99 CODE:
100 {
101 const char *cmd[64];
102 size_t cmdlen = 0;
103
104 char *outbuf =NULL;
105 size_t outbuflen = 0;
106 char *outs = NULL;
107 size_t outslen = 0;
108
109 SV *arg;
110
111 while ((arg = av_pop(cmds)) && (arg != &PL_sv_undef)) {
112 if (cmdlen >= 63) {
113 die("too many arguments");
114 }
115 cmd[cmdlen] = SvPV_nolen(arg);
116 DPRINTF("pve_rados_mon_command%zd %s\n", cmdlen, cmd[cmdlen]);
117 cmdlen++;
118 }
119
120 int ret = rados_mon_command(cluster, cmd, cmdlen,
121 NULL, 0,
122 &outbuf, &outbuflen,
123 &outs, &outslen);
124
125 if (ret < 0) {
126 char msg[4096];
127 snprintf(msg, sizeof(msg), "mon_command failed - %s\n", outs);
128 rados_buffer_free(outs);
129 die(msg);
130 }
131
132 RETVAL = newSVpv(outbuf, outbuflen);
133
134 rados_buffer_free(outbuf);
135 }
136 OUTPUT: RETVAL
137
138 HV *
139 pve_rados_cluster_stat(cluster)
140 rados_t cluster
141 PROTOTYPE: $
142 CODE:
143 {
144 struct rados_cluster_stat_t result;
145
146 DPRINTF("pve_rados_cluster_stat");
147
148 int ret = rados_cluster_stat(cluster, &result);
149
150 if(ret != 0) {
151 warn("rados_cluster_stat failed (ret=%d)\n", ret);
152 XSRETURN_UNDEF;
153 }
154 HV * rh = (HV *)sv_2mortal((SV *)newHV());
155
156 (void)hv_store(rh, "kb", 2, newSViv(result.kb), 0);
157 (void)hv_store(rh, "kb_used", 7, newSViv(result.kb_used), 0);
158 (void)hv_store(rh, "kb_avail", 8, newSViv(result.kb_avail), 0);
159 (void)hv_store(rh, "num_objects", 11, newSViv(result.num_objects), 0);
160
161 RETVAL = rh;
162 }
163 OUTPUT: RETVAL