[systemd-commits] 3 commits - TODO src/journal src/shared src/systemd

Lennart Poettering lennart at kemper.freedesktop.org
Tue Apr 2 08:48:15 PDT 2013


 TODO                       |    2 
 src/journal/journal-send.c |   94 +++++++++++++--------------------------------
 src/shared/log.c           |   31 +++-----------
 src/shared/macro.h         |   18 +++++++-
 src/shared/util.c          |   24 ++++-------
 src/shared/util.h          |    6 ++
 src/systemd/sd-bus.h       |    3 +
 7 files changed, 72 insertions(+), 106 deletions(-)

New commits:
commit d1148ed10a474ccc949113a8ec06e7e29c4c7cb0
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Apr 2 17:33:31 2013 +0200

    update TODO

diff --git a/TODO b/TODO
index 5e8a050..2f23647 100644
--- a/TODO
+++ b/TODO
@@ -50,6 +50,8 @@ Fedora 19:
 
 Features:
 
+* add sd_journal_get_timeout() and sd_journal_get_events(9
+
 * seems that when we follow symlinks to units we prefer the symlink
   destination path over /etc and /usr. We shouldn't do that. Instead
   /etc should always override /run+/usr and also any symlink
diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h
index 057931d..122ec95 100644
--- a/src/systemd/sd-bus.h
+++ b/src/systemd/sd-bus.h
@@ -33,6 +33,9 @@ extern "C" {
 #endif
 
 /* TODO:
+ * - allow registration/removl of callbacks from within callbacks
+ * - don't allow recursive processing
+ *
  * - add page donation logic
  * - api for appending/reading fixed arrays
  * - merge busctl into systemctl or so?

commit fa70beaabc56762fdf77e675c3e09bb638d89938
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Apr 2 17:33:19 2013 +0200

    macro: add macro for precisely determining length of decimal string formatting of a numeric type

diff --git a/src/shared/macro.h b/src/shared/macro.h
index 4e5d0f4..f884bf6 100644
--- a/src/shared/macro.h
+++ b/src/shared/macro.h
@@ -67,9 +67,11 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) {
  * @member: the name of the member within the struct.
  *
  */
-#define container_of(ptr, type, member) ({ \
-        const typeof( ((type *)0)->member ) *__mptr = (ptr); \
-        (type *)( (char *)__mptr - offsetof(type,member) );})
+#define container_of(ptr, type, member)                                 \
+        __extension__ ({                                                \
+                        const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+                        (type *)( (char *)__mptr - offsetof(type,member) ); \
+                })
 
 #undef MAX
 #define MAX(a,b)                                 \
@@ -255,4 +257,14 @@ do {                                                                    \
         }                                                               \
 } while(false)
 
+/* Returns the number of chars needed to format variables of the
+ * specified type as a decimal string. Adds in extra space for a
+ * negative '-' prefix. */
+
+#define DECIMAL_STR_MAX(type)                                           \
+        (1+(sizeof(type) <= 1 ? 3 :                                     \
+            sizeof(type) <= 2 ? 5 :                                     \
+            sizeof(type) <= 4 ? 10 :                                    \
+            sizeof(type) <= 8 ? 20 : sizeof(int[-2*(sizeof(type) > 8)])))
+
 #include "log.h"
diff --git a/src/shared/util.c b/src/shared/util.c
index b69e7e8..d861ca9 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -447,14 +447,13 @@ char *split_quoted(const char *c, size_t *l, char **state) {
 int get_parent_of_pid(pid_t pid, pid_t *_ppid) {
         int r;
         _cleanup_fclose_ FILE *f = NULL;
-        char fn[PATH_MAX], line[LINE_MAX], *p;
+        char fn[sizeof("/proc/")-1 + DECIMAL_STR_MAX(pid_t) + sizeof("/stat")], line[LINE_MAX], *p;
         long unsigned ppid;
 
         assert(pid > 0);
         assert(_ppid);
 
         assert_se(snprintf(fn, sizeof(fn)-1, "/proc/%lu/stat", (unsigned long) pid) < (int) (sizeof(fn)-1));
-        char_array_0(fn);
 
         f = fopen(fn, "re");
         if (!f)
@@ -491,13 +490,12 @@ int get_parent_of_pid(pid_t pid, pid_t *_ppid) {
 
 int get_starttime_of_pid(pid_t pid, unsigned long long *st) {
         _cleanup_fclose_ FILE *f = NULL;
-        char fn[PATH_MAX], line[LINE_MAX], *p;
+        char fn[sizeof("/proc/")-1 + DECIMAL_STR_MAX(pid_t) + sizeof("/stat")], line[LINE_MAX], *p;
 
         assert(pid > 0);
         assert(st);
 
         assert_se(snprintf(fn, sizeof(fn)-1, "/proc/%lu/stat", (unsigned long) pid) < (int) (sizeof(fn)-1));
-        char_array_0(fn);
 
         f = fopen(fn, "re");
         if (!f)
@@ -2611,7 +2609,7 @@ int get_ctty_devnr(pid_t pid, dev_t *d) {
 
 int get_ctty(pid_t pid, dev_t *_devnr, char **r) {
         int k;
-        char fn[PATH_MAX], *s, *b, *p;
+        char fn[sizeof("/dev/char/")-1 + 2*DECIMAL_STR_MAX(unsigned) + 1 + 1], *s, *b, *p;
         dev_t devnr;
 
         assert(r);
@@ -2621,7 +2619,6 @@ int get_ctty(pid_t pid, dev_t *_devnr, char **r) {
                 return k;
 
         snprintf(fn, sizeof(fn), "/dev/char/%u:%u", major(devnr), minor(devnr));
-        char_array_0(fn);
 
         k = readlink_malloc(fn, &s);
         if (k < 0) {
@@ -4762,7 +4759,7 @@ static const char *const __signal_table[] = {
 DEFINE_PRIVATE_STRING_TABLE_LOOKUP(__signal, int);
 
 const char *signal_to_string(int signo) {
-        static __thread char buf[12];
+        static __thread char buf[sizeof("RTMIN+")-1 + DECIMAL_STR_MAX(int) + 1];
         const char *name;
 
         name = __signal_to_string(signo);
@@ -4770,10 +4767,10 @@ const char *signal_to_string(int signo) {
                 return name;
 
         if (signo >= SIGRTMIN && signo <= SIGRTMAX)
-                snprintf(buf, sizeof(buf) - 1, "RTMIN+%d", signo - SIGRTMIN);
+                snprintf(buf, sizeof(buf), "RTMIN+%d", signo - SIGRTMIN);
         else
-                snprintf(buf, sizeof(buf) - 1, "%d", signo);
-        char_array_0(buf);
+                snprintf(buf, sizeof(buf), "%d", signo);
+
         return buf;
 }
 
@@ -5041,7 +5038,7 @@ int setrlimit_closest(int resource, const struct rlimit *rlim) {
 }
 
 int getenv_for_pid(pid_t pid, const char *field, char **_value) {
-        char path[sizeof("/proc/")-1+10+sizeof("/environ")], *value = NULL;
+        char path[sizeof("/proc/")-1 + DECIMAL_STR_MAX(pid_t) + sizeof("/environ")], *value = NULL;
         int r;
         FILE *f;
         bool done = false;
@@ -5054,7 +5051,6 @@ int getenv_for_pid(pid_t pid, const char *field, char **_value) {
                 pid = getpid();
 
         snprintf(path, sizeof(path), "/proc/%lu/environ", (unsigned long) pid);
-        char_array_0(path);
 
         f = fopen(path, "re");
         if (!f)

commit 5c0aa72a4999bdcf03fe93ed5c8213c2b4c681f0
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Apr 2 16:31:55 2013 +0200

    util: add a bit of syntactic sugar for saving/restoring errno

diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c
index d5ec73e..4b9109a 100644
--- a/src/journal/journal-send.c
+++ b/src/journal/journal-send.c
@@ -112,12 +112,11 @@ _public_ int sd_journal_printv(int priority, const char *format, va_list ap) {
 }
 
 static int fill_iovec_sprintf(const char *format, va_list ap, int extra, struct iovec **_iov) {
+        PROTECT_ERRNO;
         int r, n = 0, i = 0, j;
         struct iovec *iov = NULL;
-        int saved_errno;
 
         assert(_iov);
-        saved_errno = errno;
 
         if (extra > 0) {
                 n = MAX(extra * 2, extra + 4);
@@ -163,7 +162,6 @@ static int fill_iovec_sprintf(const char *format, va_list ap, int extra, struct
 
         *_iov = iov;
 
-        errno = saved_errno;
         return i;
 
 fail:
@@ -172,7 +170,6 @@ fail:
 
         free(iov);
 
-        errno = saved_errno;
         return r;
 }
 
@@ -202,14 +199,14 @@ finish:
 }
 
 _public_ int sd_journal_sendv(const struct iovec *iov, int n) {
+        PROTECT_ERRNO;
         int fd, buffer_fd;
         struct iovec *w;
         uint64_t *l;
-        int r, i, j = 0;
+        int i, j = 0;
         struct msghdr mh;
         struct sockaddr_un sa;
         ssize_t k;
-        int saved_errno;
         union {
                 struct cmsghdr cmsghdr;
                 uint8_t buf[CMSG_SPACE(sizeof(int))];
@@ -227,24 +224,18 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int n) {
         if (_unlikely_(n <= 0))
                 return -EINVAL;
 
-        saved_errno = errno;
-
         w = alloca(sizeof(struct iovec) * n * 5 + 3);
         l = alloca(sizeof(uint64_t) * n);
 
         for (i = 0; i < n; i++) {
                 char *c, *nl;
 
-                if (_unlikely_(!iov[i].iov_base || iov[i].iov_len <= 1)) {
-                        r = -EINVAL;
-                        goto finish;
-                }
+                if (_unlikely_(!iov[i].iov_base || iov[i].iov_len <= 1))
+                        return -EINVAL;
 
                 c = memchr(iov[i].iov_base, '=', iov[i].iov_len);
-                if (_unlikely_(!c || c == iov[i].iov_base)) {
-                        r = -EINVAL;
-                        goto finish;
-                }
+                if (_unlikely_(!c || c == iov[i].iov_base))
+                        return -EINVAL;
 
                 have_syslog_identifier = have_syslog_identifier ||
                         (c == (char *) iov[i].iov_base + 17 &&
@@ -252,10 +243,8 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int n) {
 
                 nl = memchr(iov[i].iov_base, '\n', iov[i].iov_len);
                 if (nl) {
-                        if (_unlikely_(nl < c)) {
-                                r = -EINVAL;
-                                goto finish;
-                        }
+                        if (_unlikely_(nl < c))
+                                return -EINVAL;
 
                         /* Already includes a newline? Bummer, then
                          * let's write the variable name, then a
@@ -300,10 +289,8 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int n) {
         }
 
         fd = journal_fd();
-        if (_unlikely_(fd < 0)) {
-                r = fd;
-                goto finish;
-        }
+        if (_unlikely_(fd < 0))
+                return fd;
 
         zero(sa);
         sa.sun_family = AF_UNIX;
@@ -316,37 +303,29 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int n) {
         mh.msg_iovlen = j;
 
         k = sendmsg(fd, &mh, MSG_NOSIGNAL);
-        if (k >= 0) {
-                r = 0;
-                goto finish;
-        }
+        if (k >= 0)
+                return 0;
 
-        if (errno != EMSGSIZE && errno != ENOBUFS) {
-                r = -errno;
-                goto finish;
-        }
+        if (errno != EMSGSIZE && errno != ENOBUFS)
+                return -errno;
 
         /* Message doesn't fit... Let's dump the data in a temporary
          * file and just pass a file descriptor of it to the other
          * side */
 
         buffer_fd = mkostemp(path, O_CLOEXEC|O_RDWR);
-        if (buffer_fd < 0) {
-                r = -errno;
-                goto finish;
-        }
+        if (buffer_fd < 0)
+                return -errno;
 
         if (unlink(path) < 0) {
                 close_nointr_nofail(buffer_fd);
-                r = -errno;
-                goto finish;
+                return -errno;
         }
 
         n = writev(buffer_fd, w, j);
         if (n < 0) {
                 close_nointr_nofail(buffer_fd);
-                r = -errno;
-                goto finish;
+                return -errno;
         }
 
         mh.msg_iov = NULL;
@@ -367,24 +346,15 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int n) {
         k = sendmsg(fd, &mh, MSG_NOSIGNAL);
         close_nointr_nofail(buffer_fd);
 
-        if (k < 0) {
-                r = -errno;
-                goto finish;
-        }
-
-        r = 0;
-
-finish:
-        errno = saved_errno;
+        if (k < 0)
+                return -errno;
 
-        return r;
+        return 0;
 }
 
 static int fill_iovec_perror_and_send(const char *message, int skip, struct iovec iov[]) {
-        size_t n, k, r;
-        int saved_errno;
-
-        saved_errno = errno;
+        PROTECT_ERRNO;
+        size_t n, k;
 
         k = isempty(message) ? 0 : strlen(message) + 2;
         n = 8 + k + 256 + 1;
@@ -394,7 +364,7 @@ static int fill_iovec_perror_and_send(const char *message, int skip, struct iove
                 char* j;
 
                 errno = 0;
-                j = strerror_r(saved_errno, buffer + 8 + k, n - 8 - k);
+                j = strerror_r(_saved_errno_, buffer + 8 + k, n - 8 - k);
                 if (errno == 0) {
                         char error[6 + 10 + 1]; /* for a 32bit value */
 
@@ -408,24 +378,18 @@ static int fill_iovec_perror_and_send(const char *message, int skip, struct iove
                                 memcpy(buffer + 8 + k - 2, ": ", 2);
                         }
 
-                        snprintf(error, sizeof(error), "ERRNO=%u", saved_errno);
+                        snprintf(error, sizeof(error), "ERRNO=%u", _saved_errno_);
                         char_array_0(error);
 
                         IOVEC_SET_STRING(iov[skip+0], "PRIORITY=3");
                         IOVEC_SET_STRING(iov[skip+1], buffer);
                         IOVEC_SET_STRING(iov[skip+2], error);
 
-                        r = sd_journal_sendv(iov, skip + 3);
-
-                        errno = saved_errno;
-                        return r;
+                        return sd_journal_sendv(iov, skip + 3);
                 }
 
-                if (errno != ERANGE) {
-                        r = -errno;
-                        errno = saved_errno;
-                        return r;
-                }
+                if (errno != ERANGE)
+                        return -errno;
 
                 n *= 2;
         }
diff --git a/src/shared/log.c b/src/shared/log.c
index 293c261..0dd04bc 100644
--- a/src/shared/log.c
+++ b/src/shared/log.c
@@ -598,18 +598,14 @@ int log_dump_internal(
         const char *func,
         char *buffer) {
 
-        int saved_errno, r;
+        PROTECT_ERRNO;
 
         /* This modifies the buffer... */
 
         if (_likely_(LOG_PRI(level) > log_max_level))
                 return 0;
 
-        saved_errno = errno;
-        r = log_dispatch(level, file, line, func, NULL, NULL, buffer);
-        errno = saved_errno;
-
-        return r;
+        return log_dispatch(level, file, line, func, NULL, NULL, buffer);
 }
 
 int log_metav(
@@ -620,20 +616,16 @@ int log_metav(
         const char *format,
         va_list ap) {
 
+        PROTECT_ERRNO;
         char buffer[LINE_MAX];
-        int saved_errno, r;
 
         if (_likely_(LOG_PRI(level) > log_max_level))
                 return 0;
 
-        saved_errno = errno;
         vsnprintf(buffer, sizeof(buffer), format, ap);
         char_array_0(buffer);
 
-        r = log_dispatch(level, file, line, func, NULL, NULL, buffer);
-        errno = saved_errno;
-
-        return r;
+        return log_dispatch(level, file, line, func, NULL, NULL, buffer);
 }
 
 int log_meta(
@@ -663,21 +655,17 @@ int log_metav_object(
         const char *format,
         va_list ap) {
 
+        PROTECT_ERRNO;
         char buffer[LINE_MAX];
-        int saved_errno, r;
 
         if (_likely_(LOG_PRI(level) > log_max_level))
                 return 0;
 
-        saved_errno = errno;
         vsnprintf(buffer, sizeof(buffer), format, ap);
         char_array_0(buffer);
 
-        r = log_dispatch(level, file, line, func,
-                         object_name, object, buffer);
-        errno = saved_errno;
-
-        return r;
+        return log_dispatch(level, file, line, func,
+                            object_name, object, buffer);
 }
 
 int log_meta_object(
@@ -735,7 +723,7 @@ int log_struct_internal(
                 const char *func,
                 const char *format, ...) {
 
-        int saved_errno;
+        PROTECT_ERRNO;
         va_list ap;
         int r;
 
@@ -748,8 +736,6 @@ int log_struct_internal(
         if ((level & LOG_FACMASK) == 0)
                 level = log_facility | LOG_PRI(level);
 
-        saved_errno = errno;
-
         if ((log_target == LOG_TARGET_AUTO ||
              log_target == LOG_TARGET_JOURNAL_OR_KMSG ||
              log_target == LOG_TARGET_JOURNAL) &&
@@ -843,7 +829,6 @@ int log_struct_internal(
                         r = -EINVAL;
         }
 
-        errno = saved_errno;
         return r;
 }
 
diff --git a/src/shared/util.c b/src/shared/util.c
index 46c20be..b69e7e8 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -207,14 +207,12 @@ int close_nointr(int fd) {
 }
 
 void close_nointr_nofail(int fd) {
-        int saved_errno = errno;
+        PROTECT_ERRNO;
 
         /* like close_nointr() but cannot fail, and guarantees errno
          * is unchanged */
 
         assert_se(close_nointr(fd) == 0);
-
-        errno = saved_errno;
 }
 
 void close_many(const int fds[], unsigned n_fd) {
diff --git a/src/shared/util.h b/src/shared/util.h
index d1cdd90..7f05075 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -615,3 +615,9 @@ char *strextend(char **x, ...);
 char *strrep(const char *s, unsigned n);
 
 void* greedy_realloc(void **p, size_t *allocated, size_t need);
+
+static inline void reset_errno(int *saved_errno) {
+        errno = *saved_errno;
+}
+
+#define PROTECT_ERRNO __attribute__((cleanup(reset_errno))) int _saved_errno_ = errno



More information about the systemd-commits mailing list