logind: add shutdown/suspend/idle inhibition framework
This commit is contained in:
@@ -1155,3 +1155,53 @@ DBusHandlerResult bus_exit_idle_filter(DBusConnection *bus, DBusMessage *m, void
|
||||
|
||||
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
||||
}
|
||||
|
||||
/* This mimics dbus_bus_get_unix_user() */
|
||||
pid_t bus_get_unix_process_id(
|
||||
DBusConnection *connection,
|
||||
const char *name,
|
||||
DBusError *error) {
|
||||
|
||||
DBusMessage *m = NULL, *reply = NULL;
|
||||
uint32_t pid = 0;
|
||||
|
||||
m = dbus_message_new_method_call(
|
||||
DBUS_SERVICE_DBUS,
|
||||
DBUS_PATH_DBUS,
|
||||
DBUS_INTERFACE_DBUS,
|
||||
"GetConnectionUnixProcessID");
|
||||
if (!m) {
|
||||
dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, NULL);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (!dbus_message_append_args(
|
||||
m,
|
||||
DBUS_TYPE_STRING, &name,
|
||||
DBUS_TYPE_INVALID)) {
|
||||
dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, NULL);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
reply = dbus_connection_send_with_reply_and_block(connection, m, -1, error);
|
||||
if (!reply)
|
||||
goto finish;
|
||||
|
||||
if (dbus_set_error_from_message(error, reply))
|
||||
goto finish;
|
||||
|
||||
if (!dbus_message_get_args(
|
||||
reply, error,
|
||||
DBUS_TYPE_UINT32, &pid,
|
||||
DBUS_TYPE_INVALID))
|
||||
goto finish;
|
||||
|
||||
finish:
|
||||
if (m)
|
||||
dbus_message_unref(m);
|
||||
|
||||
if (reply)
|
||||
dbus_message_unref(reply);
|
||||
|
||||
return (pid_t) pid;
|
||||
}
|
||||
|
||||
@@ -199,4 +199,6 @@ void bus_async_unregister_and_exit(DBusConnection *bus, const char *name);
|
||||
|
||||
DBusHandlerResult bus_exit_idle_filter(DBusConnection *bus, DBusMessage *m, void *userdata);
|
||||
|
||||
pid_t bus_get_unix_process_id(DBusConnection *connection, const char *name, DBusError *error);
|
||||
|
||||
#endif
|
||||
|
||||
+1
-51
@@ -27,56 +27,6 @@
|
||||
#include "dbus-common.h"
|
||||
#include "polkit.h"
|
||||
|
||||
/* This mimics dbus_bus_get_unix_user() */
|
||||
static pid_t get_unix_process_id(
|
||||
DBusConnection *connection,
|
||||
const char *name,
|
||||
DBusError *error) {
|
||||
|
||||
DBusMessage *m = NULL, *reply = NULL;
|
||||
uint32_t pid = 0;
|
||||
|
||||
m = dbus_message_new_method_call(
|
||||
DBUS_SERVICE_DBUS,
|
||||
DBUS_PATH_DBUS,
|
||||
DBUS_INTERFACE_DBUS,
|
||||
"GetConnectionUnixProcessID");
|
||||
if (!m) {
|
||||
dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, NULL);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (!dbus_message_append_args(
|
||||
m,
|
||||
DBUS_TYPE_STRING, &name,
|
||||
DBUS_TYPE_INVALID)) {
|
||||
dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, NULL);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
reply = dbus_connection_send_with_reply_and_block(connection, m, -1, error);
|
||||
if (!reply)
|
||||
goto finish;
|
||||
|
||||
if (dbus_set_error_from_message(error, reply))
|
||||
goto finish;
|
||||
|
||||
if (!dbus_message_get_args(
|
||||
reply, error,
|
||||
DBUS_TYPE_UINT32, &pid,
|
||||
DBUS_TYPE_INVALID))
|
||||
goto finish;
|
||||
|
||||
finish:
|
||||
if (m)
|
||||
dbus_message_unref(m);
|
||||
|
||||
if (reply)
|
||||
dbus_message_unref(reply);
|
||||
|
||||
return (pid_t) pid;
|
||||
}
|
||||
|
||||
int verify_polkit(
|
||||
DBusConnection *c,
|
||||
DBusMessage *request,
|
||||
@@ -104,7 +54,7 @@ int verify_polkit(
|
||||
if (!sender)
|
||||
return -EINVAL;
|
||||
|
||||
pid_raw = get_unix_process_id(c, sender, error);
|
||||
pid_raw = bus_get_unix_process_id(c, sender, error);
|
||||
if (pid_raw == 0)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
+2
-1
@@ -1690,7 +1690,8 @@ char *cescape(const char *s) {
|
||||
|
||||
/* Does C style string escaping. */
|
||||
|
||||
if (!(r = new(char, strlen(s)*4 + 1)))
|
||||
r = new(char, strlen(s)*4 + 1);
|
||||
if (!r)
|
||||
return NULL;
|
||||
|
||||
for (f = s, t = r; *f; f++)
|
||||
|
||||
Reference in New Issue
Block a user