1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-03-10 16:58:47 +03:00

dmeventd: add DM_EVENT_GET_PARAMETERS request to dmeventd protocol

The DM_EVENT_GET_PARAMETERS requests the parameters under which
the running dmeventd is run and the it sends them to caller.

The parameters sent:
  - the pid of the running dmeventd
  - foreground state
  - exec_method (currently either "direct" or "systemd")

The exact message sent back:
  pid=<pid> daemon=<no/yes> exec_method=<direct/systemd>
This commit is contained in:
Peter Rajnoha 2014-02-04 17:01:54 +01:00
parent 8a8abc5ed9
commit fbeb08f320
3 changed files with 60 additions and 2 deletions

View File

@ -514,6 +514,29 @@ static int _get_status(struct message_data *message_data)
} }
static int _get_parameters(struct message_data *message_data) {
struct dm_event_daemon_message *msg = message_data->msg;
char buf[128];
int r = -1;
dm_free(msg->data);
if (!(dm_snprintf(buf, sizeof(buf), "%s pid=%d daemon=%s exec_method=%s",
message_data->id,
getpid(),
_foreground ? "no" : "yes",
_systemd_activation ? "systemd" : "direct")))
goto_out;
msg->size = strlen(buf) + 1;
if (!(msg->data = dm_malloc(msg->size)))
goto_out;
dm_strncpy(msg->data, buf, msg->size);
r = 0;
out:
return r;
}
/* Cleanup at exit. */ /* Cleanup at exit. */
static void _exit_dm_lib(void) static void _exit_dm_lib(void)
{ {
@ -1437,6 +1460,14 @@ static int _handle_request(struct dm_event_daemon_message *msg,
{ DM_EVENT_CMD_GET_TIMEOUT, _get_timeout}, { DM_EVENT_CMD_GET_TIMEOUT, _get_timeout},
{ DM_EVENT_CMD_ACTIVE, _active}, { DM_EVENT_CMD_ACTIVE, _active},
{ DM_EVENT_CMD_GET_STATUS, _get_status}, { DM_EVENT_CMD_GET_STATUS, _get_status},
/* dmeventd parameters of running dmeventd,
* returns 'pid=<pid> daemon=<no/yes> exec_method=<direct/systemd>'
* pid - pidfile of running dmeventd
* daemon - running as a daemon or not (foreground)?
* exec_method - "direct" if executed directly or
* "systemd" if executed via systemd
*/
{ DM_EVENT_CMD_GET_PARAMETERS, _get_parameters},
}, *req; }, *req;
for (req = requests; req < requests + sizeof(requests) / sizeof(struct request); req++) for (req = requests; req < requests + sizeof(requests) / sizeof(struct request); req++)
@ -1732,6 +1763,7 @@ out:
unsetenv(SD_LISTEN_FDS_ENV_VAR_NAME); unsetenv(SD_LISTEN_FDS_ENV_VAR_NAME);
return r; return r;
} }
#endif #endif
static void _remove_files_on_exit(void) static void _remove_files_on_exit(void)
@ -1938,18 +1970,43 @@ static void restart(void)
} }
_initial_registrations[count] = 0; _initial_registrations[count] = 0;
if (version >= 2) {
if (daemon_talk(&fifos, &msg, DM_EVENT_CMD_GET_PARAMETERS, "-", "-", 0, 0)) {
fprintf(stderr, "Failed to acquire parameters from old dmeventd.\n");
goto bad;
}
if (strstr(msg.data, "exec_method=systemd"))
_systemd_activation = 1;
}
#ifdef __linux__
/*
* If the protocol version is old, just assume that if systemd is running,
* the dmeventd is also run as a systemd service via fifo activation.
*/
if (version < 2) {
/* This check is copied from sd-daemon.c. */
struct stat st;
if (!lstat("/run/systemd/system/", &st) && !!S_ISDIR(st.st_mode))
_systemd_activation = 1;
}
#endif
if (daemon_talk(&fifos, &msg, DM_EVENT_CMD_DIE, "-", "-", 0, 0)) { if (daemon_talk(&fifos, &msg, DM_EVENT_CMD_DIE, "-", "-", 0, 0)) {
fprintf(stderr, "Old dmeventd refused to die.\n"); fprintf(stderr, "Old dmeventd refused to die.\n");
goto bad; goto bad;
} }
if (!_systemd_activation &&
((e = getenv(SD_ACTIVATION_ENV_VAR_NAME)) && strcmp(e, "1")))
_systemd_activation = 1;
/* /*
* If we're under systemd management, just send the initial * If we're under systemd management, just send the initial
* registrations to the fifo - this will instantiate new dmeventd. * registrations to the fifo - this will instantiate new dmeventd.
* If not under systemd management, continue with this process * If not under systemd management, continue with this process
* to take over the old dmeventd. * to take over the old dmeventd.
*/ */
if (!(e = getenv(SD_ACTIVATION_ENV_VAR_NAME)) || strcmp(e, "1")) { if (!_systemd_activation) {
/* /*
* Non-systemd environment. * Non-systemd environment.
* Wait for daemon to die, detected by sending further DIE messages * Wait for daemon to die, detected by sending further DIE messages

View File

@ -34,6 +34,7 @@ enum dm_event_command {
DM_EVENT_CMD_HELLO, DM_EVENT_CMD_HELLO,
DM_EVENT_CMD_DIE, DM_EVENT_CMD_DIE,
DM_EVENT_CMD_GET_STATUS, DM_EVENT_CMD_GET_STATUS,
DM_EVENT_CMD_GET_PARAMETERS,
}; };
/* Message passed between client and daemon. */ /* Message passed between client and daemon. */

View File

@ -46,7 +46,7 @@ enum dm_event_mask {
}; };
#define DM_EVENT_ALL_ERRORS DM_EVENT_ERROR_MASK #define DM_EVENT_ALL_ERRORS DM_EVENT_ERROR_MASK
#define DM_EVENT_PROTOCOL_VERSION 1 #define DM_EVENT_PROTOCOL_VERSION 2
struct dm_task; struct dm_task;
struct dm_event_handler; struct dm_event_handler;