[systemd-commits] 3 commits - src/core src/cryptsetup src/hostname src/journal src/libsystemd-bus src/locale src/login src/nspawn src/python-systemd src/readahead src/remount-fs src/reply-password src/shared src/shutdownd src/stdio-bridge src/systemctl src/timedate src/tmpfiles src/tty-ask-password-agent src/udev src/update-utmp src/vconsole

Zbigniew Jędrzejewski-Szmek zbyszek at kemper.freedesktop.org
Fri Apr 5 17:05:58 PDT 2013


 src/core/dbus-execute.c                             |    6 -
 src/core/dbus.c                                     |    4 
 src/core/device.c                                   |    3 
 src/core/execute.c                                  |   32 +----
 src/core/job.c                                      |   22 +--
 src/core/locale-setup.c                             |    4 
 src/core/loopback-setup.c                           |   65 +++++------
 src/core/main.c                                     |   33 ++---
 src/core/manager.c                                  |  116 ++++++++------------
 src/core/mount.c                                    |   15 +-
 src/core/service.c                                  |    4 
 src/core/swap.c                                     |   10 -
 src/core/umount.c                                   |   16 +-
 src/core/unit.c                                     |   22 +--
 src/cryptsetup/cryptsetup.c                         |    5 
 src/hostname/hostnamectl.c                          |    3 
 src/journal/journald-server.c                       |   12 --
 src/journal/journald-stream.c                       |    9 -
 src/journal/journald-syslog.c                       |   33 ++---
 src/libsystemd-bus/bus-socket.c                     |   10 -
 src/libsystemd-bus/sd-bus.c                         |   13 --
 src/locale/localectl.c                              |    3 
 src/locale/localed.c                                |    4 
 src/login/loginctl.c                                |   10 -
 src/login/logind-inhibit.c                          |    3 
 src/login/logind-session.c                          |    3 
 src/login/logind.c                                  |   38 ++----
 src/login/pam-module.c                              |   28 +---
 src/nspawn/nspawn.c                                 |   13 --
 src/python-systemd/_reader.c                        |    6 -
 src/readahead/readahead-collect.c                   |   17 +-
 src/remount-fs/remount-fs.c                         |    3 
 src/reply-password/reply-password.c                 |    6 -
 src/shared/ask-password-api.c                       |    7 -
 src/shared/conf-parser.c                            |   44 ++-----
 src/shared/dbus-loop.c                              |   20 +--
 src/shared/install.c                                |   24 ++--
 src/shared/log.c                                    |   43 +++----
 src/shared/util.c                                   |  113 ++++++++-----------
 src/shared/util.h                                   |    4 
 src/shared/utmp-wtmp.c                              |   18 +--
 src/shared/virt.c                                   |    3 
 src/shutdownd/shutdownd.c                           |   41 +++----
 src/stdio-bridge/stdio-bridge.c                     |   16 +-
 src/systemctl/systemctl.c                           |   71 +++++-------
 src/timedate/timedatectl.c                          |    6 -
 src/tmpfiles/tmpfiles.c                             |   16 +-
 src/tty-ask-password-agent/tty-ask-password-agent.c |   12 --
 src/udev/udev-builtin-net_id.c                      |    3 
 src/update-utmp/update-utmp.c                       |    3 
 src/vconsole/vconsole-setup.c                       |    9 -
 51 files changed, 417 insertions(+), 607 deletions(-)

New commits:
commit 245802dd89ccf10de446faff5577e041d5372062
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Sun Mar 24 21:06:27 2013 -0400

    Use _cleanup_ when reading config files

diff --git a/src/core/main.c b/src/core/main.c
index 4d21dd9..921476a 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -704,7 +704,7 @@ static int parse_config_file(void) {
                 { NULL, NULL, NULL, 0, NULL }
         };
 
-        FILE *f;
+        FILE _cleanup_fclose_ *f;
         const char *fn;
         int r;
 
@@ -722,8 +722,6 @@ static int parse_config_file(void) {
         if (r < 0)
                 log_warning("Failed to parse configuration file: %s", strerror(-r));
 
-        fclose(f);
-
         return 0;
 }
 
diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c
index a87df38..fbacf98 100644
--- a/src/shared/conf-parser.c
+++ b/src/shared/conf-parser.c
@@ -262,23 +262,19 @@ int config_parse(
                 void *userdata) {
 
         unsigned line = 0;
-        char *section = NULL;
+        char _cleanup_free_ *section = NULL, *continuation = NULL;
+        FILE _cleanup_fclose_ *ours = NULL;
         int r;
-        bool ours = false;
-        char *continuation = NULL;
 
         assert(filename);
         assert(lookup);
 
         if (!f) {
-                f = fopen(filename, "re");
+                f = ours = fopen(filename, "re");
                 if (!f) {
-                        r = -errno;
-                        log_error("Failed to open configuration file '%s': %s", filename, strerror(-r));
-                        goto finish;
+                        log_error("Failed to open configuration file '%s': %m", filename);
+                        return -errno;
                 }
-
-                ours = true;
         }
 
         while (!feof(f)) {
@@ -289,19 +285,16 @@ int config_parse(
                         if (feof(f))
                                 break;
 
-                        r = -errno;
-                        log_error("Failed to read configuration file '%s': %s", filename, strerror(-r));
-                        goto finish;
+                        log_error("Failed to read configuration file '%s': %m", filename);
+                        return -errno;
                 }
 
                 truncate_nl(l);
 
                 if (continuation) {
                         c = strappend(continuation, l);
-                        if (!c) {
-                                r = -ENOMEM;
-                                goto finish;
-                        }
+                        if (!c)
+                                return -ENOMEM;
 
                         free(continuation);
                         continuation = NULL;
@@ -323,10 +316,8 @@ int config_parse(
                                 continuation = c;
                         else {
                                 continuation = strdup(l);
-                                if (!continuation) {
-                                        r = -ENOMEM;
-                                        goto finish;
-                                }
+                                if (!continuation)
+                                        return -ENOMEM;
                         }
 
                         continue;
@@ -344,19 +335,10 @@ int config_parse(
                 free(c);
 
                 if (r < 0)
-                        goto finish;
+                        return r;
         }
 
-        r = 0;
-
-finish:
-        free(section);
-        free(continuation);
-
-        if (f && ours)
-                fclose(f);
-
-        return r;
+        return 0;
 }
 
 int config_parse_int(

commit c84a94883161073239c35d181e25823ff0454f68
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Sun Mar 24 19:09:19 2013 -0400

    Add _cleanup_globfree_
    
    Fixes a memleak in error path in exec_context_load_environment.

diff --git a/src/core/execute.c b/src/core/execute.c
index c510497..61369cd 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -1698,7 +1698,7 @@ int exec_context_load_environment(const ExecContext *c, char ***l) {
                 int k;
                 bool ignore = false;
                 char **p;
-                glob_t pglob = {};
+                glob_t _cleanup_globfree_ pglob = {};
                 int count, n;
 
                 fn = *i;
@@ -1709,7 +1709,6 @@ int exec_context_load_environment(const ExecContext *c, char ***l) {
                 }
 
                 if (!path_is_absolute(fn)) {
-
                         if (ignore)
                                 continue;
 
@@ -1720,7 +1719,6 @@ int exec_context_load_environment(const ExecContext *c, char ***l) {
                 /* Filename supports globbing, take all matching files */
                 errno = 0;
                 if (glob(fn, 0, NULL, &pglob) != 0) {
-                        globfree(&pglob);
                         if (ignore)
                                 continue;
 
@@ -1729,7 +1727,6 @@ int exec_context_load_environment(const ExecContext *c, char ***l) {
                 }
                 count = pglob.gl_pathc;
                 if (count == 0) {
-                        globfree(&pglob);
                         if (ignore)
                                 continue;
 
@@ -1743,7 +1740,6 @@ int exec_context_load_environment(const ExecContext *c, char ***l) {
                                         continue;
 
                                 strv_free(r);
-                                globfree(&pglob);
                                 return k;
                          }
 
@@ -1755,16 +1751,12 @@ int exec_context_load_environment(const ExecContext *c, char ***l) {
                                 m = strv_env_merge(2, r, p);
                                 strv_free(r);
                                 strv_free(p);
-
-                                if (!m) {
-                                        globfree(&pglob);
+                                if (!m)
                                         return -ENOMEM;
-                                }
 
                                 r = m;
                         }
                 }
-                globfree(&pglob);
         }
 
         *l = r;
diff --git a/src/shared/util.c b/src/shared/util.c
index 2f66597..52867a1 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -4322,7 +4322,7 @@ int in_group(const char *name) {
 }
 
 int glob_exists(const char *path) {
-        glob_t g;
+        glob_t _cleanup_globfree_ g = {};
         int r, k;
 
         assert(path);
@@ -4339,8 +4339,6 @@ int glob_exists(const char *path) {
         else
                 r = errno ? -errno : -EIO;
 
-        globfree(&g);
-
         return r;
 }
 
diff --git a/src/shared/util.h b/src/shared/util.h
index 4c4aed5..bea43fc 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -37,8 +37,8 @@
 #include <sys/resource.h>
 #include <stddef.h>
 #include <unistd.h>
-#include <systemd/sd-journal.h>
 
+#include <systemd/sd-journal.h>
 #include "macro.h"
 #include "time-util.h"
 
@@ -539,6 +539,8 @@ static inline void journal_closep(sd_journal **j) {
         sd_journal_close(*j);
 }
 
+#define _cleanup_globfree_ __attribute__((cleanup(globfree)))
+
 _malloc_  static inline void *malloc_multiply(size_t a, size_t b) {
         if (_unlikely_(b == 0 || a > ((size_t) -1) / b))
                 return NULL;
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
index 51827f0..5d32bd1 100644
--- a/src/tmpfiles/tmpfiles.c
+++ b/src/tmpfiles/tmpfiles.c
@@ -601,12 +601,12 @@ static int recursive_relabel(Item *i, const char *path) {
 
 static int glob_item(Item *i, int (*action)(Item *, const char *)) {
         int r = 0, k;
-        glob_t g = {};
+        glob_t _cleanup_globfree_ g = {};
         char **fn;
 
         errno = 0;
-        if ((k = glob(i->path, GLOB_NOSORT|GLOB_BRACE, NULL, &g)) != 0) {
-
+        k = glob(i->path, GLOB_NOSORT|GLOB_BRACE, NULL, &g);
+        if (k != 0)
                 if (k != GLOB_NOMATCH) {
                         if (errno > 0)
                                 errno = EIO;
@@ -614,13 +614,13 @@ static int glob_item(Item *i, int (*action)(Item *, const char *)) {
                         log_error("glob(%s) failed: %m", i->path);
                         return -errno;
                 }
-        }
 
-        STRV_FOREACH(fn, g.gl_pathv)
-                if ((k = action(i, *fn)) < 0)
+        STRV_FOREACH(fn, g.gl_pathv) {
+                k = action(i, *fn);
+                if (k < 0)
                         r = k;
+        }
 
-        globfree(&g);
         return r;
 }
 

commit b92bea5d2a9481de69bb627a7b442a9f58fca43d
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Sun Mar 24 19:59:00 2013 -0400

    Use initalization instead of explicit zeroing
    
    Before, we would initialize many fields twice: first
    by filling the structure with zeros, and then a second
    time with the real values. We can let the compiler do
    the job for us, avoiding one copy.
    
    A downside of this patch is that text gets slightly
    bigger. This is because all zero() calls are effectively
    inlined:
    
    $ size build/.libs/systemd
             text    data     bss     dec     hex filename
    before 897737  107300    2560 1007597   f5fed build/.libs/systemd
    after  897873  107300    2560 1007733   f6075 build/.libs/systemd
    
    … actually less than 1‰.
    
    A few asserts that the parameter is not null had to be removed. I
    don't think this changes much, because first, it is quite unlikely
    for the assert to fail, and second, an immediate SEGV is almost as
    good as an assert.

diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c
index 0a53207..2a8a0e1 100644
--- a/src/core/dbus-execute.c
+++ b/src/core/dbus-execute.c
@@ -160,9 +160,8 @@ int bus_execute_append_cpu_sched_priority(DBusMessageIter *i, const char *proper
         if (c->cpu_sched_set)
                 n = c->cpu_sched_priority;
         else {
-                struct sched_param p;
+                struct sched_param p = {};
 
-                zero(p);
                 if (sched_getparam(0, &p) >= 0)
                         n = p.sched_priority;
                 else
@@ -280,9 +279,8 @@ int bus_execute_append_rlimits(DBusMessageIter *i, const char *property, void *d
         if (c->rlimit[r])
                 u = (uint64_t) c->rlimit[r]->rlim_max;
         else {
-                struct rlimit rl;
+                struct rlimit rl = {};
 
-                zero(rl);
                 getrlimit(r, &rl);
 
                 u = (uint64_t) rl.rlim_max;
diff --git a/src/core/dbus.c b/src/core/dbus.c
index b92c7d0..67ab1ae 100644
--- a/src/core/dbus.c
+++ b/src/core/dbus.c
@@ -203,13 +203,11 @@ static void bus_toggle_watch(DBusWatch *bus_watch, void *data) {
 }
 
 static int bus_timeout_arm(Manager *m, Watch *w) {
-        struct itimerspec its;
+        struct itimerspec its = {};
 
         assert(m);
         assert(w);
 
-        zero(its);
-
         if (dbus_timeout_get_enabled(w->data.bus_timeout)) {
                 timespec_store(&its.it_value, dbus_timeout_get_interval(w->data.bus_timeout) * USEC_PER_MSEC);
                 its.it_interval = its.it_value;
diff --git a/src/core/device.c b/src/core/device.c
index 0b01718..fb94868 100644
--- a/src/core/device.c
+++ b/src/core/device.c
@@ -477,7 +477,6 @@ static void device_shutdown(Manager *m) {
 }
 
 static int device_enumerate(Manager *m) {
-        struct epoll_event ev;
         int r;
         struct udev_enumerate *e = NULL;
         struct udev_list_entry *item = NULL, *first = NULL;
@@ -485,6 +484,8 @@ static int device_enumerate(Manager *m) {
         assert(m);
 
         if (!m->udev) {
+                struct epoll_event ev;
+
                 if (!(m->udev = udev_new()))
                         return -ENOMEM;
 
diff --git a/src/core/execute.c b/src/core/execute.c
index 2c13d1f..c510497 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -205,7 +205,10 @@ static int open_null_as(int flags, int nfd) {
 
 static int connect_logger_as(const ExecContext *context, ExecOutput output, const char *ident, const char *unit_id, int nfd) {
         int fd, r;
-        union sockaddr_union sa;
+        union sockaddr_union sa = {
+                .un.sun_family = AF_UNIX,
+                .un.sun_path = "/run/systemd/journal/stdout",
+        };
 
         assert(context);
         assert(output < _EXEC_OUTPUT_MAX);
@@ -216,10 +219,6 @@ static int connect_logger_as(const ExecContext *context, ExecOutput output, cons
         if (fd < 0)
                 return -errno;
 
-        zero(sa);
-        sa.un.sun_family = AF_UNIX;
-        strncpy(sa.un.sun_path, "/run/systemd/journal/stdout", sizeof(sa.un.sun_path));
-
         r = connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path));
         if (r < 0) {
                 close_nointr_nofail(fd);
@@ -938,7 +937,7 @@ static int apply_seccomp(uint32_t *syscall_filter) {
         int i;
         unsigned n;
         struct sock_filter *f;
-        struct sock_fprog prog;
+        struct sock_fprog prog = {};
 
         assert(syscall_filter);
 
@@ -970,7 +969,6 @@ static int apply_seccomp(uint32_t *syscall_filter) {
         memcpy(f + (ELEMENTSOF(header) + 2*n), footer, sizeof(footer));
 
         /* Third: install the filter */
-        zero(prog);
         prog.len = ELEMENTSOF(header) + ELEMENTSOF(footer) + 2*n;
         prog.filter = f;
         if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog) < 0)
@@ -1210,10 +1208,9 @@ int exec_spawn(ExecCommand *command,
                         }
 
                 if (context->cpu_sched_set) {
-                        struct sched_param param;
-
-                        zero(param);
-                        param.sched_priority = context->cpu_sched_priority;
+                        struct sched_param param = {
+                                .sched_priority = context->cpu_sched_priority,
+                        };
 
                         r = sched_setscheduler(0,
                                                context->cpu_sched_policy |
@@ -1701,7 +1698,7 @@ int exec_context_load_environment(const ExecContext *c, char ***l) {
                 int k;
                 bool ignore = false;
                 char **p;
-                glob_t pglob;
+                glob_t pglob = {};
                 int count, n;
 
                 fn = *i;
@@ -1721,7 +1718,6 @@ int exec_context_load_environment(const ExecContext *c, char ***l) {
                 }
 
                 /* Filename supports globbing, take all matching files */
-                zero(pglob);
                 errno = 0;
                 if (glob(fn, 0, NULL, &pglob) != 0) {
                         globfree(&pglob);
diff --git a/src/core/job.c b/src/core/job.c
index d5b7987..af5855b 100644
--- a/src/core/job.c
+++ b/src/core/job.c
@@ -858,10 +858,12 @@ finish:
 }
 
 int job_start_timer(Job *j) {
-        struct itimerspec its;
-        struct epoll_event ev;
+        struct itimerspec its = {};
+        struct epoll_event ev = {
+                .data.ptr = &j->timer_watch,
+                .events = EPOLLIN,
+        };
         int fd, r;
-        assert(j);
 
         if (j->unit->job_timeout <= 0 ||
             j->timer_watch.type == WATCH_JOB_TIMER)
@@ -874,7 +876,6 @@ int job_start_timer(Job *j) {
                 goto fail;
         }
 
-        zero(its);
         timespec_store(&its.it_value, j->unit->job_timeout);
 
         if (timerfd_settime(fd, 0, &its, NULL) < 0) {
@@ -882,10 +883,6 @@ int job_start_timer(Job *j) {
                 goto fail;
         }
 
-        zero(ev);
-        ev.data.ptr = &j->timer_watch;
-        ev.events = EPOLLIN;
-
         if (epoll_ctl(j->manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0) {
                 r = -errno;
                 goto fail;
@@ -1064,15 +1061,14 @@ int job_deserialize(Job *j, FILE *f, FDSet *fds) {
 }
 
 int job_coldplug(Job *j) {
-        struct epoll_event ev;
+        struct epoll_event ev = {
+                .data.ptr = &j->timer_watch,
+                .events = EPOLLIN,
+        };
 
         if (j->timer_watch.type != WATCH_JOB_TIMER)
                 return 0;
 
-        zero(ev);
-        ev.data.ptr = &j->timer_watch;
-        ev.events = EPOLLIN;
-
         if (epoll_ctl(j->manager->epoll_fd, EPOLL_CTL_ADD, j->timer_watch.fd, &ev) < 0)
                 return -errno;
 
diff --git a/src/core/locale-setup.c b/src/core/locale-setup.c
index eefb256..d7113b9 100644
--- a/src/core/locale-setup.c
+++ b/src/core/locale-setup.c
@@ -68,11 +68,9 @@ static const char * const variable_names[_VARIABLE_MAX] = {
 };
 
 int locale_setup(void) {
-        char *variables[_VARIABLE_MAX];
+        char *variables[_VARIABLE_MAX] = {};
         int r = 0, i;
 
-        zero(variables);
-
         if (detect_container(NULL) <= 0) {
                 r = parse_env_file("/proc/cmdline", WHITESPACE,
                                    "locale.LANG",              &variables[VARIABLE_LANG],
diff --git a/src/core/loopback-setup.c b/src/core/loopback-setup.c
index bfd0d93..f98a298 100644
--- a/src/core/loopback-setup.c
+++ b/src/core/loopback-setup.c
@@ -88,25 +88,26 @@ static int add_adresses(int fd, int if_loopback, unsigned *requests) {
         union {
                 struct sockaddr sa;
                 struct sockaddr_nl nl;
-        } sa;
+        } sa = {
+                .nl.nl_family = AF_NETLINK,
+        };
+
         union {
                 struct nlmsghdr header;
                 uint8_t buf[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
                             NLMSG_ALIGN(sizeof(struct ifaddrmsg)) +
                             RTA_LENGTH(sizeof(struct in6_addr))];
-        } request;
+        } request = {
+                .header.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)),
+                .header.nlmsg_type = RTM_NEWADDR,
+                .header.nlmsg_flags = NLM_F_REQUEST|NLM_F_CREATE|NLM_F_ACK,
+                .header.nlmsg_seq = *requests + 1,
+        };
 
         struct ifaddrmsg *ifaddrmsg;
         uint32_t ipv4_address = htonl(INADDR_LOOPBACK);
         int r;
 
-        zero(request);
-
-        request.header.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
-        request.header.nlmsg_type = RTM_NEWADDR;
-        request.header.nlmsg_flags = NLM_F_REQUEST|NLM_F_CREATE|NLM_F_ACK;
-        request.header.nlmsg_seq = *requests + 1;
-
         ifaddrmsg = NLMSG_DATA(&request.header);
         ifaddrmsg->ifa_family = AF_INET;
         ifaddrmsg->ifa_prefixlen = 8;
@@ -114,13 +115,11 @@ static int add_adresses(int fd, int if_loopback, unsigned *requests) {
         ifaddrmsg->ifa_scope = RT_SCOPE_HOST;
         ifaddrmsg->ifa_index = if_loopback;
 
-        r = add_rtattr(&request.header, sizeof(request), IFA_LOCAL, &ipv4_address, sizeof(ipv4_address));
+        r = add_rtattr(&request.header, sizeof(request), IFA_LOCAL,
+                       &ipv4_address, sizeof(ipv4_address));
         if (r < 0)
                 return r;
 
-        zero(sa);
-        sa.nl.nl_family = AF_NETLINK;
-
         if (sendto_loop(fd, &request, request.header.nlmsg_len, 0, &sa.sa, sizeof(sa)) < 0)
                 return -errno;
         (*requests)++;
@@ -134,7 +133,8 @@ static int add_adresses(int fd, int if_loopback, unsigned *requests) {
         ifaddrmsg->ifa_family = AF_INET6;
         ifaddrmsg->ifa_prefixlen = 128;
 
-        r = add_rtattr(&request.header, sizeof(request), IFA_LOCAL, &in6addr_loopback, sizeof(in6addr_loopback));
+        r = add_rtattr(&request.header, sizeof(request), IFA_LOCAL,
+                       &in6addr_loopback, sizeof(in6addr_loopback));
         if (r < 0)
                 return r;
 
@@ -149,31 +149,29 @@ static int start_interface(int fd, int if_loopback, unsigned *requests) {
         union {
                 struct sockaddr sa;
                 struct sockaddr_nl nl;
-        } sa;
+        } sa = {
+                .nl.nl_family = AF_NETLINK,
+        };
+
         union {
                 struct nlmsghdr header;
                 uint8_t buf[NLMSG_ALIGN(sizeof(struct nlmsghdr)) +
                             NLMSG_ALIGN(sizeof(struct ifinfomsg))];
-        } request;
+        } request = {
+                .header.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
+                .header.nlmsg_type = RTM_NEWLINK,
+                .header.nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK,
+                .header.nlmsg_seq = *requests + 1,
+        };
 
         struct ifinfomsg *ifinfomsg;
 
-        zero(request);
-
-        request.header.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
-        request.header.nlmsg_type = RTM_NEWLINK;
-        request.header.nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK;
-        request.header.nlmsg_seq = *requests + 1;
-
         ifinfomsg = NLMSG_DATA(&request.header);
         ifinfomsg->ifi_family = AF_UNSPEC;
         ifinfomsg->ifi_index = if_loopback;
         ifinfomsg->ifi_flags = IFF_UP;
         ifinfomsg->ifi_change = IFF_UP;
 
-        zero(sa);
-        sa.nl.nl_family = AF_NETLINK;
-
         if (sendto_loop(fd, &request, request.header.nlmsg_len, 0, &sa.sa, sizeof(sa)) < 0)
                 return -errno;
 
@@ -234,7 +232,10 @@ static int check_loopback(void) {
         union {
                 struct sockaddr sa;
                 struct sockaddr_in in;
-        } sa;
+        } sa = {
+                .in.sin_family = AF_INET,
+                .in.sin_addr.s_addr = INADDR_LOOPBACK,
+        };
 
         /* If we failed to set up the loop back device, check whether
          * it might already be set up */
@@ -243,10 +244,6 @@ static int check_loopback(void) {
         if (fd < 0)
                 return -errno;
 
-        zero(sa);
-        sa.in.sin_family = AF_INET;
-        sa.in.sin_addr.s_addr = INADDR_LOOPBACK;
-
         if (bind(fd, &sa.sa, sizeof(sa.in)) >= 0)
                 r = 1;
         else
@@ -260,7 +257,9 @@ int loopback_setup(void) {
         union {
                 struct sockaddr sa;
                 struct sockaddr_nl nl;
-        } sa;
+        } sa = {
+                .nl.nl_family = AF_NETLINK,
+        };
         unsigned requests = 0, i;
         int _cleanup_close_ fd = -1;
         bool eperm = false;
@@ -274,8 +273,6 @@ int loopback_setup(void) {
         if (fd < 0)
                 return -errno;
 
-        zero(sa);
-        sa.nl.nl_family = AF_NETLINK;
         if (bind(fd, &sa.sa, sizeof(sa)) < 0) {
                 r = -errno;
                 goto error;
diff --git a/src/core/main.c b/src/core/main.c
index 92f066c..4d21dd9 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -107,13 +107,13 @@ _noreturn_ static void crash(int sig) {
         if (!arg_dump_core)
                 log_error("Caught <%s>, not dumping core.", signal_to_string(sig));
         else {
-                struct sigaction sa;
+                struct sigaction sa = {
+                        .sa_handler = nop_handler,
+                        .sa_flags = SA_NOCLDSTOP|SA_RESTART,
+                };
                 pid_t pid;
 
                 /* We want to wait for the core process, hence let's enable SIGCHLD */
-                zero(sa);
-                sa.sa_handler = nop_handler;
-                sa.sa_flags = SA_NOCLDSTOP|SA_RESTART;
                 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
 
                 pid = fork();
@@ -121,7 +121,7 @@ _noreturn_ static void crash(int sig) {
                         log_error("Caught <%s>, cannot fork for core dump: %s", signal_to_string(sig), strerror(errno));
 
                 else if (pid == 0) {
-                        struct rlimit rl;
+                        struct rlimit rl = {};
 
                         /* Enable default signal handler for core dump */
                         zero(sa);
@@ -129,7 +129,6 @@ _noreturn_ static void crash(int sig) {
                         assert_se(sigaction(sig, &sa, NULL) == 0);
 
                         /* Don't limit the core dump size */
-                        zero(rl);
                         rl.rlim_cur = RLIM_INFINITY;
                         rl.rlim_max = RLIM_INFINITY;
                         setrlimit(RLIMIT_CORE, &rl);
@@ -162,16 +161,16 @@ _noreturn_ static void crash(int sig) {
                 chvt(arg_crash_chvt);
 
         if (arg_crash_shell) {
-                struct sigaction sa;
+                struct sigaction sa = {
+                        .sa_handler = SIG_IGN,
+                        .sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART,
+                };
                 pid_t pid;
 
                 log_info("Executing crash shell in 10s...");
                 sleep(10);
 
                 /* Let the kernel reap children for us */
-                zero(sa);
-                sa.sa_handler = SIG_IGN;
-                sa.sa_flags = SA_NOCLDSTOP|SA_NOCLDWAIT|SA_RESTART;
                 assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
 
                 pid = fork();
@@ -193,12 +192,10 @@ _noreturn_ static void crash(int sig) {
 }
 
 static void install_crash_handler(void) {
-        struct sigaction sa;
-
-        zero(sa);
-
-        sa.sa_handler = crash;
-        sa.sa_flags = SA_NODEFER;
+        struct sigaction sa = {
+                .sa_handler = crash,
+                .sa_flags = SA_NODEFER,
+        };
 
         sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
 }
diff --git a/src/core/manager.c b/src/core/manager.c
index e26522a..549153e 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -93,12 +93,15 @@ static int manager_setup_notify(Manager *m) {
         union {
                 struct sockaddr sa;
                 struct sockaddr_un un;
-        } sa;
-        struct epoll_event ev;
+        } sa = {
+                .sa.sa_family = AF_UNIX,
+        };
+        struct epoll_event ev = {
+                .events = EPOLLIN,
+                .data.ptr = &m->notify_watch,
+        };
         int one = 1, r;
 
-        assert(m);
-
         m->notify_watch.type = WATCH_NOTIFY;
         m->notify_watch.fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
         if (m->notify_watch.fd < 0) {
@@ -106,9 +109,6 @@ static int manager_setup_notify(Manager *m) {
                 return -errno;
         }
 
-        zero(sa);
-        sa.sa.sa_family = AF_UNIX;
-
         if (getpid() != 1 || detect_container(NULL) > 0)
                 snprintf(sa.un.sun_path, sizeof(sa.un.sun_path), NOTIFY_SOCKET "/%llu", random_ull());
         else
@@ -129,10 +129,6 @@ static int manager_setup_notify(Manager *m) {
                 return -errno;
         }
 
-        zero(ev);
-        ev.events = EPOLLIN;
-        ev.data.ptr = &m->notify_watch;
-
         r = epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->notify_watch.fd, &ev);
         if (r < 0) {
                 log_error("Failed to add notification socket fd to epoll: %m");
@@ -150,16 +146,14 @@ static int manager_setup_notify(Manager *m) {
 }
 
 static int manager_jobs_in_progress_mod_timer(Manager *m) {
-        struct itimerspec its;
+        struct itimerspec its = {
+                .it_value.tv_sec = JOBS_IN_PROGRESS_WAIT_SEC,
+                .it_interval.tv_sec = JOBS_IN_PROGRESS_PERIOD_SEC,
+        };
 
         if (m->jobs_in_progress_watch.type != WATCH_JOBS_IN_PROGRESS)
                 return 0;
 
-        zero(its);
-
-        its.it_value.tv_sec = JOBS_IN_PROGRESS_WAIT_SEC;
-        its.it_interval.tv_sec = JOBS_IN_PROGRESS_PERIOD_SEC;
-
         if (timerfd_settime(m->jobs_in_progress_watch.fd, 0, &its, NULL) < 0)
                 return -errno;
 
@@ -167,11 +161,12 @@ static int manager_jobs_in_progress_mod_timer(Manager *m) {
 }
 
 static int manager_watch_jobs_in_progress(Manager *m) {
-        struct epoll_event ev;
+        struct epoll_event ev = {
+                .events = EPOLLIN,
+                .data.ptr = &m->jobs_in_progress_watch,
+        };
         int r;
 
-        assert(m);
-
         if (m->jobs_in_progress_watch.type != WATCH_INVALID)
                 return 0;
 
@@ -189,10 +184,6 @@ static int manager_watch_jobs_in_progress(Manager *m) {
                 goto err;
         }
 
-        zero(ev);
-        ev.events = EPOLLIN;
-        ev.data.ptr = &m->jobs_in_progress_watch;
-
         if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->jobs_in_progress_watch.fd, &ev) < 0) {
                 log_error("Failed to add jobs progress timer fd to epoll: %m");
                 r = -errno;
@@ -287,10 +278,18 @@ static void manager_print_jobs_in_progress(Manager *m) {
 }
 
 static int manager_setup_time_change(Manager *m) {
-        struct epoll_event ev;
-        struct itimerspec its;
+        struct epoll_event ev = {
+                .events = EPOLLIN,
+                .data.ptr = &m->time_change_watch,
+        };
+
+        /* We only care for the cancellation event, hence we set the
+         * timeout to the latest possible value. */
+        struct itimerspec its = {
+                .it_value.tv_sec = TIME_T_MAX,
+        };
+        assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
 
-        assert(m);
         assert(m->time_change_watch.type == WATCH_INVALID);
 
         /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever
@@ -303,13 +302,6 @@ static int manager_setup_time_change(Manager *m) {
                 return -errno;
         }
 
-        zero(its);
-
-        /* We only care for the cancellation event, hence we set the
-         * timeout to the latest possible value. */
-        assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX));
-        its.it_value.tv_sec = TIME_T_MAX;
-
         if (timerfd_settime(m->time_change_watch.fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
                 log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m");
                 close_nointr_nofail(m->time_change_watch.fd);
@@ -317,10 +309,6 @@ static int manager_setup_time_change(Manager *m) {
                 return 0;
         }
 
-        zero(ev);
-        ev.events = EPOLLIN;
-        ev.data.ptr = &m->time_change_watch;
-
         if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->time_change_watch.fd, &ev) < 0) {
                 log_error("Failed to add timer change fd to epoll: %m");
                 return -errno;
@@ -360,15 +348,18 @@ static int enable_special_signals(Manager *m) {
 
 static int manager_setup_signals(Manager *m) {
         sigset_t mask;
-        struct epoll_event ev;
-        struct sigaction sa;
+        struct epoll_event ev = {
+                .events = EPOLLIN,
+                .data.ptr = &m->signal_watch,
+        };
+        struct sigaction sa = {
+                .sa_handler = SIG_DFL,
+                .sa_flags = SA_NOCLDSTOP|SA_RESTART,
+        };
 
         assert(m);
 
         /* We are not interested in SIGSTOP and friends. */
-        zero(sa);
-        sa.sa_handler = SIG_DFL;
-        sa.sa_flags = SA_NOCLDSTOP|SA_RESTART;
         assert_se(sigaction(SIGCHLD, &sa, NULL) == 0);
 
         assert_se(sigemptyset(&mask) == 0);
@@ -410,10 +401,6 @@ static int manager_setup_signals(Manager *m) {
         if (m->signal_watch.fd < 0)
                 return -errno;
 
-        zero(ev);
-        ev.events = EPOLLIN;
-        ev.data.ptr = &m->signal_watch;
-
         if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->signal_watch.fd, &ev) < 0)
                 return -errno;
 
@@ -1184,30 +1171,29 @@ static int manager_process_notify_fd(Manager *m) {
 
         for (;;) {
                 char buf[4096];
-                struct msghdr msghdr;
-                struct iovec iovec;
-                struct ucred *ucred;
+                struct iovec iovec = {
+                        .iov_base = buf,
+                        .iov_len = sizeof(buf)-1,
+                };
+
                 union {
                         struct cmsghdr cmsghdr;
                         uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
-                } control;
+                } control = {};
+
+                struct msghdr msghdr = {
+                        .msg_iov = &iovec,
+                        .msg_iovlen = 1,
+                        .msg_control = &control,
+                        .msg_controllen = sizeof(control),
+                };
+                struct ucred *ucred;
                 Unit *u;
                 char _cleanup_strv_free_ **tags = NULL;
 
-                zero(iovec);
-                iovec.iov_base = buf;
-                iovec.iov_len = sizeof(buf)-1;
-
-                zero(control);
-                zero(msghdr);
-                msghdr.msg_iov = &iovec;
-                msghdr.msg_iovlen = 1;
-                msghdr.msg_control = &control;
-                msghdr.msg_controllen = sizeof(control);
-
                 n = recvmsg(m->notify_watch.fd, &msghdr, MSG_DONTWAIT);
                 if (n <= 0) {
-                        if (n >= 0)
+                        if (n == 0)
                                 return -EIO;
 
                         if (errno == EAGAIN || errno == EINTR)
@@ -1254,12 +1240,10 @@ static int manager_dispatch_sigchld(Manager *m) {
         assert(m);
 
         for (;;) {
-                siginfo_t si;
+                siginfo_t si = {};
                 Unit *u;
                 int r;
 
-                zero(si);
-
                 /* First we call waitd() for a PID and do not reap the
                  * zombie. That way we can still access /proc/$PID for
                  * it while it is a zombie. */
diff --git a/src/core/mount.c b/src/core/mount.c
index 51a81a9..4f24555 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -293,7 +293,7 @@ static int mount_add_requires_mounts_links(Mount *m) {
 }
 
 static char* mount_test_option(const char *haystack, const char *needle) {
-        struct mntent me;
+        struct mntent me = { .mnt_opts = (char*) haystack };
 
         assert(needle);
 
@@ -303,9 +303,6 @@ static char* mount_test_option(const char *haystack, const char *needle) {
         if (!haystack)
                 return NULL;
 
-        zero(me);
-        me.mnt_opts = (char*) haystack;
-
         return hasmntopt(&me, needle);
 }
 
@@ -1706,10 +1703,14 @@ static void mount_shutdown(Manager *m) {
 
 static int mount_enumerate(Manager *m) {
         int r;
-        struct epoll_event ev;
         assert(m);
 
         if (!m->proc_self_mountinfo) {
+                struct epoll_event ev = {
+                        .events = EPOLLPRI,
+                        .data.ptr = &m->mount_watch,
+                };
+
                 m->proc_self_mountinfo = fopen("/proc/self/mountinfo", "re");
                 if (!m->proc_self_mountinfo)
                         return -errno;
@@ -1717,10 +1718,6 @@ static int mount_enumerate(Manager *m) {
                 m->mount_watch.type = WATCH_MOUNT;
                 m->mount_watch.fd = fileno(m->proc_self_mountinfo);
 
-                zero(ev);
-                ev.events = EPOLLPRI;
-                ev.data.ptr = &m->mount_watch;
-
                 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->mount_watch.fd, &ev) < 0)
                         return -errno;
         }
diff --git a/src/core/service.c b/src/core/service.c
index 98266a5..a104b30 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -3446,7 +3446,7 @@ static int service_enumerate(Manager *m) {
         unsigned i;
         DIR _cleanup_closedir_ *d = NULL;
         char _cleanup_free_ *path = NULL, *fpath = NULL, *name = NULL;
-        Set *runlevel_services[ELEMENTSOF(rcnd_table)];
+        Set *runlevel_services[ELEMENTSOF(rcnd_table)] = {};
         Set _cleanup_set_free_ *shutdown_services = NULL;
         Unit *service;
         Iterator j;
@@ -3457,8 +3457,6 @@ static int service_enumerate(Manager *m) {
         if (m->running_as != SYSTEMD_SYSTEM)
                 return 0;
 
-        zero(runlevel_services);
-
         STRV_FOREACH(p, m->lookup_paths.sysvrcnd_path)
                 for (i = 0; i < ELEMENTSOF(rcnd_table); i ++) {
                         struct dirent *de;
diff --git a/src/core/swap.c b/src/core/swap.c
index dc98f47..b363c5e 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -1242,10 +1242,14 @@ static void swap_shutdown(Manager *m) {
 
 static int swap_enumerate(Manager *m) {
         int r;
-        struct epoll_event ev;
         assert(m);
 
         if (!m->proc_swaps) {
+                struct epoll_event ev = {
+                        .events = EPOLLPRI,
+                        .data.ptr = &m->swap_watch,
+                };
+
                 m->proc_swaps = fopen("/proc/swaps", "re");
                 if (!m->proc_swaps)
                         return (errno == ENOENT) ? 0 : -errno;
@@ -1253,10 +1257,6 @@ static int swap_enumerate(Manager *m) {
                 m->swap_watch.type = WATCH_SWAP;
                 m->swap_watch.fd = fileno(m->proc_swaps);
 
-                zero(ev);
-                ev.events = EPOLLPRI;
-                ev.data.ptr = &m->swap_watch;
-
                 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->swap_watch.fd, &ev) < 0)
                         return -errno;
         }
diff --git a/src/core/umount.c b/src/core/umount.c
index 95e47e3..8c69e74 100644
--- a/src/core/umount.c
+++ b/src/core/umount.c
@@ -381,7 +381,13 @@ static int delete_loopback(const char *device) {
 static int delete_dm(dev_t devnum) {
         int _cleanup_close_ fd = -1;
         int r;
-        struct dm_ioctl dm;
+        struct dm_ioctl dm = {
+                .version = {DM_VERSION_MAJOR,
+                            DM_VERSION_MINOR,
+                            DM_VERSION_PATCHLEVEL},
+                .data_size = sizeof(dm),
+                .dev = devnum,
+        };
 
         assert(major(devnum) != 0);
 
@@ -389,14 +395,6 @@ static int delete_dm(dev_t devnum) {
         if (fd < 0)
                 return -errno;
 
-        zero(dm);
-        dm.version[0] = DM_VERSION_MAJOR;
-        dm.version[1] = DM_VERSION_MINOR;
-        dm.version[2] = DM_VERSION_PATCHLEVEL;
-
-        dm.data_size = sizeof(dm);
-        dm.dev = devnum;
-
         r = ioctl(fd, DM_DEV_REMOVE, &dm);
         return r >= 0 ? 0 : -errno;
 }
diff --git a/src/core/unit.c b/src/core/unit.c
index dbb1882..63e42b2 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -1520,17 +1520,16 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su
 }
 
 int unit_watch_fd(Unit *u, int fd, uint32_t events, Watch *w) {
-        struct epoll_event ev;
+        struct epoll_event ev = {
+                .data.ptr = w,
+                .events = events,
+        };
 
         assert(u);
         assert(fd >= 0);
         assert(w);
         assert(w->type == WATCH_INVALID || (w->type == WATCH_FD && w->fd == fd && w->data.unit == u));
 
-        zero(ev);
-        ev.data.ptr = w;
-        ev.events = events;
-
         if (epoll_ctl(u->manager->epoll_fd,
                       w->type == WATCH_INVALID ? EPOLL_CTL_ADD : EPOLL_CTL_MOD,
                       fd,
@@ -1578,7 +1577,7 @@ void unit_unwatch_pid(Unit *u, pid_t pid) {
 }
 
 int unit_watch_timer(Unit *u, clockid_t clock_id, bool relative, usec_t usec, Watch *w) {
-        struct itimerspec its;
+        struct itimerspec its = {};
         int flags, fd;
         bool ours;
 
@@ -1603,8 +1602,6 @@ int unit_watch_timer(Unit *u, clockid_t clock_id, bool relative, usec_t usec, Wa
         } else
                 assert_not_reached("Invalid watch type");
 
-        zero(its);
-
         if (usec <= 0) {
                 /* Set absolute time in the past, but not 0, since we
                  * don't want to disarm the timer */
@@ -1622,11 +1619,10 @@ int unit_watch_timer(Unit *u, clockid_t clock_id, bool relative, usec_t usec, Wa
                 goto fail;
 
         if (w->type == WATCH_INVALID) {
-                struct epoll_event ev;
-
-                zero(ev);
-                ev.data.ptr = w;
-                ev.events = EPOLLIN;
+                struct epoll_event ev = {
+                        .data.ptr = w,
+                        .events = EPOLLIN,
+                };
 
                 if (epoll_ctl(u->manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0)
                         goto fail;
diff --git a/src/cryptsetup/cryptsetup.c b/src/cryptsetup/cryptsetup.c
index 51d4f99..ae4aa8d 100644
--- a/src/cryptsetup/cryptsetup.c
+++ b/src/cryptsetup/cryptsetup.c
@@ -461,10 +461,7 @@ int main(int argc, char *argv[]) {
                                 k = crypt_load(cd, CRYPT_LUKS1, NULL);
 
                         if ((!opt_type && k < 0) || streq_ptr(opt_type, CRYPT_PLAIN)) {
-                                struct crypt_params_plain params;
-
-                                zero(params);
-                                params.hash = hash;
+                                struct crypt_params_plain params = { .hash = hash };
 
                                 /* for CRYPT_PLAIN limit reads
                                 * from keyfile to key length, and
diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c
index 917fac2..1c90435 100644
--- a/src/hostname/hostnamectl.c
+++ b/src/hostname/hostnamectl.c
@@ -152,7 +152,7 @@ static int show_status(DBusConnection *bus, char **args, unsigned n) {
         const char *interface = "";
         int r;
         DBusMessageIter iter, sub, sub2, sub3;
-        StatusInfo info;
+        StatusInfo info = {};
 
         assert(args);
 
@@ -176,7 +176,6 @@ static int show_status(DBusConnection *bus, char **args, unsigned n) {
                 return -EIO;
         }
 
-        zero(info);
         dbus_message_iter_recurse(&iter, &sub);
 
         while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) {
diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
index a9d7aa1..9a96689 100644
--- a/src/journal/journald-server.c
+++ b/src/journal/journald-server.c
@@ -719,7 +719,7 @@ void server_driver_message(Server *s, sd_id128_t message_id, const char *format,
         struct iovec iovec[N_IOVEC_META_FIELDS + 4];
         int n = 0;
         va_list ap;
-        struct ucred ucred;
+        struct ucred ucred = {};
 
         assert(s);
         assert(format);
@@ -740,7 +740,6 @@ void server_driver_message(Server *s, sd_id128_t message_id, const char *format,
                 IOVEC_SET_STRING(iovec[n++], mid);
         }
 
-        zero(ucred);
         ucred.pid = getpid();
         ucred.uid = getuid();
         ucred.gid = getgid();
@@ -1356,17 +1355,16 @@ static int server_open_sync_timer(Server *s) {
 int server_schedule_sync(Server *s) {
         int r;
 
-        struct itimerspec sync_timer_enable;
-
         assert(s);
 
         if (s->sync_scheduled)
                 return 0;
 
         if (s->sync_interval_usec) {
-                zero(sync_timer_enable);
-                sync_timer_enable.it_value.tv_sec = s->sync_interval_usec / USEC_PER_SEC;
-                sync_timer_enable.it_value.tv_nsec = s->sync_interval_usec % MSEC_PER_SEC;
+                struct itimerspec sync_timer_enable = {
+                        .it_value.tv_sec = s->sync_interval_usec / USEC_PER_SEC,
+                        .it_value.tv_nsec = s->sync_interval_usec % MSEC_PER_SEC,
+                };
 
                 r = timerfd_settime(s->sync_timer_fd, 0, &sync_timer_enable, NULL);
                 if (r < 0)
diff --git a/src/journal/journald-stream.c b/src/journal/journald-stream.c
index bdc2f49..6d51c29 100644
--- a/src/journal/journald-stream.c
+++ b/src/journal/journald-stream.c
@@ -412,13 +412,16 @@ fail:
 }
 
 int server_open_stdout_socket(Server *s) {
-        union sockaddr_union sa;
         int r;
         struct epoll_event ev;
 
         assert(s);
 
         if (s->stdout_fd < 0) {
+                union sockaddr_union sa = {
+                        .un.sun_family = AF_UNIX,
+                        .un.sun_path = "/run/systemd/journal/stdout",
+                };
 
                 s->stdout_fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
                 if (s->stdout_fd < 0) {
@@ -426,10 +429,6 @@ int server_open_stdout_socket(Server *s) {
                         return -errno;
                 }
 
-                zero(sa);
-                sa.un.sun_family = AF_UNIX;
-                strncpy(sa.un.sun_path, "/run/systemd/journal/stdout", sizeof(sa.un.sun_path));
-
                 unlink(sa.un.sun_path);
 
                 r = bind(s->stdout_fd, &sa.sa, offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path));
diff --git a/src/journal/journald-syslog.c b/src/journal/journald-syslog.c
index afddca3..000f5ac 100644
--- a/src/journal/journald-syslog.c
+++ b/src/journal/journald-syslog.c
@@ -34,28 +34,28 @@
 #define WARN_FORWARD_SYSLOG_MISSED_USEC (30 * USEC_PER_SEC)
 
 static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned n_iovec, struct ucred *ucred, struct timeval *tv) {
-        struct msghdr msghdr;
+
+        union sockaddr_union sa = {
+                .un.sun_family = AF_UNIX,
+                .un.sun_path = "/run/systemd/journal/syslog",
+        };
+        struct msghdr msghdr = {
+                .msg_iov = (struct iovec *) iovec,
+                .msg_iovlen = n_iovec,
+                .msg_name = &sa,
+                .msg_namelen = offsetof(union sockaddr_union, un.sun_path)
+                               + sizeof("/run/systemd/journal/syslog") - 1,
+        };
         struct cmsghdr *cmsg;
         union {
                 struct cmsghdr cmsghdr;
                 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
         } control;
-        union sockaddr_union sa;
 
         assert(s);
         assert(iovec);
         assert(n_iovec > 0);
 
-        zero(msghdr);
-        msghdr.msg_iov = (struct iovec*) iovec;
-        msghdr.msg_iovlen = n_iovec;
-
-        zero(sa);
-        sa.un.sun_family = AF_UNIX;
-        strncpy(sa.un.sun_path, "/run/systemd/journal/syslog", sizeof(sa.un.sun_path));
-        msghdr.msg_name = &sa;
-        msghdr.msg_namelen = offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path);
-
         if (ucred) {
                 zero(control);
                 msghdr.msg_control = &control;
@@ -412,13 +412,16 @@ void server_process_syslog_message(
 }
 
 int server_open_syslog_socket(Server *s) {
-        union sockaddr_union sa;
         int one, r;
         struct epoll_event ev;
 
         assert(s);
 
         if (s->syslog_fd < 0) {
+                union sockaddr_union sa = {
+                        .un.sun_family = AF_UNIX,
+                        .un.sun_path = "/dev/log",
+                };
 
                 s->syslog_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
                 if (s->syslog_fd < 0) {
@@ -426,10 +429,6 @@ int server_open_syslog_socket(Server *s) {
                         return -errno;
                 }
 
-                zero(sa);
-                sa.un.sun_family = AF_UNIX;
-                strncpy(sa.un.sun_path, "/dev/log", sizeof(sa.un.sun_path));
-
                 unlink(sa.un.sun_path);
 
                 r = bind(s->syslog_fd, &sa.sa, offsetof(union sockaddr_union, un.sun_path) + strlen(sa.un.sun_path));
diff --git a/src/libsystemd-bus/bus-socket.c b/src/libsystemd-bus/bus-socket.c
index c68c7bc..145f454 100644
--- a/src/libsystemd-bus/bus-socket.c
+++ b/src/libsystemd-bus/bus-socket.c
@@ -986,16 +986,14 @@ int bus_socket_read_message(sd_bus *bus, sd_bus_message **m) {
 int bus_socket_process_opening(sd_bus *b) {
         int error = 0;
         socklen_t slen = sizeof(error);
-        struct pollfd p;
+        struct pollfd p = {
+                .fd = b->output_fd,
+                .events = POLLOUT,
+        };
         int r;
 
-        assert(b);
         assert(b->state == BUS_OPENING);
 
-        zero(p);
-        p.fd = b->output_fd;
-        p.events = POLLOUT;
-
         r = poll(&p, 1, 0);
         if (r < 0)
                 return -errno;
diff --git a/src/libsystemd-bus/sd-bus.c b/src/libsystemd-bus/sd-bus.c
index 6f8d444..2f084c2 100644
--- a/src/libsystemd-bus/sd-bus.c
+++ b/src/libsystemd-bus/sd-bus.c
@@ -436,8 +436,11 @@ static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
 
 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
         _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
-        struct addrinfo hints, *result;
         int r;
+        struct addrinfo *result, hints = {
+                .ai_socktype = SOCK_STREAM,
+                .ai_flags = AI_ADDRCONFIG,
+        };
 
         assert(b);
         assert(p);
@@ -475,10 +478,6 @@ static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
         if (!host || !port)
                 return -EINVAL;
 
-        zero(hints);
-        hints.ai_socktype = SOCK_STREAM;
-        hints.ai_flags = AI_ADDRCONFIG;
-
         if (family) {
                 if (streq(family, "ipv4"))
                         hints.ai_family = AF_INET;
@@ -1937,7 +1936,7 @@ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
 }
 
 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
-        struct pollfd p[2];
+        struct pollfd p[2] = {};
         int r, e, n;
         struct timespec ts;
         usec_t until, m;
@@ -1968,9 +1967,7 @@ static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
         if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
                 m = timeout_usec;
 
-        zero(p);
         p[0].fd = bus->input_fd;
-
         if (bus->output_fd == bus->input_fd) {
                 p[0].events = e;
                 n = 1;
diff --git a/src/locale/localectl.c b/src/locale/localectl.c
index 5739a1d..5328ac4 100644
--- a/src/locale/localectl.c
+++ b/src/locale/localectl.c
@@ -158,7 +158,7 @@ static int show_status(DBusConnection *bus, char **args, unsigned n) {
         const char *interface = "";
         int r;
         DBusMessageIter iter, sub, sub2, sub3;
-        StatusInfo info;
+        StatusInfo info = {};
 
         assert(args);
 
@@ -182,7 +182,6 @@ static int show_status(DBusConnection *bus, char **args, unsigned n) {
                 return -EIO;
         }
 
-        zero(info);
         dbus_message_iter_recurse(&iter, &sub);
 
         while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) {
diff --git a/src/locale/localed.c b/src/locale/localed.c
index df812ee..23fbde0 100644
--- a/src/locale/localed.c
+++ b/src/locale/localed.c
@@ -1011,7 +1011,7 @@ static DBusHandlerResult locale_message_handler(
                 dbus_bool_t interactive;
                 DBusMessageIter iter;
                 bool modified = false;
-                bool passed[_PROP_MAX];
+                bool passed[_PROP_MAX] = {};
                 int p;
 
                 if (!dbus_message_iter_init(message, &iter))
@@ -1033,8 +1033,6 @@ static DBusHandlerResult locale_message_handler(
 
                 dbus_message_iter_get_basic(&iter, &interactive);
 
-                zero(passed);
-
                 /* Check whether a variable changed and if so valid */
                 STRV_FOREACH(i, l) {
                         bool valid = false;
diff --git a/src/login/loginctl.c b/src/login/loginctl.c
index 6c229c6..36c65bc 100644
--- a/src/login/loginctl.c
+++ b/src/login/loginctl.c
@@ -834,17 +834,13 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo
         const char *interface = "";
         int r;
         DBusMessageIter iter, sub, sub2, sub3;
-        SessionStatusInfo session_info;
-        UserStatusInfo user_info;
-        SeatStatusInfo seat_info;
+        SessionStatusInfo session_info = {};
+        UserStatusInfo user_info = {};
+        SeatStatusInfo seat_info = {};
 
         assert(path);
         assert(new_line);
 
-        zero(session_info);
-        zero(user_info);
-        zero(seat_info);
-
         r = bus_method_call_with_reply(
                         bus,
                         "org.freedesktop.login1",
diff --git a/src/login/logind-inhibit.c b/src/login/logind-inhibit.c
index c43ae23..e770883 100644
--- a/src/login/logind-inhibit.c
+++ b/src/login/logind-inhibit.c
@@ -292,7 +292,7 @@ int inhibitor_create_fifo(Inhibitor *i) {
 
         /* Open reading side */
         if (i->fifo_fd < 0) {
-                struct epoll_event ev;
+                struct epoll_event ev = {};
 
                 i->fifo_fd = open(i->fifo_path, O_RDONLY|O_CLOEXEC|O_NDELAY);
                 if (i->fifo_fd < 0)
@@ -302,7 +302,6 @@ int inhibitor_create_fifo(Inhibitor *i) {
                 if (r < 0)
                         return r;
 
-                zero(ev);
                 ev.events = 0;
                 ev.data.u32 = FD_OTHER_BASE + i->fifo_fd;
 
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index 71c7912..97c24d0 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -898,7 +898,7 @@ int session_create_fifo(Session *s) {
 
         /* Open reading side */
         if (s->fifo_fd < 0) {
-                struct epoll_event ev;
+                struct epoll_event ev = {};
 
                 s->fifo_fd = open(s->fifo_path, O_RDONLY|O_CLOEXEC|O_NDELAY);
                 if (s->fifo_fd < 0)
@@ -908,7 +908,6 @@ int session_create_fifo(Session *s) {
                 if (r < 0)
                         return r;
 
-                zero(ev);
                 ev.events = 0;
                 ev.data.u32 = FD_OTHER_BASE + s->fifo_fd;
 
diff --git a/src/login/logind.c b/src/login/logind.c
index f72aac5..c9e492f 100644
--- a/src/login/logind.c
+++ b/src/login/logind.c
@@ -1174,7 +1174,10 @@ static void manager_dispatch_other(Manager *m, int fd) {
 static int manager_connect_bus(Manager *m) {
         DBusError error;
         int r;
-        struct epoll_event ev;
+        struct epoll_event ev = {
+                .events = EPOLLIN,
+                .data.u32 = FD_BUS,
+        };
 
         assert(m);
         assert(!m->bus);
@@ -1230,10 +1233,6 @@ static int manager_connect_bus(Manager *m) {
                 goto fail;
         }
 
-        zero(ev);
-        ev.events = EPOLLIN;
-        ev.data.u32 = FD_BUS;
-
         if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->bus_fd, &ev) < 0)
                 goto fail;
 
@@ -1246,7 +1245,10 @@ fail:
 }
 
 static int manager_connect_console(Manager *m) {
-        struct epoll_event ev;
+        struct epoll_event ev = {
+                .events = 0,
+                .data.u32 = FD_CONSOLE,
+        };
 
         assert(m);
         assert(m->console_active_fd < 0);
@@ -1271,10 +1273,6 @@ static int manager_connect_console(Manager *m) {
                 return -errno;
         }
 
-        zero(ev);
-        ev.events = 0;
-        ev.data.u32 = FD_CONSOLE;
-
         if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->console_active_fd, &ev) < 0)
                 return -errno;
 
@@ -1282,8 +1280,11 @@ static int manager_connect_console(Manager *m) {
 }
 
 static int manager_connect_udev(Manager *m) {
-        struct epoll_event ev;
         int r;
+        struct epoll_event ev = {
+                .events = EPOLLIN,
+                .data.u32 = FD_SEAT_UDEV,
+        };
 
         assert(m);
         assert(!m->udev_seat_monitor);
@@ -1304,9 +1305,6 @@ static int manager_connect_udev(Manager *m) {
 
         m->udev_seat_fd = udev_monitor_get_fd(m->udev_seat_monitor);
 
-        zero(ev);
-        ev.events = EPOLLIN;
-        ev.data.u32 = FD_SEAT_UDEV;
         if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->udev_seat_fd, &ev) < 0)
                 return -errno;
 
@@ -1447,7 +1445,7 @@ int manager_get_idle_hint(Manager *m, dual_timestamp *t) {
 
 int manager_dispatch_idle_action(Manager *m) {
         struct dual_timestamp since;
-        struct itimerspec its;
+        struct itimerspec its = {};
         int r;
         usec_t n;
 
@@ -1459,7 +1457,6 @@ int manager_dispatch_idle_action(Manager *m) {
                 goto finish;
         }
 
-        zero(its);
         n = now(CLOCK_MONOTONIC);
 
         r = manager_get_idle_hint(m, &since);
@@ -1482,7 +1479,10 @@ int manager_dispatch_idle_action(Manager *m) {
         }
 
         if (m->idle_action_fd < 0) {
-                struct epoll_event ev;
+                struct epoll_event ev = {
+                        .events = EPOLLIN,
+                        .data.u32 = FD_IDLE_ACTION,
+                };
 
                 m->idle_action_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC);
                 if (m->idle_action_fd < 0) {
@@ -1491,10 +1491,6 @@ int manager_dispatch_idle_action(Manager *m) {
                         goto finish;
                 }
 
-                zero(ev);
-                ev.events = EPOLLIN;
-                ev.data.u32 = FD_IDLE_ACTION;
-
                 if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->idle_action_fd, &ev) < 0) {
                         log_error("Failed to add idle action timer to epoll: %m");
                         r = -errno;
diff --git a/src/login/pam-module.c b/src/login/pam-module.c
index 0d4f799..c8f4dae 100644
--- a/src/login/pam-module.c
+++ b/src/login/pam-module.c
@@ -256,13 +256,15 @@ static bool check_user_lists(
 }
 
 static int get_seat_from_display(const char *display, const char **seat, uint32_t *vtnr) {
-        char *p = NULL;
+        char _cleanup_free_ *p = NULL;
         int r;
-        int fd;
-        union sockaddr_union sa;
+        int _cleanup_close_ fd = -1;
+        union sockaddr_union sa = {
+                .un.sun_family = AF_UNIX,
+        };
         struct ucred ucred;
         socklen_t l;
-        char *tty;
+        char _cleanup_free_ *tty = NULL;
         int v;
 
         assert(display);
@@ -277,27 +279,17 @@ static int get_seat_from_display(const char *display, const char **seat, uint32_
         r = socket_from_display(display, &p);
         if (r < 0)
                 return r;
+        strncpy(sa.un.sun_path, p, sizeof(sa.un.sun_path)-1);
 
         fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0);
-        if (fd < 0) {
-                free(p);
+        if (fd < 0)
                 return -errno;
-        }
-
-        zero(sa);
-        sa.un.sun_family = AF_UNIX;
-        strncpy(sa.un.sun_path, p, sizeof(sa.un.sun_path)-1);
-        free(p);
 
-        if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path)) < 0) {
-                close_nointr_nofail(fd);
+        if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path)) < 0)
                 return -errno;
-        }
 
         l = sizeof(ucred);
         r = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &l);
-        close_nointr_nofail(fd);
-
         if (r < 0)
                 return -errno;
 
@@ -306,8 +298,6 @@ static int get_seat_from_display(const char *display, const char **seat, uint32_
                 return r;
 
         v = vtnr_from_tty(tty);
-        free(tty);
-
         if (v < 0)
                 return v;
         else if (v == 0)
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
index 01ef12b..b90ccc5 100644
--- a/src/nspawn/nspawn.c
+++ b/src/nspawn/nspawn.c
@@ -674,8 +674,11 @@ static int setup_kmsg(const char *dest, int kmsg_socket) {
         union {
                 struct cmsghdr cmsghdr;
                 uint8_t buf[CMSG_SPACE(sizeof(int))];
-        } control;
-        struct msghdr mh;
+        } control = {};
+        struct msghdr mh = {
+                .msg_control = &control,
+                .msg_controllen = sizeof(control),
+        };
         struct cmsghdr *cmsg;
 
         assert(dest);
@@ -716,12 +719,6 @@ static int setup_kmsg(const char *dest, int kmsg_socket) {
                 return -errno;
         }
 
-        zero(mh);
-        zero(control);
-
-        mh.msg_control = &control;
-        mh.msg_controllen = sizeof(control);
-
         cmsg = CMSG_FIRSTHDR(&mh);
         cmsg->cmsg_level = SOL_SOCKET;
         cmsg->cmsg_type = SCM_RIGHTS;
diff --git a/src/python-systemd/_reader.c b/src/python-systemd/_reader.c
index d1188a1..a49527f 100644
--- a/src/python-systemd/_reader.c
+++ b/src/python-systemd/_reader.c
@@ -64,7 +64,7 @@ PyDoc_STRVAR(MonotonicType__doc__,
 static PyStructSequence_Field MonotonicType_fields[] = {
     {(char*) "timestamp", (char*) "Time"},
     {(char*) "bootid", (char*) "Unique identifier of the boot"},
-    {NULL, NULL}
+    {} /* Sentinel */
 };
 
 static PyStructSequence_Desc Monotonic_desc = {
@@ -898,7 +898,7 @@ static PyGetSetDef Reader_getsetters[] = {
      NULL,
      (char*) closed__doc__,
      NULL},
-    {NULL}
+    {} /* Sentinel */
 };
 
 static PyMethodDef Reader_methods[] = {
@@ -927,7 +927,7 @@ static PyMethodDef Reader_methods[] = {
     {"test_cursor",     (PyCFunction) Reader_test_cursor, METH_VARARGS, Reader_test_cursor__doc__},
     {"query_unique",    (PyCFunction) Reader_query_unique, METH_VARARGS, Reader_query_unique__doc__},
     {"get_catalog",     (PyCFunction) Reader_get_catalog, METH_NOARGS, Reader_get_catalog__doc__},
-    {NULL}  /* Sentinel */
+    {}  /* Sentinel */
 };
 
 static PyTypeObject ReaderType = {
diff --git a/src/readahead/readahead-collect.c b/src/readahead/readahead-collect.c
index b2d0f68..0358392 100644
--- a/src/readahead/readahead-collect.c
+++ b/src/readahead/readahead-collect.c
@@ -75,10 +75,7 @@ static usec_t starttime;
 #define PTR_TO_SECTOR(p) (PTR_TO_ULONG(p)-1)
 
 static int btrfs_defrag(int fd) {
-        struct btrfs_ioctl_vol_args data;
-
-        zero(data);
-        data.fd = fd;
+        struct btrfs_ioctl_vol_args data = { .fd = fd };
 
         return ioctl(fd, BTRFS_IOC_DEFRAG, &data);
 }
@@ -186,11 +183,10 @@ static unsigned long fd_first_block(int fd) {
         struct {
                 struct fiemap fiemap;
                 struct fiemap_extent extent;
-        } data;
-
-        zero(data);
-        data.fiemap.fm_length = ~0ULL;
-        data.fiemap.fm_extent_count = 1;
+        } data = {
+                .fiemap.fm_length = ~0ULL,
+                .fiemap.fm_extent_count = 1,
+        };
 
         if (ioctl(fd, FS_IOC_FIEMAP, &data) < 0)
                 return 0;
@@ -238,7 +234,7 @@ static int collect(const char *root) {
                 FD_INOTIFY,   /* We get notifications to quit early via this fd */
                 _FD_MAX
         };
-        struct pollfd pollfd[_FD_MAX];
+        struct pollfd pollfd[_FD_MAX] = {};
         int fanotify_fd = -1, signal_fd = -1, inotify_fd = -1, r = 0;
         pid_t my_pid;
         Hashmap *files = NULL;
@@ -314,7 +310,6 @@ static int collect(const char *root) {
 
         my_pid = getpid();
 
-        zero(pollfd);
         pollfd[FD_FANOTIFY].fd = fanotify_fd;
         pollfd[FD_FANOTIFY].events = POLLIN;
         pollfd[FD_SIGNAL].fd = signal_fd;
diff --git a/src/remount-fs/remount-fs.c b/src/remount-fs/remount-fs.c
index b49d095..f432718 100644
--- a/src/remount-fs/remount-fs.c
+++ b/src/remount-fs/remount-fs.c
@@ -129,10 +129,9 @@ int main(int argc, char *argv[]) {
         }
 
         while (!hashmap_isempty(pids)) {
-                siginfo_t si;
+                siginfo_t si = {};
                 char *s;
 
-                zero(si);
                 if (waitid(P_ALL, 0, &si, WEXITED) < 0) {
 
                         if (errno == EINTR)
diff --git a/src/reply-password/reply-password.c b/src/reply-password/reply-password.c
index a935d0f..2f16898 100644
--- a/src/reply-password/reply-password.c
+++ b/src/reply-password/reply-password.c
@@ -41,14 +41,14 @@ static int send_on_socket(int fd, const char *socket_name, const void *packet, s
         union {
                 struct sockaddr sa;
                 struct sockaddr_un un;
-        } sa;
+        } sa = {
+                .un.sun_family = AF_UNIX,
+        };
 
         assert(fd >= 0);
         assert(socket_name);
         assert(packet);
 
-        zero(sa);
-        sa.un.sun_family = AF_UNIX;
         strncpy(sa.un.sun_path, socket_name, sizeof(sa.un.sun_path));
 
         if (sendto(fd, packet, size, MSG_NOSIGNAL, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(socket_name)) < 0) {
diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c
index 277efd3..4557155 100644
--- a/src/shared/ask-password-api.c
+++ b/src/shared/ask-password-api.c
@@ -109,7 +109,6 @@ int ask_password_tty(
         }
 
         zero(pollfd);
-
         pollfd[POLL_TTY].fd = ttyfd >= 0 ? ttyfd : STDIN_FILENO;
         pollfd[POLL_TTY].events = POLLIN;
         pollfd[POLL_INOTIFY].fd = notify;
@@ -248,7 +247,9 @@ static int create_socket(char **name) {
         union {
                 struct sockaddr sa;
                 struct sockaddr_un un;
-        } sa;
+        } sa = {
+                .un.sun_family = AF_UNIX,
+        };
         int one = 1, r;
         char *c;
 
@@ -260,8 +261,6 @@ static int create_socket(char **name) {
                 return -errno;
         }
 
-        zero(sa);
-        sa.un.sun_family = AF_UNIX;
         snprintf(sa.un.sun_path, sizeof(sa.un.sun_path)-1, "/run/systemd/ask-password/sck.%llu", random_ull());
 
         RUN_WITH_UMASK(0177) {
diff --git a/src/shared/dbus-loop.c b/src/shared/dbus-loop.c
index fec8998..b42ae14 100644
--- a/src/shared/dbus-loop.c
+++ b/src/shared/dbus-loop.c
@@ -45,7 +45,7 @@ typedef struct EpollData {
 
 static dbus_bool_t add_watch(DBusWatch *watch, void *data) {
         EpollData _cleanup_free_ *e = NULL;
-        struct epoll_event ev;
+        struct epoll_event ev = { .data.ptr = e };
 
         assert(watch);
 
@@ -57,9 +57,7 @@ static dbus_bool_t add_watch(DBusWatch *watch, void *data) {
         e->object = watch;
         e->is_timeout = false;
 
-        zero(ev);
         ev.events = bus_flags_to_events(watch);
-        ev.data.ptr = e;
 
         if (epoll_ctl(PTR_TO_INT(data), EPOLL_CTL_ADD, e->fd, &ev) < 0) {
 
@@ -106,7 +104,7 @@ static void remove_watch(DBusWatch *watch, void *data) {
 
 static void toggle_watch(DBusWatch *watch, void *data) {
         EpollData *e;
-        struct epoll_event ev;
+        struct epoll_event ev = {};
 
         assert(watch);
 
@@ -114,21 +112,18 @@ static void toggle_watch(DBusWatch *watch, void *data) {
         if (!e)
                 return;
 
-        zero(ev);
-        ev.events = bus_flags_to_events(watch);
         ev.data.ptr = e;
+        ev.events = bus_flags_to_events(watch);
 
         assert_se(epoll_ctl(PTR_TO_INT(data), EPOLL_CTL_MOD, e->fd, &ev) == 0);
 }
 
 static int timeout_arm(EpollData *e) {
-        struct itimerspec its;
+        struct itimerspec its = {};
 
         assert(e);
         assert(e->is_timeout);
 
-        zero(its);
-
         if (dbus_timeout_get_enabled(e->object)) {
                 timespec_store(&its.it_value, dbus_timeout_get_interval(e->object) * USEC_PER_MSEC);
                 its.it_interval = its.it_value;
@@ -142,7 +137,7 @@ static int timeout_arm(EpollData *e) {
 
 static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data) {
         EpollData *e;
-        struct epoll_event ev;
+        struct epoll_event ev = {};
 
         assert(timeout);
 
@@ -160,7 +155,6 @@ static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data) {
         if (timeout_arm(e) < 0)
                 goto fail;
 
-        zero(ev);
         ev.events = EPOLLIN;
         ev.data.ptr = e;
 
@@ -227,13 +221,11 @@ int bus_loop_open(DBusConnection *c) {
 
 int bus_loop_dispatch(int fd) {
         int n;
-        struct epoll_event event;
+        struct epoll_event event = {};
         EpollData *d;
 
         assert(fd >= 0);
 
-        zero(event);
-
         n = epoll_wait(fd, &event, 1, 0);
         if (n < 0)
                 return errno == EAGAIN || errno == EINTR ? 0 : -errno;
diff --git a/src/shared/install.c b/src/shared/install.c
index 2555a36..9e87039 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -700,7 +700,7 @@ int unit_file_link(
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
-        LookupPaths _cleanup_lookup_paths_free_ paths = {NULL};
+        LookupPaths _cleanup_lookup_paths_free_ paths = {};
         char **i;
         char _cleanup_free_ *config_path = NULL;
         int r, q;
@@ -1116,7 +1116,7 @@ static int unit_file_can_install(
                 const char *name,
                 bool allow_symlink) {
 
-        InstallContext _cleanup_install_context_done_ c = {NULL};
+        InstallContext _cleanup_install_context_done_ c = {};
         InstallInfo *i;
         int r;
 
@@ -1452,8 +1452,8 @@ int unit_file_enable(
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
-        LookupPaths _cleanup_lookup_paths_free_ paths = {NULL};
-        InstallContext _cleanup_install_context_done_ c = {NULL};
+        LookupPaths _cleanup_lookup_paths_free_ paths = {};
+        InstallContext _cleanup_install_context_done_ c = {};
         char **i;
         char _cleanup_free_ *config_path = NULL;
         int r;
@@ -1491,8 +1491,8 @@ int unit_file_disable(
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
-        LookupPaths _cleanup_lookup_paths_free_ paths = {NULL};
-        InstallContext _cleanup_install_context_done_ c = {NULL};
+        LookupPaths _cleanup_lookup_paths_free_ paths = {};
+        InstallContext _cleanup_install_context_done_ c = {};
         char **i;
         char _cleanup_free_ *config_path = NULL;
         Set _cleanup_set_free_free_ *remove_symlinks_to = NULL;
@@ -1533,8 +1533,8 @@ int unit_file_reenable(
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
-        LookupPaths _cleanup_lookup_paths_free_ paths = {NULL};
-        InstallContext _cleanup_install_context_done_ c = {NULL};
+        LookupPaths _cleanup_lookup_paths_free_ paths = {};
+        InstallContext _cleanup_install_context_done_ c = {};
         char **i;
         char _cleanup_free_ *config_path = NULL;
         Set _cleanup_set_free_free_ *remove_symlinks_to = NULL;
@@ -1576,7 +1576,7 @@ UnitFileState unit_file_get_state(
                 const char *root_dir,
                 const char *name) {
 
-        LookupPaths _cleanup_lookup_paths_free_ paths = {NULL};
+        LookupPaths _cleanup_lookup_paths_free_ paths = {};
         UnitFileState state = _UNIT_FILE_STATE_INVALID;
         char **i;
         char _cleanup_free_ *path = NULL;
@@ -1734,8 +1734,8 @@ int unit_file_preset(
                 UnitFileChange **changes,
                 unsigned *n_changes) {
 
-        LookupPaths _cleanup_lookup_paths_free_ paths = {NULL};
-        InstallContext _cleanup_install_context_done_ plus = {NULL}, minus = {NULL};
+        LookupPaths _cleanup_lookup_paths_free_ paths = {};
+        InstallContext _cleanup_install_context_done_ plus = {}, minus = {NULL};
         char **i;
         char _cleanup_free_ *config_path = NULL;
         Set _cleanup_set_free_free_ *remove_symlinks_to = NULL;
@@ -1800,7 +1800,7 @@ int unit_file_get_list(
                 const char *root_dir,
                 Hashmap *h) {
 
-        LookupPaths _cleanup_lookup_paths_free_ paths = {NULL};
+        LookupPaths _cleanup_lookup_paths_free_ paths = {};
         char **i;
         char _cleanup_free_ *buf = NULL;
         DIR _cleanup_closedir_ *d = NULL;
diff --git a/src/shared/log.c b/src/shared/log.c
index 0dd04bc..876f22d 100644
--- a/src/shared/log.c
+++ b/src/shared/log.c
@@ -129,16 +129,15 @@ static int create_log_socket(int type) {
 }
 
 static int log_open_syslog(void) {
-        union sockaddr_union sa;
         int r;
+        union sockaddr_union sa = {
+                .un.sun_family = AF_UNIX,
+                .un.sun_path = "/dev/log",
+        };
 
         if (syslog_fd >= 0)
                 return 0;
 
-        zero(sa);
-        sa.un.sun_family = AF_UNIX;
-        strncpy(sa.un.sun_path, "/dev/log", sizeof(sa.un.sun_path));
-
         syslog_fd = create_log_socket(SOCK_DGRAM);
         if (syslog_fd < 0) {
                 r = syslog_fd;
@@ -183,7 +182,10 @@ void log_close_journal(void) {
 }
 
 static int log_open_journal(void) {
-        union sockaddr_union sa;
+        union sockaddr_union sa = {
+                .un.sun_family = AF_UNIX,
+                .un.sun_path = "/run/systemd/journal/socket",
+        };
         int r;
 
         if (journal_fd >= 0)
@@ -195,10 +197,6 @@ static int log_open_journal(void) {
                 goto fail;
         }
 
-        zero(sa);
-        sa.un.sun_family = AF_UNIX;
-        strncpy(sa.un.sun_path, "/run/systemd/journal/socket", sizeof(sa.un.sun_path));
-
         if (connect(journal_fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path)) < 0) {
                 r = -errno;
                 goto fail;
@@ -313,7 +311,7 @@ static int write_to_console(
                 const char *buffer) {
 
         char location[64];
-        struct iovec iovec[5];
+        struct iovec iovec[5] = {};
         unsigned n = 0;
         bool highlight;
 
@@ -322,8 +320,6 @@ static int write_to_console(
 
         highlight = LOG_PRI(level) <= LOG_ERR && show_color;
 
-        zero(iovec);
-
         if (show_location) {
                 snprintf(location, sizeof(location), "(%s:%u) ", file, line);
                 char_array_0(location);
@@ -353,8 +349,11 @@ static int write_to_syslog(
         const char *buffer) {
 
         char header_priority[16], header_time[64], header_pid[16];
-        struct iovec iovec[5];
-        struct msghdr msghdr;
+        struct iovec iovec[5] = {};
+        struct msghdr msghdr = {
+                .msg_iov = iovec,
+                .msg_iovlen = ELEMENTSOF(iovec),
+        };
         time_t t;
         struct tm *tm;
 
@@ -375,7 +374,6 @@ static int write_to_syslog(
         snprintf(header_pid, sizeof(header_pid), "[%lu]: ", (unsigned long) getpid());
         char_array_0(header_pid);
 
-        zero(iovec);
         IOVEC_SET_STRING(iovec[0], header_priority);
         IOVEC_SET_STRING(iovec[1], header_time);
         IOVEC_SET_STRING(iovec[2], program_invocation_short_name);
@@ -386,10 +384,6 @@ static int write_to_syslog(
         if (syslog_is_stream)
                 iovec[4].iov_len++;
 
-        zero(msghdr);
-        msghdr.msg_iov = iovec;
-        msghdr.msg_iovlen = ELEMENTSOF(iovec);
-
         for (;;) {
                 ssize_t n;
 
@@ -417,7 +411,7 @@ static int write_to_kmsg(
         const char *buffer) {
 
         char header_priority[16], header_pid[16];
-        struct iovec iovec[5];
+        struct iovec iovec[5] = {};
 
         if (kmsg_fd < 0)
                 return 0;
@@ -428,7 +422,6 @@ static int write_to_kmsg(
         snprintf(header_pid, sizeof(header_pid), "[%lu]: ", (unsigned long) getpid());
         char_array_0(header_pid);
 
-        zero(iovec);
         IOVEC_SET_STRING(iovec[0], header_priority);
         IOVEC_SET_STRING(iovec[1], program_invocation_short_name);
         IOVEC_SET_STRING(iovec[2], header_pid);
@@ -482,8 +475,8 @@ static int write_to_journal(
         const char *buffer) {
 
         char header[LINE_MAX];
-        struct iovec iovec[4] = {{0}};
-        struct msghdr mh = {0};
+        struct iovec iovec[4] = {};
+        struct msghdr mh = {};
 
         if (journal_fd < 0)
                 return 0;
@@ -742,7 +735,7 @@ int log_struct_internal(
             journal_fd >= 0) {
 
                 char header[LINE_MAX];
-                struct iovec iovec[17] = {{0}};
+                struct iovec iovec[17] = {};
                 unsigned n = 0, i;
                 struct msghdr mh;
                 static const char nl = '\n';
diff --git a/src/shared/util.c b/src/shared/util.c
index 1bffd84..2f66597 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -889,15 +889,14 @@ int reset_all_signal_handlers(void) {
         int sig;
 
         for (sig = 1; sig < _NSIG; sig++) {
-                struct sigaction sa;
+                struct sigaction sa = {
+                        .sa_handler = SIG_DFL,
+                        .sa_flags = SA_RESTART,
+                };
 
                 if (sig == SIGKILL || sig == SIGSTOP)
                         continue;
 
-                zero(sa);
-                sa.sa_handler = SIG_DFL;
-                sa.sa_flags = SA_RESTART;
-
                 /* On Linux the first two RT signals are reserved by
                  * glibc, and sigaction() will return EINVAL for them. */
                 if ((sigaction(sig, &sa, NULL) < 0))
@@ -1858,11 +1857,10 @@ int open_terminal(const char *name, int mode) {
 }
 
 int flush_fd(int fd) {
-        struct pollfd pollfd;
-
-        zero(pollfd);
-        pollfd.fd = fd;
-        pollfd.events = POLLIN;
+        struct pollfd pollfd = {
+                .fd = fd,
+                .events = POLLIN,
+        };
 
         for (;;) {
                 char buf[LINE_MAX];
@@ -1903,7 +1901,6 @@ int acquire_terminal(
 
         int fd = -1, notify = -1, r = 0, wd = -1;
         usec_t ts = 0;
-        struct sigaction sa_old, sa_new;
 
         assert(name);
 
@@ -1938,6 +1935,11 @@ int acquire_terminal(
         }
 
         for (;;) {
+                struct sigaction sa_old, sa_new = {
+                        .sa_handler = SIG_IGN,
+                        .sa_flags = SA_RESTART,
+                };
+
                 if (notify >= 0) {
                         r = flush_fd(notify);
                         if (r < 0)
@@ -1953,9 +1955,6 @@ int acquire_terminal(
 
                 /* Temporarily ignore SIGHUP, so that we don't get SIGHUP'ed
                  * if we already own the tty. */
-                zero(sa_new);
-                sa_new.sa_handler = SIG_IGN;
-                sa_new.sa_flags = SA_RESTART;
                 assert_se(sigaction(SIGHUP, &sa_new, &sa_old) == 0);
 
                 /* First, try to get the tty */
@@ -2063,7 +2062,10 @@ fail:
 
 int release_terminal(void) {
         int r = 0;
-        struct sigaction sa_old, sa_new;
+        struct sigaction sa_old, sa_new = {
+                .sa_handler = SIG_IGN,
+                .sa_flags = SA_RESTART,
+        };
         int _cleanup_close_ fd;
 
         fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_NDELAY|O_CLOEXEC);
@@ -2072,10 +2074,6 @@ int release_terminal(void) {
 
         /* Temporarily ignore SIGHUP, so that we don't get SIGHUP'ed
          * by our own TIOCNOTTY */
-
-        zero(sa_new);
-        sa_new.sa_handler = SIG_IGN;
-        sa_new.sa_flags = SA_RESTART;
         assert_se(sigaction(SIGHUP, &sa_new, &sa_old) == 0);
 
         if (ioctl(fd, TIOCNOTTY) < 0)
@@ -2100,13 +2098,13 @@ int sigaction_many(const struct sigaction *sa, ...) {
 }
 
 int ignore_signals(int sig, ...) {
-        struct sigaction sa;
+        struct sigaction sa = {
+                .sa_handler = SIG_IGN,
+                .sa_flags = SA_RESTART,
+        };
         va_list ap;
         int r = 0;
 
-        zero(sa);
-        sa.sa_handler = SIG_IGN;
-        sa.sa_flags = SA_RESTART;
 
         if (sigaction(sig, &sa, NULL) < 0)
                 r = -errno;
@@ -2121,14 +2119,13 @@ int ignore_signals(int sig, ...) {
 }
 
 int default_signals(int sig, ...) {
-        struct sigaction sa;
+        struct sigaction sa = {
+                .sa_handler = SIG_DFL,
+                .sa_flags = SA_RESTART,
+        };
         va_list ap;
         int r = 0;
 
-        zero(sa);
-        sa.sa_handler = SIG_DFL;
-        sa.sa_flags = SA_RESTART;
-
         if (sigaction(sig, &sa, NULL) < 0)
                 r = -errno;
 
@@ -2177,11 +2174,10 @@ ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll) {
                                 continue;
 
                         if (k < 0 && errno == EAGAIN && do_poll) {
-                                struct pollfd pollfd;
-
-                                zero(pollfd);
-                                pollfd.fd = fd;
-                                pollfd.events = POLLIN;
+                                struct pollfd pollfd = {
+                                        .fd = fd,
+                                        .events = POLLIN,
+                                };
 
                                 if (poll(&pollfd, 1, -1) < 0) {
                                         if (errno == EINTR)
@@ -2226,11 +2222,10 @@ ssize_t loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
                                 continue;
 
                         if (k < 0 && errno == EAGAIN && do_poll) {
-                                struct pollfd pollfd;
-
-                                zero(pollfd);
-                                pollfd.fd = fd;
-                                pollfd.events = POLLOUT;
+                                struct pollfd pollfd = {
+                                        .fd = fd,
+                                        .events = POLLOUT,
+                                };
 
                                 if (poll(&pollfd, 1, -1) < 0) {
                                         if (errno == EINTR)
@@ -2933,7 +2928,7 @@ int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char
         static const char status_indent[] = "         "; /* "[" STATUS "] " */
         _cleanup_free_ char *s = NULL;
         _cleanup_close_ int fd = -1;
-        struct iovec iovec[6];
+        struct iovec iovec[6] = {};
         int n = 0;
         static bool prev_ephemeral;
 
@@ -2971,8 +2966,6 @@ int status_vprintf(const char *status, bool ellipse, bool ephemeral, const char
                 }
         }
 
-        zero(iovec);
-
         if (prev_ephemeral)
                 IOVEC_SET_STRING(iovec[n++], "\r" ANSI_ERASE_TO_END_OF_LINE);
         prev_ephemeral = ephemeral;
@@ -3162,8 +3155,7 @@ char **replace_env_argv(char **argv, char **env) {
 }
 
 int fd_columns(int fd) {
-        struct winsize ws;
-        zero(ws);
+        struct winsize ws = {};
 
         if (ioctl(fd, TIOCGWINSZ, &ws) < 0)
                 return -errno;
@@ -3197,8 +3189,7 @@ unsigned columns(void) {
 }
 
 int fd_lines(int fd) {
-        struct winsize ws;
-        zero(ws);
+        struct winsize ws = {};
 
         if (ioctl(fd, TIOCGWINSZ, &ws) < 0)
                 return -errno;
@@ -3247,13 +3238,9 @@ bool on_tty(void) {
 }
 
 int running_in_chroot(void) {
-        struct stat a, b;
-
-        zero(a);
-        zero(b);
+        struct stat a = {}, b = {};
 
         /* Only works as root */
-
         if (stat("/proc/1/root", &a) < 0)
                 return -errno;
 
@@ -3731,10 +3718,9 @@ void execute_directory(const char *directory, DIR *d, char *argv[]) {
 
         while (!hashmap_isempty(pids)) {
                 pid_t pid = PTR_TO_UINT(hashmap_first_key(pids));
-                siginfo_t si;
+                siginfo_t si = {};
                 char *path;
 
-                zero(si);
                 if (waitid(P_PID, pid, &si, WEXITED) < 0) {
 
                         if (errno == EINTR)
@@ -3861,12 +3847,11 @@ char* hostname_cleanup(char *s) {
 }
 
 int pipe_eof(int fd) {
-        struct pollfd pollfd;
         int r;
-
-        zero(pollfd);
-        pollfd.fd = fd;
-        pollfd.events = POLLIN|POLLHUP;
+        struct pollfd pollfd = {
+                .fd = fd,
+                .events = POLLIN|POLLHUP,
+        };
 
         r = poll(&pollfd, 1, 0);
         if (r < 0)
@@ -3879,12 +3864,11 @@ int pipe_eof(int fd) {
 }
 
 int fd_wait_for_event(int fd, int event, usec_t t) {
-        struct pollfd pollfd;
         int r;
-
-        zero(pollfd);
-        pollfd.fd = fd;
-        pollfd.events = event;
+        struct pollfd pollfd = {
+                .fd = fd,
+                .events = event,
+        };
 
         r = poll(&pollfd, 1, t == (usec_t) -1 ? -1 : (int) (t / USEC_PER_MSEC));
         if (r < 0)
@@ -4343,7 +4327,6 @@ int glob_exists(const char *path) {
 
         assert(path);
 
-        zero(g);
         errno = 0;
         k = glob(path, GLOB_NOSORT|GLOB_BRACE, NULL, &g);
 
diff --git a/src/shared/utmp-wtmp.c b/src/shared/utmp-wtmp.c
index 3494b56..5ee3d22 100644
--- a/src/shared/utmp-wtmp.c
+++ b/src/shared/utmp-wtmp.c
@@ -33,7 +33,7 @@
 #include "utmp-wtmp.h"
 
 int utmp_get_runlevel(int *runlevel, int *previous) {
-        struct utmpx lookup, *found;
+        struct utmpx *found, lookup = { .ut_type = RUN_LVL };
         int r;
         const char *e;
 
@@ -66,9 +66,6 @@ int utmp_get_runlevel(int *runlevel, int *previous) {
 
         setutxent();
 
-        zero(lookup);
-        lookup.ut_type = RUN_LVL;
-
         if (!(found = getutxid(&lookup)))
                 r = -errno;
         else {
@@ -102,14 +99,12 @@ static void init_timestamp(struct utmpx *store, usec_t t) {
 }
 
 static void init_entry(struct utmpx *store, usec_t t) {
-        struct utsname uts;
+        struct utsname uts = {};
 
         assert(store);
 
         init_timestamp(store, t);
 
-        zero(uts);
-
         if (uname(&uts) >= 0)
                 strncpy(store->ut_host, uts.release, sizeof(store->ut_host));
 
@@ -311,7 +306,10 @@ static int write_to_terminal(const char *tty, const char *message) {
 
         while (left > 0) {
                 ssize_t n;
-                struct pollfd pollfd;
+                struct pollfd pollfd = {
+                        .fd = fd,
+                        .events = POLLOUT,
+                };
                 usec_t t;
                 int k;
 
@@ -320,10 +318,6 @@ static int write_to_terminal(const char *tty, const char *message) {
                 if (t >= end)
                         return -ETIME;
 
-                zero(pollfd);
-                pollfd.fd = fd;
-                pollfd.events = POLLOUT;
-
                 k = poll(&pollfd, 1, (end - t) / USEC_PER_MSEC);
                 if (k < 0)
                         return -errno;
diff --git a/src/shared/virt.c b/src/shared/virt.c
index 78016ee..fddb45d 100644
--- a/src/shared/virt.c
+++ b/src/shared/virt.c
@@ -62,7 +62,7 @@ int detect_vm(const char **id) {
         union {
                 uint32_t sig32[3];
                 char text[13];
-        } sig;
+        } sig = {};
         unsigned i;
         const char *j, *k;
         bool hypervisor;
@@ -84,7 +84,6 @@ int detect_vm(const char **id) {
                 return r;
 
         /* http://lwn.net/Articles/301888/ */
-        zero(sig);
 
 #if defined (__i386__)
 #define REG_a "eax"
diff --git a/src/shutdownd/shutdownd.c b/src/shutdownd/shutdownd.c
index ee2a328..4c9c149 100644
--- a/src/shutdownd/shutdownd.c
+++ b/src/shutdownd/shutdownd.c
@@ -46,30 +46,29 @@ union shutdown_buffer {
 };
 
 static int read_packet(int fd, union shutdown_buffer *_b) {
-        struct msghdr msghdr;
-        struct iovec iovec;
         struct ucred *ucred;
+        ssize_t n;
+
+        union shutdown_buffer b; /* We maintain our own copy here, in
+                                  * order not to corrupt the last message */
+        struct iovec iovec = {
+                iovec.iov_base = &b,
+                iovec.iov_len = sizeof(b) - 1,
+        };
         union {
                 struct cmsghdr cmsghdr;
                 uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
-        } control;
-        ssize_t n;
-        union shutdown_buffer b; /* We maintain our own copy here, in order not to corrupt the last message */
+        } control = {};
+        struct msghdr msghdr = {
+                .msg_iov = &iovec,
+                msghdr.msg_iovlen = 1,
+                msghdr.msg_control = &control,
+                msghdr.msg_controllen = sizeof(control),
+        };
 
         assert(fd >= 0);
         assert(_b);
 
-        zero(iovec);
-        iovec.iov_base = &b;
-        iovec.iov_len = sizeof(b) - 1;
-
-        zero(control);
-        zero(msghdr);
-        msghdr.msg_iov = &iovec;
-        msghdr.msg_iovlen = 1;
-        msghdr.msg_control = &control;
-        msghdr.msg_controllen = sizeof(control);
-
         n = recvmsg(fd, &msghdr, MSG_DONTWAIT);
         if (n <= 0) {
                 if (n == 0) {
@@ -270,8 +269,8 @@ int main(int argc, char *argv[]) {
         };
 
         int r = EXIT_FAILURE, n_fds;
-        union shutdown_buffer b;
-        struct pollfd pollfd[_FD_MAX];
+        union shutdown_buffer b = {};
+        struct pollfd pollfd[_FD_MAX] = {};
         bool exec_shutdown = false, unlink_nologin = false;
         unsigned i;
 
@@ -302,9 +301,6 @@ int main(int argc, char *argv[]) {
                 return EXIT_FAILURE;
         }
 
-        zero(b);
-        zero(pollfd);
-
         pollfd[FD_SOCKET].fd = SD_LISTEN_FDS_START;
         pollfd[FD_SOCKET].events = POLLIN;
 
@@ -402,13 +398,12 @@ int main(int argc, char *argv[]) {
                 }
 
                 if (pollfd[FD_WALL_TIMER].revents) {
-                        struct itimerspec its;
+                        struct itimerspec its = {};
 
                         warn_wall(n, &b.command);
                         flush_fd(pollfd[FD_WALL_TIMER].fd);
 
                         /* Restart timer */
-                        zero(its);
                         timespec_store(&its.it_value, when_wall(n, b.command.usec));
                         if (timerfd_settime(pollfd[FD_WALL_TIMER].fd, TFD_TIMER_ABSTIME, &its, NULL) < 0) {
                                 log_error("timerfd_settime(): %m");
diff --git a/src/stdio-bridge/stdio-bridge.c b/src/stdio-bridge/stdio-bridge.c
index 8667bbf..a5bdb03 100644
--- a/src/stdio-bridge/stdio-bridge.c
+++ b/src/stdio-bridge/stdio-bridge.c
@@ -124,7 +124,6 @@ int main(int argc, char *argv[]) {
 
         for (;;) {
                 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
-                struct pollfd p[3];
                 int events_a, events_b, fd;
                 uint64_t timeout_a, timeout_b, t;
                 struct timespec _ts, *ts;
@@ -211,15 +210,14 @@ int main(int argc, char *argv[]) {
                         ts = timespec_store(&_ts, t);
                 }
 
-                zero(p);
-                p[0].fd = fd;
-                p[0].events = events_a;
-                p[1].fd = STDIN_FILENO;
-                p[1].events = events_b & POLLIN;
-                p[2].fd = STDOUT_FILENO;
-                p[2].events = events_b & POLLOUT;
+                {
+                        struct pollfd p[3] = {
+                                {.fd = fd,            .events = events_a, },
+                                {.fd = STDIN_FILENO,  .events = events_b & POLLIN, },
+                                {.fd = STDOUT_FILENO, .events = events_b & POLLOUT, }};
 
-                r = ppoll(p, ELEMENTSOF(p), ts, NULL);
+                        r = ppoll(p, ELEMENTSOF(p), ts, NULL);
+                }
                 if (r < 0) {
                         log_error("ppoll() failed: %m");
                         goto finish;
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index e445b50..fd9f580 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -1193,14 +1193,11 @@ static int enable_wait_for_jobs(DBusConnection *bus) {
 
 static int wait_for_jobs(DBusConnection *bus, Set *s) {
         int r = 0;
-        WaitData d;
+        WaitData d = { .set = s };
 
         assert(bus);
         assert(s);
 
-        zero(d);
-        d.set = s;
-
         if (!dbus_connection_add_filter(bus, wait_filter, &d, NULL))
                 return log_oom();
 
@@ -3021,9 +3018,8 @@ static int print_property(const char *name, DBusMessageIter *iter) {
 
                         dbus_message_iter_recurse(iter, &sub);
                         while (dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_STRUCT) {
-                                ExecStatusInfo info;
+                                ExecStatusInfo info = {};
 
-                                zero(info);
                                 if (exec_status_info_deserialize(&sub, &info) >= 0) {
                                         char timestamp1[FORMAT_TIMESTAMP_MAX], timestamp2[FORMAT_TIMESTAMP_MAX];
                                         char _cleanup_free_ *t;
@@ -3070,14 +3066,12 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo
         const char *interface = "";
         int r;
         DBusMessageIter iter, sub, sub2, sub3;
-        UnitStatusInfo info;
+        UnitStatusInfo info = {};
         ExecStatusInfo *p;
 
         assert(path);
         assert(new_line);
 
-        zero(info);
-
         r = bus_method_call_with_reply(
                         bus,
                         "org.freedesktop.systemd1",
@@ -3654,7 +3648,7 @@ static int enable_sysv_units(char **args) {
 #if defined(HAVE_SYSV_COMPAT) && defined(HAVE_CHKCONFIG)
         const char *verb = args[0];
         unsigned f = 1, t = 1;
-        LookupPaths paths;
+        LookupPaths paths = {};
 
         if (arg_scope != UNIT_FILE_SYSTEM)
                 return 0;
@@ -3667,7 +3661,6 @@ static int enable_sysv_units(char **args) {
         /* Processes all SysV units, and reshuffles the array so that
          * afterwards only the native units remain */
 
-        zero(paths);
         r = lookup_paths_init(&paths, SYSTEMD_SYSTEM, false, NULL, NULL, NULL);
         if (r < 0)
                 return r;
@@ -4716,7 +4709,7 @@ static int parse_time_spec(const char *t, usec_t *_u) {
         } else {
                 char *e = NULL;
                 long hour, minute;
-                struct tm tm;
+                struct tm tm = {};
                 time_t s;
                 usec_t n;
 
@@ -4732,7 +4725,6 @@ static int parse_time_spec(const char *t, usec_t *_u) {
                 n = now(CLOCK_REALTIME);
                 s = (time_t) (n / USEC_PER_SEC);
 
-                zero(tm);
                 assert_se(localtime_r(&s, &tm));
 
                 tm.tm_hour = (int) hour;
@@ -5134,7 +5126,7 @@ finish:
 }
 
 static int talk_initctl(void) {
-        struct init_request request = {0};
+        struct init_request request = {};
         int r;
         int _cleanup_close_ fd = -1;
         char rl;
@@ -5339,41 +5331,38 @@ static int systemctl_main(DBusConnection *bus, int argc, char *argv[], DBusError
 
 static int send_shutdownd(usec_t t, char mode, bool dry_run, bool warn, const char *message) {
         int _cleanup_close_ fd;
-        struct msghdr msghdr;
-        struct iovec iovec[2];
-        union sockaddr_union sockaddr;
-        struct sd_shutdown_command c;
+        struct sd_shutdown_command c = {
+                .usec = t,
+                .mode = mode,
+                .dry_run = dry_run,
+                .warn_wall = warn,
+        };
+        union sockaddr_union sockaddr = {
+                .un.sun_family = AF_UNIX,
+                .un.sun_path = "/run/systemd/shutdownd",
+        };
+        struct iovec iovec[2] = {
+                {.iov_base = (char*) &c,
+                 .iov_len = offsetof(struct sd_shutdown_command, wall_message),
+                }
+        };
+        struct msghdr msghdr = {
+                .msg_name = &sockaddr,
+                .msg_namelen = offsetof(struct sockaddr_un, sun_path)
+                               + sizeof("/run/systemd/shutdownd") - 1,
+                .msg_iov = iovec,
+                .msg_iovlen = 1,
+        };
 
         fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);
         if (fd < 0)
                 return -errno;
 
-        zero(c);
-        c.usec = t;
-        c.mode = mode;
-        c.dry_run = dry_run;
-        c.warn_wall = warn;
-
-        zero(sockaddr);
-        sockaddr.sa.sa_family = AF_UNIX;
-        strncpy(sockaddr.un.sun_path, "/run/systemd/shutdownd", sizeof(sockaddr.un.sun_path));
-
-        zero(msghdr);
-        msghdr.msg_name = &sockaddr;
-        msghdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) + sizeof("/run/systemd/shutdownd") - 1;
-
-        zero(iovec);
-        iovec[0].iov_base = (char*) &c;
-        iovec[0].iov_len = offsetof(struct sd_shutdown_command, wall_message);
-
-        if (isempty(message))
-                msghdr.msg_iovlen = 1;
-        else {
+        if (!isempty(message)) {
                 iovec[1].iov_base = (char*) message;
                 iovec[1].iov_len = strlen(message);
-                msghdr.msg_iovlen = 2;
+                msghdr.msg_iovlen++;
         }
-        msghdr.msg_iov = iovec;
 
         if (sendmsg(fd, &msghdr, MSG_NOSIGNAL) < 0)
                 return -errno;
diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c
index bcd935a..8d4e560 100644
--- a/src/timedate/timedatectl.c
+++ b/src/timedate/timedatectl.c
@@ -72,9 +72,8 @@ typedef struct StatusInfo {
 } StatusInfo;
 
 static bool ntp_synced(void) {
-        struct timex txc;
+        struct timex txc = {};
 
-        zero(txc);
         if (adjtimex(&txc) < 0)
                 return false;
 
@@ -242,7 +241,7 @@ static int show_status(DBusConnection *bus, char **args, unsigned n) {
         const char *interface = "";
         int r;
         DBusMessageIter iter, sub, sub2, sub3;
-        StatusInfo info;
+        StatusInfo info = {};
 
         assert(args);
 
@@ -266,7 +265,6 @@ static int show_status(DBusConnection *bus, char **args, unsigned n) {
                 return -EIO;
         }
 
-        zero(info);
         dbus_message_iter_recurse(&iter, &sub);
 
         while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) {
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
index 4e2519d..51827f0 100644
--- a/src/tmpfiles/tmpfiles.c
+++ b/src/tmpfiles/tmpfiles.c
@@ -601,11 +601,9 @@ static int recursive_relabel(Item *i, const char *path) {
 
 static int glob_item(Item *i, int (*action)(Item *, const char *)) {
         int r = 0, k;
-        glob_t g;
+        glob_t g = {};
         char **fn;
 
-        zero(g);
-
         errno = 0;
         if ((k = glob(i->path, GLOB_NOSORT|GLOB_BRACE, NULL, &g)) != 0) {
 
diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c
index 99a626c..3f5706e 100644
--- a/src/tty-ask-password-agent/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent/tty-ask-password-agent.c
@@ -60,11 +60,11 @@ static int ask_password_plymouth(
                 char ***_passphrases) {
 
         int fd = -1, notify = -1;
-        union sockaddr_union sa;
+        union sockaddr_union sa = {};
         char *packet = NULL;
         ssize_t k;
         int r, n;
-        struct pollfd pollfd[2];
+        struct pollfd pollfd[2] = {};
         char buffer[LINE_MAX];
         size_t p = 0;
         enum {
@@ -91,7 +91,6 @@ static int ask_password_plymouth(
                 goto finish;
         }
 
-        zero(sa);
         sa.sa.sa_family = AF_UNIX;
         strncpy(sa.un.sun_path+1, "/org/freedesktop/plymouthd", sizeof(sa.un.sun_path)-1);
         if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) {
@@ -116,7 +115,6 @@ static int ask_password_plymouth(
                 goto finish;
         }
 
-        zero(pollfd);
         pollfd[POLL_SOCKET].fd = fd;
         pollfd[POLL_SOCKET].events = POLLIN;
         pollfd[POLL_INOTIFY].fd = notify;
@@ -325,7 +323,7 @@ static int parse_password(const char *filename, char **wall) {
                 union {
                         struct sockaddr sa;
                         struct sockaddr_un un;
-                } sa;
+                } sa = {};
                 size_t packet_length = 0;
 
                 assert(arg_action == ACTION_QUERY ||
@@ -410,7 +408,6 @@ static int parse_password(const char *filename, char **wall) {
                         goto finish;
                 }
 
-                zero(sa);
                 sa.un.sun_family = AF_UNIX;
                 strncpy(sa.un.sun_path, socket_name, sizeof(sa.un.sun_path));
 
@@ -563,7 +560,7 @@ static int watch_passwords(void) {
         };
 
         int notify = -1, signal_fd = -1, tty_block_fd = -1;
-        struct pollfd pollfd[_FD_MAX];
+        struct pollfd pollfd[_FD_MAX] = {};
         sigset_t mask;
         int r;
 
@@ -591,7 +588,6 @@ static int watch_passwords(void) {
                 goto finish;
         }
 
-        zero(pollfd);
         pollfd[FD_INOTIFY].fd = notify;
         pollfd[FD_INOTIFY].events = POLLIN;
         pollfd[FD_SIGNAL].fd = signal_fd;
diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
index fdbec5a..5719021 100644
--- a/src/udev/udev-builtin-net_id.c
+++ b/src/udev/udev-builtin-net_id.c
@@ -396,7 +396,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
         unsigned int i;
         const char *devtype;
         const char *prefix = "en";
-        struct netnames names;
+        struct netnames names = {};
         int err;
 
         /* handle only ARPHRD_ETHER devices */
@@ -425,7 +425,6 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
                         prefix = "ww";
         }
 
-        zero(names);
         err = names_mac(dev, &names);
         if (err >= 0 && names.mac_valid) {
                 char str[IFNAMSIZ];
diff --git a/src/update-utmp/update-utmp.c b/src/update-utmp/update-utmp.c
index a311280..9184025 100644
--- a/src/update-utmp/update-utmp.c
+++ b/src/update-utmp/update-utmp.c
@@ -313,11 +313,10 @@ static int on_runlevel(Context *c) {
 int main(int argc, char *argv[]) {
         int r;
         DBusError error;
-        Context c;
+        Context c = {};
 
         dbus_error_init(&error);
 
-        zero(c);
 #ifdef HAVE_AUDIT
         c.audit_fd = -1;
 #endif
diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c
index efeae90..ee1f3eb 100644
--- a/src/vconsole/vconsole-setup.c
+++ b/src/vconsole/vconsole-setup.c
@@ -179,20 +179,18 @@ static int font_load(const char *vc, const char *font, const char *map, const ch
  * to apply a new font to all VTs.
  */
 static void font_copy_to_all_vcs(int fd) {
-        struct vt_stat vcs;
-        int i;
-        int r;
+        struct vt_stat vcs = {};
+        int i, r;
 
         /* get active, and 16 bit mask of used VT numbers */
-        zero(vcs);
         r = ioctl(fd, VT_GETSTATE, &vcs);
         if (r < 0)
                 return;
 
         for (i = 1; i <= 15; i++) {
                 char vcname[16];
-                struct console_font_op cfo;
                 int _cleanup_close_ vcfd = -1;
+                struct console_font_op cfo = {};
 
                 if (i == vcs.v_active)
                         continue;
@@ -208,7 +206,6 @@ static void font_copy_to_all_vcs(int fd) {
                         continue;
 
                 /* copy font from active VT, where the font was uploaded to */
-                zero(cfo);
                 cfo.op = KD_FONT_OP_COPY;
                 cfo.height = vcs.v_active-1; /* tty1 == index 0 */
                 ioctl(vcfd, KDFONTOP, &cfo);



More information about the systemd-commits mailing list