1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-06 16:59:03 +03:00

logind: implement more dbus functionality

This commit is contained in:
Lennart Poettering 2011-06-21 19:20:05 +02:00
parent a185c5aa2d
commit bef422ae1e
4 changed files with 300 additions and 15 deletions

View File

@ -27,26 +27,26 @@
#define BUS_MANAGER_INTERFACE \ #define BUS_MANAGER_INTERFACE \
" <interface name=\"org.freedesktop.login1.Manager\">\n" \ " <interface name=\"org.freedesktop.login1.Manager\">\n" \
" <method name=\"GetSeat\">\n" \
" <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \
" <arg name=\"seat\" type=\"o\" direction=\"out\"/>\n" \
" </method>\n" \
" <method name=\"GetUser\">\n" \
" <arg name=\"uid\" type=\"t\" direction=\"in\"/>\n" \
" <arg name=\"user\" type=\"o\" direction=\"out\"/>\n" \
" </method>\n" \
" <method name=\"GetSession\">\n" \ " <method name=\"GetSession\">\n" \
" <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \ " <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \
" <arg name=\"session\" type=\"o\" direction=\"out\"/>\n" \ " <arg name=\"session\" type=\"o\" direction=\"out\"/>\n" \
" </method>\n" \ " </method>\n" \
" <method name=\"ListSeats\">\n" \ " <method name=\"GetUser\">\n" \
" <arg name=\"seats\" type=\"a(so)\" direction=\"out\"/>\n" \ " <arg name=\"uid\" type=\"u\" direction=\"in\"/>\n" \
" <arg name=\"user\" type=\"o\" direction=\"out\"/>\n" \
" </method>\n" \
" <method name=\"GetSeat\">\n" \
" <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \
" <arg name=\"seat\" type=\"o\" direction=\"out\"/>\n" \
" </method>\n" \
" <method name=\"ListSessions\">\n" \
" <arg name=\"users\" type=\"a(sussso)\" direction=\"out\"/>\n" \
" </method>\n" \ " </method>\n" \
" <method name=\"ListUsers\">\n" \ " <method name=\"ListUsers\">\n" \
" <arg name=\"users\" type=\"a(uso)\" direction=\"out\"/>\n" \ " <arg name=\"users\" type=\"a(uso)\" direction=\"out\"/>\n" \
" </method>\n" \ " </method>\n" \
" <method name=\"ListSessions\">\n" \ " <method name=\"ListSeats\">\n" \
" <arg name=\"users\" type=\"a(sussso)\" direction=\"out\"/>\n" \ " <arg name=\"seats\" type=\"a(so)\" direction=\"out\"/>\n" \
" </method>\n" \ " </method>\n" \
" <method name=\"CreateSession\">\n" \ " <method name=\"CreateSession\">\n" \
" <arg name=\"uid\" type=\"u\" direction=\"in\"/>\n" \ " <arg name=\"uid\" type=\"u\" direction=\"in\"/>\n" \
@ -72,7 +72,7 @@
" <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \ " <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \
" </method>\n" \ " </method>\n" \
" <method name=\"TerminateUser\">\n" \ " <method name=\"TerminateUser\">\n" \
" <arg name=\"uid\" type=\"t\" direction=\"in\"/>\n" \ " <arg name=\"uid\" type=\"u\" direction=\"in\"/>\n" \
" </method>\n" \ " </method>\n" \
" <method name=\"TerminateSeat\">\n" \ " <method name=\"TerminateSeat\">\n" \
" <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \ " <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \
@ -184,6 +184,7 @@ static DBusHandlerResult manager_message_handler(
DBusError error; DBusError error;
DBusMessage *reply = NULL; DBusMessage *reply = NULL;
int r;
assert(connection); assert(connection);
assert(message); assert(message);
@ -191,7 +192,201 @@ static DBusHandlerResult manager_message_handler(
dbus_error_init(&error); dbus_error_init(&error);
if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect")) { if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "GetSession")) {
const char *name;
char *p;
Session *session;
bool b;
if (!dbus_message_get_args(
message,
&error,
DBUS_TYPE_STRING, &name,
DBUS_TYPE_INVALID))
return bus_send_error_reply(connection, message, &error, -EINVAL);
session = hashmap_get(m->sessions, name);
if (!session)
return bus_send_error_reply(connection, message, &error, -ENOENT);
reply = dbus_message_new_method_return(message);
if (!reply)
goto oom;
p = session_bus_path(session);
if (!p)
goto oom;
b = dbus_message_append_args(
reply,
DBUS_TYPE_OBJECT_PATH, &p,
DBUS_TYPE_INVALID);
free(p);
if (!b)
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "GetUser")) {
uint32_t uid;
char *p;
User *user;
bool b;
if (!dbus_message_get_args(
message,
&error,
DBUS_TYPE_UINT32, &uid,
DBUS_TYPE_INVALID))
return bus_send_error_reply(connection, message, &error, -EINVAL);
user = hashmap_get(m->users, ULONG_TO_PTR((unsigned long) uid));
if (!user)
return bus_send_error_reply(connection, message, &error, -ENOENT);
reply = dbus_message_new_method_return(message);
if (!reply)
goto oom;
p = user_bus_path(user);
if (!p)
goto oom;
b = dbus_message_append_args(
reply,
DBUS_TYPE_OBJECT_PATH, &p,
DBUS_TYPE_INVALID);
free(p);
if (!b)
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "GetSeat")) {
const char *name;
char *p;
Seat *seat;
bool b;
if (!dbus_message_get_args(
message,
&error,
DBUS_TYPE_STRING, &name,
DBUS_TYPE_INVALID))
return bus_send_error_reply(connection, message, &error, -EINVAL);
seat = hashmap_get(m->seats, name);
if (!seat)
return bus_send_error_reply(connection, message, &error, -ENOENT);
reply = dbus_message_new_method_return(message);
if (!reply)
goto oom;
p = seat_bus_path(seat);
if (!p)
goto oom;
b = dbus_message_append_args(
reply,
DBUS_TYPE_OBJECT_PATH, &p,
DBUS_TYPE_INVALID);
free(p);
if (!b)
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "ActivateSession")) {
const char *name;
Session *session;
if (!dbus_message_get_args(
message,
&error,
DBUS_TYPE_STRING, &name,
DBUS_TYPE_INVALID))
return bus_send_error_reply(connection, message, &error, -EINVAL);
session = hashmap_get(m->sessions, name);
if (!session)
return bus_send_error_reply(connection, message, &error, -ENOENT);
r = session_activate(session);
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
reply = dbus_message_new_method_return(message);
if (!reply)
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "TerminateSession")) {
const char *name;
Session *session;
if (!dbus_message_get_args(
message,
&error,
DBUS_TYPE_STRING, &name,
DBUS_TYPE_INVALID))
return bus_send_error_reply(connection, message, &error, -EINVAL);
session = hashmap_get(m->sessions, name);
if (!session)
return bus_send_error_reply(connection, message, &error, -ENOENT);
r = session_stop(session);
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
reply = dbus_message_new_method_return(message);
if (!reply)
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "TerminateUser")) {
uint32_t uid;
User *user;
if (!dbus_message_get_args(
message,
&error,
DBUS_TYPE_UINT32, &uid,
DBUS_TYPE_INVALID))
return bus_send_error_reply(connection, message, &error, -EINVAL);
user = hashmap_get(m->users, ULONG_TO_PTR((unsigned long) uid));
if (!user)
return bus_send_error_reply(connection, message, &error, -ENOENT);
r = user_stop(user);
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
reply = dbus_message_new_method_return(message);
if (!reply)
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "TerminateSeat")) {
const char *name;
Seat *seat;
if (!dbus_message_get_args(
message,
&error,
DBUS_TYPE_STRING, &name,
DBUS_TYPE_INVALID))
return bus_send_error_reply(connection, message, &error, -EINVAL);
seat = hashmap_get(m->seats, name);
if (!seat)
return bus_send_error_reply(connection, message, &error, -ENOENT);
r = seat_stop_sessions(seat);
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
reply = dbus_message_new_method_return(message);
if (!reply)
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect")) {
char *introspection = NULL; char *introspection = NULL;
FILE *f; FILE *f;
Iterator i; Iterator i;

View File

@ -249,11 +249,90 @@ static DBusHandlerResult session_message_dispatch(
{ NULL, NULL, NULL, NULL, NULL } { NULL, NULL, NULL, NULL, NULL }
}; };
DBusError error;
DBusMessage *reply = NULL;
int r;
assert(s); assert(s);
assert(connection); assert(connection);
assert(message); assert(message);
dbus_error_init(&error);
if (dbus_message_is_method_call(message, "org.freedesktop.login1.Session", "Terminate")) {
r = session_stop(s);
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
reply = dbus_message_new_method_return(message);
if (!reply)
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Session", "Activate")) {
r = session_activate(s);
if (r < 0)
return bus_send_error_reply(connection, message, NULL, r);
reply = dbus_message_new_method_return(message);
if (!reply)
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Session", "Lock") ||
dbus_message_is_method_call(message, "org.freedesktop.login1.Session", "Unlock")) {
bool b;
DBusMessage *sig;
sig = dbus_message_new_signal(dbus_message_get_path(message), "org.freedesktop.login1.Session", dbus_message_get_member(message));
if (!sig)
goto oom;
b = dbus_connection_send(connection, sig, NULL);
dbus_message_unref(sig);
if (!b)
goto oom;
reply = dbus_message_new_method_return(message);
if (!reply)
goto oom;
} else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Session", "SetIdleHint")) {
dbus_bool_t b;
if (!dbus_message_get_args(
message,
&error,
DBUS_TYPE_BOOLEAN, &b,
DBUS_TYPE_INVALID))
return bus_send_error_reply(connection, message, &error, -EINVAL);
session_set_idle_hint(s, b);
reply = dbus_message_new_method_return(message);
if (!reply)
goto oom;
} else
return bus_default_message_handler(connection, message, INTROSPECTION, INTERFACES_LIST, properties); return bus_default_message_handler(connection, message, INTROSPECTION, INTERFACES_LIST, properties);
if (reply) {
if (!dbus_connection_send(connection, reply, NULL))
goto oom;
dbus_message_unref(reply);
}
return DBUS_HANDLER_RESULT_HANDLED;
oom:
if (reply)
dbus_message_unref(reply);
dbus_error_free(&error);
return DBUS_HANDLER_RESULT_NEED_MEMORY;
} }
static DBusHandlerResult session_message_handler( static DBusHandlerResult session_message_handler(

View File

@ -595,6 +595,16 @@ dont_know:
return 0; return 0;
} }
void session_set_idle_hint(Session *s, bool b) {
assert(s);
if (s->idle_hint == b)
return;
s->idle_hint = b;
dual_timestamp_get(&s->idle_hint_timestamp);
}
int session_check_gc(Session *s) { int session_check_gc(Session *s) {
int r; int r;

View File

@ -86,6 +86,7 @@ void session_add_to_gc_queue(Session *s);
int session_activate(Session *s); int session_activate(Session *s);
bool session_is_active(Session *s); bool session_is_active(Session *s);
int session_get_idle_hint(Session *s, dual_timestamp *t); int session_get_idle_hint(Session *s, dual_timestamp *t);
void session_set_idle_hint(Session *s, bool b);
int session_start(Session *s); int session_start(Session *s);
int session_stop(Session *s); int session_stop(Session *s);
int session_save(Session *s); int session_save(Session *s);