Lines Matching defs:part
2 This file is part of systemd.
61 static void message_free_part(sd_bus_message *m, struct bus_body_part *part) {
63 assert(part);
65 if (part->memfd >= 0) {
69 if (!part->sealed) {
70 assert(part->memfd_offset == 0);
71 assert(part->data == part->mmap_begin);
72 bus_kernel_push_memfd(m->bus, part->memfd, part->data, part->mapped, part->allocated);
74 if (part->mapped > 0)
75 assert_se(munmap(part->mmap_begin, part->mapped) == 0);
77 safe_close(part->memfd);
80 } else if (part->munmap_this)
81 munmap(part->mmap_begin, part->mapped);
82 else if (part->free_this)
83 free(part->data);
85 if (part != &m->body)
86 free(part);
90 struct bus_body_part *part;
94 part = &m->body;
96 struct bus_body_part *next = part->next;
97 message_free_part(m, part);
98 part = next;
184 /* Initially, the header is allocated as part of of
1177 struct bus_body_part *part;
1185 part = &m->body;
1186 zero(*part);
1190 part = new0(struct bus_body_part, 1);
1191 if (!part) {
1196 m->body_end->next = part;
1199 part->memfd = -1;
1200 m->body_end = part;
1203 return part;
1206 static void part_zero(struct bus_body_part *part, size_t sz) {
1207 assert(part);
1212 assert(!part->data);
1213 assert(part->memfd < 0);
1215 part->size = sz;
1216 part->is_zero = true;
1217 part->sealed = true;
1222 struct bus_body_part *part,
1230 assert(part);
1231 assert(!part->sealed);
1236 if (!part->data && part->memfd < 0) {
1237 part->memfd = bus_kernel_pop_memfd(m->bus, &part->data, &part->mapped, &part->allocated);
1238 part->mmap_begin = part->data;
1241 if (part->memfd >= 0) {
1243 if (part->allocated == 0 || sz > part->allocated) {
1247 r = memfd_set_size(part->memfd, new_allocated);
1253 part->allocated = new_allocated;
1256 if (!part->data || sz > part->mapped) {
1260 if (part->mapped <= 0)
1261 n = mmap(NULL, psz, PROT_READ|PROT_WRITE, MAP_SHARED, part->memfd, 0);
1263 n = mremap(part->mmap_begin, part->mapped, psz, MREMAP_MAYMOVE);
1270 part->mmap_begin = part->data = n;
1271 part->mapped = psz;
1272 part->memfd_offset = 0;
1275 part->munmap_this = true;
1277 if (part->allocated == 0 || sz > part->allocated) {
1281 n = realloc(part->data, new_allocated);
1287 part->data = n;
1288 part->allocated = new_allocated;
1289 part->free_this = true;
1294 *q = part->data ? (uint8_t*) part->data + part->size : NULL;
1296 part->size = sz;
1369 struct bus_body_part *part = NULL;
1376 (force_inline && m->body_end->size > MEMFD_MIN_SIZE); /* if this must be an inlined extension, let's create a new part if the previous part is large enough to be inlined */
1380 part = message_append_part(m);
1381 if (!part)
1384 part_zero(part, padding);
1387 part = message_append_part(m);
1388 if (!part)
1391 r = part_make_space(m, part, sz, &p);
1399 part = m->body_end;
1400 op = part->data;
1401 os = part->size;
1403 start_part = ALIGN_TO(part->size, align);
1406 r = part_make_space(m, part, end_part, &p);
1417 c->array_size = adjust_pointer(c->array_size, op, os, part->data);
1419 m->error.message = (const char*) adjust_pointer(m->error.message, op, os, part->data);
2684 struct bus_body_part *part;
2737 part = message_append_part(m);
2738 if (!part)
2741 part->memfd = copy_fd;
2742 part->memfd_offset = offset;
2743 part->sealed = true;
2744 part->size = size;
2760 struct bus_body_part *part;
2824 part = message_append_part(m);
2825 if (!part)
2828 part->memfd = copy_fd;
2829 part->memfd_offset = offset;
2830 part->sealed = true;
2831 part->size = size;
2933 struct bus_body_part *part;
2990 /* Add padding at the end of the fields part, since we know
3002 MESSAGE_FOREACH_PART(part, i, m)
3003 if (part->memfd >= 0 &&
3004 !part->sealed &&
3005 (part->size > MEMFD_MIN_SIZE || m->bus->use_memfd < 0) &&
3006 part != m->body_end) { /* The last part may never be sent as memfd */
3012 bus_body_part_unmap(part);
3015 sz = part->size;
3016 r = memfd_set_size(part->memfd, sz);
3021 if (memfd_set_sealed(part->memfd) >= 0)
3022 part->sealed = true;
3036 int bus_body_part_map(struct bus_body_part *part) {
3040 assert_se(part);
3042 if (part->data)
3045 if (part->size <= 0)
3049 if (part->memfd < 0 && part->is_zero && part->size < 8) {
3051 part->data = (void*) zeroes;
3055 shift = part->memfd_offset - ((part->memfd_offset / page_size()) * page_size());
3056 psz = PAGE_ALIGN(part->size + shift);
3058 if (part->memfd >= 0)
3059 p = mmap(NULL, psz, PROT_READ, MAP_PRIVATE, part->memfd, part->memfd_offset - shift);
3060 else if (part->is_zero)
3068 part->mapped = psz;
3069 part->mmap_begin = p;
3070 part->data = (uint8_t*) p + shift;
3071 part->munmap_this = true;
3076 void bus_body_part_unmap(struct bus_body_part *part) {
3078 assert_se(part);
3080 if (part->memfd < 0)
3083 if (!part->mmap_begin)
3086 if (!part->munmap_this)
3089 assert_se(munmap(part->mmap_begin, part->mapped) == 0);
3091 part->mmap_begin = NULL;
3092 part->data = NULL;
3093 part->mapped = 0;
3094 part->munmap_this = false;
3167 struct bus_body_part *part;
3174 part = m->cached_rindex_part;
3177 part = &m->body;
3181 while (part) {
3185 if (index + sz <= begin + part->size) {
3187 r = bus_body_part_map(part);
3192 *p = (uint8_t*) part->data + index - begin;
3194 m->cached_rindex_part = part;
3197 return part;
3200 begin += part->size;
3201 part = part->next;
3301 struct bus_body_part *part;
3315 part = find_part(m, *rindex, padding, (void**) &q);
3316 if (!part)
3326 part = find_part(m, start, nbytes, (void**) &q);
3327 if (!part || (nbytes > 0 && !q))
4335 in a different part that then the
5552 struct bus_body_part *part;
5565 MESSAGE_FOREACH_PART(part, i, m)
5566 e = mempcpy(e, part->data, part->size);