Просмотр исходного кода

libdpkg: Move compat.c to libcompat

Guillem Jover лет назад: 18
Родитель
Сommit
76af8cf4d7
16 измененных файлов с 506 добавлено и 256 удалено
  1. 22 0
      ChangeLog
  2. 0 1
      TODO
  3. 4 4
      configure.ac
  4. 0 1
      lib/Makefile.am
  5. 0 202
      lib/compat.c
  6. 0 47
      lib/dpkg.h
  7. 28 0
      libcompat/Makefile.am
  8. 33 0
      libcompat/alphasort.c
  9. 45 0
      libcompat/compat.h
  10. 85 0
      libcompat/scandir.c
  11. 42 0
      libcompat/snprintf.c
  12. 45 0
      libcompat/strerror.c
  13. 83 0
      libcompat/strsignal.c
  14. 41 0
      libcompat/unsetenv.c
  15. 78 0
      libcompat/vsnprintf.c
  16. 0 1
      po/POTFILES.in

+ 22 - 0
ChangeLog

@@ -1,3 +1,25 @@
+2008-09-14  Guillem Jover  <guillem@debian.org>
+
+	* configure.ac (AC_CHECK_FUNCS): Move 'vsnprintf', 'snprintf',
+	'strerror', 'strsignal', 'scandir', 'alphasort' and 'unsetenv' to ...
+	(DPKG_CHECK_COMPAT_FUNCS): ... here.
+	* lib/Makefile.am (libdpkg_a_SOURCES): Remove 'compat.c'.
+	* lib/dpkg.h (strerror, strsignal, scandir, alphasort, unsetenv)
+	(offsetof, strtoul, va_copy, WCOREDUMP): Move declarations to ...
+	* libcompat/compat.h: ... here.
+	* libcompat/Makefile.am (libcompat_a_SOURCES): Add 'strerror.c',
+	'strsignal.c', 'snprintf.c', 'vsnprintf.c', 'alphasort.c',
+	'scandir.c' and 'unsetenv.c'.
+	* po/POTFILES.in: Remove 'lib/compat.c'.
+	* lib/compat.c: Split into ...
+	* libcompat/alphasort.c: ... here. New file.
+	* libcompat/scandir.c: Likewise.
+	* libcompat/snprintf.c: Likewise.
+	* libcompat/strerror.c: Likewise.
+	* libcompat/strsignal.c: Likewise.
+	* libcompat/unsetenv.c: Likewise.
+	* libcompat/vsnprintf.c: Likewise.
+
 2008-09-14  Guillem Jover  <guillem@debian.org>
 
 	* lib/compat.c: Do not include <dpkg.h> anymore.

+ 0 - 1
TODO

@@ -64,7 +64,6 @@ lenny
 
  * Cleanup libcompat:
    - Add fnmatch, IRIX5 doesn't have it.
-   - Cut lib/compat.c into little pieces and move them here.
 
  * Get rid of install-info.
 

+ 4 - 4
configure.ac

@@ -93,10 +93,10 @@ DPKG_C_ATTRIBUTE
 
 # Checks for library functions.
 DPKG_FUNC_VA_COPY
-DPKG_CHECK_COMPAT_FUNCS([getopt getopt_long strnlen obstack_free])
-AC_CHECK_FUNCS([vsnprintf snprintf strtoul strerror strsignal alphasort \
-                isascii bcopy memcpy scandir unsetenv lchown setsid \
-                getdtablesize])
+DPKG_CHECK_COMPAT_FUNCS([getopt getopt_long obstack_free \
+                         vsnprintf snprintf strnlen strerror strsignal \
+                         scandir alphasort unsetenv])
+AC_CHECK_FUNCS([strtoul isascii bcopy memcpy lchown setsid getdtablesize])
 
 SJR_COMPILER_WARNINGS
 SJR_COMPILER_OPTIMISATIONS

+ 0 - 1
lib/Makefile.am

@@ -19,7 +19,6 @@ libdpkg_a_SOURCES = \
 	dpkg-priv.h \
 	dlist.h \
 	cleanup.c \
-	compat.c \
 	compression.c \
 	database.c \
 	dbmodify.c \

+ 0 - 202
lib/compat.c

@@ -1,202 +0,0 @@
-/*
- * libdpkg - Debian packaging suite library routines
- * compat.c - compatibility functions
- *
- * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2,
- * or (at your option) any later version.
- *
- * This is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with dpkg; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <config.h>
-
-#include <errno.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <dirent.h>
-#include <stdarg.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include <gettext.h>
-
-#define _(str) gettext(str)
-
-#ifndef HAVE_VSNPRINTF
-int vsnprintf (char *buf, size_t maxsize, const char *fmt, va_list al) {
-  static FILE *file= NULL;
-
-  struct stat stab;
-  unsigned long want, nr;
-  int retval;
-
-  if (maxsize == 0) return -1;
-  if (!file) {
-    file = tmpfile();
-    if (!file)
-      return -1;
-  } else {
-    if (fseek(file, 0, 0))
-      return -1;
-    if (ftruncate(fileno(file), 0))
-      return -1;
-  }
-  if (vfprintf(file, fmt, al) == EOF)
-    return -1;
-  if (fflush(file))
-    return -1;
-  if (fstat(fileno(file), &stab))
-    return -1;
-  if (fseek(file, 0, 0))
-    return -1;
-  want= stab.st_size;
-  if (want >= maxsize) {
-    want= maxsize-1; retval= -1;
-  } else {
-    retval= want;
-  }
-  nr= fread(buf,1,want-1,file);
-  if (nr != want - 1)
-    return -1;
-  buf[want]= NULL;
-
-  return retval;
-}
-#endif
-
-#ifndef HAVE_SNPRINTF
-int
-snprintf (char *str, size_t n, char const *format, ...)
-{
-  va_list ap;
-  int i;
-  (void)n;
-  va_start (ap, format);
-  i = vsprintf (str, format, ap);
-  va_end (ap);
-  return i;
-}
-#endif
-
-#ifndef HAVE_STRERROR
-extern const char *const sys_errlist[];
-extern const int sys_nerr;
-const char *strerror(int e) {
-  static char buf[100];
-  if (e >= 0 && e < sys_nerr) return sys_errlist[e];
-  sprintf(buf, _("System error no.%d"), e);
-  return buf;
-}
-#endif
-
-#ifndef HAVE_STRSIGNAL
-extern const char *const sys_siglist[];
-const char *strsignal(int e) {
-  static char buf[100];
-  if (e >= 0 && e < NSIG) return sys_siglist[e];
-  sprintf(buf, _("Signal no.%d"), e);
-  return buf;
-}
-#endif
-
-#ifndef HAVE_DECL_SYS_SIGLIST
-const char *const sys_siglist[32] = {
-  "SIGHUP",      /*1*/
-  "SIGINT",      /*2*/
-  "SIGQUIT",     /*3*/
-  "SIGILL",      /*4*/
-  "SIGTRAP",     /*5*/
-  "SIGABRT",     /*6*/
-  "SIGEMT",      /*7*/
-  "SIGFPE",      /*8*/
-  "SIGKILL",     /*9*/
-  "SIGUSR1",     /*10*/
-  "SIGSEGV",     /*11*/
-  "SIGUSR2",     /*12*/
-  "SIGPIPE",     /*13*/
-  "SIGALRM",     /*14*/
-  "SIGTERM",     /*15*/
-  "SIGSTKFLT",   /*16*/
-  "SIGCHLD",     /*17*/
-  "SIGCONT",     /*18*/
-  "SIGSTOP",     /*19*/
-  "SIGTSTP",     /*20*/
-  "SIGTTIN",     /*21*/
-  "SIGTTOU",     /*22*/
-  "SIGXXX",      /*23*/
-  "SIGXXX",      /*24*/
-  "SIGXXX",      /*25*/
-  "SIGXXX",      /*26*/
-  "SIGXXX",      /*27*/
-  "SIGXXX",      /*28*/
-  "SIGXXX",      /*29*/
-  "SIGXXX",      /*30*/
-  "SIGXXX",      /*31*/
-  "SIGXXX"       /*32*/
-};
-#endif
-
-#ifndef HAVE_SCANDIR
-
-static int (*scandir_comparfn)(const void*, const void*);
-static int scandir_compar(const void *a, const void *b) {
-  return scandir_comparfn(*(const struct dirent**)a,*(const struct dirent**)b);
-}
-      
-int scandir(const char *dir, struct dirent ***namelist,
-            int (*select)(const struct dirent *),
-            int (*compar)(const void*, const void*)) {
-  DIR *d;
-  int used, avail;
-  struct dirent *e, *m;
-  d= opendir(dir);  if (!d) return -1;
-  used=0; avail=20;
-  *namelist= malloc(avail*sizeof(struct dirent*));
-  if (!*namelist) return -1;
-  while ((e= readdir(d)) != NULL) {
-    if (!select(e)) continue;
-    m= malloc(sizeof(struct dirent) + strlen(e->d_name));
-    if (!m) return -1;
-    *m= *e;
-    strcpy(m->d_name,e->d_name);
-    if (used >= avail-1) {
-      avail+= avail;
-      *namelist= realloc(*namelist, avail*sizeof(struct dirent*));
-      if (!*namelist) return -1;
-    }
-    (*namelist)[used]= m;
-    used++;
-  }
-  (*namelist)[used]= NULL;
-  scandir_comparfn= compar;
-  qsort(*namelist, used, sizeof(struct dirent*), scandir_compar);
-  return used;
-}
-#endif
-
-#ifndef HAVE_ALPHASORT
-int alphasort(const struct dirent *a, const struct dirent *b) {
-  return strcmp(a->d_name,b->d_name);
-}
-#endif
-
-#ifndef HAVE_UNSETENV
-void unsetenv(const char *p) {
-  char *q;
-  q= malloc(strlen(p)+3); if (!q) return;
-  strcpy(q,p); strcat(q,"="); putenv(q);
-}
-#endif

+ 0 - 47
lib/dpkg.h

@@ -395,53 +395,6 @@ void compress_cat(enum compress_type type, int fd_in, int fd_out,
                   const char *compression, char *desc, ...)
                   NONRETURNING PRINTFFORMAT(5, 6);
 
-/*** from compat.c ***/
-
-#ifndef HAVE_STRERROR
-const char *strerror(int);
-#endif
-
-#ifndef HAVE_STRSIGNAL
-const char *strsignal(int);
-#endif
-
-#ifndef HAVE_SCANDIR
-struct dirent;
-int scandir(const char *dir, struct dirent ***namelist,
-	    int (*select)(const struct dirent *),
-	    int (*compar)(const void*, const void*));
-#endif
-
-#ifndef HAVE_ALPHASORT
-struct dirent;
-int alphasort(const struct dirent *a, const struct dirent *b);
-#endif
-
-#ifndef HAVE_UNSETENV
-void unsetenv(const char *x);
-#endif
-
-/*** other compatibility functions ***/
-
-#ifndef offsetof
-#define offsetof(st, m) ((size_t)&((st *)NULL)->m)
-#endif
-
-#ifndef HAVE_STRTOUL
-#define strtoul strtol
-#endif
-
-#ifndef HAVE_VA_COPY
-#define va_copy(dest, src) (dest) = (src)
-#endif
-
-/* Define WCOREDUMP if we don't have it already - coredumps won't be
- * detected, though.
- */
-#ifndef WCOREDUMP
-#define WCOREDUMP(x) 0
-#endif
-
 /* Set BUILDOLDPKGFORMAT to 1 to build old-format archives by default.
  *  */
 #ifndef BUILDOLDPKGFORMAT

+ 28 - 0
libcompat/Makefile.am

@@ -25,3 +25,31 @@ if !HAVE_STRNLEN
 libcompat_a_SOURCES += strnlen.c strnlen.h
 endif
 
+if !HAVE_STRERROR
+libcompat_a_SOURCES += strerror.c
+endif
+
+if !HAVE_STRSIGNAL
+libcompat_a_SOURCES += strsignal.c
+endif
+
+if !HAVE_SNPRINTF
+libcompat_a_SOURCES += snprintf.c
+endif
+
+if !HAVE_VSNPRINTF
+libcompat_a_SOURCES += vsnprintf.c
+endif
+
+if !HAVE_ALPHASORT
+libcompat_a_SOURCES += alphasort.c
+endif
+
+if !HAVE_SCANDIR
+libcompat_a_SOURCES += scandir.c
+endif
+
+if !HAVE_UNSETENV
+libcompat_a_SOURCES += unsetenv.c
+endif
+

+ 33 - 0
libcompat/alphasort.c

@@ -0,0 +1,33 @@
+/*
+ * libcompat - system compatibility library
+ *
+ * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with dpkg; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <dirent.h>
+#include <string.h>
+
+#ifndef HAVE_ALPHASORT
+int
+alphasort(const struct dirent *a, const struct dirent *b)
+{
+	return strcmp(a->d_name, b->d_name);
+}
+#endif
+

+ 45 - 0
libcompat/compat.h

@@ -2,6 +2,7 @@
  * libcompat - system compatibility library
  * compat.h - system compatibility declarations
  *
+ * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
  * Copyright © 2008 Guillem Jover <guillem@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
@@ -26,8 +27,52 @@
 extern "C" {
 #endif
 
+#ifndef offsetof
+#define offsetof(st, m) ((size_t)&((st *)NULL)->m)
+#endif
+
+/*
+ * Define WCOREDUMP if we don't have it already, coredumps won't be
+ * detected, though.
+ */
+#ifndef WCOREDUMP
+#define WCOREDUMP(x) 0
+#endif
+
+#ifndef HAVE_STRTOUL
+#define strtoul strtol
+#endif
+
+#ifndef HAVE_VA_COPY
+#define va_copy(dest, src) (dest) = (src)
+#endif
+
 #include <strnlen.h>
 
+#ifndef HAVE_STRERROR
+const char *strerror(int);
+#endif
+
+#ifndef HAVE_STRSIGNAL
+const char *strsignal(int);
+#endif
+
+#ifndef HAVE_SCANDIR
+struct dirent;
+int scandir(const char *dir, struct dirent ***namelist,
+            int (*select)(const struct dirent *),
+            int (*compar)(const void *, const void *));
+#endif
+
+#ifndef HAVE_ALPHASORT
+struct dirent;
+int alphasort(const struct dirent *a, const struct dirent *b);
+#endif
+
+#ifndef HAVE_UNSETENV
+void unsetenv(const char *x);
+#endif
+
 #ifdef __cplusplus
 }
 #endif

+ 85 - 0
libcompat/scandir.c

@@ -0,0 +1,85 @@
+/*
+ * libcompat - system compatibility library
+ *
+ * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with dpkg; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <dirent.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef HAVE_SCANDIR
+static int (*scandir_comparfn)(const void *, const void *);
+static int
+scandir_compar(const void *a, const void *b)
+{
+	return scandir_comparfn(*(const struct dirent **)a,
+	                        *(const struct dirent **)b);
+}
+
+int
+scandir(const char *dir, struct dirent ***namelist,
+        int (*select)(const struct dirent *),
+        int (*compar)(const void *, const void *))
+{
+	DIR *d;
+	int used, avail;
+	struct dirent *e, *m;
+
+	d = opendir(dir);
+	if (!d)
+		return -1;
+
+	used = 0;
+	avail = 20;
+
+	*namelist = malloc(avail * sizeof(struct dirent *));
+	if (!*namelist)
+		return -1;
+
+	while ((e = readdir(d)) != NULL) {
+		if (!select(e))
+			continue;
+
+		m = malloc(sizeof(struct dirent) + strlen(e->d_name));
+		if (!m)
+			return -1;
+		*m = *e;
+		strcpy(m->d_name, e->d_name);
+
+		if (used >= avail - 1) {
+			avail += avail;
+			*namelist = realloc(*namelist, avail * sizeof(struct dirent *));
+			if (!*namelist)
+				return -1;
+		}
+
+		(*namelist)[used] = m;
+		used++;
+	}
+	(*namelist)[used] = NULL;
+
+	scandir_comparfn = compar;
+	qsort(*namelist, used, sizeof(struct dirent *), scandir_compar);
+
+	return used;
+}
+#endif
+

+ 42 - 0
libcompat/snprintf.c

@@ -0,0 +1,42 @@
+/*
+ * libcompat - system compatibility library
+ *
+ * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with dpkg; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+#ifndef HAVE_SNPRINTF
+int
+snprintf(char *str, size_t n, char const *fmt, ...)
+{
+	va_list ap;
+	int i;
+
+	(void)n;
+	va_start(ap, fmt);
+	i = vsprintf(str, fmt, ap);
+	va_end(ap);
+
+	return i;
+}
+#endif
+

+ 45 - 0
libcompat/strerror.c

@@ -0,0 +1,45 @@
+/*
+ * libcompat - system compatibility library
+ *
+ * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with dpkg; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <gettext.h>
+
+#define _(str) gettext(str)
+
+#ifndef HAVE_STRERROR
+extern const char *const sys_errlist[];
+extern const int sys_nerr;
+
+const char *
+strerror(int e)
+{
+	static char buf[100];
+
+	if (e >= 0 && e < sys_nerr)
+		return sys_errlist[e];
+
+	sprintf(buf, _("System error no.%d"), e);
+
+	return buf;
+}
+#endif
+

+ 83 - 0
libcompat/strsignal.c

@@ -0,0 +1,83 @@
+/*
+ * libcompat - system compatibility library
+ *
+ * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with dpkg; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <signal.h>
+#include <string.h>
+#include <stdio.h>
+#include <gettext.h>
+
+#define _(str) gettext(str)
+
+#ifndef HAVE_DECL_SYS_SIGLIST
+const char *const sys_siglist[32] = {
+	"SIGHUP",	/* 1 */
+	"SIGINT",	/* 2 */
+	"SIGQUIT",	/* 3 */
+	"SIGILL",	/* 4 */
+	"SIGTRAP",	/* 5 */
+	"SIGABRT",	/* 6 */
+	"SIGEMT",	/* 7 */
+	"SIGFPE",	/* 8 */
+	"SIGKILL",	/* 9 */
+	"SIGUSR1",	/* 10 */
+	"SIGSEGV",	/* 11 */
+	"SIGUSR2",	/* 12 */
+	"SIGPIPE",	/* 13 */
+	"SIGALRM",	/* 14 */
+	"SIGTERM",	/* 15 */
+	"SIGSTKFLT",	/* 16 */
+	"SIGCHLD",	/* 17 */
+	"SIGCONT",	/* 18 */
+	"SIGSTOP",	/* 19 */
+	"SIGTSTP",	/* 20 */
+	"SIGTTIN",	/* 21 */
+	"SIGTTOU",	/* 22 */
+	"SIGXXX",	/* 23 */
+	"SIGXXX",	/* 24 */
+	"SIGXXX",	/* 25 */
+	"SIGXXX",	/* 26 */
+	"SIGXXX",	/* 27 */
+	"SIGXXX",	/* 28 */
+	"SIGXXX",	/* 29 */
+	"SIGXXX",	/* 30 */
+	"SIGXXX",	/* 31 */
+	"SIGXXX"	/* 32 */
+};
+#else
+extern const char *const sys_siglist[];
+#endif
+
+#ifndef HAVE_STRSIGNAL
+const char *
+strsignal(int s)
+{
+	static char buf[100];
+
+	if (s >= 0 && s < NSIG)
+		return sys_siglist[s];
+
+	sprintf(buf, _("Signal no.%d"), s);
+
+	return buf;
+}
+#endif
+

+ 41 - 0
libcompat/unsetenv.c

@@ -0,0 +1,41 @@
+/*
+ * libcompat - system compatibility library
+ *
+ * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with dpkg; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef HAVE_UNSETENV
+void
+unsetenv(const char *p)
+{
+	char *q;
+
+	q = malloc(strlen(p) + 3);
+	if (!q)
+		return;
+
+	strcpy(q, p);
+	strcat(q, "=");
+	putenv(q);
+}
+#endif
+

+ 78 - 0
libcompat/vsnprintf.c

@@ -0,0 +1,78 @@
+/*
+ * libcompat - system compatibility library
+ *
+ * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with dpkg; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#ifndef HAVE_VSNPRINTF
+int
+vsnprintf(char *buf, size_t maxsize, const char *fmt, va_list al)
+{
+	static FILE *file = NULL;
+
+	struct stat stab;
+	unsigned long want, nr;
+	int retval;
+
+	if (maxsize == 0)
+		return -1;
+
+	if (!file) {
+		file = tmpfile();
+		if (!file)
+			return -1;
+	} else {
+		if (fseek(file, 0, 0))
+			return -1;
+		if (ftruncate(fileno(file), 0))
+			return -1;
+	}
+
+	if (vfprintf(file, fmt, al) == EOF)
+		return -1;
+	if (fflush(file))
+		return -1;
+	if (fstat(fileno(file), &stab))
+		return -1;
+	if (fseek(file, 0, 0))
+		return -1;
+
+	want = stab.st_size;
+	if (want >= maxsize) {
+		want = maxsize - 1;
+		retval = -1;
+	} else {
+		retval = want;
+	}
+
+	nr = fread(buf, 1, want - 1, file);
+	if (nr != want - 1)
+		return -1;
+	buf[want] = NULL;
+
+	return retval;
+}
+#endif
+

+ 0 - 1
po/POTFILES.in

@@ -1,7 +1,6 @@
 # This is the list of all source files with translatable strings.
 
 lib/cleanup.c
-lib/compat.c
 lib/compression.c
 lib/database.c
 lib/dbmodify.c