commit 1e9522c61c7a544d59db32cb7fbbd42e6793d848 Author: Florian Weimer Date: Thu Oct 5 18:14:27 2017 +0200 nscd: Eliminate compilation time dependency in the build output Reviewed-by: Carlos O'Donell diff --git a/nscd/nscd_stat.c b/nscd/nscd_stat.c index d7d351c663fa6fe6..27b914aa712e7b8d 100644 --- a/nscd/nscd_stat.c +++ b/nscd/nscd_stat.c @@ -35,9 +35,23 @@ # include #endif /* HAVE_SELINUX */ +/* We use this to make sure the receiver is the same. The lower 16 + bits are reserved for flags indicating compilation variants. This + version needs to be updated if the definition of struct statdata + changes. */ +#define STATDATA_VERSION 0x01020000U -/* We use this to make sure the receiver is the same. */ -static const char compilation[21] = __DATE__ " " __TIME__; +#ifdef HAVE_SELINUX +# define STATDATA_VERSION_SELINUX_FLAG 0x0001U +#else +# define STATDATA_VERSION_SELINUX_FLAG 0x0000U +#endif + +/* All flags affecting the struct statdata layout. */ +#define STATDATA_VERSION_FLAGS STATDATA_VERSION_SELINUX_FLAG + +/* The full version number for struct statdata. */ +#define STATDATA_VERSION_FULL (STATDATA_VERSION | STATDATA_VERSION_FLAGS) /* Statistic data for one database. */ struct dbstat @@ -68,10 +82,11 @@ struct dbstat uintmax_t addfailed; }; -/* Record for transmitting statistics. */ +/* Record for transmitting statistics. If this definition changes, + update STATDATA_VERSION above. */ struct statdata { - char version[sizeof (compilation)]; + unsigned int version; /* Must be STATDATA_VERSION_FULL. */ int debug_level; time_t runtime; unsigned long int client_queued; @@ -96,7 +111,7 @@ send_stats (int fd, struct database_dyn dbs[lastdb]) memset (&data, 0, sizeof (data)); - memcpy (data.version, compilation, sizeof (compilation)); + data.version = STATDATA_VERSION_FULL; data.debug_level = debug_level; data.runtime = time (NULL) - start_time; data.client_queued = client_queued; @@ -196,7 +211,7 @@ receive_print_stats (void) /* Read as much data as we expect. */ if (TEMP_FAILURE_RETRY (read (fd, &data, sizeof (data))) != sizeof (data) - || (memcmp (data.version, compilation, sizeof (compilation)) != 0 + || (data.version != STATDATA_VERSION_FULL /* Yes, this is an assignment! */ && (errno = EINVAL))) {