X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fkdbus.h;h=2ebf405d7dfabcd4c5e3d07e84b8d898697f0506;hb=5ebe2ce782a5f4614b3381ba093cbebded3d3ce6;hp=c97994974b7882246c9d04fe689870f3d1fc8175;hpb=581fe6c8176c6ea4ad998566df0746bf7b56456f;p=elogind.git diff --git a/src/libsystemd/sd-bus/kdbus.h b/src/libsystemd/sd-bus/kdbus.h index c97994974..2ebf405d7 100644 --- a/src/libsystemd/sd-bus/kdbus.h +++ b/src/libsystemd/sd-bus/kdbus.h @@ -1,18 +1,8 @@ /* - * Copyright (C) 2013-2014 Kay Sievers - * Copyright (C) 2013-2014 Greg Kroah-Hartman - * Copyright (C) 2013-2014 Linux Foundation - * Copyright (C) 2013-2014 Lennart Poettering - * Copyright (C) 2013-2014 Daniel Mack - * Copyright (C) 2013-2014 David Herrmann - * * kdbus is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the * Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. - * - * "Everything should be made as simple as possible, but not simpler." - * -- Albert Einstein */ #ifndef _KDBUS_UAPI_H_ @@ -26,6 +16,7 @@ #define KDBUS_DST_ID_NAME (0) #define KDBUS_MATCH_ID_ANY (~0ULL) #define KDBUS_DST_ID_BROADCAST (~0ULL) +#define KDBUS_FLAG_KERNEL (1ULL << 63) /** * struct kdbus_notify_id_change - name registry change message @@ -88,6 +79,21 @@ struct kdbus_creds { __u64 starttime; }; +/** + * struct kdbus_caps - process capabilities + * @last_cap: Highest currently known capability bit + * @caps: Variable number of 32-bit capabilities flags + * + * Contains a variable number of 32-bit capabilities flags. + * + * Attached to: + * KDBUS_ITEM_CAPS + */ +struct kdbus_caps { + __u32 last_cap; + __u32 caps[0]; +}; + /** * struct kdbus_audit - audit information * @sessionid: The audit session ID @@ -321,6 +327,7 @@ struct kdbus_item { struct kdbus_vec vec; struct kdbus_creds creds; struct kdbus_audit audit; + struct kdbus_caps caps; struct kdbus_timestamp timestamp; struct kdbus_name name; struct kdbus_bloom_parameter bloom_parameter; @@ -372,7 +379,8 @@ enum kdbus_payload_type { /** * struct kdbus_msg - the representation of a kdbus message * @size: Total size of the message - * @flags: Message flags (KDBUS_MSG_FLAGS_*) + * @flags: Message flags (KDBUS_MSG_FLAGS_*), userspace → kernel + * @kernel_flags: Supported message flags, kernel → userspace * @priority: Message queue priority value * @dst_id: 64-bit ID of the destination connection * @src_id: 64-bit ID of the source connection @@ -382,7 +390,8 @@ enum kdbus_payload_type { * @timeout_ns: The time to wait for a message reply from the peer. * If there is no reply, a kernel-generated message * with an attached KDBUS_ITEM_REPLY_TIMEOUT item - * is sent to @src_id. + * is sent to @src_id. The timeout is expected in + * nanoseconds and as absolute CLOCK_MONOTONIC value. * @cookie_reply: A reply to the requesting message with the same * cookie. The requesting connection can match its * request and the reply with this value @@ -394,6 +403,7 @@ enum kdbus_payload_type { struct kdbus_msg { __u64 size; __u64 flags; + __u64 kernel_flags; __s64 priority; __u64 dst_id; __u64 src_id; @@ -428,7 +438,8 @@ enum kdbus_recv_flags { /** * struct kdbus_cmd_recv - struct to de-queue a buffered message - * @flags: KDBUS_RECV_* flags + * @flags: KDBUS_RECV_* flags, userspace → kernel + * @kernel_flags: Supported KDBUS_RECV_* flags, kernel → userspace * @priority: Minimum priority of the messages to de-queue. Lowest * values have the highest priority. * @offset: Returned offset in the pool where the message is @@ -439,10 +450,38 @@ enum kdbus_recv_flags { */ struct kdbus_cmd_recv { __u64 flags; + __u64 kernel_flags; __s64 priority; __u64 offset; } __attribute__((aligned(8))); +/** + * struct kdbus_cmd_cancel - struct to cancel a synchronously pending message + * @cookie The cookie of the pending message + * @flags Flags for the free command. Currently unused. + * + * This struct is used with the KDBUS_CMD_CANCEL ioctl. + */ +struct kdbus_cmd_cancel { + __u64 cookie; + __u64 flags; +} __attribute__((aligned(8))); + +/** + * struct kdbus_cmd_free - struct to free a slice of memory in the pool + * @offset: The offset of the memory slice, as returned by other + * ioctls + * @flags: Flags for the free command, userspace → kernel + * @kernel_flags: Supported flags of the free command, userspace → kernel + * + * This struct is used with the KDBUS_CMD_FREE ioctl. + */ +struct kdbus_cmd_free { + __u64 offset; + __u64 flags; + __u64 kernel_flags; +} __attribute__((aligned(8))); + /** * enum kdbus_policy_access_type - permissions of a policy record * @_KDBUS_POLICY_ACCESS_NULL: Uninitialized/invalid @@ -500,7 +539,8 @@ enum kdbus_hello_flags { * @KDBUS_ATTACH_CREDS: Credentials * @KDBUS_ATTACH_AUXGROUPS: Auxiliary groups * @KDBUS_ATTACH_NAMES: Well-known names - * @KDBUS_ATTACH_COMM: The "comm" process identifier + * @KDBUS_ATTACH_COMM_TID: The "comm" process identifier of the TID + * @KDBUS_ATTACH_COMM_PID: The "comm" process identifier of the PID * @KDBUS_ATTACH_EXE: The path of the executable * @KDBUS_ATTACH_CMDLINE: The process command line * @KDBUS_ATTACH_CGROUP: The croup membership @@ -515,21 +555,23 @@ enum kdbus_attach_flags { KDBUS_ATTACH_CREDS = 1ULL << 1, KDBUS_ATTACH_AUXGROUPS = 1ULL << 2, KDBUS_ATTACH_NAMES = 1ULL << 3, - KDBUS_ATTACH_COMM = 1ULL << 4, - KDBUS_ATTACH_EXE = 1ULL << 5, - KDBUS_ATTACH_CMDLINE = 1ULL << 6, - KDBUS_ATTACH_CGROUP = 1ULL << 7, - KDBUS_ATTACH_CAPS = 1ULL << 8, - KDBUS_ATTACH_SECLABEL = 1ULL << 9, - KDBUS_ATTACH_AUDIT = 1ULL << 10, - KDBUS_ATTACH_CONN_NAME = 1ULL << 11, - _KDBUS_ATTACH_ALL = (1ULL << 12) - 1, + KDBUS_ATTACH_TID_COMM = 1ULL << 4, + KDBUS_ATTACH_PID_COMM = 1ULL << 5, + KDBUS_ATTACH_EXE = 1ULL << 6, + KDBUS_ATTACH_CMDLINE = 1ULL << 7, + KDBUS_ATTACH_CGROUP = 1ULL << 8, + KDBUS_ATTACH_CAPS = 1ULL << 9, + KDBUS_ATTACH_SECLABEL = 1ULL << 10, + KDBUS_ATTACH_AUDIT = 1ULL << 11, + KDBUS_ATTACH_CONN_NAME = 1ULL << 12, + _KDBUS_ATTACH_ALL = (1ULL << 13) - 1, }; /** * struct kdbus_cmd_hello - struct to say hello to kdbus * @size: The total size of the structure - * @conn_flags: Connection flags (KDBUS_HELLO_*). + * @flags: Connection flags (KDBUS_HELLO_*), userspace → kernel + * @kernel_flags: Supported connection flags, kernel → userspace * @attach_flags: Mask of metadata to attach to each message sent * (KDBUS_ATTACH_*) * @bus_flags: The flags field copied verbatim from the original @@ -548,7 +590,8 @@ enum kdbus_attach_flags { */ struct kdbus_cmd_hello { __u64 size; - __u64 conn_flags; + __u64 flags; + __u64 kernel_flags; __u64 attach_flags; __u64 bus_flags; __u64 id; @@ -571,15 +614,18 @@ enum kdbus_make_flags { /** * struct kdbus_cmd_make - struct to make a bus, an endpoint or a domain * @size: The total size of the struct - * @flags: Properties for the bus/ep/domain to create + * @flags: Properties for the bus/ep/domain to create, + * userspace → kernel + * @kernel_flags: Supported flags for the used command, kernel → userspace * @items: Items describing details * - * This structure is used with the KDBUS_CMD_BUS_MAKE, KDBUS_CMD_EP_MAKE and - * KDBUS_CMD_DOMAIN_MAKE ioctls. + * This structure is used with the KDBUS_CMD_BUS_MAKE, KDBUS_CMD_ENDPOINT_MAKE + * and KDBUS_CMD_DOMAIN_MAKE ioctls. */ struct kdbus_cmd_make { __u64 size; __u64 flags; + __u64 kernel_flags; struct kdbus_item items[0]; } __attribute__((aligned(8))); @@ -602,9 +648,9 @@ enum kdbus_name_flags { /** * struct kdbus_cmd_name - struct to describe a well-known name * @size: The total size of the struct - * @flags: Flags for a name entry (KDBUS_NAME_*) - * @owner_id: The current owner of the name - * @conn_flags: The flags of the owning connection (KDBUS_HELLO_*) + * @flags: Flags for a name entry (KDBUS_NAME_*), + * userspace → kernel, kernel → userspace + * @kernel_flags: Supported flags for a name entry, kernel → userspace * @items: Item list, containing the well-known name as * KDBUS_ITEM_NAME * @@ -613,8 +659,26 @@ enum kdbus_name_flags { struct kdbus_cmd_name { __u64 size; __u64 flags; - __u64 owner_id; + __u64 kernel_flags; + struct kdbus_item items[0]; +} __attribute__((aligned(8))); + +/** + * struct kdbus_name_info - struct to describe a well-known name + * @size: The total size of the struct + * @flags: Flags for a name entry (KDBUS_NAME_*), + * @conn_flags: The flags of the owning connection (KDBUS_HELLO_*) + * @owner_id: The current owner of the name + * @items: Item list, containing the well-known name as + * KDBUS_ITEM_NAME + * + * This structure is used as return struct for the KDBUS_CMD_NAME_LIST ioctl. + */ +struct kdbus_name_info { + __u64 size; + __u64 flags; __u64 conn_flags; + __u64 owner_id; struct kdbus_item items[0]; } __attribute__((aligned(8))); @@ -634,7 +698,9 @@ enum kdbus_name_list_flags { /** * struct kdbus_cmd_name_list - request a list of name entries - * @flags: Flags for the query (KDBUS_NAME_LIST_*) + * @flags: Flags for the query (KDBUS_NAME_LIST_*), + * userspace → kernel + * @kernel_flags: Supported flags for queries, kernel → userspace * @offset: The returned offset in the caller's pool buffer. * The user must use KDBUS_CMD_FREE to free the * allocated memory. @@ -643,6 +709,7 @@ enum kdbus_name_list_flags { */ struct kdbus_cmd_name_list { __u64 flags; + __u64 kernel_flags; __u64 offset; } __attribute__((aligned(8))); @@ -656,45 +723,48 @@ struct kdbus_cmd_name_list { */ struct kdbus_name_list { __u64 size; - struct kdbus_cmd_name names[0]; + struct kdbus_name_info names[0]; }; /** - * struct kdbus_cmd_conn_info - struct used for KDBUS_CMD_CONN_INFO ioctl + * struct kdbus_cmd_info - struct used for KDBUS_CMD_CONN_INFO ioctl * @size: The total size of the struct - * @flags: KDBUS_ATTACH_* flags + * @flags: KDBUS_ATTACH_* flags, userspace → kernel + * @kernel_flags: Supported KDBUS_ATTACH_* flags, kernel → userspace * @id: The 64-bit ID of the connection. If set to zero, passing * @name is required. kdbus will look up the name to * determine the ID in this case. * @offset: Returned offset in the caller's pool buffer where the - * kdbus_conn_info struct result is stored. The user must + * kdbus_info struct result is stored. The user must * use KDBUS_CMD_FREE to free the allocated memory. - * @name: The optional well-known name to look up. Only needed in - * case @id is zero. + * @items: The optional item list, containing the + * well-known name to look up as a KDBUS_ITEM_NAME. + * Only needed in case @id is zero. * * On success, the KDBUS_CMD_CONN_INFO ioctl will return 0 and @offset will * tell the user the offset in the connection pool buffer at which to find the - * result in a struct kdbus_conn_info. + * result in a struct kdbus_info. */ -struct kdbus_cmd_conn_info { +struct kdbus_cmd_info { __u64 size; __u64 flags; + __u64 kernel_flags; __u64 id; __u64 offset; struct kdbus_item items[0]; } __attribute__((aligned(8))); /** - * struct kdbus_conn_info - information returned by KDBUS_CMD_CONN_INFO + * struct kdbus_info - information returned by KDBUS_CMD_*_INFO * @size: The total size of the struct - * @id: The connection's 64-bit ID - * @flags: The connection's flags + * @id: The connection's or bus' 64-bit ID + * @flags: The connection's or bus' flags * @items: A list of struct kdbus_item * * Note that the user is responsible for freeing the allocated memory with * the KDBUS_CMD_FREE ioctl. */ -struct kdbus_conn_info { +struct kdbus_info { __u64 size; __u64 id; __u64 flags; @@ -704,28 +774,47 @@ struct kdbus_conn_info { /** * struct kdbus_cmd_update - update flags of a connection * @size: The total size of the struct + * @flags: Flags for the update command, userspace → kernel + * @kernel_flags: Supported flags for this command, kernel → userspace * @items: A list of struct kdbus_item * * This struct is used with the KDBUS_CMD_CONN_UPDATE ioctl. */ struct kdbus_cmd_update { __u64 size; + __u64 flags; + __u64 kernel_flags; struct kdbus_item items[0]; } __attribute__((aligned(8))); +/** + * enum kdbus_cmd_match_flags - flags to control the KDBUS_CMD_MATCH_ADD ioctl + * @KDBUS_MATCH_REPLACE: If entries with the supplied cookie already + * exists, remove them before installing the new + * matches. + */ +enum kdbus_cmd_match_flags { + KDBUS_MATCH_REPLACE = 1ULL << 0, +}; + /** * struct kdbus_cmd_match - struct to add or remove matches * @size: The total size of the struct * @cookie: Userspace supplied cookie. When removing, the cookie * identifies the match to remove + * @flags: Flags for match command (KDBUS_MATCH_*), + * userspace → kernel + * @kernel_flags: Supported flags of the used command, kernel → userspace * @items: A list of items for additional information * - * This structure is used with the KDBUS_CMD_ADD_MATCH and - * KDBUS_CMD_REMOVE_MATCH ioctl. + * This structure is used with the KDBUS_CMD_MATCH_ADD and + * KDBUS_CMD_MATCH_REMOVE ioctl. */ struct kdbus_cmd_match { __u64 size; __u64 cookie; + __u64 flags; + __u64 kernel_flags; struct kdbus_item items[0]; } __attribute__((aligned(8))); @@ -738,7 +827,7 @@ struct kdbus_cmd_match { * is closed. * @KDBUS_CMD_DOMAIN_MAKE: Similar to KDBUS_CMD_BUS_MAKE, but it creates a * new kdbus domain. - * @KDBUS_CMD_EP_MAKE: Creates a new named special endpoint to talk to + * @KDBUS_CMD_ENDPOINT_MAKE: Creates a new named special endpoint to talk to * the bus. Such endpoints usually carry a more * restrictive policy and grant restricted access * to specific applications. @@ -774,7 +863,9 @@ struct kdbus_cmd_match { * @KDBUS_CMD_CONN_UPDATE: Update the properties of a connection. Used to * update the metadata subscription mask and * policy. - * @KDBUS_CMD_EP_UPDATE: Update the properties of a custom enpoint. Used + * @KDBUS_CMD_BUS_CREATOR_INFO: Retrieve information of the creator of the bus + * a connection is attached to. + * @KDBUS_CMD_ENDPOINT_UPDATE: Update the properties of a custom enpoint. Used * to update the policy. * @KDBUS_CMD_MATCH_ADD: Install a match which broadcast messages should * be delivered to the connection. @@ -785,7 +876,7 @@ enum kdbus_ioctl_type { struct kdbus_cmd_make), KDBUS_CMD_DOMAIN_MAKE = _IOW(KDBUS_IOCTL_MAGIC, 0x10, struct kdbus_cmd_make), - KDBUS_CMD_EP_MAKE = _IOW(KDBUS_IOCTL_MAGIC, 0x20, + KDBUS_CMD_ENDPOINT_MAKE = _IOW(KDBUS_IOCTL_MAGIC, 0x20, struct kdbus_cmd_make), KDBUS_CMD_HELLO = _IOWR(KDBUS_IOCTL_MAGIC, 0x30, @@ -796,8 +887,10 @@ enum kdbus_ioctl_type { struct kdbus_msg), KDBUS_CMD_MSG_RECV = _IOWR(KDBUS_IOCTL_MAGIC, 0x41, struct kdbus_cmd_recv), - KDBUS_CMD_MSG_CANCEL = _IOW(KDBUS_IOCTL_MAGIC, 0x42, __u64 *), - KDBUS_CMD_FREE = _IOW(KDBUS_IOCTL_MAGIC, 0x43, __u64 *), + KDBUS_CMD_MSG_CANCEL = _IOW(KDBUS_IOCTL_MAGIC, 0x42, + struct kdbus_cmd_cancel), + KDBUS_CMD_FREE = _IOW(KDBUS_IOCTL_MAGIC, 0x43, + struct kdbus_cmd_free), KDBUS_CMD_NAME_ACQUIRE = _IOWR(KDBUS_IOCTL_MAGIC, 0x50, struct kdbus_cmd_name), @@ -807,11 +900,13 @@ enum kdbus_ioctl_type { struct kdbus_cmd_name_list), KDBUS_CMD_CONN_INFO = _IOWR(KDBUS_IOCTL_MAGIC, 0x60, - struct kdbus_cmd_conn_info), + struct kdbus_cmd_info), KDBUS_CMD_CONN_UPDATE = _IOW(KDBUS_IOCTL_MAGIC, 0x61, struct kdbus_cmd_update), + KDBUS_CMD_BUS_CREATOR_INFO = _IOWR(KDBUS_IOCTL_MAGIC, 0x62, + struct kdbus_cmd_info), - KDBUS_CMD_EP_UPDATE = _IOW(KDBUS_IOCTL_MAGIC, 0x71, + KDBUS_CMD_ENDPOINT_UPDATE = _IOW(KDBUS_IOCTL_MAGIC, 0x71, struct kdbus_cmd_update), KDBUS_CMD_MATCH_ADD = _IOW(KDBUS_IOCTL_MAGIC, 0x80,