From 1cbd136ad0752a63924ba2fcc123c4d76197f667 Mon Sep 17 00:00:00 2001 From: Max Melentiev <m.melentiev@corp.mail.ru> Date: Tue, 20 Aug 2019 14:36:51 +0300 Subject: [PATCH] systemd: replace sendmsg with sendto shortcut There is a problem with calculating .msg_namelen field of msghdr struct. Instead of .msg_name = &sa, .msg_namelen = sizeof(sa.sun_family) + strlen(sd_unix_path), it must set as .msg_namelen = sizeof(sa) // larger value than current invalid one It works on linux but when I tried to enable this feature for macOS it didn't (maybe because of different order of fields in the struct). Instead of fixing calculation, I've replaced original sendmsg call with sendto, because it's a convenient shortcut which simplifies code and can prevent such mistakes. Required for #4436 (cherry picked from commit 89aae30c88491fbaca43f7fd417d9b715c0a1800) --- src/systemd.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/systemd.c b/src/systemd.c index b6c48afe2b..073c9bb764 100644 --- a/src/systemd.c +++ b/src/systemd.c @@ -100,23 +100,14 @@ int systemd_notify(const char *message) { struct sockaddr_un sa = { .sun_family = AF_UNIX, }; - struct iovec vec = { - .iov_base = (char *)message, - .iov_len = (size_t )strlen(message) - }; - struct msghdr msg = { - .msg_iov = &vec, - .msg_iovlen = 1, - .msg_name = &sa, - }; - msg.msg_namelen = sizeof(sa.sun_family) + strlen(sd_unix_path); strncpy(sa.sun_path, sd_unix_path, sizeof(sa.sun_path)); if (sa.sun_path[0] == '@') sa.sun_path[0] = '\0'; say_debug("systemd: sending message '%s'", message); - ssize_t sent = sendmsg(systemd_fd, &msg, MSG_NOSIGNAL); + ssize_t sent = sendto(systemd_fd, message, (size_t) strlen(message), + MSG_NOSIGNAL, (struct sockaddr *) &sa, sizeof(sa)); if (sent == -1) { say_syserror("systemd: failed to send message"); return -1; -- GitLab