[systemd-commits] 3 commits - TODO man/tmpfiles.d.xml src/bus-proxyd src/import src/machine src/shared src/test src/tmpfiles

Lennart Poettering lennart at kemper.freedesktop.org
Tue Mar 10 08:12:32 PDT 2015


 TODO                        |    2 -
 man/tmpfiles.d.xml          |    2 +
 src/bus-proxyd/driver.c     |   85 ++++++++++++++++++++++++++++++++++++++++++--
 src/bus-proxyd/synthesize.c |    2 -
 src/bus-proxyd/synthesize.h |    2 +
 src/import/export-tar.c     |    2 -
 src/machine/machined-dbus.c |    4 +-
 src/shared/btrfs-util.c     |   22 +++++------
 src/shared/btrfs-util.h     |    8 ++--
 src/shared/machine-image.c  |    8 ++--
 src/shared/machine-image.h  |    2 -
 src/test/test-btrfs.c       |    4 +-
 src/tmpfiles/tmpfiles.c     |   21 +++-------
 13 files changed, 119 insertions(+), 45 deletions(-)

New commits:
commit 52fa7a3af1322aa716e5afc08b60ff2e9e13c022
Author: Lukasz Skalski <l.skalski at samsung.com>
Date:   Tue Mar 10 16:09:02 2015 +0100

    bus-proxy: add support for "GetConnectionCredentials" method
    
    GetConnectionCredentials method was added to dbus-1 specification
    more than one year ago. This method should return "[...] as many
    credentials as possible for the process connected to the server",
    but at this moment only "UnixUserID", "LinuxSecurityLabel" and
    "ProcessID" are defined by the specification. We should add support
    for next credentials after extending dbus-1 spec.

diff --git a/src/bus-proxyd/driver.c b/src/bus-proxyd/driver.c
index 3c613e4..e63a95d 100644
--- a/src/bus-proxyd/driver.c
+++ b/src/bus-proxyd/driver.c
@@ -49,9 +49,6 @@ static int get_creds_by_name(sd_bus *bus, const char *name, uint64_t mask, sd_bu
         if (r < 0)
                 return r;
 
-        if ((c->mask & mask) != mask)
-                return -ENOTSUP;
-
         *_creds = c;
         c = NULL;
 
@@ -109,6 +106,10 @@ int bus_proxy_process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m, SharedPoli
                         "  <method name=\"RemoveMatch\">\n"
                         "   <arg type=\"s\" direction=\"in\"/>\n"
                         "  </method>\n"
+                        "  <method name=\"GetConnectionCredentials\">\n"
+                        "   <arg type=\"s\" direction=\"in\"/>\n"
+                        "   <arg type=\"a{sv}\" direction=\"out\"/>\n"
+                        "  </method>\n"
                         "  <method name=\"GetConnectionSELinuxSecurityContext\">\n"
                         "   <arg type=\"s\" direction=\"in\"/>\n"
                         "   <arg type=\"ay\" direction=\"out\"/>\n"
@@ -212,6 +213,72 @@ int bus_proxy_process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m, SharedPoli
 
                 return synthetic_reply_method_return(m, NULL);
 
+        } else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "GetConnectionCredentials")) {
+                _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
+                _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
+                _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
+
+                if (!sd_bus_message_has_signature(m, "s"))
+                        return synthetic_reply_method_error(m, &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INVALID_ARGS, "Invalid parameters"));
+
+                r = get_creds_by_message(a, m, SD_BUS_CREDS_PID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_SELINUX_CONTEXT, &creds, &error);
+                if (r < 0)
+                        return synthetic_reply_method_errno(m, r, &error);
+
+                r = sd_bus_message_new_method_return(m, &reply);
+                if (r < 0)
+                        return synthetic_reply_method_errno(m, r, NULL);
+
+                r = sd_bus_message_open_container(reply, 'a', "{sv}");
+                if (r < 0)
+                        return synthetic_reply_method_errno(m, r, NULL);
+
+                /* Due to i.e. namespace translations some data might be missing */
+
+                if (creds->mask & SD_BUS_CREDS_PID) {
+                        r = sd_bus_message_append(reply, "{sv}", "ProcessID", "u", (uint32_t) creds->pid);
+                        if (r < 0)
+                                return synthetic_reply_method_errno(m, r, NULL);
+                }
+
+                if (creds->mask & SD_BUS_CREDS_EUID) {
+                        r = sd_bus_message_append(reply, "{sv}", "UnixUserID", "u", (uint32_t) creds->euid);
+                        if (r < 0)
+                                return synthetic_reply_method_errno(m, r, NULL);
+                }
+
+                if (creds->mask & SD_BUS_CREDS_SELINUX_CONTEXT) {
+                        r = sd_bus_message_open_container(reply, 'e', "sv");
+                        if (r < 0)
+                                return synthetic_reply_method_errno(m, r, NULL);
+
+                        r = sd_bus_message_append(reply, "s", "LinuxSecurityLabel");
+                        if (r < 0)
+                                return synthetic_reply_method_errno(m, r, NULL);
+
+                        r = sd_bus_message_open_container(reply, 'v', "ay");
+                        if (r < 0)
+                                return synthetic_reply_method_errno(m, r, NULL);
+
+                        r = sd_bus_message_append_array(reply, 'y', creds->label, strlen(creds->label));
+                        if (r < 0)
+                                return synthetic_reply_method_errno(m, r, NULL);
+
+                        r = sd_bus_message_close_container(reply);
+                        if (r < 0)
+                                return synthetic_reply_method_errno(m, r, NULL);
+
+                        r = sd_bus_message_close_container(reply);
+                        if (r < 0)
+                                return synthetic_reply_method_errno(m, r, NULL);
+                }
+
+                r = sd_bus_message_close_container(reply);
+                if (r < 0)
+                        return synthetic_reply_method_errno(m, r, NULL);
+
+                return synthetic_driver_send(m->bus, reply);
+
         } else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "GetConnectionSELinuxSecurityContext")) {
                 _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
                 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
@@ -223,6 +290,9 @@ int bus_proxy_process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m, SharedPoli
                 if (r < 0)
                         return synthetic_reply_method_errno(m, r, &error);
 
+                if (!(creds->mask & SD_BUS_CREDS_SELINUX_CONTEXT))
+                        return synthetic_reply_method_errno(m, -ENOTSUP, NULL);
+
                 return synthetic_reply_method_return(m, "y", creds->label, strlen(creds->label));
 
         } else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "GetConnectionUnixProcessID")) {
@@ -236,6 +306,9 @@ int bus_proxy_process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m, SharedPoli
                 if (r < 0)
                         return synthetic_reply_method_errno(m, r, &error);
 
+                if (!(creds->mask & SD_BUS_CREDS_PID))
+                        return synthetic_reply_method_errno(m, -ENOTSUP, NULL);
+
                 return synthetic_reply_method_return(m, "u", (uint32_t) creds->pid);
 
         } else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "GetConnectionUnixUser")) {
@@ -249,6 +322,9 @@ int bus_proxy_process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m, SharedPoli
                 if (r < 0)
                         return synthetic_reply_method_errno(m, r, &error);
 
+                if (!(creds->mask & SD_BUS_CREDS_EUID))
+                        return synthetic_reply_method_errno(m, -ENOTSUP, NULL);
+
                 return synthetic_reply_method_return(m, "u", (uint32_t) creds->euid);
 
         } else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "GetId")) {
@@ -283,6 +359,9 @@ int bus_proxy_process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m, SharedPoli
                 if (r < 0)
                         return synthetic_reply_method_errno(m, r, &error);
 
+                if (!(creds->mask & SD_BUS_CREDS_UNIQUE_NAME))
+                        return synthetic_reply_method_errno(m, -ENOTSUP, NULL);
+
                 return synthetic_reply_method_return(m, "s", creds->unique_name);
 
         } else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "ListActivatableNames")) {
diff --git a/src/bus-proxyd/synthesize.c b/src/bus-proxyd/synthesize.c
index 542166f..67bcc7a 100644
--- a/src/bus-proxyd/synthesize.c
+++ b/src/bus-proxyd/synthesize.c
@@ -30,7 +30,7 @@
 #include "bus-util.h"
 #include "synthesize.h"
 
-static int synthetic_driver_send(sd_bus *b, sd_bus_message *m) {
+int synthetic_driver_send(sd_bus *b, sd_bus_message *m) {
         int r;
 
         assert(b);
diff --git a/src/bus-proxyd/synthesize.h b/src/bus-proxyd/synthesize.h
index a55f171..e850350 100644
--- a/src/bus-proxyd/synthesize.h
+++ b/src/bus-proxyd/synthesize.h
@@ -23,6 +23,8 @@
 
 #include "sd-bus.h"
 
+int synthetic_driver_send(sd_bus *b, sd_bus_message *m);
+
 int synthetic_reply_method_return(sd_bus_message *call, const char *types, ...);
 int synthetic_reply_method_return_strv(sd_bus_message *call, char **l);
 

commit 657cf7f4f8d376e082db48022d2be193ff647d06
Author: daurnimator <quae at daurnimator.com>
Date:   Mon Mar 9 15:11:44 2015 -0400

    tmpfiles: port to unquote_many_words()

diff --git a/TODO b/TODO
index 6c1f230..6180077 100644
--- a/TODO
+++ b/TODO
@@ -232,8 +232,6 @@ Features:
 
 * exponential backoff in timesyncd and resolved when we cannot reach a server
 
-* tmpfiles: port to unquote_many_words(), similar to sysusers
-
 * unquote_many_words() should probably be used by a lot of code that
   currently uses FOREACH_WORD and friends. For example, most conf
   parsing callbacks should use it.
diff --git a/man/tmpfiles.d.xml b/man/tmpfiles.d.xml
index 4bd0fcf..bc98d8b 100644
--- a/man/tmpfiles.d.xml
+++ b/man/tmpfiles.d.xml
@@ -118,6 +118,8 @@
     d    /run/user   0755 root root 10d -
     L    /tmp/foobar -    -    -    -   /dev/null</programlisting>
 
+    <para>Fields may be enclosed within quotes and contain C-style escapes.</para>
+
     <refsect2>
       <title>Type</title>
 
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
index 652fe5f..10c5a63 100644
--- a/src/tmpfiles/tmpfiles.c
+++ b/src/tmpfiles/tmpfiles.c
@@ -1506,23 +1506,25 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
         _cleanup_(item_free_contents) Item i = {};
         ItemArray *existing;
         Hashmap *h;
-        int r, c = -1, pos;
+        int r, pos;
         bool force = false, boot = false;
 
         assert(fname);
         assert(line >= 1);
         assert(buffer);
 
-        r = sscanf(buffer,
-                   "%ms %ms %ms %ms %ms %ms %n",
+        r = unquote_many_words(&buffer,
                    &action,
                    &path,
                    &mode,
                    &user,
                    &group,
                    &age,
-                   &c);
-        if (r < 2) {
+                   &i.argument,
+                   NULL);
+        if (r < 0)
+                return log_error_errno(r, "[%s:%u] Failed to parse line: %m", fname, line);
+        else if (r < 2) {
                 log_error("[%s:%u] Syntax error.", fname, line);
                 return -EIO;
         }
@@ -1559,15 +1561,6 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
                 return r;
         }
 
-        if (c >= 0)  {
-                c += strspn(buffer+c, WHITESPACE);
-                if (buffer[c] != 0 && (buffer[c] != '-' || buffer[c+1] != 0)) {
-                        i.argument = unquote(buffer+c, "\"");
-                        if (!i.argument)
-                                return log_oom();
-                }
-        }
-
         switch (i.type) {
 
         case CREATE_FILE:

commit cb81cd8073392936882643af0129934bf67e96c4
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Mar 10 15:55:58 2015 +0100

    shared: the btrfs quota field is called "referenced" not "referred"

diff --git a/src/import/export-tar.c b/src/import/export-tar.c
index 80de838..c27bab4 100644
--- a/src/import/export-tar.c
+++ b/src/import/export-tar.c
@@ -284,7 +284,7 @@ int tar_export_start(TarExport *e, const char *path, int fd, ImportCompressType
 
                 r = btrfs_subvol_get_quota_fd(sfd, &q);
                 if (r >= 0)
-                        e->quota_referenced = q.referred;
+                        e->quota_referenced = q.referenced;
 
                 free(e->temp_path);
                 e->temp_path = NULL;
diff --git a/src/machine/machined-dbus.c b/src/machine/machined-dbus.c
index adba812..4d74093 100644
--- a/src/machine/machined-dbus.c
+++ b/src/machine/machined-dbus.c
@@ -76,7 +76,7 @@ static int property_get_pool_usage(
                 BtrfsQuotaInfo q;
 
                 if (btrfs_subvol_get_quota_fd(fd, &q) >= 0)
-                        usage = q.referred;
+                        usage = q.referenced;
         }
 
         if (stat("/var/lib/machines.raw", &st) >= 0) {
@@ -112,7 +112,7 @@ static int property_get_pool_limit(
                 BtrfsQuotaInfo q;
 
                 if (btrfs_subvol_get_quota_fd(fd, &q) >= 0)
-                        size = q.referred_max;
+                        size = q.referenced_max;
         }
 
         if (stat("/var/lib/machines.raw", &st) >= 0) {
diff --git a/src/shared/btrfs-util.c b/src/shared/btrfs-util.c
index 23a22db..62b1eff 100644
--- a/src/shared/btrfs-util.c
+++ b/src/shared/btrfs-util.c
@@ -599,7 +599,7 @@ int btrfs_subvol_get_quota_fd(int fd, BtrfsQuotaInfo *ret) {
                         if (sh->type == BTRFS_QGROUP_INFO_KEY) {
                                 const struct btrfs_qgroup_info_item *qii = BTRFS_IOCTL_SEARCH_HEADER_BODY(sh);
 
-                                ret->referred = le64toh(qii->rfer);
+                                ret->referenced = le64toh(qii->rfer);
                                 ret->exclusive = le64toh(qii->excl);
 
                                 found_info = true;
@@ -607,11 +607,11 @@ int btrfs_subvol_get_quota_fd(int fd, BtrfsQuotaInfo *ret) {
                         } else if (sh->type == BTRFS_QGROUP_LIMIT_KEY) {
                                 const struct btrfs_qgroup_limit_item *qli = BTRFS_IOCTL_SEARCH_HEADER_BODY(sh);
 
-                                ret->referred_max = le64toh(qli->max_rfer);
+                                ret->referenced_max = le64toh(qli->max_rfer);
                                 ret->exclusive_max = le64toh(qli->max_excl);
 
-                                if (ret->referred_max == 0)
-                                        ret->referred_max = (uint64_t) -1;
+                                if (ret->referenced_max == 0)
+                                        ret->referenced_max = (uint64_t) -1;
                                 if (ret->exclusive_max == 0)
                                         ret->exclusive_max = (uint64_t) -1;
 
@@ -632,12 +632,12 @@ finish:
                 return -ENODATA;
 
         if (!found_info) {
-                ret->referred = (uint64_t) -1;
+                ret->referenced = (uint64_t) -1;
                 ret->exclusive = (uint64_t) -1;
         }
 
         if (!found_limit) {
-                ret->referred_max = (uint64_t) -1;
+                ret->referenced_max = (uint64_t) -1;
                 ret->exclusive_max = (uint64_t) -1;
         }
 
@@ -686,11 +686,11 @@ int btrfs_quota_enable(const char *path, bool b) {
         return btrfs_quota_enable_fd(fd, b);
 }
 
-int btrfs_quota_limit_fd(int fd, uint64_t referred_max) {
+int btrfs_quota_limit_fd(int fd, uint64_t referenced_max) {
         struct btrfs_ioctl_qgroup_limit_args args = {
                 .lim.max_rfer =
-                        referred_max == (uint64_t) -1 ? 0 :
-                        referred_max == 0 ? 1 : referred_max,
+                        referenced_max == (uint64_t) -1 ? 0 :
+                        referenced_max == 0 ? 1 : referenced_max,
                 .lim.flags = BTRFS_QGROUP_LIMIT_MAX_RFER,
         };
 
@@ -702,14 +702,14 @@ int btrfs_quota_limit_fd(int fd, uint64_t referred_max) {
         return 0;
 }
 
-int btrfs_quota_limit(const char *path, uint64_t referred_max) {
+int btrfs_quota_limit(const char *path, uint64_t referenced_max) {
         _cleanup_close_ int fd = -1;
 
         fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW);
         if (fd < 0)
                 return -errno;
 
-        return btrfs_quota_limit_fd(fd, referred_max);
+        return btrfs_quota_limit_fd(fd, referenced_max);
 }
 
 int btrfs_resize_loopback_fd(int fd, uint64_t new_size, bool grow_only) {
diff --git a/src/shared/btrfs-util.h b/src/shared/btrfs-util.h
index cb85b71..9685723 100644
--- a/src/shared/btrfs-util.h
+++ b/src/shared/btrfs-util.h
@@ -37,9 +37,9 @@ typedef struct BtrfsSubvolInfo {
 } BtrfsSubvolInfo;
 
 typedef struct BtrfsQuotaInfo {
-        uint64_t referred;
+        uint64_t referenced;
         uint64_t exclusive;
-        uint64_t referred_max;
+        uint64_t referenced_max;
         uint64_t exclusive_max;
 } BtrfsQuotaInfo;
 
@@ -71,8 +71,8 @@ int btrfs_defrag(const char *p);
 int btrfs_quota_enable_fd(int fd, bool b);
 int btrfs_quota_enable(const char *path, bool b);
 
-int btrfs_quota_limit_fd(int fd, uint64_t referred_max);
-int btrfs_quota_limit(const char *path, uint64_t referred_max);
+int btrfs_quota_limit_fd(int fd, uint64_t referenced_max);
+int btrfs_quota_limit(const char *path, uint64_t referenced_max);
 
 int btrfs_resize_loopback_fd(int fd, uint64_t size, bool grow_only);
 int btrfs_resize_loopback(const char *path, uint64_t size, bool grow_only);
diff --git a/src/shared/machine-image.c b/src/shared/machine-image.c
index c6d2850..552847e 100644
--- a/src/shared/machine-image.c
+++ b/src/shared/machine-image.c
@@ -163,10 +163,10 @@ static int image_make(
 
                                 r = btrfs_subvol_get_quota_fd(fd, &quota);
                                 if (r >= 0) {
-                                        (*ret)->usage = quota.referred;
+                                        (*ret)->usage = quota.referenced;
                                         (*ret)->usage_exclusive = quota.exclusive;
 
-                                        (*ret)->limit = quota.referred_max;
+                                        (*ret)->limit = quota.referenced_max;
                                         (*ret)->limit_exclusive = quota.exclusive_max;
                                 }
 
@@ -613,7 +613,7 @@ int image_path_lock(const char *path, int operation, LockFile *global, LockFile
         return 0;
 }
 
-int image_set_limit(Image *i, uint64_t referred_max) {
+int image_set_limit(Image *i, uint64_t referenced_max) {
         assert(i);
 
         if (path_equal(i->path, "/") ||
@@ -623,7 +623,7 @@ int image_set_limit(Image *i, uint64_t referred_max) {
         if (i->type != IMAGE_SUBVOLUME)
                 return -ENOTSUP;
 
-        return btrfs_quota_limit(i->path, referred_max);
+        return btrfs_quota_limit(i->path, referenced_max);
 }
 
 int image_name_lock(const char *name, int operation, LockFile *ret) {
diff --git a/src/shared/machine-image.h b/src/shared/machine-image.h
index df23949..bf41b2e 100644
--- a/src/shared/machine-image.h
+++ b/src/shared/machine-image.h
@@ -71,4 +71,4 @@ bool image_name_is_valid(const char *s) _pure_;
 int image_path_lock(const char *path, int operation, LockFile *global, LockFile *local);
 int image_name_lock(const char *name, int operation, LockFile *ret);
 
-int image_set_limit(Image *i, uint64_t referred_max);
+int image_set_limit(Image *i, uint64_t referenced_max);
diff --git a/src/test/test-btrfs.c b/src/test/test-btrfs.c
index c49b832..9e6538e 100644
--- a/src/test/test-btrfs.c
+++ b/src/test/test-btrfs.c
@@ -50,9 +50,9 @@ int main(int argc, char *argv[]) {
                 if (r < 0)
                         log_error_errno(r, "Failed to get quota info: %m");
                 else {
-                        log_info("referred: %s", strna(format_bytes(bs, sizeof(bs), quota.referred)));
+                        log_info("referenced: %s", strna(format_bytes(bs, sizeof(bs), quota.referenced)));
                         log_info("exclusive: %s", strna(format_bytes(bs, sizeof(bs), quota.exclusive)));
-                        log_info("referred_max: %s", strna(format_bytes(bs, sizeof(bs), quota.referred_max)));
+                        log_info("referenced_max: %s", strna(format_bytes(bs, sizeof(bs), quota.referenced_max)));
                         log_info("exclusive_max: %s", strna(format_bytes(bs, sizeof(bs), quota.exclusive_max)));
                 }
 



More information about the systemd-commits mailing list