···1616#include "util/u_misc.h"
1717#include "util/u_var.h"
1818#include "util/u_debug.h"
1919+#include "util/u_git_tag.h"
19202021#include "shared/ipc_protocol.h"
2122#include "client/ipc_client.h"
···301302 ii->ipc_c.ism = mmap(NULL, size, access, flags, ii->ipc_c.ism_handle, 0);
302303 if (ii->ipc_c.ism == NULL) {
303304 IPC_ERROR((&ii->ipc_c), "Failed to mmap shm!");
305305+ free(ii);
306306+ return -1;
307307+ }
308308+309309+ if (strncmp(u_git_tag, ii->ipc_c.ism->u_git_tag, IPC_VERSION_NAME_LEN) != 0) {
310310+ IPC_ERROR((&ii->ipc_c), "Monado client library version %s does not match service version %s", u_git_tag,
311311+ ii->ipc_c.ism->u_git_tag);
304312 free(ii);
305313 return -1;
306314 }
+4
src/xrt/ipc/server/ipc_server_process.c
···2323#include "util/u_verify.h"
2424#include "util/u_process.h"
25252626+#include "util/u_git_tag.h"
2727+2628#include "shared/ipc_shmem.h"
2729#include "server/ipc_server.h"
2830···319321320322 // Finally tell the client how many devices we have.
321323 s->ism->num_isdevs = count;
324324+325325+ snprintf(s->ism->u_git_tag, IPC_VERSION_NAME_LEN, "%s", u_git_tag);
322326323327 return 0;
324328}
+7
src/xrt/ipc/shared/ipc_protocol.h
···3737#define IPC_SHARED_MAX_OUTPUTS 128
3838#define IPC_SHARED_MAX_BINDINGS 64
39394040+// example: v21.0.0-560-g586d33b5
4141+#define IPC_VERSION_NAME_LEN 64
40424143/*
4244 *
···174176 */
175177struct ipc_shared_memory
176178{
179179+ /*!
180180+ * The git revision of the service, used by clients to detect version mismatches.
181181+ */
182182+ char u_git_tag[IPC_VERSION_NAME_LEN];
183183+177184 /*!
178185 * Number of elements in @ref itracks that are populated/valid.
179186 */