Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */
2 : :
3 : : #include <errno.h>
4 : : #include <stddef.h>
5 : : #include <string.h>
6 : : #include <sys/socket.h>
7 : : #include <sys/un.h>
8 : :
9 : : #include "alloc-util.h"
10 : : #include "main-func.h"
11 : : #include "fd-util.h"
12 : : #include "fileio.h"
13 : : #include "log.h"
14 : : #include "macro.h"
15 : : #include "memory-util.h"
16 : : #include "socket-util.h"
17 : : #include "string-util.h"
18 : : #include "util.h"
19 : :
20 : 0 : static int send_on_socket(int fd, const char *socket_name, const void *packet, size_t size) {
21 : 0 : union sockaddr_union sa = {};
22 : : int salen;
23 : :
24 [ # # ]: 0 : assert(fd >= 0);
25 [ # # ]: 0 : assert(socket_name);
26 [ # # ]: 0 : assert(packet);
27 : :
28 : 0 : salen = sockaddr_un_set_path(&sa.un, socket_name);
29 [ # # ]: 0 : if (salen < 0)
30 [ # # ]: 0 : return log_error_errno(salen, "Specified socket path for AF_UNIX socket invalid, refusing: %s", socket_name);
31 : :
32 [ # # ]: 0 : if (sendto(fd, packet, size, MSG_NOSIGNAL, &sa.sa, salen) < 0)
33 [ # # ]: 0 : return log_error_errno(errno, "Failed to send: %m");
34 : :
35 : 0 : return 0;
36 : : }
37 : :
38 : 0 : static int run(int argc, char *argv[]) {
39 : 0 : _cleanup_(erase_and_freep) char *packet = NULL;
40 : 0 : _cleanup_close_ int fd = -1;
41 : 0 : size_t length = 0;
42 : : int r;
43 : :
44 : 0 : log_setup_service();
45 : :
46 [ # # ]: 0 : if (argc != 3)
47 [ # # ]: 0 : return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Wrong number of arguments.");
48 : :
49 [ # # ]: 0 : if (streq(argv[1], "1")) {
50 [ # # ]: 0 : _cleanup_(erase_and_freep) char *line = NULL;
51 : :
52 : 0 : r = read_line(stdin, LONG_LINE_MAX, &line);
53 [ # # ]: 0 : if (r < 0)
54 [ # # ]: 0 : return log_error_errno(r, "Failed to read password: %m");
55 [ # # ]: 0 : if (r == 0)
56 [ # # ]: 0 : return log_error_errno(SYNTHETIC_ERRNO(EIO),
57 : : "Got EOF while reading password.");
58 : :
59 : 0 : packet = strjoin("+", line);
60 [ # # ]: 0 : if (!packet)
61 : 0 : return log_oom();
62 : :
63 : 0 : length = 1 + strlen(line) + 1;
64 : :
65 [ # # ]: 0 : } else if (streq(argv[1], "0")) {
66 : 0 : packet = strdup("-");
67 [ # # ]: 0 : if (!packet)
68 : 0 : return log_oom();
69 : :
70 : 0 : length = 1;
71 : :
72 : : } else
73 [ # # ]: 0 : return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
74 : : "Invalid first argument %s", argv[1]);
75 : :
76 : 0 : fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
77 [ # # ]: 0 : if (fd < 0)
78 [ # # ]: 0 : return log_error_errno(errno, "socket() failed: %m");
79 : :
80 : 0 : return send_on_socket(fd, argv[2], packet, length);
81 : : }
82 : :
83 : 0 : DEFINE_MAIN_FUNCTION(run);
|