41 message_realloc(
message **mp,
size_t data_len,
size_t descrips,
size_t ch_size)
43 size_t total_len =
sizeof(
message)
45 + descrips *
sizeof(
int)
48 bool have_existing = (mp != NULL) && (*mp != NULL);
49 message *m = realloc(have_existing ? *mp : NULL, total_len);
50 if (m == NULL)
return NULL;
52 m->total_len = total_len;
54 char *data = ((
char*) m) +
sizeof(
message);
55 int *new_descrip = (
int*) (data + data_len);
64 int *old_descrip = (
int*) (data + m->data.len);
66 (
channel*) (old_descrip + m->descriptors.len);
69 memmove(new_channels, old_channels, ch_size);
71 size_t fdcount = m->descriptors.len;
72 memmove(new_descrip, old_descrip, fdcount *
sizeof(
int));
78 m->data.len = data_len;
80 m->descriptors.data = new_descrip;
81 m->descriptors.len = descrips;
83 m->channels.data = new_channels;
86 if (mp != NULL) *mp = m;
91 message_alloc(
size_t data_len,
size_t descrips,
size_t channels)
93 message *m = message_realloc(NULL, data_len, descrips, channels);
102 if (m == NULL)
return;
114 message *enlarged = message_realloc(m,
115 old.data.len + data.len, old.descriptors.len, old.channels.len);
116 if (enlarged == NULL)
return false;
118 assert(enlarged->data.len == old.data.len + data.len);
120 memcpy(enlarged->data.data + old.data.len, data.data, data.len);
132 size_t oldcount = m->descriptors.len;
134 message *enlarged = message_realloc(mp,
135 m->data.len, m->descriptors.len + fds.len, m->channels.len);
136 if (enlarged == NULL)
return false;
138 assert(enlarged->descriptors.len == oldcount + fds.len);
139 char *target = (
char*) (enlarged->descriptors.data + oldcount);
140 memcpy(target, fds.data, fds.len *
sizeof(
int));
150 for (
size_t i = 0; i < channels.len; i++)
157 size_t channel_bytes = 0;
159 for (
size_t i = 0; i < old->channels.len; i++)
162 for (
size_t i = 0; i < channels.len; i++)
165 message *enlarged = message_realloc(m,
166 old->data.len, old->descriptors.len, channel_bytes);
167 if (enlarged == NULL)
return false;
170 char *new_channels = (
char*) enlarged->channels.data;
171 char *next = new_channels;
173 for (
size_t i = 0; i < channels.len; i++) {
174 channel *src = channels.data[i];
175 int copied = channel_copy(next, src);
181 enlarged->channels.len++;
190 message *m = message_alloc(len, 0, 0);
191 char *trailer = ((
char*) m) +
sizeof(
message);
192 memcpy(trailer, data, len);
194 m->data.data = trailer;
201 message_get_data(struct
message *m)
208 message_get_descriptors(struct
message *m)
211 return m->descriptors;
218 return m->channels.len;
225 channel *next = m->channels.data;
227 for (
size_t i = 0; i < index; i++)
239 printf(
"message { size %lu (0x%lx),\n", m->total_len, m->total_len);
240 printf(
" data { %4lu B : ", m->data.len);
241 for (
size_t i = 0; i < m->data.len; i++) {
242 printf(
"%02x ", (
int) (0xff & m->data.data[i]));
246 printf(
" descrip { %6lu : ", m->descriptors.len);
247 for (
size_t i = 0; i < m->descriptors.len; i++) {
248 printf(
"%d ", m->descriptors.data[i]);
252 printf(
" channels { %6lu : ", m->channels.len);
253 for (
size_t i = 0; i < m->channels.len; i++)
259 size_t total_size = m->total_len;
260 for (
size_t row = 0; row < total_size; row += 8) {
261 for (
int i = row; i < row + 8; i++) {
262 if (i >= total_size) printf(
" ");
263 else printf(
" %02x", 0xff & ((
char*) m)[i]);
268 for (
int i = row; i < row + 8 && i < total_size; i++) {
269 char c = ((
char*) m)[i];
270 if (((c >=
'A') && (c <=
'Z')) ||
271 ((c >=
'a') && (c <=
'z')) ||
272 (c ==
',') || (c ==
' ') || (c ==
'!') ||
273 (c ==
'"') || (c ==
'\'')