(protocol) version of the running dmeventd on the client side.
Right now this is only used in dmeventd -R.
init_fifos
fini_fifos
daemon_talk
+dm_event_get_version
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;
int i, count = 0;
char *message;
int length;
+ int version;
/* Get the list of registrations from the running daemon. */
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);
}
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__ */
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)
};
#define DM_EVENT_ALL_ERRORS DM_EVENT_ERROR_MASK
+#define DM_EVENT_PROTOCOL_VERSION 1
struct dm_event_handler;