summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO13
-rw-r--r--src/login/logind-device.c16
-rw-r--r--src/login/logind-seat-dbus.c40
-rw-r--r--src/login/logind-seat.c20
-rw-r--r--src/login/logind-seat.h3
5 files changed, 79 insertions, 13 deletions
diff --git a/TODO b/TODO
index 73230caae9..872d66652c 100644
--- a/TODO
+++ b/TODO
@@ -12,8 +12,6 @@ Bugfixes:
* make anaconda write timeout=0 for encrypted devices
-* make sure timeouts are applied to Type=oneshot services.
-
* Dangling symlinks of .automount unit files in .wants/ directories, set up
automount points even when the original .automount file did not exist
anymore. Only the .mount unit was still around.
@@ -27,16 +25,19 @@ Bugfixes:
Features:
-* introduce CanGraphics and CanText properties on seat objects, to combat races where gdm is started before the graphics driver is loaded and finished probing.
+* support rd.luks= kernel cmdline params in cryptsetup generator
+
+* support rd.fstab= kernel cmdline params in fstab generator
+
+* support rd.driver= kernel cmdline params in modules load
-* change $NOTIFY_SOCKET to use an abstract namespace socket, so that chroot() is compatible with this
- https://bugzilla.redhat.com/show_bug.cgi?id=833105
+* supprto rd.xxx wherever else makes sense
* readahead: merge the three tools into one binary
* systemctl: when stopping a service which has triggres and warning about it actually check the TriggeredBy= deps fields
-* send bus signal to upower on resume so that it can send out its dbus signal for compat
+* send SIGPWR to upower on resume so that it can send out its dbus signal for compat
* vtconsole: don't override kernel cmdline utf8 override setting
diff --git a/src/login/logind-device.c b/src/login/logind-device.c
index 828e1efe4a..51b15358ba 100644
--- a/src/login/logind-device.c
+++ b/src/login/logind-device.c
@@ -65,22 +65,32 @@ void device_free(Device *d) {
}
void device_detach(Device *d) {
+ Seat *s;
assert(d);
- if (d->seat)
- LIST_REMOVE(Device, devices, d->seat->devices, d);
+ if (!d->seat)
+ return;
- seat_add_to_gc_queue(d->seat);
+ s = d->seat;
+ LIST_REMOVE(Device, devices, d->seat->devices, d);
d->seat = NULL;
+
+ seat_add_to_gc_queue(s);
+ seat_send_changed(s, "CanGraphical\0");
}
void device_attach(Device *d, Seat *s) {
assert(d);
assert(s);
+ if (d->seat == s)
+ return;
+
if (d->seat)
device_detach(d);
d->seat = s;
LIST_PREPEND(Device, devices, s->devices, d);
+
+ seat_send_changed(s, "CanGraphical\0");
}
diff --git a/src/login/logind-seat-dbus.c b/src/login/logind-seat-dbus.c
index 4bf9bf7b1f..7833d70a03 100644
--- a/src/login/logind-seat-dbus.c
+++ b/src/login/logind-seat-dbus.c
@@ -36,6 +36,8 @@
" <property name=\"Id\" type=\"s\" access=\"read\"/>\n" \
" <property name=\"ActiveSession\" type=\"so\" access=\"read\"/>\n" \
" <property name=\"CanMultiSession\" type=\"b\" access=\"read\"/>\n" \
+ " <property name=\"CanTTY\" type=\"b\" access=\"read\"/>\n" \
+ " <property name=\"CanGraphical\" type=\"b\" access=\"read\"/>\n" \
" <property name=\"Sessions\" type=\"a(so)\" access=\"read\"/>\n" \
" <property name=\"IdleHint\" type=\"b\" access=\"read\"/>\n" \
" <property name=\"IdleSinceHint\" type=\"t\" access=\"read\"/>\n" \
@@ -133,7 +135,7 @@ static int bus_seat_append_sessions(DBusMessageIter *i, const char *property, vo
return 0;
}
-static int bus_seat_append_multi_session(DBusMessageIter *i, const char *property, void *data) {
+static int bus_seat_append_can_multi_session(DBusMessageIter *i, const char *property, void *data) {
Seat *s = data;
dbus_bool_t b;
@@ -149,6 +151,38 @@ static int bus_seat_append_multi_session(DBusMessageIter *i, const char *propert
return 0;
}
+static int bus_seat_append_can_tty(DBusMessageIter *i, const char *property, void *data) {
+ Seat *s = data;
+ dbus_bool_t b;
+
+ assert(i);
+ assert(property);
+ assert(s);
+
+ b = seat_can_tty(s);
+
+ if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b))
+ return -ENOMEM;
+
+ return 0;
+}
+
+static int bus_seat_append_can_graphical(DBusMessageIter *i, const char *property, void *data) {
+ Seat *s = data;
+ dbus_bool_t b;
+
+ assert(i);
+ assert(property);
+ assert(s);
+
+ b = seat_can_graphical(s);
+
+ if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b))
+ return -ENOMEM;
+
+ return 0;
+}
+
static int bus_seat_append_idle_hint(DBusMessageIter *i, const char *property, void *data) {
Seat *s = data;
dbus_bool_t b;
@@ -210,7 +244,9 @@ static int get_seat_for_path(Manager *m, const char *path, Seat **_s) {
static const BusProperty bus_login_seat_properties[] = {
{ "Id", bus_property_append_string, "s", offsetof(Seat, id), true },
{ "ActiveSession", bus_seat_append_active, "(so)", 0 },
- { "CanMultiSession", bus_seat_append_multi_session, "b", 0 },
+ { "CanMultiSession", bus_seat_append_can_multi_session, "b", 0 },
+ { "CanTTY", bus_seat_append_can_tty, "b", 0 },
+ { "CanGraphical", bus_seat_append_can_graphical, "b", 0 },
{ "Sessions", bus_seat_append_sessions, "a(so)", 0 },
{ "IdleHint", bus_seat_append_idle_hint, "b", 0 },
{ "IdleSinceHint", bus_seat_append_idle_hint_since, "t", 0 },
diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c
index 755f20c03a..045712192a 100644
--- a/src/login/logind-seat.c
+++ b/src/login/logind-seat.c
@@ -104,9 +104,13 @@ int seat_save(Seat *s) {
fprintf(f,
"# This is private data. Do not parse.\n"
"IS_VTCONSOLE=%i\n"
- "CAN_MULTI_SESSION=%i\n",
+ "CAN_MULTI_SESSION=%i\n"
+ "CAN_TTY=%i\n"
+ "CAN_GRAPHICAL=%i\n",
seat_is_vtconsole(s),
- seat_can_multi_session(s));
+ seat_can_multi_session(s),
+ seat_can_tty(s),
+ seat_can_graphical(s));
if (s->active) {
assert(s->active->user);
@@ -427,6 +431,18 @@ bool seat_can_multi_session(Seat *s) {
return s->manager->console_active_fd >= 0;
}
+bool seat_can_tty(Seat *s) {
+ assert(s);
+
+ return seat_is_vtconsole(s);
+}
+
+bool seat_can_graphical(Seat *s) {
+ assert(s);
+
+ return !!s->devices;
+}
+
int seat_get_idle_hint(Seat *s, dual_timestamp *t) {
Session *session;
bool idle_hint = true;
diff --git a/src/login/logind-seat.h b/src/login/logind-seat.h
index d41320da46..1abbc344ec 100644
--- a/src/login/logind-seat.h
+++ b/src/login/logind-seat.h
@@ -63,6 +63,9 @@ int seat_attach_session(Seat *s, Session *session);
bool seat_is_vtconsole(Seat *s);
bool seat_can_multi_session(Seat *s);
+bool seat_can_tty(Seat *s);
+bool seat_can_graphical(Seat *s);
+
int seat_get_idle_hint(Seat *s, dual_timestamp *t);
int seat_start(Seat *s);