metadata: add new item type KDBUS_ITEM_AUXGROUPS (ABI break)
authorDaniel Mack <zonque@gmail.com>
Sat, 9 Aug 2014 12:12:51 +0000 (14:12 +0200)
committerDaniel Mack <zonque@gmail.com>
Sun, 10 Aug 2014 19:43:48 +0000 (21:43 +0200)
Add new data type to dump the auxiliary groups the sending task is a member
of.

kdbus.h
metadata.c

diff --git a/kdbus.h b/kdbus.h
index 8f98396c5335e9b00b78d6187bad50e6ce675678..97da18c322deaca4c55fa184b35962d2881aa5c0 100644 (file)
--- a/kdbus.h
+++ b/kdbus.h
@@ -223,6 +223,7 @@ struct kdbus_policy_access {
  * @KDBUS_ITEM_ID:             Connection ID
  * @KDBUS_ITEM_TIMESTAMP:      Timestamp
  * @KDBUS_ITEM_CREDS:          Process credential
+ * @KDBUS_ITEM_AUXGROUPS:      Auxiliary process groups
  * @KDBUS_ITEM_PID_COMM:       Process ID "comm" identifier
  * @KDBUS_ITEM_TID_COMM:       Thread ID "comm" identifier
  * @KDBUS_ITEM_EXE:            The path of the executable
@@ -263,6 +264,7 @@ enum kdbus_item_type {
        KDBUS_ITEM_ID,
        KDBUS_ITEM_TIMESTAMP,
        KDBUS_ITEM_CREDS,
+       KDBUS_ITEM_AUXGROUPS,
        KDBUS_ITEM_PID_COMM,
        KDBUS_ITEM_TID_COMM,
        KDBUS_ITEM_EXE,
@@ -500,6 +502,7 @@ enum kdbus_hello_flags {
  * enum kdbus_attach_flags - flags for metadata attachments
  * @KDBUS_ATTACH_TIMESTAMP:    Timestamp
  * @KDBUS_ATTACH_CREDS:                Credentials
+ * @KDBUS_ATTACH_AUXGROUPS:    Auxiliary groups
  * @KDBUS_ATTACH_NAMES:                Well-known names
  * @KDBUS_ATTACH_COMM:         The "comm" process identifier
  * @KDBUS_ATTACH_EXE:          The path of the executable
@@ -514,16 +517,17 @@ enum kdbus_hello_flags {
 enum kdbus_attach_flags {
        KDBUS_ATTACH_TIMESTAMP          =  1 <<  0,
        KDBUS_ATTACH_CREDS              =  1 <<  1,
-       KDBUS_ATTACH_NAMES              =  1 <<  2,
-       KDBUS_ATTACH_COMM               =  1 <<  3,
-       KDBUS_ATTACH_EXE                =  1 <<  4,
-       KDBUS_ATTACH_CMDLINE            =  1 <<  5,
-       KDBUS_ATTACH_CGROUP             =  1 <<  6,
-       KDBUS_ATTACH_CAPS               =  1 <<  7,
-       KDBUS_ATTACH_SECLABEL           =  1 <<  8,
-       KDBUS_ATTACH_AUDIT              =  1 <<  9,
-       KDBUS_ATTACH_CONN_NAME          =  1 << 10,
-       _KDBUS_ATTACH_ALL               =  (1 << 11) - 1,
+       KDBUS_ATTACH_AUXGROUPS          =  1 <<  2,
+       KDBUS_ATTACH_NAMES              =  1 <<  3,
+       KDBUS_ATTACH_COMM               =  1 <<  4,
+       KDBUS_ATTACH_EXE                =  1 <<  5,
+       KDBUS_ATTACH_CMDLINE            =  1 <<  6,
+       KDBUS_ATTACH_CGROUP             =  1 <<  7,
+       KDBUS_ATTACH_CAPS               =  1 <<  8,
+       KDBUS_ATTACH_SECLABEL           =  1 <<  9,
+       KDBUS_ATTACH_AUDIT              =  1 << 10,
+       KDBUS_ATTACH_CONN_NAME          =  1 << 11,
+       _KDBUS_ATTACH_ALL               =  (1 << 12) - 1,
 };
 
 /**
index 0db53922692a4c8440846f8da7b98660d84a0021..facf70bb8b4c381dbba636a0577f56c44b809e9e 100644 (file)
@@ -189,6 +189,35 @@ static int kdbus_meta_append_cred(struct kdbus_meta *meta)
                                      &creds, sizeof(creds));
 }
 
+static int kdbus_meta_append_auxgroups(struct kdbus_meta *meta)
+{
+       struct group_info *info;
+       struct kdbus_item *item;
+       u64 *gid, size;
+       int i, ret = 0;
+
+       info = get_current_groups();
+
+       size = KDBUS_ITEM_SIZE(info->ngroups * sizeof(*gid));
+       item = kdbus_meta_append_item(meta, size);
+       if (IS_ERR(item)) {
+               ret = PTR_ERR(item);
+               goto exit_put_groups;
+       }
+
+       item->size = size;
+       item->type = KDBUS_ITEM_AUXGROUPS;
+       gid = (u64 *) item->data;
+
+       for (i = 0; i < info->ngroups; i++)
+               gid[i] = from_kgid(current_user_ns(), GROUP_AT(info, i));
+
+exit_put_groups:
+       put_group_info(info);
+
+       return ret;
+}
+
 static int kdbus_meta_append_src_names(struct kdbus_meta *meta,
                                       struct kdbus_conn *conn)
 {
@@ -437,6 +466,12 @@ int kdbus_meta_append(struct kdbus_meta *meta,
                        return ret;
        }
 
+       if (mask & KDBUS_ATTACH_AUXGROUPS) {
+               ret = kdbus_meta_append_auxgroups(meta);
+               if (ret < 0)
+                       return ret;
+       }
+
        if (mask & KDBUS_ATTACH_NAMES && conn) {
                ret = kdbus_meta_append_src_names(meta, conn);
                if (ret < 0)