mirror of
https://github.com/systemd/systemd.git
synced 2025-03-25 18:50:18 +03:00
manager: identify the init/system/user mode we are running it and pick D-Bus bus accordingly
This commit is contained in:
parent
7898b0cf7e
commit
dfcd764ea6
2
dbus.c
2
dbus.c
@ -378,7 +378,7 @@ int bus_init(Manager *m) {
|
||||
dbus_connection_set_change_sigpipe(FALSE);
|
||||
|
||||
dbus_error_init(&error);
|
||||
if (!(m->bus = dbus_bus_get_private(m->is_init ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, &error))) {
|
||||
if (!(m->bus = dbus_bus_get_private(m->running_as == MANAGER_USER ? DBUS_BUS_SESSION : DBUS_BUS_SYSTEM, &error))) {
|
||||
log_error("Failed to get D-Bus connection: %s", error.message);
|
||||
dbus_error_free(&error);
|
||||
return -ECONNREFUSED;
|
||||
|
17
manager.c
17
manager.c
@ -76,6 +76,15 @@ Manager* manager_new(void) {
|
||||
if (!(m = new0(Manager, 1)))
|
||||
return NULL;
|
||||
|
||||
if (getpid() == 1)
|
||||
m->running_as = MANAGER_INIT;
|
||||
else if (getuid() == 0)
|
||||
m->running_as = MANAGER_SYSTEM;
|
||||
else
|
||||
m->running_as = MANAGER_USER;
|
||||
|
||||
log_debug("systemd running in %s mode.", manager_running_as_to_string(m->running_as));
|
||||
|
||||
m->signal_watch.fd = m->mount_watch.fd = m->udev_watch.fd = m->epoll_fd = -1;
|
||||
m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */
|
||||
|
||||
@ -1347,3 +1356,11 @@ int manager_get_job_from_dbus_path(Manager *m, const char *s, Job **_j) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char* const manager_running_as_table[_MANAGER_RUNNING_AS_MAX] = {
|
||||
[MANAGER_INIT] = "init",
|
||||
[MANAGER_SYSTEM] = "system",
|
||||
[MANAGER_USER] = "user"
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP(manager_running_as, ManagerRunningAs);
|
||||
|
16
manager.h
16
manager.h
@ -32,6 +32,14 @@ typedef struct Manager Manager;
|
||||
typedef enum WatchType WatchType;
|
||||
typedef struct Watch Watch;
|
||||
|
||||
typedef enum ManagerRunningAs {
|
||||
MANAGER_INIT, /* root and pid=1 */
|
||||
MANAGER_SYSTEM, /* root and pid!=1 */
|
||||
MANAGER_USER, /* non-root */
|
||||
_MANAGER_RUNNING_AS_MAX,
|
||||
_MANAGER_RUNNING_AS_INVALID = -1
|
||||
} ManagerRunningAs;
|
||||
|
||||
enum WatchType {
|
||||
WATCH_INVALID,
|
||||
WATCH_SIGNAL,
|
||||
@ -69,6 +77,9 @@ struct Watch {
|
||||
#define SPECIAL_CTRL_ALT_DEL_TARGET "ctrl-alt-del.target"
|
||||
|
||||
struct Manager {
|
||||
/* In which mode are we running */
|
||||
ManagerRunningAs running_as;
|
||||
|
||||
uint32_t current_job_id;
|
||||
|
||||
/* Note that the set of units we know of is allowed to be
|
||||
@ -104,8 +115,6 @@ struct Manager {
|
||||
bool dispatching_run_queue:1;
|
||||
bool dispatching_dbus_queue:1;
|
||||
|
||||
bool is_init:1;
|
||||
|
||||
bool request_bus_dispatch:1;
|
||||
|
||||
Hashmap *watch_pids; /* pid => Unit object n:1 */
|
||||
@ -155,4 +164,7 @@ unsigned manager_dispatch_dbus_queue(Manager *m);
|
||||
|
||||
int manager_loop(Manager *m);
|
||||
|
||||
const char *manager_running_as_to_string(ManagerRunningAs i);
|
||||
ManagerRunningAs manager_running_as_from_string(const char *s);
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user