From 4b880c8b5a20c00f0c5fa054c971963702ea70f9 Mon Sep 17 00:00:00 2001 From: David Henningsson Date: Sun, 17 Jan 2010 19:38:11 +0100 Subject: Add dbus properties for returning rttime-nsec-max, max-realtime-priority and min-nice-level --- rtkit-daemon.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/rtkit-daemon.c b/rtkit-daemon.c index e2eba15..a638ac1 100644 --- a/rtkit-daemon.c +++ b/rtkit-daemon.c @@ -79,6 +79,16 @@ " \n" \ " \n" \ " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n"\ + " " \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -1248,6 +1258,37 @@ static int verify_canary_refusal(void) { return 0; } +static void add_variant( + DBusMessage *m, + int type, + const void *data) { + + DBusMessageIter iter, sub; + char t[2]; + + t[0] = (char) type; + t[1] = 0; + + dbus_message_iter_init_append(m, &iter); + + assert_se(dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, t, &sub)); + assert_se(dbus_message_iter_append_basic(&sub, type, data)); + assert_se(dbus_message_iter_close_container(&iter, &sub)); +} + +static int handle_dbus_prop_get(const char* property, DBusMessage *r) { + if (strcmp(property, "RTTimeNSecMax") == 0) + add_variant(r, DBUS_TYPE_INT64, &rttime_nsec_max); + else if (strcmp(property, "MaxRealtimePriority") == 0) + add_variant(r, DBUS_TYPE_INT32, &max_realtime_priority); + else if (strcmp(property, "MinNiceLevel") == 0) + add_variant(r, DBUS_TYPE_INT32, &min_nice_level); + else + return -1; + + return 0; +} + static DBusHandlerResult dbus_handler(DBusConnection *c, DBusMessage *m, void *userdata) { DBusError error; DBusMessage *r = NULL; @@ -1258,7 +1299,6 @@ static DBusHandlerResult dbus_handler(DBusConnection *c, DBusMessage *m, void *u user_gc(); if (dbus_message_is_method_call(m, "org.freedesktop.RealtimeKit1", "MakeThreadRealtime")) { - uint64_t thread; uint32_t priority; struct rtkit_user *u; @@ -1362,6 +1402,33 @@ static DBusHandlerResult dbus_handler(DBusConnection *c, DBusMessage *m, void *u dbus_connection_close(c); + } else if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Properties", "Get")) { + const char *interface, *property; + + if (!dbus_message_get_args(m, &error, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_STRING, &property, + DBUS_TYPE_INVALID)) { + + syslog(LOG_DEBUG, "Failed to parse property get call: %s\n", error.message); + assert_se(r = dbus_message_new_error(m, error.name, error.message)); + goto finish; + } + + if (strcmp(interface, "org.freedesktop.RealtimeKit1") == 0) { + assert_se(r = dbus_message_new_method_return(m)); + + if (!handle_dbus_prop_get(property, r) < 0) { + dbus_message_unref(r); + assert_se(r = dbus_message_new_error_printf( + m, + DBUS_ERROR_UNKNOWN_METHOD, + "Unknown property %s", + property)); + } + } else + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } else if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Introspectable", "Introspect")) { const char *xml = INTROSPECT_XML; -- cgit