From: Daniel Wagner <daniel.wag...@bmw-carit.de> --- include/dbus.h | 9 +++++++ src/dbus.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+)
diff --git a/include/dbus.h b/include/dbus.h index 07b44ab..cb4d34c 100644 --- a/include/dbus.h +++ b/include/dbus.h @@ -171,6 +171,15 @@ static inline void connman_dbus_dict_append_fixed_array(DBusMessageIter *dict, dbus_bool_t connman_dbus_validate_ident(const char *ident); char *connman_dbus_encode_string(const char *value); +typedef void (* connman_dbus_get_connection_unix_user_cb_t) (int error, + unsigned int uid, + void *user_data); + +int connman_dbus_get_connection_unix_user(DBusConnection *connection, + const char *bus_name, + connman_dbus_get_connection_unix_user_cb_t cb, + void *user_data); + typedef void (* connman_dbus_get_context_cb_t) (int error, const unsigned char *context, void *user_data); diff --git a/src/dbus.c b/src/dbus.c index 7c69b87..63d189e 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -406,6 +406,90 @@ dbus_bool_t __connman_dbus_append_objpath_dict_array(DBusMessage *msg, return TRUE; } +static void get_connection_unix_user_reply(DBusPendingCall *call, void *user_data) +{ + struct cb_data *cbd = user_data; + connman_dbus_get_connection_unix_user_cb_t cb = cbd->cb; + DBusMessageIter iter; + DBusMessage *reply; + unsigned char *context = NULL; + int err = 0; + unsigned int uid; + + reply = dbus_pending_call_steal_reply(call); + + if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) { + DBG("Failed to retrieve SELinux context"); + err = -EIO; + goto done; + } + + if (dbus_message_has_signature(reply, "u") == FALSE) { + DBG("Message signature is wrong"); + err = -EINVAL; + goto done; + } + + dbus_message_iter_init(reply, &iter); + dbus_message_iter_get_basic(&iter, &uid); + +done: + (*cb)(err, uid, cbd->user_data); + + dbus_message_unref(reply); + + dbus_pending_call_unref(call); +} + +int connman_dbus_get_connection_unix_user(DBusConnection *connection, + const char *bus_name, + connman_dbus_get_connection_unix_user_cb_t cb, + void *user_data) +{ + struct cb_data *cbd = cb_data_new(cb, user_data); + DBusPendingCall *call; + DBusMessage *msg = NULL; + int err; + + msg = dbus_message_new_method_call(DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS, + "GetConnectionUnixUser"); + if (msg == NULL) { + DBG("Can't allocate new message"); + err = -ENOMEM; + goto err; + } + + dbus_message_append_args(msg, DBUS_TYPE_STRING, &bus_name, + DBUS_TYPE_INVALID); + + if (dbus_connection_send_with_reply(connection, msg, + &call, -1) == FALSE) { + DBG("Failed to execute method call"); + err = -EINVAL; + goto err; + } + + if (call == NULL) { + DBG("D-Bus connection not available"); + err = -EINVAL; + goto err; + } + + dbus_pending_call_set_notify(call, get_connection_unix_user_reply, + cbd, g_free); + + dbus_message_unref(msg); + + return 0; + +err: + dbus_message_unref(msg); + g_free(cbd); + + return err; +} + static unsigned char *parse_context(DBusMessage *msg) { DBusMessageIter iter, array; -- 1.8.1.3.566.gaa39828 _______________________________________________ connman mailing list connman@connman.net http://lists.connman.net/listinfo/connman