]> git.pond.sub.org Git - empserver/commitdiff
file: New ef_typedstr_eq(), factored out of obj_changed()
authorMarkus Armbruster <armbru@pond.sub.org>
Sun, 9 Feb 2014 16:26:44 +0000 (17:26 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 1 Feb 2015 15:53:00 +0000 (16:53 +0100)
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
include/file.h
src/lib/common/file.c
src/lib/subs/check.c

index 4c77060f9a7e0a3fdaabe81b5e26e63f4e74804d..130c20d7a60f780699407ba10f23bb52378bdee3 100644 (file)
@@ -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);
index c3e07a1f11e11eb77399198fbd9670623ff195ff..6a40a551a9b5e390143d3a4ca5709520c5a5d5ab 100644 (file)
@@ -29,7 +29,7 @@
  *  Known contributors to this file:
  *     Dave Pare, 1989
  *     Steve McClure, 2000
- *     Markus Armbruster, 2005-2013
+ *     Markus Armbruster, 2005-2014
  */
 
 #include <config.h>
@@ -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
index dfffad82b5d28dc94d461c1a4b949ca79d3ef3cc..671847f4c1b1a445cb5d004463f8c4bf156e1685 100644 (file)
@@ -28,7 +28,7 @@
  *
  *  Known contributors to this file:
  *     Steve McClure, 1998
- *     Markus Armbruster, 2004-2012
+ *     Markus Armbruster, 2004-2014
  */
 
 #include <config.h>
 #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;