dbus: don't accept activation requests anymore if we are going down anyway

This commit is contained in:
Lennart Poettering 2010-09-01 03:30:59 +02:00
parent aabd9b11ba
commit 8f6df3fa98
6 changed files with 42 additions and 5 deletions

6
fixme
View File

@ -80,6 +80,12 @@ v9:
* fix terminal setup
* figure out ssh disconnect hang
* home.mount failing should not be able to cancel umount.target (IgnoreDependencyFailure=yes borked?)
* disallow further dbus+socket activation on shutdown
External:
* place /etc/inittab with explaining blurb.

View File

@ -41,6 +41,7 @@
#define BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE "org.freedesktop.systemd1.TransactionIsDestructive"
#define BUS_ERROR_TRANSACTION_JOBS_CONFLICTING "org.freedesktop.systemd1.TransactionJobsConflicting"
#define BUS_ERROR_TRANSACTION_ORDER_IS_CYCLIC "org.freedesktop.systemd1.TransactionOrderIsCyclic"
#define BUS_ERROR_SHUTTING_DOWN "org.freedesktop.systemd1.ShuttingDown"
static inline const char *bus_error(const DBusError *e, int r) {
if (e && e->message)

View File

@ -43,6 +43,7 @@
#include "dbus-timer.h"
#include "dbus-path.h"
#include "bus-errors.h"
#include "special.h"
#define CONNECTIONS_MAX 52
@ -383,13 +384,19 @@ static DBusHandlerResult api_bus_message_filter(DBusConnection *connection, DBus
log_debug("Got D-Bus activation request for %s", name);
r = manager_load_unit(m, name, NULL, &error, &u);
if (manager_unit_pending_inactive(m, SPECIAL_DBUS_SERVICE) ||
manager_unit_pending_inactive(m, SPECIAL_DBUS_SOCKET)) {
r = -EADDRNOTAVAIL;
dbus_set_error(&error, BUS_ERROR_SHUTTING_DOWN, "Refusing activation, D-Bus is shutting down.");
} else {
r = manager_load_unit(m, name, NULL, &error, &u);
if (r >= 0 && u->meta.refuse_manual_start)
r = -EPERM;
if (r >= 0 && u->meta.refuse_manual_start)
r = -EPERM;
if (r >= 0)
r = manager_add_job(m, JOB_START, u, JOB_REPLACE, true, &error, NULL);
if (r >= 0)
r = manager_add_job(m, JOB_START, u, JOB_REPLACE, true, &error, NULL);
}
if (r < 0) {
const char *id, *text;

View File

@ -2584,6 +2584,26 @@ int manager_set_console(Manager *m, const char *console) {
return 0;
}
bool manager_unit_pending_inactive(Manager *m, const char *name) {
Unit *u;
assert(m);
assert(name);
/* Returns true if the unit is inactive or going down */
if (!(u = manager_get_unit(m, name)))
return true;
if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u)))
return true;
if (u->meta.job && u->meta.job->type == JOB_STOP)
return true;
return false;
}
static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = {
[MANAGER_SYSTEM] = "system",
[MANAGER_SESSION] = "session"

View File

@ -259,6 +259,8 @@ void manager_reset_failed(Manager *m);
void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success);
bool manager_unit_pending_inactive(Manager *m, const char *name);
const char *manager_running_as_to_string(ManagerRunningAs i);
ManagerRunningAs manager_running_as_from_string(const char *s);

View File

@ -59,6 +59,7 @@
#define SPECIAL_POWEROFF_TARGET "poweroff.target"
#define SPECIAL_REBOOT_TARGET "reboot.target"
#define SPECIAL_DBUS_SERVICE "dbus.service"
#define SPECIAL_DBUS_SOCKET "dbus.socket"
#define SPECIAL_GETTY_TARGET "getty.target"
#define SPECIAL_SERIAL_GETTY_SERVICE "serial-getty@.service"