diff options
author | David Henningsson <launchpad.web@epost.diwic.se> | 2010-02-07 13:59:21 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-02-17 02:51:43 +0100 |
commit | 18a26fb38ff2422cb4839d76f5314bd09231c0e9 (patch) | |
tree | 185ffc96f653a9385a55753d426b246ae6ad1c5d /rtkit.c | |
parent | d30db4ca250a2743872a525740d5177705072fda (diff) |
rtkit: Add client-side testing of properties
To complete the previous patch that implemented properties in rtkit,
here's the client-side code that tests that the properties work, and make
them more accessible for the casual C programmer.
Diffstat (limited to 'rtkit.c')
-rw-r--r-- | rtkit.c | 119 |
1 files changed, 119 insertions, 0 deletions
@@ -2,6 +2,7 @@ /*** Copyright 2009 Lennart Poettering + Copyright 2010 David Henningsson <diwic@ubuntu.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files @@ -56,6 +57,112 @@ static int translate_error(const char *name) { return -EIO; } +static long long rtkit_get_int_property(DBusConnection *connection, const char* propname, long long* propval) { + DBusMessage *m = NULL, *r = NULL; + DBusMessageIter iter, subiter; + dbus_int64_t i64; + dbus_int32_t i32; + DBusError error; + int current_type; + long long ret; + const char * interfacestr = "org.freedesktop.RealtimeKit1"; + + dbus_error_init(&error); + + if (!(m = dbus_message_new_method_call( + RTKIT_SERVICE_NAME, + RTKIT_OBJECT_PATH, + "org.freedesktop.DBus.Properties", + "Get"))) { + ret = -ENOMEM; + goto finish; + } + + if (!dbus_message_append_args( + m, + DBUS_TYPE_STRING, &interfacestr, + DBUS_TYPE_STRING, &propname, + DBUS_TYPE_INVALID)) { + ret = -ENOMEM; + goto finish; + } + + if (!(r = dbus_connection_send_with_reply_and_block(connection, m, -1, &error))) { + ret = translate_error(error.name); + goto finish; + } + + if (dbus_set_error_from_message(&error, r)) { + ret = translate_error(error.name); + goto finish; + } + + ret = -EBADMSG; + dbus_message_iter_init(r, &iter); + while ((current_type = dbus_message_iter_get_arg_type (&iter)) != DBUS_TYPE_INVALID) { + + if (current_type == DBUS_TYPE_VARIANT) { + dbus_message_iter_recurse(&iter, &subiter); + + while ((current_type = dbus_message_iter_get_arg_type (&subiter)) != DBUS_TYPE_INVALID) { + + if (current_type == DBUS_TYPE_INT32) { + dbus_message_iter_get_basic(&subiter, &i32); + *propval = i32; + ret = 0; + } + + if (current_type == DBUS_TYPE_INT64) { + dbus_message_iter_get_basic(&subiter, &i64); + *propval = i64; + ret = 0; + } + + dbus_message_iter_next (&subiter); + } + } + dbus_message_iter_next (&iter); + } + +finish: + + if (m) + dbus_message_unref(m); + + if (r) + dbus_message_unref(r); + + dbus_error_free(&error); + + return ret; +} + +int rtkit_get_max_realtime_priority(DBusConnection *connection) { + long long retval; + int err; + + err = rtkit_get_int_property(connection, "MaxRealtimePriority", &retval); + return err < 0 ? err : retval; +} + +int rtkit_get_min_nice_level(DBusConnection *connection, int* min_nice_level) { + long long retval; + int err; + + err = rtkit_get_int_property(connection, "MinNiceLevel", &retval); + if (err >= 0) + *min_nice_level = retval; + return err; +} + +long long rtkit_get_rttime_nsec_max(DBusConnection *connection) { + long long retval; + int err; + + err = rtkit_get_int_property(connection, "RTTimeNSecMax", &retval); + return err < 0 ? err : retval; +} + int rtkit_make_realtime(DBusConnection *connection, pid_t thread, int priority) { DBusMessage *m = NULL, *r = NULL; dbus_uint64_t u64; @@ -186,4 +293,16 @@ int rtkit_make_high_priority(DBusConnection *connection, pid_t thread, int nice_ return -ENOTSUP; } +int rtkit_get_max_realtime_priority(DBusConnection *connection) { + return -ENOTSUP; +} + +int rtkit_get_min_nice_level(DBusConnection *connection, int* min_nice_level) { + return -ENOTSUP; +} + +long long rtkit_get_rttime_nsec_max(DBusConnection *connection) { + return -ENOTSUP; +} + #endif |