This source file includes following definitions.
- crm_ipc_default_buffer_size
- pcmk__valid_ipc_header
- pcmk__client_type_str
- pcmk__ipc_msg_append
1
2
3
4
5
6
7
8
9
10 #include <crm_internal.h>
11
12 #include <stdio.h>
13 #include <stdint.h>
14 #include <sys/types.h>
15
16 #include <crm/common/xml.h>
17 #include "crmcommon_private.h"
18
19
20
21
22
23 #define BUFFER_SIZE (128*1024)
24
25
26
27
28
29
30 unsigned int
31 crm_ipc_default_buffer_size(void)
32 {
33 return BUFFER_SIZE;
34 }
35
36
37
38
39
40
41
42
43
44 bool
45 pcmk__valid_ipc_header(const pcmk__ipc_header_t *header)
46 {
47 if (header == NULL) {
48 crm_err("IPC message without header");
49 return false;
50
51 } else if (header->version > PCMK__IPC_VERSION) {
52 crm_err("Filtering incompatible v%d IPC message (only versions <= %d supported)",
53 header->version, PCMK__IPC_VERSION);
54 return false;
55 }
56 return true;
57 }
58
59 const char *
60 pcmk__client_type_str(uint64_t client_type)
61 {
62 switch (client_type) {
63 case pcmk__client_ipc:
64 return "IPC";
65 case pcmk__client_tcp:
66 return "TCP";
67 case pcmk__client_tls:
68 return "TLS";
69 default:
70 return "unknown";
71 }
72 }
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 int
99 pcmk__ipc_msg_append(GByteArray **buffer, guint8 *data)
100 {
101 pcmk__ipc_header_t *full_header = NULL;
102 pcmk__ipc_header_t *header = (pcmk__ipc_header_t *) (void *) data;
103 const guint8 *payload = (guint8 *) data + sizeof(pcmk__ipc_header_t);
104 int rc = pcmk_rc_ok;
105
106 if (!pcmk__valid_ipc_header(header)) {
107 return EBADMSG;
108 }
109
110 if (pcmk_is_set(header->flags, crm_ipc_multipart_end)) {
111 full_header = (pcmk__ipc_header_t *) (void *) (*buffer)->data;
112
113
114
115
116
117 CRM_CHECK(buffer != NULL && *buffer != NULL && header->part_id != 0,
118 return EINVAL);
119 CRM_CHECK(full_header->qb.id == header->qb.id, return EBADMSG);
120 g_byte_array_append(*buffer, payload, header->size);
121
122 crm_trace("Received IPC message %" PRId32 " (final part %" PRIu16 ") of %"
123 PRId32 " bytes",
124 header->qb.id, header->part_id, header->qb.size);
125
126 } else if (pcmk_is_set(header->flags, crm_ipc_multipart)) {
127 if (header->part_id == 0) {
128
129
130
131
132 CRM_CHECK(buffer != NULL && *buffer == NULL, return EINVAL);
133 *buffer = g_byte_array_new();
134
135
136
137
138
139
140
141
142 pcmk__clear_ipc_flags(header->flags, "server", crm_ipc_multipart);
143
144 g_byte_array_append(*buffer, data,
145 sizeof(pcmk__ipc_header_t) + header->size - 1);
146
147 } else {
148 full_header = (pcmk__ipc_header_t *) (void *) (*buffer)->data;
149
150
151
152
153
154
155 CRM_CHECK(buffer != NULL && *buffer != NULL, return EINVAL);
156 CRM_CHECK(full_header->qb.id == header->qb.id, return EBADMSG);
157 g_byte_array_append(*buffer, payload, header->size - 1);
158 }
159
160 crm_trace("Received IPC message %" PRId32 " (part %" PRIu16 ") of %"
161 PRId32 " bytes",
162 header->qb.id, header->part_id, header->qb.size);
163
164 rc = pcmk_rc_ipc_more;
165
166 } else {
167
168
169
170
171 CRM_CHECK(buffer != NULL && *buffer == NULL, return EINVAL);
172 *buffer = g_byte_array_new();
173 g_byte_array_append(*buffer, data,
174 sizeof(pcmk__ipc_header_t) + header->size);
175
176 crm_trace("Received IPC message %" PRId32 " of %" PRId32 " bytes",
177 header->qb.id, header->qb.size);
178 }
179
180 crm_trace("Text = %s", payload);
181 crm_trace("Buffer = %s", (*buffer)->data + sizeof(pcmk__ipc_header_t));
182
183
184
185
186 full_header = (pcmk__ipc_header_t *) (void *) (*buffer)->data;
187 full_header->size = (*buffer)->len - sizeof(pcmk__ipc_header_t);
188
189 return rc;
190 }