X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fbusname.c;h=bd7d02d73b6940ad3246d38cf86a4fbf44bf6444;hb=679142ce4a8def7da43c4d3b2a02bae8c0d21175;hp=49a43feb376f3b4afb2580e84f62bfb787168751;hpb=2f671520ebade4877cbf6aca3572a5f8c4e1871d;p=elogind.git diff --git a/src/core/busname.c b/src/core/busname.c index 49a43feb3..bd7d02d73 100644 --- a/src/core/busname.c +++ b/src/core/busname.c @@ -197,6 +197,8 @@ static void busname_unwatch_fd(BusName *n) { static void busname_close_fd(BusName *n) { assert(n); + busname_unwatch_fd(n); + if (n->starter_fd <= 0) return; @@ -215,7 +217,7 @@ static int busname_watch_fd(BusName *n) { if (n->event_source) r = sd_event_source_set_enabled(n->event_source, SD_EVENT_ON); else - r = sd_event_add_io(UNIT(n)->manager->event, n->starter_fd, EPOLLIN, busname_dispatch_io, n, &n->event_source); + r = sd_event_add_io(UNIT(n)->manager->event, &n->event_source, n->starter_fd, EPOLLIN, busname_dispatch_io, n); if (r < 0) { log_warning_unit(UNIT(n)->id, "Failed to watch starter fd: %s", strerror(-r)); busname_unwatch_fd(n); @@ -231,7 +233,8 @@ static int busname_open_fd(BusName *n) { if (n->starter_fd >= 0) return 0; - n->starter_fd = bus_kernel_create_starter(UNIT(n)->manager->running_as == SYSTEMD_SYSTEM ? "system" : "user", n->name); + n->starter_fd = bus_kernel_create_starter(UNIT(n)->manager->running_as == SYSTEMD_SYSTEM ? "system" : "user", + n->name, n->policy); if (n->starter_fd < 0) { log_warning_unit(UNIT(n)->id, "Failed to create starter fd: %s", strerror(-n->starter_fd)); return n->starter_fd; @@ -333,6 +336,11 @@ static void busname_enter_running(BusName *n) { if (unit_stop_pending(UNIT(n))) { log_debug_unit(UNIT(n)->id, "Suppressing activation request on %s since unit stop is scheduled.", UNIT(n)->id); + + /* Flush all queued activation reqeuest by closing and reopening the connection */ + bus_kernel_drop_one(n->starter_fd); + + busname_enter_listening(n); return; } @@ -541,10 +549,19 @@ DEFINE_STRING_TABLE_LOOKUP(busname_state, BusNameState); static const char* const busname_result_table[_BUSNAME_RESULT_MAX] = { [BUSNAME_SUCCESS] = "success", [BUSNAME_FAILURE_RESOURCES] = "resources", + [BUSNAME_FAILURE_SERVICE_FAILED_PERMANENT] = "service-failed-permanent", }; DEFINE_STRING_TABLE_LOOKUP(busname_result, BusNameResult); +static const char* const busname_policy_access_table[_BUSNAME_POLICY_ACCESS_MAX] = { + [BUSNAME_POLICY_ACCESS_SEE] = "see", + [BUSNAME_POLICY_ACCESS_TALK] = "talk", + [BUSNAME_POLICY_ACCESS_OWN] = "own", +}; + +DEFINE_STRING_TABLE_LOOKUP(busname_policy_access, BusNamePolicyAccess); + const UnitVTable busname_vtable = { .object_size = sizeof(BusName), @@ -577,7 +594,6 @@ const UnitVTable busname_vtable = { .bus_interface = "org.freedesktop.systemd1.BusName", .bus_vtable = bus_busname_vtable, - .bus_changing_properties = bus_busname_changing_properties, .status_message_formats = { .finished_start_job = {