]> sourceware.org Git - lvm2.git/commitdiff
Add rudimentary versioning to the dmevend protocol, allowing us to detect the
authorPetr Rockai <prokai@redhat.com>
Mon, 4 Apr 2011 16:11:09 +0000 (16:11 +0000)
committerPetr Rockai <prokai@redhat.com>
Mon, 4 Apr 2011 16:11:09 +0000 (16:11 +0000)
(protocol) version of the running dmeventd on the client side.

Right now this is only used in dmeventd -R.

daemons/dmeventd/.exported_symbols
daemons/dmeventd/dmeventd.c
daemons/dmeventd/dmeventd.h
daemons/dmeventd/libdevmapper-event.c
daemons/dmeventd/libdevmapper-event.h

index 25690c8d1b7d574a225415e9aa1748f1d60a7040..fab74dc1d6f3dd8e740a3806d8424855bb399df6 100644 (file)
@@ -1,3 +1,4 @@
 init_fifos
 fini_fifos
 daemon_talk
+dm_event_get_version
index fe5f0194becd6285a80bf5a753b7ede9b4f1949d..1a91cb858217f6758a3012e9fe4af3f85adbb60e 100644 (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);
        }
index 3a13f1180173d411c217cf536e84bf99cbe11742..c60d402c7a82e9a484a9c626e37e1ddc36aab38a 100644 (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__ */
index 8dc83284a362dd9f2637c976c56f3f4ddf47b9e0..2a3545f0e38b553494b82c01b5fcc0add479702c 100644 (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)
index 0de20c145ffd8751269f36fc892ef21bf857b7b1..e07eaf6f20977c6b132aa1cc372c0124fcaa21e1 100644 (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;
 
This page took 0.044595 seconds and 5 git commands to generate.