X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-terminal%2Fsysview.c;h=161ea117a4fbe88308e06186f557fdddbacba2ca;hb=6022343476982439dfc2e06bf54db78a0c8c6bff;hp=d885cb4d4aee722e2764df158bfc2560c1dfd4c1;hpb=7ed3a638b2e4ffb5e76a0cf1a008e1c7233edb75;p=elogind.git diff --git a/src/libsystemd-terminal/sysview.c b/src/libsystemd-terminal/sysview.c index d885cb4d4..161ea117a 100644 --- a/src/libsystemd-terminal/sysview.c +++ b/src/libsystemd-terminal/sysview.c @@ -98,6 +98,7 @@ sysview_device *sysview_device_free(sysview_device *device) { break; } + free(device->name); free(device); return NULL; @@ -262,7 +263,7 @@ static int session_take_control_fn(sd_bus *bus, log_debug("sysview: %s: TakeControl failed: %s: %s", session->name, e->name, e->message); - error = sd_bus_error_get_errno(e); + error = -sd_bus_error_get_errno(e); } else { session->has_control = true; error = 0; @@ -367,11 +368,11 @@ int sysview_seat_new(sysview_seat **out, sysview_context *c, const char *name) { if (!seat->name) return -ENOMEM; - seat->session_map = hashmap_new(string_hash_func, string_compare_func); + seat->session_map = hashmap_new(&string_hash_ops); if (!seat->session_map) return -ENOMEM; - seat->device_map = hashmap_new(string_hash_func, string_compare_func); + seat->device_map = hashmap_new(&string_hash_ops); if (!seat->device_map) return -ENOMEM; @@ -516,6 +517,18 @@ static int context_raise_session_detach(sysview_context *c, sysview_session *ses return context_raise(c, &event, 0); } +static int context_raise_device_change(sysview_context *c, sysview_device *device, struct udev_device *ud) { + sysview_event event = { + .type = SYSVIEW_EVENT_DEVICE_CHANGE, + .device_change = { + .device = device, + .ud = ud, + } + }; + + return context_raise(c, &event, 0); +} + static int context_add_device(sysview_context *c, sysview_device *device) { sysview_session *session; int r, error = 0; @@ -766,15 +779,15 @@ int sysview_context_new(sysview_context **out, return errno > 0 ? -errno : -EFAULT; } - c->seat_map = hashmap_new(string_hash_func, string_compare_func); + c->seat_map = hashmap_new(&string_hash_ops); if (!c->seat_map) return -ENOMEM; - c->session_map = hashmap_new(string_hash_func, string_compare_func); + c->session_map = hashmap_new(&string_hash_ops); if (!c->session_map) return -ENOMEM; - c->device_map = hashmap_new(string_hash_func, string_compare_func); + c->device_map = hashmap_new(&string_hash_ops); if (!c->device_map) return -ENOMEM; @@ -821,7 +834,7 @@ static int context_ud_prepare_monitor(sysview_context *c, struct udev_monitor *m return r; } - return r; + return 0; } static int context_ud_prepare_scan(sysview_context *c, struct udev_enumerate *e) { @@ -871,7 +884,7 @@ static int context_ud_hotplug(sysview_context *c, struct udev_device *d) { if (!device) return 0; - /* TODO: send REFRESH event */ + return context_raise_device_change(c, device, d); } else if (!action || streq_ptr(action, "add")) { struct udev_device *p; unsigned int type, t; @@ -882,7 +895,7 @@ static int context_ud_hotplug(sysview_context *c, struct udev_device *d) { if (streq(subsystem, "input") && startswith(sysname, "event") && safe_atou(sysname + 5, &t) >= 0) type = SYSVIEW_DEVICE_EVDEV; - else if (streq(subsystem, "drm") && startswith(sysname, "card") && safe_atou(sysname + 4, &t) >= 0) + else if (streq(subsystem, "drm") && startswith(sysname, "card")) type = SYSVIEW_DEVICE_DRM; else type = (unsigned)-1; @@ -892,11 +905,11 @@ static int context_ud_hotplug(sysview_context *c, struct udev_device *d) { p = d; seatname = NULL; - while ((p = udev_device_get_parent(p))) { + do { seatname = udev_device_get_property_value(p, "ID_SEAT"); if (seatname) break; - } + } while ((p = udev_device_get_parent(p))); seat = sysview_find_seat(c, seatname ? : "seat0"); if (!seat) @@ -1194,7 +1207,7 @@ static int context_ld_list_seats_fn(sd_bus *bus, log_debug("sysview: ListSeats on logind failed: %s: %s", error->name, error->message); - return sd_bus_error_get_errno(error); + return -sd_bus_error_get_errno(error); } r = sd_bus_message_enter_container(reply, 'a', "(so)"); @@ -1246,7 +1259,7 @@ static int context_ld_list_sessions_fn(sd_bus *bus, log_debug("sysview: ListSessions on logind failed: %s: %s", error->name, error->message); - return sd_bus_error_get_errno(error); + return -sd_bus_error_get_errno(error); } r = sd_bus_message_enter_container(reply, 'a', "(susso)");