summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2010-03-26 00:17:32 +0000
committerColin Watson <cjwatson@debian.org>2010-03-26 00:17:32 +0000
commit4c64fd44d547f7bb1889f7bfbde958e09f1e89d6 (patch)
tree4015eacc96e8c762a3a6e0ea5f0aacde82ac69c3
parent15bf47572c6b9b4fb095cb18ff0a01a1cb29db98 (diff)
Convert to source format 3.0 (quilt) and DEP-3 patch tagging.
-rw-r--r--.gitignore1
-rw-r--r--debian/changelog6
-rw-r--r--debian/patches/build-outside-glibc.patch105
-rw-r--r--debian/patches/db_dump185.patch1353
-rw-r--r--debian/patches/libc-symbols.patch101
-rw-r--r--debian/patches/pmt-compat.patch21
-rw-r--r--debian/patches/series5
-rw-r--r--debian/patches/weak-alias.patch22
-rw-r--r--debian/source/format1
9 files changed, 1615 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index 66b772b..55f5fe8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,5 +15,6 @@
.*.swp
.DS_store
# The contents of the svn:ignoreproperty on the branch root.
+.pc
*.os
libdb1.so.*
diff --git a/debian/changelog b/debian/changelog
index 5509184..efd2f5f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+db1-compat (2.1.3-13) UNRELEASED; urgency=low
+
+ * Convert to source format 3.0 (quilt) and DEP-3 patch tagging.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 26 Mar 2010 00:15:07 +0000
+
db1-compat (2.1.3-12) unstable; urgency=low
* Link with -z combreloc, not -z -combreloc (closes: #557075).
diff --git a/debian/patches/build-outside-glibc.patch b/debian/patches/build-outside-glibc.patch
new file mode 100644
index 0000000..7df7f12
--- /dev/null
+++ b/debian/patches/build-outside-glibc.patch
@@ -0,0 +1,105 @@
+Description: Modify build system to work outside glibc
+Author: Colin Watson <cjwatson@debian.org>
+Forwarded: no
+Last-Update: 2010-03-26
+
+Index: b/Makefile
+===================================================================
+--- a/Makefile
++++ b/Makefile
+@@ -20,54 +20,24 @@
+ rec_close rec_delete rec_get rec_open rec_put rec_search \
+ rec_seq rec_utils
+
+-db1-headers := db.h mpool.h ndbm.h
+-distribute := compat.h \
+- btree/btree.h btree/extern.h \
+- hash/extern.h hash/hash.h hash/page.h \
+- recno/extern.h recno/recno.h \
+- $(db1-headers)
+-
+-include ../Makeconfig
+-
+-install-others := $(db1-headers:%=$(inst_includedir)/db1/%)
+-
+-ifeq (yes,$(build-shared))
+-install-others += $(inst_slibdir)/libdb.so$(libdb1.so-version)
+-endif
+-
+-$(inst_slibdir)/libdb.so$(libdb1.so-version): $(inst_slibdir)/libdb1-$(version).so $(+force)
+- rm -f $@
+- $(LN_S) $(<F) $@
+-
+-$(db1-headers:%=$(inst_includedir)/db1/%): $(inst_includedir)/db1/%: % $(+force)
+- $(do-install)
+-
+-include ../Rules
+-
+-CPPFLAGS += -D__DBINTERFACE_PRIVATE -DUSE_LIBDB1
+-
+-# This file defines some static functions for alternative hash algorithms
+-# that are not actually used.
+-CFLAGS-hash_func.c := -Wno-unused
+-
+-# The db code outsmarts the compiler frequently.
+-override CFLAGS += -Wno-uninitialized
+-
+-# Force the soname to be libdb.so for compatibility.
+-LDFLAGS-db1.so = -Wl,-soname=lib$(libprefix)db.so$($(@F)-version)
+-
+-# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
+-# This ensures they will load libc.so for needed symbols if loaded by
+-# a statically-linked program that hasn't already loaded it.
+-$(objpfx)libdb1.so: $(objpfx)libdb1_pic.a $(+preinit) $(+postinit) $(+interp) \
+- $(common-objpfx)libc.so
+-
+-#subdir_install: $(inst_libdir)/libndbm.a
+-#$(inst_libdir)/libndbm.a: $(inst_libdir)/libdb1.a $(+force)
+-# $(make-link)
+-#
+-#ifeq ($(build-shared),yes)
+-#subdir_install: $(inst_libdir)/libndbm.so
+-#$(inst_libdir)/libndbm.so: $(inst_libdir)/libdb1.so $(+force)
+-# $(make-link)
+-#endif
++CFLAGS ?= -O2
++CPPFLAGS += -I. -D_REENTRANT -D__DBINTERFACE_PRIVATE -DUSE_LIBDB1
++CPPFLAGS += -D_GNU_SOURCE
++libdb.so-version=.2
++
++all: libdb1.so$(libdb.so-version)
++
++%.o: %.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) -c -g -o $@ $<
++%.os: %.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) -c -fPIC -o $@ $<
++
++libdb1.so$(libdb.so-version): $(patsubst %,%.os,$(libdb1-routines))
++ $(CC) -Wl,-O1 -Wl,--version-script=Versions -Wl,-z,combreloc \
++ -Wl,-soname=libdb.so$(libdb.so-version) \
++ -shared -o $@ $^ /usr/lib/libc.so
++
++clean:
++ rm -f $(patsubst %,%.o,$(libdb1-routines))
++ rm -f $(patsubst %,%.os,$(libdb1-routines))
++ rm -f libdb1.so$(libdb.so-version) *~
+Index: b/Versions
+===================================================================
+--- a/Versions
++++ b/Versions
+@@ -1,10 +1,11 @@
+-libdb1 {
+- GLIBC_2.0 {
++GLIBC_2.0 {
++ global:
+ # the real DB entry point.
+ dbopen; __dbopen;
+
+ # The compatibility functions.
+ dbm_clearerr; dbm_close; dbm_delete; dbm_dirfno; dbm_error;
+ dbm_fetch; dbm_firstkey; dbm_nextkey; dbm_open; dbm_store;
+- }
+-}
++ local:
++ *;
++};
diff --git a/debian/patches/db_dump185.patch b/debian/patches/db_dump185.patch
new file mode 100644
index 0000000..a2249ba
--- /dev/null
+++ b/debian/patches/db_dump185.patch
@@ -0,0 +1,1353 @@
+Description: Add db_dump185 utility
+ This provides dump compatibility with legacy database files.
+Author: Julian Gilbey <jdg@debian.org>
+Bug-Debian: http://bugs.debian.org/353637
+Forwarded: no
+Last-Update: 2010-03-26
+
+Index: b/Makefile
+===================================================================
+--- a/Makefile
++++ b/Makefile
+@@ -25,7 +25,7 @@
+ CPPFLAGS += -D_GNU_SOURCE
+ libdb.so-version=.2
+
+-all: libdb1.so$(libdb.so-version)
++all: libdb1.so$(libdb.so-version) db_dump185/db_dump185
+
+ %.o: %.c
+ $(CC) $(CPPFLAGS) $(CFLAGS) -c -g -o $@ $<
+@@ -37,7 +37,11 @@
+ -Wl,-soname=libdb.so$(libdb.so-version) \
+ -shared -o $@ $^ /usr/lib/libc.so
+
++db_dump185/db_dump185: db_dump185/db_dump185.c libdb1.so$(libdb.so-version)
++ $(CC) -I. -o $@ $< libdb1.so$(libdb.so-version)
++
+ clean:
+ rm -f $(patsubst %,%.o,$(libdb1-routines))
+ rm -f $(patsubst %,%.os,$(libdb1-routines))
+ rm -f libdb1.so$(libdb.so-version) *~
++ rm -f db_dump185/db_dump185
+Index: b/db_dump185/db_dump185.1
+===================================================================
+--- /dev/null
++++ b/db_dump185/db_dump185.1
+@@ -0,0 +1,956 @@
++.ds TYPE C
++.\"
++.\" See the file LICENSE for redistribution information.
++.\"
++.\" Copyright (c) 1996, 1997, 1998
++.\" Sleepycat Software. All rights reserved.
++.\"
++.\" @(#)db_dump.so 10.10 (Sleepycat) 4/10/98
++.\"
++.\"
++.\" See the file LICENSE for redistribution information.
++.\"
++.\" Copyright (c) 1997, 1998
++.\" Sleepycat Software. All rights reserved.
++.\"
++.\" @(#)macros.so 10.45 (Sleepycat) 5/4/98
++.\"
++.\" This manpage was originally for db_dump from a later version of
++.\" the DB, so many of these initial macros are now defunct. (jdg, 2/06)
++.\"
++.\" We don't want hyphenation for any HTML documents.
++.if !d HTML .ds HTML
++.ie '\*[HTML]'YES'\{\
++.de Hy
++..
++.de Nh
++..
++.nh
++\}
++.el\{\
++.de Hy
++.hy
++..
++.de Nh
++.nh
++..
++\}
++.\" The alternative text macro
++.\" This macro takes two arguments:
++.\" + the text produced if this is a "C" manpage
++.\" + the text produced if this is a "CXX" or "JAVA" manpage
++.\"
++.de Al
++.ie '\*[TYPE]'C'\{\\$1
++\}
++.el\{\\$2
++\}
++..
++.\" Scoped name macro.
++.\" Produces a_b, a::b, a.b depending on language
++.\" This macro takes two arguments:
++.\" + the class or prefix (without underscore)
++.\" + the name within the class or following the prefix
++.de Sc
++.ie '\*[TYPE]'C'\{\\$1_\\$2
++\}
++.el\{\
++.ie '\*[TYPE]'CXX'\{\\$1::\\$2
++\}
++.el\{\\$1.\\$2
++\}
++\}
++..
++.\" Scoped name for Java.
++.\" Produces Db.b, for Java, otherwise just b. This macro is used for
++.\" constants that must be scoped in Java, but are global otherwise.
++.\" This macro takes two arguments:
++.\" + the class
++.\" + the name within the class or following the prefix
++.de Sj
++.ie '\*[TYPE]'JAVA'\{\
++.TP 5
++Db.\\$1\}
++.el\{\
++.TP 5
++\\$1\}
++..
++.\" The general information text macro.
++.de Gn
++.ie '\*[TYPE]'C'\{The DB library is a family of groups of functions that provides a modular
++programming interface to transactions and record-oriented file access.
++The library includes support for transactions, locking, logging and file
++page caching, as well as various indexed access methods.
++Many of the functional groups (e.g., the file page caching functions)
++are useful independent of the other DB functions,
++although some functional groups are explicitly based on other functional
++groups (e.g., transactions and logging).
++\}
++.el\{The DB library is a family of classes that provides a modular
++programming interface to transactions and record-oriented file access.
++The library includes support for transactions, locking, logging and file
++page caching, as well as various indexed access methods.
++Many of the classes (e.g., the file page caching class)
++are useful independent of the other DB classes,
++although some classes are explicitly based on other classes
++(e.g., transactions and logging).
++\}
++..
++.\" The library error macro, the local error macro.
++.\" These macros take one argument:
++.\" + the function name.
++.de Ee
++The
++.I \\$1
++.ie '\*[TYPE]'C'\{function may fail and return
++.I errno
++\}
++.el\{method may fail and throw a
++.IR DbException (3)
++.if '\*[TYPE]'CXX'\{
++or return
++.I errno
++\}
++\}
++for any of the errors specified for the following DB and library functions:
++..
++.de Ec
++In addition, the
++.I \\$1
++.ie '\*[TYPE]'C'\{function may fail and return
++.I errno
++\}
++.el\{method may fail and throw a
++.IR DbException (3)
++.ie '\*[TYPE]'CXX'\{or return
++.I errno
++\}
++.el\{encapsulating an
++.I errno
++\}
++\}
++for the following conditions:
++..
++.de Ea
++[EAGAIN]
++A lock was unavailable.
++..
++.de Eb
++[EBUSY]
++The shared memory region was in use and the force flag was not set.
++..
++.de Em
++[EAGAIN]
++The shared memory region was locked and (repeatedly) unavailable.
++..
++.de Ei
++[EINVAL]
++An invalid flag value or parameter was specified.
++..
++.de Es
++[EACCES]
++An attempt was made to modify a read-only database.
++..
++.de Et
++The DB_THREAD flag was specified and spinlocks are not implemented for
++this architecture.
++..
++.de Ep
++[EPERM]
++Database corruption was detected.
++All subsequent database calls (other than
++.ie '\*[TYPE]'C'\{\
++.IR DB->close )
++\}
++.el\{\
++.IR Db::close )
++\}
++will return EPERM.
++..
++.de Ek
++.if '\*[TYPE]'CXX'\{\
++Methods marked as returning
++.I errno
++will, by default, throw an exception that encapsulates the error information.
++The default error behavior can be changed, see
++.IR DbException (3).
++\}
++..
++.\" The SEE ALSO text macro
++.de Sa
++.nh
++.na
++.IR db_archive (1),
++.IR db_checkpoint (1),
++.IR db_deadlock (1),
++.IR db_dump (1),
++.IR db_load (1),
++.IR db_recover (1),
++.IR db_stat (1).
++(Note that on Debian systems, some of these manpages and programs have
++been renamed to things like
++.B db4.3_stat
++to distinguish between the multiple DB versions.)
++.ad
++.Hy
++..
++.\" The function header macro.
++.\" This macro takes one argument:
++.\" + the function name.
++.de Fn
++.in 2
++.I \\$1
++.in
++..
++.\" The XXX_open function text macro, for merged create/open calls.
++.\" This macro takes two arguments:
++.\" + the interface, e.g., "transaction region"
++.\" + the prefix, e.g., "txn" (or the class name for C++, e.g., "DbTxn")
++.de Co
++.ie '\*[TYPE]'C'\{\
++.Fn \\$2_open
++The
++.I \\$2_open
++function copies a pointer, to the \\$1 identified by the
++.B directory
++.IR dir ,
++into the memory location referenced by
++.IR regionp .
++.PP
++If the
++.I dbenv
++argument to
++.I \\$2_open
++was initialized using
++.IR db_appinit ,
++.I dir
++is interpreted as described by
++.IR db_appinit (3).
++\}
++.el\{\
++.Fn \\$2::open
++The
++.I \\$2::open
++.ie '\*[TYPE]'CXX'\{\
++method copies a pointer, to the \\$1 identified by the
++.B directory
++.IR dir ,
++into the memory location referenced by
++.IR regionp .
++\}
++.el\{\
++method returns a \\$1 identified by the
++.B directory
++.IR dir .
++\}
++.PP
++If the
++.I dbenv
++argument to
++.I \\$2::open
++was initialized using
++.IR DbEnv::appinit ,
++.I dir
++is interpreted as described by
++.IR DbEnv (3).
++\}
++.PP
++Otherwise,
++if
++.I dir
++is not NULL,
++it is interpreted relative to the current working directory of the process.
++If
++.I dir
++is NULL,
++the following environment variables are checked in order:
++``TMPDIR'', ``TEMP'', and ``TMP''.
++If one of them is set,
++\\$1 files are created relative to the directory it specifies.
++If none of them are set, the first possible one of the following
++directories is used:
++.IR /var/tmp ,
++.IR /usr/tmp ,
++.IR /temp ,
++.IR /tmp ,
++.I C:/temp
++and
++.IR C:/tmp .
++.PP
++All files associated with the \\$1 are created in this directory.
++This directory must already exist when
++.ie '\*[TYPE]'C'\{
++\\$1_open
++\}
++.el\{\
++\\$2::open
++\}
++is called.
++If the \\$1 already exists,
++the process must have permission to read and write the existing files.
++If the \\$1 does not already exist,
++it is optionally created and initialized.
++..
++.\" The common close language macro, for discarding created regions
++.\" This macro takes one argument:
++.\" + the function prefix, e.g., txn (the class name for C++, e.g., DbTxn)
++.de Cc
++In addition, if the
++.I dir
++argument to
++.ie '\*[TYPE]'C'\{\
++.ds Va db_appinit
++.ds Vo \\$1_open
++.ds Vu \\$1_unlink
++\}
++.el\{\
++.ds Va DbEnv::appinit
++.ds Vo \\$1::open
++.ds Vu \\$1::unlink
++\}
++.I \\*(Vo
++was NULL
++and
++.I dbenv
++was not initialized using
++.IR \\*(Va ,
++.if '\\$1'memp'\{\
++or the DB_MPOOL_PRIVATE flag was set,
++\}
++all files created for this shared region will be removed,
++as if
++.I \\*(Vu
++were called.
++.rm Va
++.rm Vo
++.rm Vu
++..
++.\" The DB_ENV information macro.
++.\" This macro takes two arguments:
++.\" + the function called to open, e.g., "txn_open"
++.\" + the function called to close, e.g., "txn_close"
++.de En
++.ie '\*[TYPE]'C'\{\
++based on the
++.I dbenv
++argument to
++.IR \\$1 ,
++which is a pointer to a structure of type DB_ENV (typedef'd in <db.h>).
++Applications will normally use the same DB_ENV structure (initialized
++by
++.IR db_appinit (3)),
++as an argument to all of the subsystems in the DB package.
++.PP
++References to the DB_ENV structure are maintained by DB,
++so it may not be discarded until the last close function,
++corresponding to an open function for which it was an argument,
++has returned.
++In order to ensure compatibility with future releases of DB, all fields of
++the DB_ENV structure that are not explicitly set should be initialized to 0
++before the first time the structure is used.
++Do this by declaring the structure external or static, or by calling the C
++library routine
++.IR bzero (3)
++or
++.IR memset (3).
++.PP
++The fields of the DB_ENV structure used by
++.I \\$1
++are described below.
++.if '\*[TYPE]'CXX'\{\
++As references to the DB_ENV structure may be maintained by
++.IR \\$1 ,
++it is necessary that the DB_ENV structure and memory it references be valid
++until the
++.I \\$2
++function is called.
++\}
++.ie '\\$1'db_appinit'\{The
++.I dbenv
++argument may not be NULL.
++If any of the fields of the
++.I dbenv
++are set to 0,
++defaults appropriate for the system are used where possible.
++\}
++.el\{If
++.I dbenv
++is NULL
++or any of its fields are set to 0,
++defaults appropriate for the system are used where possible.
++\}
++.PP
++The following fields in the DB_ENV structure may be initialized before calling
++.IR \\$1 :
++\}
++.el\{\
++based on which set methods have been used.
++It is expected that applications will use a single DbEnv object as the
++argument to all of the subsystems in the DB package.
++The fields of the DbEnv object used by
++.I \\$1
++are described below.
++As references to the DbEnv object may be maintained by
++.IR \\$1 ,
++it is necessary that the DbEnv object and memory it references be valid
++until the object is destroyed.
++.ie '\\$1'appinit'\{\
++The
++.I dbenv
++argument may not be NULL.
++If any of the fields of the
++.I dbenv
++are set to 0,
++defaults appropriate for the system are used where possible.
++\}
++.el\{\
++Any of the DbEnv fields that are not explicitly set will default to
++appropriate values.
++\}
++.PP
++The following fields in the DbEnv object may be initialized, using the
++appropriate set method, before calling
++.IR \\$1 :
++\}
++..
++.\" The DB_ENV common fields macros.
++.de Se
++.if '\*[TYPE]'JAVA'\{\
++.TP 5
++DbErrcall db_errcall;
++.ns
++.TP 5
++String db_errpfx;
++.ns
++.TP 5
++int db_verbose;
++The error fields of the DbEnv behave as described for
++.IR DbEnv (3).
++\}
++.ie '\*[TYPE]'CXX'\{\
++.TP 5
++void *(*db_errcall)(char *db_errpfx, char *buffer);
++.ns
++.TP 5
++FILE *db_errfile;
++.ns
++.TP 5
++const char *db_errpfx;
++.ns
++.TP 5
++class ostream *db_error_stream;
++.ns
++.TP 5
++int db_verbose;
++The error fields of the DbEnv behave as described for
++.IR DbEnv (3).
++\}
++.el\{\
++void *(*db_errcall)(char *db_errpfx, char *buffer);
++.ns
++.TP 5
++FILE *db_errfile;
++.ns
++.TP 5
++const char *db_errpfx;
++.ns
++.TP 5
++int db_verbose;
++The error fields of the DB_ENV behave as described for
++.IR db_appinit (3).
++.sp
++\}
++..
++.\" The open flags.
++.de Fm
++The
++.I flags
++and
++.I mode
++arguments specify how files will be opened and/or created when they
++don't already exist.
++The flags value is specified by
++.BR or 'ing
++together one or more of the following values:
++.Sj DB_CREATE
++Create any underlying files, as necessary.
++If the files do not already exist and the DB_CREATE flag is not specified,
++the call will fail.
++..
++.\" DB_THREAD open flag macro.
++.\" This macro takes two arguments:
++.\" + the open function name
++.\" + the object it returns.
++.de Ft
++.TP 5
++.Sj DB_THREAD
++Cause the \\$2 handle returned by the
++.I \\$1
++.Al function method
++to be useable by multiple threads within a single address space,
++i.e., to be ``free-threaded''.
++.if '\*[TYPE]'JAVA'\{\
++Threading is assumed in the Java API,
++so no special flags are required,
++and DB functions will always behave as if the DB_THREAD flag was specified.
++\}
++..
++.\" The mode macro.
++.\" This macro takes one argument:
++.\" + the subsystem name.
++.de Mo
++All files created by the \\$1 are created with mode
++.I mode
++(as described in
++.IR chmod (2))
++and modified by the process' umask value at the time of creation (see
++.IR umask (2)).
++The group ownership of created files is based on the system and directory
++defaults, and is not further specified by DB.
++..
++.\" The application exits macro.
++.\" This macro takes one argument:
++.\" + the application name.
++.de Ex
++The
++.I \\$1
++utility exits 0 on success, and >0 if an error occurs.
++..
++.\" The application -h section.
++.\" This macro takes one argument:
++.\" + the application name
++.de Dh
++DB_HOME
++If the
++.B \-h
++option is not specified and the environment variable
++.I DB_HOME
++is set, it is used as the path of the database home, as described in
++.IR db_appinit (3).
++..
++.\" The function DB_HOME ENVIRONMENT VARIABLES section.
++.\" This macro takes one argument:
++.\" + the open function name
++.de Eh
++DB_HOME
++If the
++.I dbenv
++argument to
++.I \\$1
++was initialized using
++.IR db_appinit ,
++the environment variable DB_HOME may be used as the path of the database
++home for the interpretation of the
++.I dir
++argument to
++.IR \\$1 ,
++as described in
++.IR db_appinit (3).
++.if \\n(.$>1 \{Specifically,
++.I \\$1
++is affected by the configuration string value of \\$2.\}
++..
++.\" The function TMPDIR ENVIRONMENT VARIABLES section.
++.\" This macro takes two arguments:
++.\" + the interface, e.g., "transaction region"
++.\" + the prefix, e.g., "txn" (or the class name for C++, e.g., "DbTxn")
++.de Ev
++TMPDIR
++If the
++.I dbenv
++argument to
++.ie '\*[TYPE]'C'\{\
++.ds Vo \\$2_open
++\}
++.el\{\
++.ds Vo \\$2::open
++\}
++.I \\*(Vo
++was NULL or not initialized using
++.IR db_appinit ,
++the environment variable TMPDIR may be used as the directory in which to
++create the \\$1,
++as described in the
++.I \\*(Vo
++section above.
++.rm Vo
++..
++.\" The unused flags macro.
++.de Fl
++The
++.I flags
++parameter is currently unused, and must be set to 0.
++..
++.\" The no-space TP macro.
++.de Nt
++.br
++.ns
++.TP 5
++..
++.\" The return values of the functions macros.
++.\" Rc is the standard two-value return with a suffix for more values.
++.\" Ro is the standard two-value return but there were previous values.
++.\" Rt is the standard two-value return, returning errno, 0, or < 0.
++.\" These macros take one argument:
++.\" + the routine name
++.de Rc
++The
++.I \\$1
++.ie '\*[TYPE]'C'\{function returns the value of
++.I errno
++on failure,
++0 on success,
++\}
++.el\{method throws a
++.IR DbException (3)
++.ie '\*[TYPE]'CXX'\{or returns the value of
++.I errno
++on failure,
++0 on success,
++\}
++.el\{that encapsulates an
++.I errno
++on failure,
++\}
++\}
++..
++.de Ro
++Otherwise, the
++.I \\$1
++.ie '\*[TYPE]'C'\{function returns the value of
++.I errno
++on failure and 0 on success.
++\}
++.el\{method throws a
++.IR DbException (3)
++.ie '\*[TYPE]'CXX'\{or returns the value of
++.I errno
++on failure and 0 on success.
++\}
++.el\{that encapsulates an
++.I errno
++on failure,
++\}
++\}
++..
++.de Rt
++The
++.I \\$1
++.ie '\*[TYPE]'C'\{function returns the value of
++.I errno
++on failure and 0 on success.
++\}
++.el\{method throws a
++.IR DbException (3)
++.ie '\*[TYPE]'CXX'\{or returns the value of
++.I errno
++on failure and 0 on success.
++\}
++.el\{that encapsulates an
++.I errno
++on failure.
++\}
++\}
++..
++.\" The TXN id macro.
++.de Tx
++.IP
++If the file is being accessed under transaction protection,
++the
++.I txnid
++parameter is a transaction ID returned from
++.IR txn_begin ,
++otherwise, NULL.
++..
++.\" The XXX_unlink function text macro.
++.\" This macro takes two arguments:
++.\" + the interface, e.g., "transaction region"
++.\" + the prefix (for C++, this is the class name)
++.de Un
++.ie '\*[TYPE]'C'\{\
++.ds Va db_appinit
++.ds Vc \\$2_close
++.ds Vo \\$2_open
++.ds Vu \\$2_unlink
++\}
++.el\{\
++.ds Va DbEnv::appinit
++.ds Vc \\$2::close
++.ds Vo \\$2::open
++.ds Vu \\$2::unlink
++\}
++.Fn \\*(Vu
++The
++.I \\*(Vu
++.Al function method
++destroys the \\$1 identified by the directory
++.IR dir ,
++removing all files used to implement the \\$1.
++.ie '\\$2'log' \{(The log files themselves and the directory
++.I dir
++are not removed.)\}
++.el \{(The directory
++.I dir
++is not removed.)\}
++If there are processes that have called
++.I \\*(Vo
++without calling
++.I \\*(Vc
++(i.e., there are processes currently using the \\$1),
++.I \\*(Vu
++will fail without further action,
++unless the force flag is set,
++in which case
++.I \\*(Vu
++will attempt to remove the \\$1 files regardless of any processes
++still using the \\$1.
++.PP
++The result of attempting to forcibly destroy the region when a process
++has the region open is unspecified.
++Processes using a shared memory region maintain an open file descriptor
++for it.
++On UNIX systems, the region removal should succeed
++and processes that have already joined the region should continue to
++run in the region without change,
++however processes attempting to join the \\$1 will either fail or
++attempt to create a new region.
++On other systems, e.g., WNT, where the
++.IR unlink (2)
++system call will fail if any process has an open file descriptor
++for the file,
++the region removal will fail.
++.PP
++In the case of catastrophic or system failure,
++database recovery must be performed (see
++.IR db_recover (1)
++or the DB_RECOVER and DB_RECOVER_FATAL flags to
++.IR \\*(Va (3)).
++Alternatively, if recovery is not required because no database state is
++maintained across failures,
++it is possible to clean up a \\$1 by removing all of the
++files in the directory specified to the
++.I \\*(Vo
++.Al function, method,
++as \\$1 files are never created in any directory other than the one
++specified to
++.IR \\*(Vo .
++Note, however,
++that this has the potential to remove files created by the other DB
++subsystems in this database environment.
++.PP
++.Rt \\*(Vu
++.rm Va
++.rm Vo
++.rm Vu
++.rm Vc
++..
++.\" Signal paragraph for standard utilities.
++.\" This macro takes one argument:
++.\" + the utility name.
++.de Si
++The
++.I \\$1
++utility attaches to DB shared memory regions.
++In order to avoid region corruption,
++it should always be given the chance to detach and exit gracefully.
++To cause
++.I \\$1
++to clean up after itself and exit,
++send it an interrupt signal (SIGINT).
++..
++.\" Logging paragraph for standard utilities.
++.\" This macro takes one argument:
++.\" + the utility name.
++.de Pi
++.B \-L
++Log the execution of the \\$1 utility to the specified file in the
++following format, where ``###'' is the process ID, and the date is
++the time the utility starting running.
++.sp
++\\$1: ### Wed Jun 15 01:23:45 EDT 1995
++.sp
++This file will be removed if the \\$1 utility exits gracefully.
++..
++.\" Malloc paragraph.
++.\" This macro takes one argument:
++.\" + the allocated object
++.de Ma
++.if !'\*[TYPE]'JAVA'\{\
++\\$1 are created in allocated memory.
++If
++.I db_malloc
++is non-NULL,
++it is called to allocate the memory,
++otherwise,
++the library function
++.IR malloc (3)
++is used.
++The function
++.I db_malloc
++must match the calling conventions of the
++.IR malloc (3)
++library routine.
++Regardless,
++the caller is responsible for deallocating the returned memory.
++To deallocate the returned memory,
++free each returned memory pointer;
++pointers inside the memory do not need to be individually freed.
++\}
++..
++.\" Underlying function paragraph.
++.\" This macro takes two arguments:
++.\" + the function name
++.\" + the utility name
++.de Uf
++The
++.I \\$1
++.Al function method
++is the underlying function used by the
++.IR \\$2 (1)
++utility.
++See the source code for the
++.I \\$2
++utility for an example of using
++.I \\$1
++in a UNIX environment.
++..
++.\" Underlying function paragraph, for C++.
++.\" This macro takes three arguments:
++.\" + the C++ method name
++.\" + the function name for C
++.\" + the utility name
++.de Ux
++The
++.I \\$1
++method is based on the C
++.I \\$2
++function, which
++is the underlying function used by the
++.IR \\$3 (1)
++utility.
++See the source code for the
++.I \\$3
++utility for an example of using
++.I \\$2
++in a UNIX environment.
++..
++.TH DB_DUMP185 1 "April 10, 1998"
++.UC 7
++.SH NAME
++db_dump185 \- dump DB 1.85 legacy database files
++.SH SYNOPSIS
++\fBdb_dump185\fP [\fB-p\fP] [\fB-f output\fP] db_file
++.SH DESCRIPTION
++The
++.I db_dump185
++utility reads the version 1.85 database file
++.I db_file
++and writes it to the standard output using a portable flat-text format
++understood by the
++.IR db_load (1)
++utility.
++The argument
++.I db_file
++must be a file produced using the version 1.85
++.I DB
++library functions.
++.PP
++The options are as follows:
++.TP 5
++.B \-f
++Write to the specified
++.I file
++instead of to the standard output.
++.TP 5
++.B \-p
++If characters in either the key or data items are printing characters
++(as defined by
++.IR isprint (3)),
++use printing characters in
++.I file
++to represent them.
++This option permits users to use standard text editors to modify
++the contents of databases.
++.IP
++Note, different systems may have different notions as to what characters
++are ``printing'', and databases dumped in this manner may be less portable
++to external systems.
++.PP
++Dumping and reloading hash databases that use user-defined hash functions
++will result in new databases that use the default hash function.
++While using the default hash function may not be optimal for the new database,
++it will continue to work correctly.
++.PP
++Dumping and reloading btree databases that use user-defined prefix or
++comparison functions will result in new databases that use the default
++prefix and comparison functions.
++.ft B
++In this case, it is quite likely that the database will be damaged
++beyond repair permitting neither record storage or retrieval.
++.ft R
++.PP
++The only available workaround for either case is to modify the sources
++for the
++.IR db_load (1)
++utility to load the database using the correct hash, prefix and comparison
++functions.
++.PP
++.Ex db_dump
++.SH "OUTPUT FORMATS
++There are two output formats used by
++.IR db_dump .
++.PP
++In both output formats, the first few lines of the output contain
++header information describing the underlying access method, filesystem page
++size and other bookkeeping information.
++This information is output in ``name=value'' pairs, where ``name'' may
++be any of the keywords listed in the
++.IR db_load (1)
++manual page, and ``value'' will be its value.
++While this header information can be edited before the database is
++reloaded,
++there is rarely any reason to do so, as all of this information can be
++overridden by command-line arguments to
++.IR db_load .
++.PP
++Following the header information are the key/data pairs from the database.
++If the database being dumped is of type
++.B btree
++or
++.BR hash ,
++the output will be paired lines of text,
++where the first line of the pair is the key item,
++and the second line of the pair is its corresponding data item.
++If the database being dumped is of type
++.BR recno ,
++the output will be lines of text,
++where each line is a new data item for the database.
++.PP
++If the
++.B \-p
++option was specified, each output line will consist of single characters
++representing any characters from the database that were ``printing'',
++and backslash (``\e'') escaped characters for any that were not.
++Backslash characters appearing in the output mean one of two things:
++if the backslash character precedes another backslash character,
++it means that a literal backslash character occurred in the key or data
++item.
++If the backslash character precedes any other character,
++the next two characters should be interpreted as hexadecimal specification
++of a single character, e.g., ``\e0a'' is a newline character in the ASCII
++character set.
++.PP
++If the
++.B \-p
++option was not specified, each output line will consist of paired hexadecimal
++values, e.g., the line ``726f6f74'' is the string ``root'' in the ASCII
++character set.
++.PP
++In both output formats,
++a single newline character ends both the key and data items.
++.SH "SEE ALSO"
++.IR isprint (3)
++.PP
++.Gn
++.PP
++.Sa
+Index: b/db_dump185/db_dump185.c
+===================================================================
+--- /dev/null
++++ b/db_dump185/db_dump185.c
+@@ -0,0 +1,355 @@
++/*-
++ * See the file LICENSE for redistribution information.
++ *
++ * Copyright (c) 1996-2004
++ * Sleepycat Software. All rights reserved.
++ *
++ * $Id: db_dump185.c,v 11.19 2004/01/28 03:36:00 bostic Exp $
++ */
++
++#ifndef lint
++static char copyright[] =
++ "Copyright (c) 1996-2004\nSleepycat Software Inc. All rights reserved.\n";
++#endif
++
++#include <sys/types.h>
++
++#include <ctype.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#include <db.h>
++
++/* Hash Table Information */
++typedef struct hashhdr185 { /* Disk resident portion */
++ int magic; /* Magic NO for hash tables */
++ int version; /* Version ID */
++ u_int32_t lorder; /* Byte Order */
++ int bsize; /* Bucket/Page Size */
++ int bshift; /* Bucket shift */
++ int dsize; /* Directory Size */
++ int ssize; /* Segment Size */
++ int sshift; /* Segment shift */
++ int ovfl_point; /* Where overflow pages are being
++ * allocated */
++ int last_freed; /* Last overflow page freed */
++ int max_bucket; /* ID of Maximum bucket in use */
++ int high_mask; /* Mask to modulo into entire table */
++ int low_mask; /* Mask to modulo into lower half of
++ * table */
++ int ffactor; /* Fill factor */
++ int nkeys; /* Number of keys in hash table */
++} HASHHDR185;
++typedef struct htab185 { /* Memory resident data structure */
++ HASHHDR185 hdr; /* Header */
++} HTAB185;
++
++/* Hash Table Information */
++typedef struct hashhdr186 { /* Disk resident portion */
++ int32_t magic; /* Magic NO for hash tables */
++ int32_t version; /* Version ID */
++ int32_t lorder; /* Byte Order */
++ int32_t bsize; /* Bucket/Page Size */
++ int32_t bshift; /* Bucket shift */
++ int32_t ovfl_point; /* Where overflow pages are being allocated */
++ int32_t last_freed; /* Last overflow page freed */
++ int32_t max_bucket; /* ID of Maximum bucket in use */
++ int32_t high_mask; /* Mask to modulo into entire table */
++ int32_t low_mask; /* Mask to modulo into lower half of table */
++ int32_t ffactor; /* Fill factor */
++ int32_t nkeys; /* Number of keys in hash table */
++ int32_t hdrpages; /* Size of table header */
++ int32_t h_charkey; /* value of hash(CHARKEY) */
++#define NCACHED 32 /* number of bit maps and spare points */
++ int32_t spares[NCACHED];/* spare pages for overflow */
++ /* address of overflow page bitmaps */
++ u_int16_t bitmaps[NCACHED];
++} HASHHDR186;
++typedef struct htab186 { /* Memory resident data structure */
++ void *unused[2];
++ HASHHDR186 hdr; /* Header */
++} HTAB186;
++
++typedef struct _epgno {
++ u_int32_t pgno; /* the page number */
++ u_int16_t index; /* the index on the page */
++} EPGNO;
++
++typedef struct _epg {
++ void *page; /* the (pinned) page */
++ u_int16_t index; /* the index on the page */
++} EPG;
++
++typedef struct _cursor {
++ EPGNO pg; /* B: Saved tree reference. */
++ DBT key; /* B: Saved key, or key.data == NULL. */
++ u_int32_t rcursor; /* R: recno cursor (1-based) */
++
++#define CURS_ACQUIRE 0x01 /* B: Cursor needs to be reacquired. */
++#define CURS_AFTER 0x02 /* B: Unreturned cursor after key. */
++#define CURS_BEFORE 0x04 /* B: Unreturned cursor before key. */
++#define CURS_INIT 0x08 /* RB: Cursor initialized. */
++ u_int8_t flags;
++} CURSOR;
++
++/* The in-memory btree/recno data structure. */
++typedef struct _btree {
++ void *bt_mp; /* memory pool cookie */
++
++ void *bt_dbp; /* pointer to enclosing DB */
++
++ EPG bt_cur; /* current (pinned) page */
++ void *bt_pinned; /* page pinned across calls */
++
++ CURSOR bt_cursor; /* cursor */
++
++ EPGNO bt_stack[50]; /* stack of parent pages */
++ EPGNO *bt_sp; /* current stack pointer */
++
++ DBT bt_rkey; /* returned key */
++ DBT bt_rdata; /* returned data */
++
++ int bt_fd; /* tree file descriptor */
++
++ u_int32_t bt_free; /* next free page */
++ u_int32_t bt_psize; /* page size */
++ u_int16_t bt_ovflsize; /* cut-off for key/data overflow */
++ int bt_lorder; /* byte order */
++ /* sorted order */
++ enum { NOT, BACK, FORWARD } bt_order;
++ EPGNO bt_last; /* last insert */
++
++ /* B: key comparison function */
++ int (*bt_cmp) __P((DBT *, DBT *));
++ /* B: prefix comparison function */
++ size_t (*bt_pfx) __P((DBT *, DBT *));
++ /* R: recno input function */
++ int (*bt_irec) __P((struct _btree *, u_int32_t));
++
++ FILE *bt_rfp; /* R: record FILE pointer */
++ int bt_rfd; /* R: record file descriptor */
++
++ void *bt_cmap; /* R: current point in mapped space */
++ void *bt_smap; /* R: start of mapped space */
++ void *bt_emap; /* R: end of mapped space */
++ size_t bt_msize; /* R: size of mapped region. */
++
++ u_int32_t bt_nrecs; /* R: number of records */
++ size_t bt_reclen; /* R: fixed record length */
++ u_char bt_bval; /* R: delimiting byte/pad character */
++
++/*
++ * NB:
++ * B_NODUPS and R_RECNO are stored on disk, and may not be changed.
++ */
++#define B_INMEM 0x00001 /* in-memory tree */
++#define B_METADIRTY 0x00002 /* need to write metadata */
++#define B_MODIFIED 0x00004 /* tree modified */
++#define B_NEEDSWAP 0x00008 /* if byte order requires swapping */
++#define B_RDONLY 0x00010 /* read-only tree */
++
++#define B_NODUPS 0x00020 /* no duplicate keys permitted */
++#define R_RECNO 0x00080 /* record oriented tree */
++
++#define R_CLOSEFP 0x00040 /* opened a file pointer */
++#define R_EOF 0x00100 /* end of input file reached. */
++#define R_FIXLEN 0x00200 /* fixed length records */
++#define R_MEMMAPPED 0x00400 /* memory mapped file. */
++#define R_INMEM 0x00800 /* in-memory file */
++#define R_MODIFIED 0x01000 /* modified file */
++#define R_RDONLY 0x02000 /* read-only file */
++
++#define B_DB_LOCK 0x04000 /* DB_LOCK specified. */
++#define B_DB_SHMEM 0x08000 /* DB_SHMEM specified. */
++#define B_DB_TXN 0x10000 /* DB_TXN specified. */
++ u_int32_t flags;
++} BTREE;
++
++void db_btree __P((DB *, int));
++void db_hash __P((DB *, int));
++void dbt_dump __P((DBT *));
++void dbt_print __P((DBT *));
++int main __P((int, char *[]));
++int usage __P((void));
++
++int
++main(argc, argv)
++ int argc;
++ char *argv[];
++{
++ extern char *optarg;
++ extern int optind;
++ DB *dbp;
++ DBT key, data;
++ int ch, pflag, rval;
++
++ pflag = 0;
++ while ((ch = getopt(argc, argv, "f:p")) != EOF)
++ switch (ch) {
++ case 'f':
++ if (freopen(optarg, "w", stdout) == NULL) {
++ fprintf(stderr, "db_dump185: %s: %s\n",
++ optarg, strerror(errno));
++ return (EXIT_FAILURE);
++ }
++ break;
++ case 'p':
++ pflag = 1;
++ break;
++ case '?':
++ default:
++ return (usage());
++ }
++ argc -= optind;
++ argv += optind;
++
++ if (argc != 1)
++ return (usage());
++
++ if ((dbp = dbopen(argv[0], O_RDONLY, 0, DB_BTREE, NULL)) == NULL) {
++ if ((dbp =
++ dbopen(argv[0], O_RDONLY, 0, DB_HASH, NULL)) == NULL) {
++ fprintf(stderr,
++ "db_dump185: %s: %s\n", argv[0], strerror(errno));
++ return (EXIT_FAILURE);
++ }
++ db_hash(dbp, pflag);
++ } else
++ db_btree(dbp, pflag);
++
++ /*
++ * !!!
++ * DB 1.85 DBTs are a subset of DB 2.0 DBTs, so we just use the
++ * new dump/print routines.
++ */
++ if (pflag)
++ while (!(rval = dbp->seq(dbp, &key, &data, R_NEXT))) {
++ dbt_print(&key);
++ dbt_print(&data);
++ }
++ else
++ while (!(rval = dbp->seq(dbp, &key, &data, R_NEXT))) {
++ dbt_dump(&key);
++ dbt_dump(&data);
++ }
++
++ if (rval == -1) {
++ fprintf(stderr, "db_dump185: seq: %s\n", strerror(errno));
++ return (EXIT_FAILURE);
++ }
++ return (EXIT_SUCCESS);
++}
++
++/*
++ * db_hash --
++ * Dump out hash header information.
++ */
++void
++db_hash(dbp, pflag)
++ DB *dbp;
++ int pflag;
++{
++ HTAB185 *hash185p;
++ HTAB186 *hash186p;
++
++ printf("format=%s\n", pflag ? "print" : "bytevalue");
++ printf("type=hash\n");
++
++ /* DB 1.85 was version 2, DB 1.86 was version 3. */
++ hash185p = dbp->internal;
++ if (hash185p->hdr.version > 2) {
++ hash186p = dbp->internal;
++ printf("h_ffactor=%lu\n", (u_long)hash186p->hdr.ffactor);
++ if (hash186p->hdr.lorder != 0)
++ printf("db_lorder=%lu\n", (u_long)hash186p->hdr.lorder);
++ printf("db_pagesize=%lu\n", (u_long)hash186p->hdr.bsize);
++ } else {
++ printf("h_ffactor=%lu\n", (u_long)hash185p->hdr.ffactor);
++ if (hash185p->hdr.lorder != 0)
++ printf("db_lorder=%lu\n", (u_long)hash185p->hdr.lorder);
++ printf("db_pagesize=%lu\n", (u_long)hash185p->hdr.bsize);
++ }
++ printf("HEADER=END\n");
++}
++
++/*
++ * db_btree --
++ * Dump out btree header information.
++ */
++void
++db_btree(dbp, pflag)
++ DB *dbp;
++ int pflag;
++{
++ BTREE *btp;
++
++ btp = dbp->internal;
++
++ printf("format=%s\n", pflag ? "print" : "bytevalue");
++ printf("type=btree\n");
++#ifdef NOT_AVAILABLE_IN_185
++ printf("bt_minkey=%lu\n", (u_long)XXX);
++ printf("bt_maxkey=%lu\n", (u_long)XXX);
++#endif
++ if (btp->bt_lorder != 0)
++ printf("db_lorder=%lu\n", (u_long)btp->bt_lorder);
++ printf("db_pagesize=%lu\n", (u_long)btp->bt_psize);
++ if (!(btp->flags & B_NODUPS))
++ printf("duplicates=1\n");
++ printf("HEADER=END\n");
++}
++
++static char hex[] = "0123456789abcdef";
++
++/*
++ * dbt_dump --
++ * Write out a key or data item using byte values.
++ */
++void
++dbt_dump(dbtp)
++ DBT *dbtp;
++{
++ size_t len;
++ u_int8_t *p;
++
++ for (len = dbtp->size, p = dbtp->data; len--; ++p)
++ (void)printf("%c%c",
++ hex[(*p & 0xf0) >> 4], hex[*p & 0x0f]);
++ printf("\n");
++}
++
++/*
++ * dbt_print --
++ * Write out a key or data item using printable characters.
++ */
++void
++dbt_print(dbtp)
++ DBT *dbtp;
++{
++ size_t len;
++ u_int8_t *p;
++
++ for (len = dbtp->size, p = dbtp->data; len--; ++p)
++ if (isprint((int)*p)) {
++ if (*p == '\\')
++ (void)printf("\\");
++ (void)printf("%c", *p);
++ } else
++ (void)printf("\\%c%c",
++ hex[(*p & 0xf0) >> 4], hex[*p & 0x0f]);
++ printf("\n");
++}
++
++/*
++ * usage --
++ * Display the usage message.
++ */
++int
++usage()
++{
++ (void)fprintf(stderr, "usage: db_dump185 [-p] [-f file] db_file\n");
++ return (EXIT_FAILURE);
++}
diff --git a/debian/patches/libc-symbols.patch b/debian/patches/libc-symbols.patch
new file mode 100644
index 0000000..46c4317
--- /dev/null
+++ b/debian/patches/libc-symbols.patch
@@ -0,0 +1,101 @@
+Description: Define symbols that were formerly libc-only
+ We aren't in libc any more, so we don't have to worry about polluting
+ libnss_db's namespace.
+Author: Colin Watson <cjwatson@debian.org>
+Bug-Debian: http://bugs.debian.org/163264
+Forwarded: no
+Last-Update: 2010-03-26
+
+Index: b/btree/btree.h
+===================================================================
+--- a/btree/btree.h
++++ b/btree/btree.h
+@@ -43,7 +43,7 @@
+
+ #include <mpool.h>
+
+-#ifdef _LIBC
++/* #ifdef _LIBC */
+ /* In the GNU C library we must not pollute the namespace because libdb is
+ needed by libnss_db. */
+ #define mpool_open __mpool_open
+@@ -53,7 +53,7 @@
+ #define mpool_put __mpool_put
+ #define mpool_sync __mpool_sync
+ #define mpool_close __mpool_close
+-#endif
++/* #endif */
+
+ #define DEFMINKEYPAGE (2) /* Minimum keys per page */
+ #define MINCACHE (5) /* Minimum cached pages */
+Index: b/db/db.c
+===================================================================
+--- a/db/db.c
++++ b/db/db.c
+@@ -44,11 +44,11 @@
+
+ #include <db.h>
+
+-#ifdef _LIBC
++/* #ifdef _LIBC */
+ /* In the GNU C library we must not pollute the namespace, because libdb
+ is needed by libnss_db. */
+ #define dbopen __dbopen
+-#endif
++/* #endif */
+
+ DB *
+ dbopen(fname, flags, mode, type, openinfo)
+@@ -78,10 +78,10 @@
+ errno = EINVAL;
+ return (NULL);
+ }
+-#ifdef _LIBC
++/* #ifdef _LIBC */
+ #undef dbopen
+ weak_alias (__dbopen, dbopen)
+-#endif
++/* #endif */
+
+ static int
+ __dberr __P((void))
+Index: b/mpool/mpool.c
+===================================================================
+--- a/mpool/mpool.c
++++ b/mpool/mpool.c
+@@ -50,7 +50,7 @@
+ #define __MPOOLINTERFACE_PRIVATE
+ #include <mpool.h>
+
+-#ifdef _LIBC
++/* #ifdef _LIBC */
+ /* In the GNU C library we must not pollute the namespace because libdb is
+ needed by libnss_db. */
+ #define mpool_open __mpool_open
+@@ -60,7 +60,7 @@
+ #define mpool_put __mpool_put
+ #define mpool_sync __mpool_sync
+ #define mpool_close __mpool_close
+-#endif
++/* #endif */
+
+ static BKT *mpool_bkt __P((MPOOL *));
+ static BKT *mpool_look __P((MPOOL *, pgno_t));
+@@ -313,7 +313,7 @@
+ return (fsync(mp->fd) ? RET_ERROR : RET_SUCCESS);
+ }
+
+-#ifdef _LIBC
++/* #ifdef _LIBC */
+ #undef mpool_open
+ #undef mpool_filter
+ #undef mpool_new
+@@ -328,7 +328,7 @@
+ weak_alias (__mpool_put, mpool_put)
+ weak_alias (__mpool_close, mpool_close)
+ weak_alias (__mpool_sync, mpool_sync)
+-#endif
++/* #endif */
+
+ /*
+ * mpool_bkt
diff --git a/debian/patches/pmt-compat.patch b/debian/patches/pmt-compat.patch
new file mode 100644
index 0000000..9ef044f
--- /dev/null
+++ b/debian/patches/pmt-compat.patch
@@ -0,0 +1,21 @@
+Description: Translate __PMT() to __P() on non-glibc architectures
+Author: Colin Watson <cjwatson@debian.org>
+Forwarded: no
+Last-Update: 2010-03-26
+
+Index: b/db.h
+===================================================================
+--- a/db.h
++++ b/db.h
+@@ -39,6 +39,11 @@
+ #include <sys/types.h>
+ #include <sys/cdefs.h>
+
++/* Some systems don't define the __PMT extension of __P; translation is safe */
++#ifndef __PMT
++#define __PMT(p) __P(p)
++#endif
++
+ #include <limits.h>
+
+ #ifdef __DBINTERFACE_PRIVATE
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..8bd7870
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,5 @@
+build-outside-glibc.patch
+weak-alias.patch
+pmt-compat.patch
+libc-symbols.patch
+db_dump185.patch
diff --git a/debian/patches/weak-alias.patch b/debian/patches/weak-alias.patch
new file mode 100644
index 0000000..59eb6cf
--- /dev/null
+++ b/debian/patches/weak-alias.patch
@@ -0,0 +1,22 @@
+Description: Weak alias definitions
+ Import part of libc-symbols.h from glibc.
+Author: Colin Watson <cjwatson@debian.org>
+Forwarded: no
+Last-Update: 2010-03-26
+
+Index: b/compat.h
+===================================================================
+--- a/compat.h
++++ b/compat.h
+@@ -45,5 +45,11 @@
+ #define MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
+ #endif
+
++/* Define ALIASNAME as a weak alias for NAME.
++ If weak aliases are not available, this defines a strong alias. */
++#define weak_alias(name, aliasname) _weak_alias (name, aliasname)
++#define _weak_alias(name, aliasname) \
++ extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
++
+
+ #endif /* compat.h */
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..163aaf8
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)