1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-02 01:18:26 +03:00

Add rudimentary versioning to the dmevend protocol, allowing us to detect the

(protocol) version of the running dmeventd on the client side.

Right now this is only used in dmeventd -R.
This commit is contained in:
Petr Rockai 2011-04-04 16:11:09 +00:00
parent 29684f590c
commit 968cdc0066
5 changed files with 45 additions and 3 deletions

View File

@ -1,3 +1,4 @@
init_fifos
fini_fifos
daemon_talk
dm_event_get_version

View File

@ -1424,8 +1424,9 @@ static int _do_process_request(struct dm_event_daemon_message *msg)
ret = 0;
answer = msg->data;
if (answer) {
msg->size = dm_asprintf(&(msg->data), "%s %s", answer,
msg->cmd == DM_EVENT_CMD_DIE ? "DYING" : "HELLO");
msg->size = dm_asprintf(&(msg->data), "%s %s %d", answer,
msg->cmd == DM_EVENT_CMD_DIE ? "DYING" : "HELLO",
DM_EVENT_PROTOCOL_VERSION);
dm_free(answer);
} else {
msg->size = 0;
@ -1704,6 +1705,7 @@ static void restart(void)
int i, count = 0;
char *message;
int length;
int version;
/* Get the list of registrations from the running daemon. */
@ -1712,12 +1714,19 @@ static void restart(void)
return;
}
if (daemon_talk(&fifos, &msg, DM_EVENT_CMD_HELLO, NULL, NULL, 0, 0)) {
if (!dm_event_get_version(&fifos, &version)) {
fprintf(stderr, "WARNING: Could not communicate with existing dmeventd.\n");
fini_fifos(&fifos);
return;
}
if (version < 1) {
fprintf(stderr, "WARNING: The running dmeventd instance is too old.\n"
"Protocol version %d (required: 1). Action cancelled.\n",
version);
exit(EXIT_FAILURE);
}
if (daemon_talk(&fifos, &msg, DM_EVENT_CMD_GET_STATUS, "-", "-", 0, 0)) {
exit(EXIT_FAILURE);
}

View File

@ -69,5 +69,6 @@ int daemon_talk(struct dm_event_fifos *fifos,
enum dm_event_mask evmask, uint32_t timeout);
int init_fifos(struct dm_event_fifos *fifos);
void fini_fifos(struct dm_event_fifos *fifos);
int dm_event_get_version(struct dm_event_fifos *fifos, int *version);
#endif /* __DMEVENTD_DOT_H__ */

View File

@ -782,6 +782,36 @@ int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next)
return ret;
}
/*
* You can (and have to) call this at the stage of the protocol where
* daemon_talk(fifos, &msg, DM_EVENT_CMD_HELLO, NULL, NULL, 0, 0)
*
* would be normally sent. This call will parse the version reply from
* dmeventd, in addition to above call. It is not safe to call this at any
* other place in the protocol.
*
* This is an internal function, not exposed in the public API.
*/
int dm_event_get_version(struct dm_event_fifos *fifos, int *version) {
char *p;
struct dm_event_daemon_message msg = { 0, 0, NULL };
if (daemon_talk(fifos, &msg, DM_EVENT_CMD_HELLO, NULL, NULL, 0, 0))
return 0;
p = msg.data;
*version = 0;
p = strchr(p, ' ') + 1; /* Message ID */
if (!p) return 0;
p = strchr(p, ' ') + 1; /* HELLO */
if (!p) return 0;
p = strchr(p, ' '); /* HELLO, once more */
if (p)
*version = atoi(p);
return 1;
}
#if 0 /* left out for now */
static char *_skip_string(char *src, const int delimiter)

View File

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