diff options
author | Guillem Jover <guillem@debian.org> | 2008-09-09 03:08:50 +0300 |
---|---|---|
committer | Guillem Jover <guillem@debian.org> | 2008-09-14 04:53:27 +0300 |
commit | 76af8cf4d7b74daec88b813eab6c547261db8f2a (patch) | |
tree | c2dade42100727b2b26e501e5170ebfe69c6eedd | |
parent | ecb7cead0c7f29020160ae385dfa9d8afff81385 (diff) | |
download | dpkg-76af8cf4d7b74daec88b813eab6c547261db8f2a.tar.gz |
libdpkg: Move compat.c to libcompat
-rw-r--r-- | ChangeLog | 22 | ||||
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | configure.ac | 8 | ||||
-rw-r--r-- | lib/Makefile.am | 1 | ||||
-rw-r--r-- | lib/compat.c | 202 | ||||
-rw-r--r-- | lib/dpkg.h | 47 | ||||
-rw-r--r-- | libcompat/Makefile.am | 28 | ||||
-rw-r--r-- | libcompat/alphasort.c | 33 | ||||
-rw-r--r-- | libcompat/compat.h | 45 | ||||
-rw-r--r-- | libcompat/scandir.c | 85 | ||||
-rw-r--r-- | libcompat/snprintf.c | 42 | ||||
-rw-r--r-- | libcompat/strerror.c | 45 | ||||
-rw-r--r-- | libcompat/strsignal.c | 83 | ||||
-rw-r--r-- | libcompat/unsetenv.c | 41 | ||||
-rw-r--r-- | libcompat/vsnprintf.c | 78 | ||||
-rw-r--r-- | po/POTFILES.in | 1 |
16 files changed, 506 insertions, 256 deletions
@@ -1,5 +1,27 @@ 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. (vsnprintf): Return negative on error instead of ohshite. @@ -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. diff --git a/configure.ac b/configure.ac index 0d79b6dec..47c7e111b 100644 --- a/configure.ac +++ b/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 diff --git a/lib/Makefile.am b/lib/Makefile.am index 2557d8a24..8c2548b27 100644 --- a/lib/Makefile.am +++ b/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 \ diff --git a/lib/compat.c b/lib/compat.c deleted file mode 100644 index 303c6573b..000000000 --- a/lib/compat.c +++ /dev/null @@ -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 diff --git a/lib/dpkg.h b/lib/dpkg.h index 44655c2d7..ecb2ddcb5 100644 --- a/lib/dpkg.h +++ b/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 diff --git a/libcompat/Makefile.am b/libcompat/Makefile.am index 6e20d68e3..0b7b1fe47 100644 --- a/libcompat/Makefile.am +++ b/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 + diff --git a/libcompat/alphasort.c b/libcompat/alphasort.c new file mode 100644 index 000000000..935ad64f2 --- /dev/null +++ b/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 + diff --git a/libcompat/compat.h b/libcompat/compat.h index 6c3a04739..abf335785 100644 --- a/libcompat/compat.h +++ b/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 diff --git a/libcompat/scandir.c b/libcompat/scandir.c new file mode 100644 index 000000000..112fca445 --- /dev/null +++ b/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 + diff --git a/libcompat/snprintf.c b/libcompat/snprintf.c new file mode 100644 index 000000000..d8b0d05a0 --- /dev/null +++ b/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 + diff --git a/libcompat/strerror.c b/libcompat/strerror.c new file mode 100644 index 000000000..b078f187b --- /dev/null +++ b/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 + diff --git a/libcompat/strsignal.c b/libcompat/strsignal.c new file mode 100644 index 000000000..f92ac0c08 --- /dev/null +++ b/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 + diff --git a/libcompat/unsetenv.c b/libcompat/unsetenv.c new file mode 100644 index 000000000..b4346a9b9 --- /dev/null +++ b/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 + diff --git a/libcompat/vsnprintf.c b/libcompat/vsnprintf.c new file mode 100644 index 000000000..ad532e094 --- /dev/null +++ b/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 + diff --git a/po/POTFILES.in b/po/POTFILES.in index c60abf4f5..9baea218a 100644 --- a/po/POTFILES.in +++ b/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 |