]> git.proxmox.com Git - pve-cluster.git/blob - data/PVE/IPCC.xs
3da7059b7107f0841e4076a65b93a16491232531
[pve-cluster.git] / data / PVE / IPCC.xs
1 #ifdef HAVE_CONFIG_H
2 #include <config.h>
3 #endif /* HAVE_CONFIG_H */
4
5 #include "EXTERN.h"
6 #include "perl.h"
7 #include "XSUB.h"
8
9 #include "ppport.h"
10
11 #include <sys/syslog.h>
12 #include <qb/qbdefs.h>
13 #include <qb/qbutil.h>
14 #include <qb/qbipcc.h>
15
16 #define PCS_SOCKET_NAME "pve2"
17
18 #define PCS_SERVICE1 1
19 #define MAX_MSG_SIZE (8192*128)
20
21 static qb_ipcc_connection_t *conn;
22 static pid_t conn_pid;
23
24 static char ipcbuffer[MAX_MSG_SIZE];
25
26 static void libqb_log_writer(const char *file_name,
27 int32_t file_line,
28 int32_t severity, const char *msg)
29 {
30 if (severity == LOG_DEBUG)
31 return;
32
33 warn("libqb: %s:%d [%d] %s\n", file_name, file_line, severity, msg);
34 }
35
36 MODULE = PVE::IPCC PACKAGE = PVE::IPCC
37
38 SV *
39 ipcc_send_rec(msgid, data=NULL)
40 I32 msgid;
41 SV * data;
42 PROTOTYPE: $;$
43 CODE:
44 {
45 pid_t cpid = getpid();
46
47 /* Each process needs its own ipcc connection,
48 * else the shared memory buffer gets corrupted.
49 */
50 if (conn && conn_pid != cpid) {
51 conn = NULL;
52 }
53
54 if (conn == NULL) {
55 qb_util_set_log_function(libqb_log_writer);
56 conn = qb_ipcc_connect(PCS_SOCKET_NAME, MAX_MSG_SIZE);
57
58 if (!conn)
59 XSRETURN_UNDEF;
60
61 conn_pid = cpid;
62 }
63
64 size_t len = 0;
65 char *dataptr = NULL;
66 if (data && SvPOK(data))
67 dataptr = SvPV(data, len);
68
69 int iov_len = 2;
70 struct iovec iov[iov_len];
71
72 struct qb_ipc_request_header req_header;
73
74 req_header.id = msgid;
75 req_header.size = sizeof(req_header) + len;
76
77 iov[0].iov_base = (char *)&req_header;
78 iov[0].iov_len = sizeof(req_header);
79 iov[1].iov_base = dataptr;
80 iov[1].iov_len = len;
81
82 int32_t ms_timeout = -1; // fixme:
83 int res = qb_ipcc_sendv_recv(conn, iov, iov_len, ipcbuffer, sizeof(ipcbuffer), ms_timeout);
84 if (res < 0) {
85 qb_ipcc_disconnect(conn);
86 conn = NULL;
87 errno = -res;
88 XSRETURN_UNDEF;
89 }
90
91 struct qb_ipc_response_header *res_header;
92
93 res_header = (struct qb_ipc_response_header *)ipcbuffer;
94 int dsize = res_header->size - sizeof(struct qb_ipc_response_header);
95
96 if (res_header->error < 0) {
97 errno = -res_header->error;
98 XSRETURN_UNDEF;
99 } else {
100 if (dsize > 0) {
101 RETVAL = newSVpv(ipcbuffer + sizeof(struct qb_ipc_response_header), dsize);
102 } else {
103 errno = 0;
104 XSRETURN_UNDEF;
105 }
106 }
107 }
108 OUTPUT: RETVAL
109