chiark / gitweb /
Remove support for auto-spawning VTs
[elogind.git] / src / libelogind / sd-bus / bus-socket.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2013 Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <endian.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25 #include <poll.h>
26
27 #include "sd-daemon.h"
28 #include "util.h"
29 #include "macro.h"
30 #include "missing.h"
31 #include "utf8.h"
32 #include "formats-util.h"
33 #include "signal-util.h"
34
35 #include "sd-bus.h"
36 #include "bus-socket.h"
37 #include "bus-internal.h"
38 #include "bus-message.h"
39
40 #define SNDBUF_SIZE (8*1024*1024)
41
42 static void iovec_advance(struct iovec iov[], unsigned *idx, size_t size) {
43
44         while (size > 0) {
45                 struct iovec *i = iov + *idx;
46
47                 if (i->iov_len > size) {
48                         i->iov_base = (uint8_t*) i->iov_base + size;
49                         i->iov_len -= size;
50                         return;
51                 }
52
53                 size -= i->iov_len;
54
55                 i->iov_base = NULL;
56                 i->iov_len = 0;
57
58                 (*idx) ++;
59         }
60 }
61
62 static int append_iovec(sd_bus_message *m, const void *p, size_t sz) {
63         assert(m);
64         assert(p);
65         assert(sz > 0);
66
67         m->iovec[m->n_iovec].iov_base = (void*) p;
68         m->iovec[m->n_iovec].iov_len = sz;
69         m->n_iovec++;
70
71         return 0;
72 }
73
74 static int bus_message_setup_iovec(sd_bus_message *m) {
75         struct bus_body_part *part;
76         unsigned n, i;
77         int r;
78
79         assert(m);
80         assert(m->sealed);
81
82         if (m->n_iovec > 0)
83                 return 0;
84
85         assert(!m->iovec);
86
87         n = 1 + m->n_body_parts;
88         if (n < ELEMENTSOF(m->iovec_fixed))
89                 m->iovec = m->iovec_fixed;
90         else {
91                 m->iovec = new(struct iovec, n);
92                 if (!m->iovec) {
93                         r = -ENOMEM;
94                         goto fail;
95                 }
96         }
97
98         r = append_iovec(m, m->header, BUS_MESSAGE_BODY_BEGIN(m));
99         if (r < 0)
100                 goto fail;
101
102         MESSAGE_FOREACH_PART(part, i, m)  {
103                 r = bus_body_part_map(part);
104                 if (r < 0)
105                         goto fail;
106
107                 r = append_iovec(m, part->data, part->size);
108                 if (r < 0)
109                         goto fail;
110         }
111
112         assert(n == m->n_iovec);
113
114         return 0;
115
116 fail:
117         m->poisoned = true;
118         return r;
119 }
120
121 bool bus_socket_auth_needs_write(sd_bus *b) {
122
123         unsigned i;
124
125         if (b->auth_index >= ELEMENTSOF(b->auth_iovec))
126                 return false;
127
128         for (i = b->auth_index; i < ELEMENTSOF(b->auth_iovec); i++) {
129                 struct iovec *j = b->auth_iovec + i;
130
131                 if (j->iov_len > 0)
132                         return true;
133         }
134
135         return false;
136 }
137
138 static int bus_socket_write_auth(sd_bus *b) {
139         ssize_t k;
140
141         assert(b);
142         assert(b->state == BUS_AUTHENTICATING);
143
144         if (!bus_socket_auth_needs_write(b))
145                 return 0;
146
147         if (b->prefer_writev)
148                 k = writev(b->output_fd, b->auth_iovec + b->auth_index, ELEMENTSOF(b->auth_iovec) - b->auth_index);
149         else {
150                 struct msghdr mh;
151                 zero(mh);
152
153                 mh.msg_iov = b->auth_iovec + b->auth_index;
154                 mh.msg_iovlen = ELEMENTSOF(b->auth_iovec) - b->auth_index;
155
156                 k = sendmsg(b->output_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL);
157                 if (k < 0 && errno == ENOTSOCK) {
158                         b->prefer_writev = true;
159                         k = writev(b->output_fd, b->auth_iovec + b->auth_index, ELEMENTSOF(b->auth_iovec) - b->auth_index);
160                 }
161         }
162
163         if (k < 0)
164                 return errno == EAGAIN ? 0 : -errno;
165
166         iovec_advance(b->auth_iovec, &b->auth_index, (size_t) k);
167         return 1;
168 }
169
170 static int bus_socket_auth_verify_client(sd_bus *b) {
171         char *e, *f, *start;
172         sd_id128_t peer;
173         unsigned i;
174         int r;
175
176         assert(b);
177
178         /* We expect two response lines: "OK" and possibly
179          * "AGREE_UNIX_FD" */
180
181         e = memmem_safe(b->rbuffer, b->rbuffer_size, "\r\n", 2);
182         if (!e)
183                 return 0;
184
185         if (b->hello_flags & KDBUS_HELLO_ACCEPT_FD) {
186                 f = memmem(e + 2, b->rbuffer_size - (e - (char*) b->rbuffer) - 2, "\r\n", 2);
187                 if (!f)
188                         return 0;
189
190                 start = f + 2;
191         } else {
192                 f = NULL;
193                 start = e + 2;
194         }
195
196         /* Nice! We got all the lines we need. First check the OK
197          * line */
198
199         if (e - (char*) b->rbuffer != 3 + 32)
200                 return -EPERM;
201
202         if (memcmp(b->rbuffer, "OK ", 3))
203                 return -EPERM;
204
205         b->auth = b->anonymous_auth ? BUS_AUTH_ANONYMOUS : BUS_AUTH_EXTERNAL;
206
207         for (i = 0; i < 32; i += 2) {
208                 int x, y;
209
210                 x = unhexchar(((char*) b->rbuffer)[3 + i]);
211                 y = unhexchar(((char*) b->rbuffer)[3 + i + 1]);
212
213                 if (x < 0 || y < 0)
214                         return -EINVAL;
215
216                 peer.bytes[i/2] = ((uint8_t) x << 4 | (uint8_t) y);
217         }
218
219         if (!sd_id128_equal(b->server_id, SD_ID128_NULL) &&
220             !sd_id128_equal(b->server_id, peer))
221                 return -EPERM;
222
223         b->server_id = peer;
224
225         /* And possibly check the second line, too */
226
227         if (f)
228                 b->can_fds =
229                         (f - e == strlen("\r\nAGREE_UNIX_FD")) &&
230                         memcmp(e + 2, "AGREE_UNIX_FD", strlen("AGREE_UNIX_FD")) == 0;
231
232         b->rbuffer_size -= (start - (char*) b->rbuffer);
233         memmove(b->rbuffer, start, b->rbuffer_size);
234
235         r = bus_start_running(b);
236         if (r < 0)
237                 return r;
238
239         return 1;
240 }
241
242 static bool line_equals(const char *s, size_t m, const char *line) {
243         size_t l;
244
245         l = strlen(line);
246         if (l != m)
247                 return false;
248
249         return memcmp(s, line, l) == 0;
250 }
251
252 static bool line_begins(const char *s, size_t m, const char *word) {
253         size_t l;
254
255         l = strlen(word);
256         if (m < l)
257                 return false;
258
259         if (memcmp(s, word, l) != 0)
260                 return false;
261
262         return m == l || (m > l && s[l] == ' ');
263 }
264
265 static int verify_anonymous_token(sd_bus *b, const char *p, size_t l) {
266         _cleanup_free_ char *token = NULL;
267         size_t len;
268         int r;
269
270         if (!b->anonymous_auth)
271                 return 0;
272
273         if (l <= 0)
274                 return 1;
275
276         assert(p[0] == ' ');
277         p++; l--;
278
279         if (l % 2 != 0)
280                 return 0;
281
282         r = unhexmem(p, l, (void **) &token, &len);
283         if (r < 0)
284                 return 0;
285
286         if (memchr(token, 0, len))
287                 return 0;
288
289         return !!utf8_is_valid(token);
290 }
291
292 static int verify_external_token(sd_bus *b, const char *p, size_t l) {
293         _cleanup_free_ char *token = NULL;
294         size_t len;
295         uid_t u;
296         int r;
297
298         /* We don't do any real authentication here. Instead, we if
299          * the owner of this bus wanted authentication he should have
300          * checked SO_PEERCRED before even creating the bus object. */
301
302         if (!b->anonymous_auth && !b->ucred_valid)
303                 return 0;
304
305         if (l <= 0)
306                 return 1;
307
308         assert(p[0] == ' ');
309         p++; l--;
310
311         if (l % 2 != 0)
312                 return 0;
313
314         r = unhexmem(p, l, (void**) &token, &len);
315         if (r < 0)
316                 return 0;
317
318         if (memchr(token, 0, len))
319                 return 0;
320
321         r = parse_uid(token, &u);
322         if (r < 0)
323                 return 0;
324
325         /* We ignore the passed value if anonymous authentication is
326          * on anyway. */
327         if (!b->anonymous_auth && u != b->ucred.uid)
328                 return 0;
329
330         return 1;
331 }
332
333 static int bus_socket_auth_write(sd_bus *b, const char *t) {
334         char *p;
335         size_t l;
336
337         assert(b);
338         assert(t);
339
340         /* We only make use of the first iovec */
341         assert(b->auth_index == 0 || b->auth_index == 1);
342
343         l = strlen(t);
344         p = malloc(b->auth_iovec[0].iov_len + l);
345         if (!p)
346                 return -ENOMEM;
347
348         memcpy(p, b->auth_iovec[0].iov_base, b->auth_iovec[0].iov_len);
349         memcpy(p + b->auth_iovec[0].iov_len, t, l);
350
351         b->auth_iovec[0].iov_base = p;
352         b->auth_iovec[0].iov_len += l;
353
354         free(b->auth_buffer);
355         b->auth_buffer = p;
356         b->auth_index = 0;
357         return 0;
358 }
359
360 static int bus_socket_auth_write_ok(sd_bus *b) {
361         char t[3 + 32 + 2 + 1];
362
363         assert(b);
364
365         xsprintf(t, "OK " SD_ID128_FORMAT_STR "\r\n", SD_ID128_FORMAT_VAL(b->server_id));
366
367         return bus_socket_auth_write(b, t);
368 }
369
370 static int bus_socket_auth_verify_server(sd_bus *b) {
371         char *e;
372         const char *line;
373         size_t l;
374         bool processed = false;
375         int r;
376
377         assert(b);
378
379         if (b->rbuffer_size < 1)
380                 return 0;
381
382         /* First char must be a NUL byte */
383         if (*(char*) b->rbuffer != 0)
384                 return -EIO;
385
386         if (b->rbuffer_size < 3)
387                 return 0;
388
389         /* Begin with the first line */
390         if (b->auth_rbegin <= 0)
391                 b->auth_rbegin = 1;
392
393         for (;;) {
394                 /* Check if line is complete */
395                 line = (char*) b->rbuffer + b->auth_rbegin;
396                 e = memmem(line, b->rbuffer_size - b->auth_rbegin, "\r\n", 2);
397                 if (!e)
398                         return processed;
399
400                 l = e - line;
401
402                 if (line_begins(line, l, "AUTH ANONYMOUS")) {
403
404                         r = verify_anonymous_token(b, line + 14, l - 14);
405                         if (r < 0)
406                                 return r;
407                         if (r == 0)
408                                 r = bus_socket_auth_write(b, "REJECTED\r\n");
409                         else {
410                                 b->auth = BUS_AUTH_ANONYMOUS;
411                                 r = bus_socket_auth_write_ok(b);
412                         }
413
414                 } else if (line_begins(line, l, "AUTH EXTERNAL")) {
415
416                         r = verify_external_token(b, line + 13, l - 13);
417                         if (r < 0)
418                                 return r;
419                         if (r == 0)
420                                 r = bus_socket_auth_write(b, "REJECTED\r\n");
421                         else {
422                                 b->auth = BUS_AUTH_EXTERNAL;
423                                 r = bus_socket_auth_write_ok(b);
424                         }
425
426                 } else if (line_begins(line, l, "AUTH"))
427                         r = bus_socket_auth_write(b, "REJECTED EXTERNAL ANONYMOUS\r\n");
428                 else if (line_equals(line, l, "CANCEL") ||
429                          line_begins(line, l, "ERROR")) {
430
431                         b->auth = _BUS_AUTH_INVALID;
432                         r = bus_socket_auth_write(b, "REJECTED\r\n");
433
434                 } else if (line_equals(line, l, "BEGIN")) {
435
436                         if (b->auth == _BUS_AUTH_INVALID)
437                                 r = bus_socket_auth_write(b, "ERROR\r\n");
438                         else {
439                                 /* We can't leave from the auth phase
440                                  * before we haven't written
441                                  * everything queued, so let's check
442                                  * that */
443
444                                 if (bus_socket_auth_needs_write(b))
445                                         return 1;
446
447                                 b->rbuffer_size -= (e + 2 - (char*) b->rbuffer);
448                                 memmove(b->rbuffer, e + 2, b->rbuffer_size);
449                                 return bus_start_running(b);
450                         }
451
452                 } else if (line_begins(line, l, "DATA")) {
453
454                         if (b->auth == _BUS_AUTH_INVALID)
455                                 r = bus_socket_auth_write(b, "ERROR\r\n");
456                         else {
457                                 if (b->auth == BUS_AUTH_ANONYMOUS)
458                                         r = verify_anonymous_token(b, line + 4, l - 4);
459                                 else
460                                         r = verify_external_token(b, line + 4, l - 4);
461
462                                 if (r < 0)
463                                         return r;
464                                 if (r == 0) {
465                                         b->auth = _BUS_AUTH_INVALID;
466                                         r = bus_socket_auth_write(b, "REJECTED\r\n");
467                                 } else
468                                         r = bus_socket_auth_write_ok(b);
469                         }
470                 } else if (line_equals(line, l, "NEGOTIATE_UNIX_FD")) {
471                         if (b->auth == _BUS_AUTH_INVALID || !(b->hello_flags & KDBUS_HELLO_ACCEPT_FD))
472                                 r = bus_socket_auth_write(b, "ERROR\r\n");
473                         else {
474                                 b->can_fds = true;
475                                 r = bus_socket_auth_write(b, "AGREE_UNIX_FD\r\n");
476                         }
477                 } else
478                         r = bus_socket_auth_write(b, "ERROR\r\n");
479
480                 if (r < 0)
481                         return r;
482
483                 b->auth_rbegin = e + 2 - (char*) b->rbuffer;
484
485                 processed = true;
486         }
487 }
488
489 static int bus_socket_auth_verify(sd_bus *b) {
490         assert(b);
491
492         if (b->is_server)
493                 return bus_socket_auth_verify_server(b);
494         else
495                 return bus_socket_auth_verify_client(b);
496 }
497
498 static int bus_socket_read_auth(sd_bus *b) {
499         struct msghdr mh;
500         struct iovec iov = {};
501         size_t n;
502         ssize_t k;
503         int r;
504         void *p;
505         union {
506                 struct cmsghdr cmsghdr;
507                 uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX)];
508         } control;
509         bool handle_cmsg = false;
510
511         assert(b);
512         assert(b->state == BUS_AUTHENTICATING);
513
514         r = bus_socket_auth_verify(b);
515         if (r != 0)
516                 return r;
517
518         n = MAX(256u, b->rbuffer_size * 2);
519
520         if (n > BUS_AUTH_SIZE_MAX)
521                 n = BUS_AUTH_SIZE_MAX;
522
523         if (b->rbuffer_size >= n)
524                 return -ENOBUFS;
525
526         p = realloc(b->rbuffer, n);
527         if (!p)
528                 return -ENOMEM;
529
530         b->rbuffer = p;
531
532         iov.iov_base = (uint8_t*) b->rbuffer + b->rbuffer_size;
533         iov.iov_len = n - b->rbuffer_size;
534
535         if (b->prefer_readv)
536                 k = readv(b->input_fd, &iov, 1);
537         else {
538                 zero(mh);
539                 mh.msg_iov = &iov;
540                 mh.msg_iovlen = 1;
541                 mh.msg_control = &control;
542                 mh.msg_controllen = sizeof(control);
543
544                 k = recvmsg(b->input_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL|MSG_CMSG_CLOEXEC);
545                 if (k < 0 && errno == ENOTSOCK) {
546                         b->prefer_readv = true;
547                         k = readv(b->input_fd, &iov, 1);
548                 } else
549                         handle_cmsg = true;
550         }
551         if (k < 0)
552                 return errno == EAGAIN ? 0 : -errno;
553         if (k == 0)
554                 return -ECONNRESET;
555
556         b->rbuffer_size += k;
557
558         if (handle_cmsg) {
559                 struct cmsghdr *cmsg;
560
561                 CMSG_FOREACH(cmsg, &mh)
562                         if (cmsg->cmsg_level == SOL_SOCKET &&
563                             cmsg->cmsg_type == SCM_RIGHTS) {
564                                 int j;
565
566                                 /* Whut? We received fds during the auth
567                                  * protocol? Somebody is playing games with
568                                  * us. Close them all, and fail */
569                                 j = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
570                                 close_many((int*) CMSG_DATA(cmsg), j);
571                                 return -EIO;
572                         } else
573                                 log_debug("Got unexpected auxiliary data with level=%d and type=%d",
574                                           cmsg->cmsg_level, cmsg->cmsg_type);
575         }
576
577         r = bus_socket_auth_verify(b);
578         if (r != 0)
579                 return r;
580
581         return 1;
582 }
583
584 void bus_socket_setup(sd_bus *b) {
585         assert(b);
586
587         /* Increase the buffers to 8 MB */
588         fd_inc_rcvbuf(b->input_fd, SNDBUF_SIZE);
589         fd_inc_sndbuf(b->output_fd, SNDBUF_SIZE);
590
591         b->is_kernel = false;
592         b->message_version = 1;
593         b->message_endian = 0;
594 }
595
596 static void bus_get_peercred(sd_bus *b) {
597         int r;
598
599         assert(b);
600
601         /* Get the peer for socketpair() sockets */
602         b->ucred_valid = getpeercred(b->input_fd, &b->ucred) >= 0;
603
604         /* Get the SELinux context of the peer */
605         r = getpeersec(b->input_fd, &b->label);
606         if (r < 0 && r != -EOPNOTSUPP)
607                 log_debug_errno(r, "Failed to determine peer security context: %m");
608 }
609
610 static int bus_socket_start_auth_client(sd_bus *b) {
611         size_t l;
612         const char *auth_suffix, *auth_prefix;
613
614         assert(b);
615
616         if (b->anonymous_auth) {
617                 auth_prefix = "\0AUTH ANONYMOUS ";
618
619                 /* For ANONYMOUS auth we send some arbitrary "trace" string */
620                 l = 9;
621                 b->auth_buffer = hexmem("anonymous", l);
622         } else {
623                 char text[DECIMAL_STR_MAX(uid_t) + 1];
624
625                 auth_prefix = "\0AUTH EXTERNAL ";
626
627                 xsprintf(text, UID_FMT, geteuid());
628
629                 l = strlen(text);
630                 b->auth_buffer = hexmem(text, l);
631         }
632
633         if (!b->auth_buffer)
634                 return -ENOMEM;
635
636         if (b->hello_flags & KDBUS_HELLO_ACCEPT_FD)
637                 auth_suffix = "\r\nNEGOTIATE_UNIX_FD\r\nBEGIN\r\n";
638         else
639                 auth_suffix = "\r\nBEGIN\r\n";
640
641         b->auth_iovec[0].iov_base = (void*) auth_prefix;
642         b->auth_iovec[0].iov_len = 1 + strlen(auth_prefix + 1);
643         b->auth_iovec[1].iov_base = (void*) b->auth_buffer;
644         b->auth_iovec[1].iov_len = l * 2;
645         b->auth_iovec[2].iov_base = (void*) auth_suffix;
646         b->auth_iovec[2].iov_len = strlen(auth_suffix);
647
648         return bus_socket_write_auth(b);
649 }
650
651 int bus_socket_start_auth(sd_bus *b) {
652         assert(b);
653
654         bus_get_peercred(b);
655
656         b->state = BUS_AUTHENTICATING;
657         b->auth_timeout = now(CLOCK_MONOTONIC) + BUS_DEFAULT_TIMEOUT;
658
659         if (sd_is_socket(b->input_fd, AF_UNIX, 0, 0) <= 0)
660                 b->hello_flags &= ~KDBUS_HELLO_ACCEPT_FD;
661
662         if (b->output_fd != b->input_fd)
663                 if (sd_is_socket(b->output_fd, AF_UNIX, 0, 0) <= 0)
664                         b->hello_flags &= ~KDBUS_HELLO_ACCEPT_FD;
665
666         if (b->is_server)
667                 return bus_socket_read_auth(b);
668         else
669                 return bus_socket_start_auth_client(b);
670 }
671
672 int bus_socket_connect(sd_bus *b) {
673         int r;
674
675         assert(b);
676         assert(b->input_fd < 0);
677         assert(b->output_fd < 0);
678         assert(b->sockaddr.sa.sa_family != AF_UNSPEC);
679
680         b->input_fd = socket(b->sockaddr.sa.sa_family, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
681         if (b->input_fd < 0)
682                 return -errno;
683
684         b->output_fd = b->input_fd;
685
686         bus_socket_setup(b);
687
688         r = connect(b->input_fd, &b->sockaddr.sa, b->sockaddr_size);
689         if (r < 0) {
690                 if (errno == EINPROGRESS)
691                         return 1;
692
693                 return -errno;
694         }
695
696         return bus_socket_start_auth(b);
697 }
698
699 int bus_socket_exec(sd_bus *b) {
700         int s[2], r;
701         pid_t pid;
702
703         assert(b);
704         assert(b->input_fd < 0);
705         assert(b->output_fd < 0);
706         assert(b->exec_path);
707
708         r = socketpair(AF_UNIX, SOCK_STREAM|SOCK_NONBLOCK|SOCK_CLOEXEC, 0, s);
709         if (r < 0)
710                 return -errno;
711
712         pid = fork();
713         if (pid < 0) {
714                 safe_close_pair(s);
715                 return -errno;
716         }
717         if (pid == 0) {
718                 /* Child */
719
720                 (void) reset_all_signal_handlers();
721                 (void) reset_signal_mask();
722
723                 close_all_fds(s+1, 1);
724
725                 assert_se(dup3(s[1], STDIN_FILENO, 0) == STDIN_FILENO);
726                 assert_se(dup3(s[1], STDOUT_FILENO, 0) == STDOUT_FILENO);
727
728                 if (s[1] != STDIN_FILENO && s[1] != STDOUT_FILENO)
729                         safe_close(s[1]);
730
731                 fd_cloexec(STDIN_FILENO, false);
732                 fd_cloexec(STDOUT_FILENO, false);
733                 fd_nonblock(STDIN_FILENO, false);
734                 fd_nonblock(STDOUT_FILENO, false);
735
736                 if (b->exec_argv)
737                         execvp(b->exec_path, b->exec_argv);
738                 else {
739                         const char *argv[] = { b->exec_path, NULL };
740                         execvp(b->exec_path, (char**) argv);
741                 }
742
743                 _exit(EXIT_FAILURE);
744         }
745
746         safe_close(s[1]);
747         b->output_fd = b->input_fd = s[0];
748
749         bus_socket_setup(b);
750
751         return bus_socket_start_auth(b);
752 }
753
754 int bus_socket_take_fd(sd_bus *b) {
755         assert(b);
756
757         bus_socket_setup(b);
758
759         return bus_socket_start_auth(b);
760 }
761
762 int bus_socket_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
763         struct iovec *iov;
764         ssize_t k;
765         size_t n;
766         unsigned j;
767         int r;
768
769         assert(bus);
770         assert(m);
771         assert(idx);
772         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
773
774         if (*idx >= BUS_MESSAGE_SIZE(m))
775                 return 0;
776
777         r = bus_message_setup_iovec(m);
778         if (r < 0)
779                 return r;
780
781         n = m->n_iovec * sizeof(struct iovec);
782         iov = alloca(n);
783         memcpy(iov, m->iovec, n);
784
785         j = 0;
786         iovec_advance(iov, &j, *idx);
787
788         if (bus->prefer_writev)
789                 k = writev(bus->output_fd, iov, m->n_iovec);
790         else {
791                 struct msghdr mh = {
792                         .msg_iov = iov,
793                         .msg_iovlen = m->n_iovec,
794                 };
795
796                 if (m->n_fds > 0) {
797                         struct cmsghdr *control;
798
799                         mh.msg_control = control = alloca(CMSG_SPACE(sizeof(int) * m->n_fds));
800                         mh.msg_controllen = control->cmsg_len = CMSG_LEN(sizeof(int) * m->n_fds);
801                         control->cmsg_level = SOL_SOCKET;
802                         control->cmsg_type = SCM_RIGHTS;
803                         memcpy(CMSG_DATA(control), m->fds, sizeof(int) * m->n_fds);
804                 }
805
806                 k = sendmsg(bus->output_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL);
807                 if (k < 0 && errno == ENOTSOCK) {
808                         bus->prefer_writev = true;
809                         k = writev(bus->output_fd, iov, m->n_iovec);
810                 }
811         }
812
813         if (k < 0)
814                 return errno == EAGAIN ? 0 : -errno;
815
816         *idx += (size_t) k;
817         return 1;
818 }
819
820 static int bus_socket_read_message_need(sd_bus *bus, size_t *need) {
821         uint32_t a, b;
822         uint8_t e;
823         uint64_t sum;
824
825         assert(bus);
826         assert(need);
827         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
828
829         if (bus->rbuffer_size < sizeof(struct bus_header)) {
830                 *need = sizeof(struct bus_header) + 8;
831
832                 /* Minimum message size:
833                  *
834                  * Header +
835                  *
836                  *  Method Call: +2 string headers
837                  *       Signal: +3 string headers
838                  * Method Error: +1 string headers
839                  *               +1 uint32 headers
840                  * Method Reply: +1 uint32 headers
841                  *
842                  * A string header is at least 9 bytes
843                  * A uint32 header is at least 8 bytes
844                  *
845                  * Hence the minimum message size of a valid message
846                  * is header + 8 bytes */
847
848                 return 0;
849         }
850
851         a = ((const uint32_t*) bus->rbuffer)[1];
852         b = ((const uint32_t*) bus->rbuffer)[3];
853
854         e = ((const uint8_t*) bus->rbuffer)[0];
855         if (e == BUS_LITTLE_ENDIAN) {
856                 a = le32toh(a);
857                 b = le32toh(b);
858         } else if (e == BUS_BIG_ENDIAN) {
859                 a = be32toh(a);
860                 b = be32toh(b);
861         } else
862                 return -EBADMSG;
863
864         sum = (uint64_t) sizeof(struct bus_header) + (uint64_t) ALIGN_TO(b, 8) + (uint64_t) a;
865         if (sum >= BUS_MESSAGE_SIZE_MAX)
866                 return -ENOBUFS;
867
868         *need = (size_t) sum;
869         return 0;
870 }
871
872 static int bus_socket_make_message(sd_bus *bus, size_t size) {
873         sd_bus_message *t;
874         void *b;
875         int r;
876
877         assert(bus);
878         assert(bus->rbuffer_size >= size);
879         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
880
881         r = bus_rqueue_make_room(bus);
882         if (r < 0)
883                 return r;
884
885         if (bus->rbuffer_size > size) {
886                 b = memdup((const uint8_t*) bus->rbuffer + size,
887                            bus->rbuffer_size - size);
888                 if (!b)
889                         return -ENOMEM;
890         } else
891                 b = NULL;
892
893         r = bus_message_from_malloc(bus,
894                                     bus->rbuffer, size,
895                                     bus->fds, bus->n_fds,
896                                     NULL,
897                                     &t);
898         if (r < 0) {
899                 free(b);
900                 return r;
901         }
902
903         bus->rbuffer = b;
904         bus->rbuffer_size -= size;
905
906         bus->fds = NULL;
907         bus->n_fds = 0;
908
909         bus->rqueue[bus->rqueue_size++] = t;
910
911         return 1;
912 }
913
914 int bus_socket_read_message(sd_bus *bus) {
915         struct msghdr mh;
916         struct iovec iov = {};
917         ssize_t k;
918         size_t need;
919         int r;
920         void *b;
921         union {
922                 struct cmsghdr cmsghdr;
923                 uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX)];
924         } control;
925         bool handle_cmsg = false;
926
927         assert(bus);
928         assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
929
930         r = bus_socket_read_message_need(bus, &need);
931         if (r < 0)
932                 return r;
933
934         if (bus->rbuffer_size >= need)
935                 return bus_socket_make_message(bus, need);
936
937         b = realloc(bus->rbuffer, need);
938         if (!b)
939                 return -ENOMEM;
940
941         bus->rbuffer = b;
942
943         iov.iov_base = (uint8_t*) bus->rbuffer + bus->rbuffer_size;
944         iov.iov_len = need - bus->rbuffer_size;
945
946         if (bus->prefer_readv)
947                 k = readv(bus->input_fd, &iov, 1);
948         else {
949                 zero(mh);
950                 mh.msg_iov = &iov;
951                 mh.msg_iovlen = 1;
952                 mh.msg_control = &control;
953                 mh.msg_controllen = sizeof(control);
954
955                 k = recvmsg(bus->input_fd, &mh, MSG_DONTWAIT|MSG_NOSIGNAL|MSG_CMSG_CLOEXEC);
956                 if (k < 0 && errno == ENOTSOCK) {
957                         bus->prefer_readv = true;
958                         k = readv(bus->input_fd, &iov, 1);
959                 } else
960                         handle_cmsg = true;
961         }
962         if (k < 0)
963                 return errno == EAGAIN ? 0 : -errno;
964         if (k == 0)
965                 return -ECONNRESET;
966
967         bus->rbuffer_size += k;
968
969         if (handle_cmsg) {
970                 struct cmsghdr *cmsg;
971
972                 CMSG_FOREACH(cmsg, &mh)
973                         if (cmsg->cmsg_level == SOL_SOCKET &&
974                             cmsg->cmsg_type == SCM_RIGHTS) {
975                                 int n, *f;
976
977                                 n = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
978
979                                 if (!bus->can_fds) {
980                                         /* Whut? We received fds but this
981                                          * isn't actually enabled? Close them,
982                                          * and fail */
983
984                                         close_many((int*) CMSG_DATA(cmsg), n);
985                                         return -EIO;
986                                 }
987
988                                 f = realloc(bus->fds, sizeof(int) + (bus->n_fds + n));
989                                 if (!f) {
990                                         close_many((int*) CMSG_DATA(cmsg), n);
991                                         return -ENOMEM;
992                                 }
993
994                                 memcpy(f + bus->n_fds, CMSG_DATA(cmsg), n * sizeof(int));
995                                 bus->fds = f;
996                                 bus->n_fds += n;
997                         } else
998                                 log_debug("Got unexpected auxiliary data with level=%d and type=%d",
999                                           cmsg->cmsg_level, cmsg->cmsg_type);
1000         }
1001
1002         r = bus_socket_read_message_need(bus, &need);
1003         if (r < 0)
1004                 return r;
1005
1006         if (bus->rbuffer_size >= need)
1007                 return bus_socket_make_message(bus, need);
1008
1009         return 1;
1010 }
1011
1012 int bus_socket_process_opening(sd_bus *b) {
1013         int error = 0;
1014         socklen_t slen = sizeof(error);
1015         struct pollfd p = {
1016                 .fd = b->output_fd,
1017                 .events = POLLOUT,
1018         };
1019         int r;
1020
1021         assert(b->state == BUS_OPENING);
1022
1023         r = poll(&p, 1, 0);
1024         if (r < 0)
1025                 return -errno;
1026
1027         if (!(p.revents & (POLLOUT|POLLERR|POLLHUP)))
1028                 return 0;
1029
1030         r = getsockopt(b->output_fd, SOL_SOCKET, SO_ERROR, &error, &slen);
1031         if (r < 0)
1032                 b->last_connect_error = errno;
1033         else if (error != 0)
1034                 b->last_connect_error = error;
1035         else if (p.revents & (POLLERR|POLLHUP))
1036                 b->last_connect_error = ECONNREFUSED;
1037         else
1038                 return bus_socket_start_auth(b);
1039
1040         return bus_next_address(b);
1041 }
1042
1043 int bus_socket_process_authenticating(sd_bus *b) {
1044         int r;
1045
1046         assert(b);
1047         assert(b->state == BUS_AUTHENTICATING);
1048
1049         if (now(CLOCK_MONOTONIC) >= b->auth_timeout)
1050                 return -ETIMEDOUT;
1051
1052         r = bus_socket_write_auth(b);
1053         if (r != 0)
1054                 return r;
1055
1056         return bus_socket_read_auth(b);
1057 }