Add exports file and abi checker for tdb tdb-1.1.5
authorSimo Sorce <idra@samba.org>
Mon, 15 Jun 2009 20:19:19 +0000 (16:19 -0400)
committerSimo Sorce <idra@samba.org>
Mon, 15 Jun 2009 20:31:12 +0000 (16:31 -0400)
This is a first attempt at exporting symbols only for public functions
We also provide a rudimentary ABI checker that tries to check that
function signatures are not changed by mistake.
Given our use of macros this is not an API checker.
It's all based on tdb.h contents and the gcc -aux-info option

lib/tdb/Makefile.in
lib/tdb/abi_checks.sh [new file with mode: 0755]
lib/tdb/configure.ac
lib/tdb/libtdb.m4
lib/tdb/rules.mk
lib/tdb/tdb.exports [new file with mode: 0644]
lib/tdb/tdb.signatures [new file with mode: 0644]

index df1b02be6a18398531d317c6cc655ce1246d4fc7..93bfe37f4f2089bf2d8d65b9ac0626ddec7f09fc 100644 (file)
@@ -33,6 +33,10 @@ tdbdir = @tdbdir@
 
 TDB_OBJ = @TDB_OBJ@ @LIBREPLACEOBJ@
 
+SONAMEFLAG = @SONAMEFLAG@
+VERSIONSCRIPT = @VERSIONSCRIPT@
+EXPORTSFILE = @EXPORTSFILE@
+
 default: all
 
 include $(tdbdir)/tdb.mk
@@ -42,7 +46,7 @@ all:: showflags dirs $(PROGS) $(TDB_SOLIB) libtdb.a $(PYTHON_BUILD_TARGET)
 
 install:: all
 $(TDB_SOLIB): $(TDB_OBJ)
-       $(SHLD) $(SHLD_FLAGS) -o $@ $(TDB_OBJ) @SONAMEFLAG@$(TDB_SONAME)
+       $(SHLD) $(SHLD_FLAGS) -o $@ $(TDB_OBJ) $(VERSIONSCRIPT) $(EXPORTSFILE) $(SONAMEFLAG)$(TDB_SONAME)
 
 shared-build: all
        ${INSTALLCMD} -d $(sharedbuilddir)/lib
@@ -60,6 +64,7 @@ installcheck:: test install
 
 clean::
        rm -f *.o *.a */*.o
+       rm -fr abi
 
 distclean:: clean
        rm -f config.log config.status include/config.h config.cache
diff --git a/lib/tdb/abi_checks.sh b/lib/tdb/abi_checks.sh
new file mode 100755 (executable)
index 0000000..042b0f3
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+make clean
+
+mkdir -p abi/common
+mkdir -p abi/tools
+ABI_CHECKS="-aux-info abi/\$@.X"
+make ABI_CHECK="$ABI_CHECKS" CC="/usr/bin/gcc"
+
+for i in abi/*/*.X; do cat $i | grep 'tdb\.h'; done | sort | uniq | awk -F "extern " '{ print $2 }' > abi/signatures
+grep '^extern' include/tdb.h | grep -v '"C"' | sort | uniq | awk -F "extern " '{ print $2 }' >> abi/signatures
+
+cat > abi/exports << EOF
+{
+    global:
+EOF
+#Functions
+cat abi/signatures | grep "(" | awk -F '(' '{ print $1 }' | awk -F ' ' '{ print "           "$NF";" }' | tr -d '*' | sort >> abi/exports
+#global vars
+cat abi/signatures | grep -v "(" | awk -F ';' '{print $1 }' | awk -F ' ' '{ print "           "$NF";" }' | tr -d '*' | sort >> abi/exports
+cat >> abi/exports << EOF
+
+    local: *;
+};
+EOF
+
+diff -u tdb.signatures abi/signatures
+if [ "$?" != "0" ]; then
+    echo "WARNING: Possible ABI Change!!"
+fi
+
+diff -u tdb.exports abi/exports
+if [ "$?" != "0" ]; then
+    echo "WARNING: Export file may be outdated!!"
+fi
index e00f08af70ac1f26adc0a2612f8cdcb6ae6373b2..e5bd9f6c35ad8a9563fa872f7c0db34959468e76 100644 (file)
@@ -2,11 +2,12 @@ AC_PREREQ(2.50)
 AC_DEFUN([SMB_MODULE_DEFAULT], [echo -n ""])
 AC_DEFUN([SMB_LIBRARY_ENABLE], [echo -n ""])
 AC_DEFUN([SMB_ENABLE], [echo -n ""])
-AC_INIT(tdb, 1.1.4)
+AC_INIT(tdb, 1.1.5)
 AC_CONFIG_SRCDIR([common/tdb.c])
 AC_CONFIG_HEADER(include/config.h)
 AC_LIBREPLACE_ALL_CHECKS
 AC_LD_SONAMEFLAG
+AC_LD_VERSIONSCRIPT
 AC_LD_PICFLAG
 AC_LD_SHLIBEXT
 AC_LIBREPLACE_SHLD
index 252e0b0be30b929adcd2f82275119bac81e6b211..f5ed012a80f4f42f8c15f70b6922c550e9c4488d 100644 (file)
@@ -28,3 +28,8 @@ AC_CHECK_HEADERS(getopt.h sys/select.h sys/time.h)
 
 AC_HAVE_DECL(pread, [#include <unistd.h>])
 AC_HAVE_DECL(pwrite, [#include <unistd.h>])
+
+if test x"$VERSIONSCRIPT" != "x"; then
+    EXPORTSFILE=tdb.exports
+    AC_SUBST(EXPORTSFILE)
+fi
index 7b765625dfc292aecd84d4269174e3228789ef8b..73ab771c5c2ef9ff2d2015279d52724e0e4118d2 100644 (file)
@@ -15,7 +15,7 @@ showflags::
 .c.o:
        @echo Compiling $*.c
        @mkdir -p `dirname $@`
-       @$(CC) $(PICFLAG) $(CFLAGS) -c $< -o $@
+       @$(CC) $(PICFLAG) $(CFLAGS) $(ABI_CHECK) -c $< -o $@
 
 distclean::
        rm -f *~ */*~
diff --git a/lib/tdb/tdb.exports b/lib/tdb/tdb.exports
new file mode 100644 (file)
index 0000000..f3dcd15
--- /dev/null
@@ -0,0 +1,64 @@
+{
+    global:
+           tdb_add_flags;
+           tdb_append;
+           tdb_chainlock;
+           tdb_chainlock_mark;
+           tdb_chainlock_nonblock;
+           tdb_chainlock_read;
+           tdb_chainlock_unmark;
+           tdb_chainunlock;
+           tdb_chainunlock_read;
+           tdb_close;
+           tdb_delete;
+           tdb_dump_all;
+           tdb_enable_seqnum;
+           tdb_error;
+           tdb_errorstr;
+           tdb_exists;
+           tdb_fd;
+           tdb_fetch;
+           tdb_firstkey;
+           tdb_freelist_size;
+           tdb_get_flags;
+           tdb_get_logging_private;
+           tdb_get_seqnum;
+           tdb_hash_size;
+           tdb_increment_seqnum_nonblock;
+           tdb_lockall;
+           tdb_lockall_mark;
+           tdb_lockall_nonblock;
+           tdb_lockall_read;
+           tdb_lockall_read_nonblock;
+           tdb_lockall_unmark;
+           tdb_log_fn;
+           tdb_map_size;
+           tdb_name;
+           tdb_nextkey;
+           tdb_open;
+           tdb_open_ex;
+           tdb_parse_record;
+           tdb_printfreelist;
+           tdb_remove_flags;
+           tdb_reopen;
+           tdb_reopen_all;
+           tdb_repack;
+           tdb_setalarm_sigptr;
+           tdb_set_logging_function;
+           tdb_set_max_dead;
+           tdb_store;
+           tdb_transaction_cancel;
+           tdb_transaction_commit;
+           tdb_transaction_prepare_commit;
+           tdb_transaction_recover;
+           tdb_transaction_start;
+           tdb_traverse;
+           tdb_traverse_read;
+           tdb_unlockall;
+           tdb_unlockall_read;
+           tdb_validate_freelist;
+           tdb_wipe_all;
+           tdb_null;
+
+    local: *;
+};
diff --git a/lib/tdb/tdb.signatures b/lib/tdb/tdb.signatures
new file mode 100644 (file)
index 0000000..12e0b24
--- /dev/null
@@ -0,0 +1,59 @@
+int tdb_reopen (struct tdb_context *);
+int tdb_reopen_all (int);
+void tdb_set_logging_function (struct tdb_context *, const struct tdb_logging_context *);
+enum TDB_ERROR tdb_error (struct tdb_context *);
+const char *tdb_errorstr (struct tdb_context *);
+TDB_DATA tdb_fetch (struct tdb_context *, TDB_DATA);
+int tdb_parse_record (struct tdb_context *, TDB_DATA, int (*) (TDB_DATA, TDB_DATA, void *), void *);
+int tdb_delete (struct tdb_context *, TDB_DATA);
+int tdb_store (struct tdb_context *, TDB_DATA, TDB_DATA, int);
+int tdb_append (struct tdb_context *, TDB_DATA, TDB_DATA);
+int tdb_close (struct tdb_context *);
+TDB_DATA tdb_firstkey (struct tdb_context *);
+TDB_DATA tdb_nextkey (struct tdb_context *, TDB_DATA);
+int tdb_traverse (struct tdb_context *, tdb_traverse_func, void *);
+int tdb_traverse_read (struct tdb_context *, tdb_traverse_func, void *);
+int tdb_exists (struct tdb_context *, TDB_DATA);
+int tdb_lockall (struct tdb_context *);
+int tdb_lockall_nonblock (struct tdb_context *);
+int tdb_unlockall (struct tdb_context *);
+int tdb_lockall_read (struct tdb_context *);
+int tdb_lockall_read_nonblock (struct tdb_context *);
+int tdb_unlockall_read (struct tdb_context *);
+int tdb_lockall_mark (struct tdb_context *);
+int tdb_lockall_unmark (struct tdb_context *);
+const char *tdb_name (struct tdb_context *);
+int tdb_fd (struct tdb_context *);
+tdb_log_func tdb_log_fn (struct tdb_context *);
+void *tdb_get_logging_private (struct tdb_context *);
+int tdb_transaction_start (struct tdb_context *);
+int tdb_transaction_prepare_commit (struct tdb_context *);
+int tdb_transaction_commit (struct tdb_context *);
+int tdb_transaction_cancel (struct tdb_context *);
+int tdb_transaction_recover (struct tdb_context *);
+int tdb_get_seqnum (struct tdb_context *);
+int tdb_hash_size (struct tdb_context *);
+size_t tdb_map_size (struct tdb_context *);
+int tdb_get_flags (struct tdb_context *);
+void tdb_add_flags (struct tdb_context *, unsigned int);
+void tdb_remove_flags (struct tdb_context *, unsigned int);
+void tdb_enable_seqnum (struct tdb_context *);
+void tdb_increment_seqnum_nonblock (struct tdb_context *);
+int tdb_chainlock (struct tdb_context *, TDB_DATA);
+int tdb_chainlock_nonblock (struct tdb_context *, TDB_DATA);
+int tdb_chainunlock (struct tdb_context *, TDB_DATA);
+int tdb_chainlock_read (struct tdb_context *, TDB_DATA);
+int tdb_chainunlock_read (struct tdb_context *, TDB_DATA);
+int tdb_chainlock_mark (struct tdb_context *, TDB_DATA);
+int tdb_chainlock_unmark (struct tdb_context *, TDB_DATA);
+void tdb_setalarm_sigptr (struct tdb_context *, volatile sig_atomic_t *);
+int tdb_wipe_all (struct tdb_context *);
+int tdb_repack (struct tdb_context *);
+void tdb_dump_all (struct tdb_context *);
+int tdb_printfreelist (struct tdb_context *);
+int tdb_validate_freelist (struct tdb_context *, int *);
+int tdb_freelist_size (struct tdb_context *);
+struct tdb_context *tdb_open (const char *, int, int, int, mode_t);
+struct tdb_context *tdb_open_ex (const char *, int, int, int, mode_t, const struct tdb_logging_context *, tdb_hash_func);
+void tdb_set_max_dead (struct tdb_context *, int);
+TDB_DATA tdb_null;