diff --git a/include/file.h b/include/file.h index 4c77060f..130c20d7 100644 --- a/include/file.h +++ b/include/file.h @@ -223,6 +223,7 @@ extern int ef_flush(int); extern void ef_blank(int, int, void *); extern int ef_write(int, int, void *); extern void ef_set_uid(int, void *, int); +extern int ef_typedstr_eq(struct ef_typedstr *, struct ef_typedstr *); extern int ef_extend(int, int); extern int ef_ensure_space(int, int, int); extern int ef_id_limit(int); diff --git a/src/lib/common/file.c b/src/lib/common/file.c index c3e07a1f..6a40a551 100644 --- a/src/lib/common/file.c +++ b/src/lib/common/file.c @@ -29,7 +29,7 @@ * Known contributors to this file: * Dave Pare, 1989 * Steve McClure, 2000 - * Markus Armbruster, 2005-2013 + * Markus Armbruster, 2005-2014 */ #include @@ -600,6 +600,19 @@ ef_set_uid(int type, void *buf, int uid) elt->seqno = get_seqno(ep, uid); } +/* + * Are *A and *B equal, except for timestamps and such? + */ +int +ef_typedstr_eq(struct ef_typedstr *a, struct ef_typedstr *b) +{ + return a->ef_type == b->ef_type + && a->seqno == b->seqno + && a->uid == b->uid + && !memcmp((char *)a + sizeof(*a), (char *)b + sizeof(*a), + empfile[a->ef_type].size - sizeof(*a)); +} + /* * Return sequence number of element ID in table EP. * Return zero if table is not EFF_TYPED (it has no sequence number diff --git a/src/lib/subs/check.c b/src/lib/subs/check.c index dfffad82..671847f4 100644 --- a/src/lib/subs/check.c +++ b/src/lib/subs/check.c @@ -28,7 +28,7 @@ * * Known contributors to this file: * Steve McClure, 1998 - * Markus Armbruster, 2004-2012 + * Markus Armbruster, 2004-2014 */ #include @@ -41,24 +41,15 @@ #include "prototypes.h" #include "xy.h" -/* Note that timestamps make things tricky. And, we don't - * really care about the timestamp, we just care about the rest - * of the structure. So, we make a copy, and zero the timestamps - * in both copies, and then compare. */ - static int obj_changed(struct empobj *obj) { - union empobj_storage old, tobj; - size_t sz; + union empobj_storage old; if (!get_empobj(obj->ef_type, obj->uid, &old)) return 0; - sz = empfile[obj->ef_type].size; - memcpy(&tobj, obj, sz); - old.gen.timestamp = tobj.gen.timestamp = 0; - old.gen.generation = tobj.gen.generation = 0; - if (memcmp(&tobj, &old, sz)) + if (!ef_typedstr_eq((struct ef_typedstr *)&old, + (struct ef_typedstr *)obj)) return 1; ef_mark_fresh(obj->ef_type, obj); return 0;