From 85d9e2e2124ccf43d35d1aac642379ad349929c8 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 12 Feb 2002 20:42:25 +0000 Subject: [PATCH] * fopencookie.c: Dummy function. * vasprintf.c: New. Taken from binutils-2.9.1 and dropped all non ANSI-C stuff. Merged with asprintf version. * no-pth.c: New. --- common/ChangeLog | 9 +++ common/Makefile.am | 3 +- common/errors.h | 8 ++- common/fopencookie.c | 37 +++++++++++ common/no-pth.c | 54 +++++++++++++++ common/util.h | 24 ++++++- common/vasprintf.c | 155 +++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 287 insertions(+), 3 deletions(-) create mode 100644 common/fopencookie.c create mode 100644 common/no-pth.c create mode 100644 common/vasprintf.c diff --git a/common/ChangeLog b/common/ChangeLog index ae582fc99..9ea09bdcf 100644 --- a/common/ChangeLog +++ b/common/ChangeLog @@ -1,3 +1,12 @@ +2002-02-12 Werner Koch + + * fopencookie.c: Dummy function. + + * vasprintf.c: New. Taken from binutils-2.9.1 and dropped all non + ANSI-C stuff. Merged with asprintf version. + + * no-pth.c: New. + 2002-01-23 Werner Koch * mkdtemp.c: Copied from gnupg-1.0.6c and changed to use libgcrypt. diff --git a/common/Makefile.am b/common/Makefile.am index c0fd0bcba..a95eadd7b 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -31,7 +31,8 @@ libcommon_a_SOURCES = \ util.h i18n.h \ errors.c errors.h \ maperror.c \ - sysutils.c sysutils.h + sysutils.c sysutils.h \ + no-pth.c libcommon_a_LIBADD = @LIBOBJS@ diff --git a/common/errors.h b/common/errors.h index 840405d8b..26cdb8646 100644 --- a/common/errors.h +++ b/common/errors.h @@ -84,7 +84,13 @@ enum { GNUPG_Unknown_Sexp = 55, GNUPG_Unsupported_Protection = 56, GNUPG_Corrupted_Protection = 57, - GNUPG_Ambiguous_Name = 58 + GNUPG_Ambiguous_Name = 58, + GNUPG_Card_Error = 59, + GNUPG_Card_Reset = 60, + GNUPG_Card_Removed = 61, + GNUPG_Invalid_Card = 62, + GNUPG_Card_Not_Present = 63, + GNUPG_No_PKCS15_App = 64, }; /* Status codes - fixme: should go into another file */ diff --git a/common/fopencookie.c b/common/fopencookie.c new file mode 100644 index 000000000..7862b9a0d --- /dev/null +++ b/common/fopencookie.c @@ -0,0 +1,37 @@ +/* fopencookie.c - Dummy glibc replacement + * Copyright (C) 2002 Free Software Foundation, Inc. + * + * This file is part of GnuPG. + * + * GnuPG 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 of the License, or + * (at your option) any later version. + * + * GnuPG 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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include + +#include "util.h" + +FILE * +fopencookie (void *cookie, const char *opentype, + cookie_io_functions_t funclist) +{ + errno = ENOSYS; + return NULL; +} + + diff --git a/common/no-pth.c b/common/no-pth.c new file mode 100644 index 000000000..5eaaa3f91 --- /dev/null +++ b/common/no-pth.c @@ -0,0 +1,54 @@ +/* no-pth.c - stubs to avoid linking against PTH + * Copyright (C) 2002 Free Software Foundation, Inc. + * + * This file is part of GnuPG. + * + * GnuPG 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 of the License, or + * (at your option) any later version. + * + * GnuPG 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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#ifdef USE_GNU_PTH /*we need the stubs only in this case */ + +#include +#include +#include +#include + +#if PTH_SYSCALL_SOFT +# error this file cannot be used with PTH syscall divertion +#endif + + +ssize_t +pth_read (int a, void *b , size_t c) +{ + return read (a, b, c); +} + +ssize_t +pth_write (int a, const void *b, size_t c) +{ + return write (a, b, c); +} + +int +pth_accept (int a, struct sockaddr *b, socklen_t *c) +{ + return accept (a, b, c); +} + + + +#endif /*USE_GNU_PTH*/ diff --git a/common/util.h b/common/util.h index fa22b1571..ff20bfe15 100644 --- a/common/util.h +++ b/common/util.h @@ -55,8 +55,30 @@ int map_kbx_err (int err); int map_assuan_err (int err); int map_to_assuan_status (int rc); +/*-- replacement functions from funcname.c --*/ +#if !HAVE_VASPRINTF +#include +int vasprintf (char **result, const char *format, va_list *args); +int asprintf (char **result, const char *format, ...); +#endif -/* some macros to replace ctype ones and avoid locale problems */ +#if !HAVE_FOPENCOOKIE +typedef struct +{ + ssize_t (*read)(void*,char*,size_t); + ssize_t (*write)(void*,const char*,size_t); + int (*seek)(void*,off_t*,int); + int (*close)(coid*); +} _IO_cookie_io_functions_t; +typedef _IO_cookie_io_functions_t cookie_io_functions_t; +FILE *fopencookie (void *cookie, const char *opentype, + cookie_io_functions_t funclist); +#endif /*!HAVE_FOPENCOOKIE*/ + + + + +/*-- some macros to replace ctype ones and avoid locale problems --*/ #define spacep(p) (*(p) == ' ' || *(p) == '\t') #define digitp(p) (*(p) >= '0' && *(p) <= '9') #define hexdigitp(a) (digitp (a) \ diff --git a/common/vasprintf.c b/common/vasprintf.c new file mode 100644 index 000000000..dbef4eb08 --- /dev/null +++ b/common/vasprintf.c @@ -0,0 +1,155 @@ +/* Like vsprintf but provides a pointer to malloc'd storage, which must + be freed by the caller. + Copyright (C) 1994, 2002 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include +#include + +#ifdef TEST +int global_total_width; +#endif + +int +vasprintf (char **result, const char *format, va_list *args) +{ + const char *p = format; + /* Add one to make sure that it is never zero, which might cause malloc + to return NULL. */ + int total_width = strlen (format) + 1; + va_list ap; + + /* FIXME: use va_copy() */ + memcpy (&ap, args, sizeof (va_list)); + + while (*p != '\0') + { + if (*p++ == '%') + { + while (strchr ("-+ #0", *p)) + ++p; + if (*p == '*') + { + ++p; + total_width += abs (va_arg (ap, int)); + } + else + total_width += strtoul (p, (char**)&p, 10); + if (*p == '.') + { + ++p; + if (*p == '*') + { + ++p; + total_width += abs (va_arg (ap, int)); + } + else + total_width += strtoul (p, (char**)&p, 10); + } + while (strchr ("hlL", *p)) + ++p; + /* Should be big enough for any format specifier except %s and floats. */ + total_width += 30; + switch (*p) + { + case 'd': + case 'i': + case 'o': + case 'u': + case 'x': + case 'X': + case 'c': + (void) va_arg (ap, int); + break; + case 'f': + case 'e': + case 'E': + case 'g': + case 'G': + (void) va_arg (ap, double); + /* Since an ieee double can have an exponent of 307, we'll + make the buffer wide enough to cover the gross case. */ + total_width += 307; + break; + case 's': + total_width += strlen (va_arg (ap, char *)); + break; + case 'p': + case 'n': + (void) va_arg (ap, char *); + break; + } + } + } +#ifdef TEST + global_total_width = total_width; +#endif + *result = malloc (total_width); + if (*result != NULL) + return vsprintf (*result, format, *args); + else + return 0; +} + + +int +asprintf (char **buf, const char *fmt, ...) +{ + int status; + va_list ap; + + va_start (ap, fmt); + status = vasprintf (buf, fmt, ap); + va_end (ap); + return status; +} + + +#ifdef TEST +void +checkit (const char* format, ...) +{ + va_list args; + char *result; + + va_start (args, format); + vasprintf (&result, format, args); + if (strlen (result) < global_total_width) + printf ("PASS: "); + else + printf ("FAIL: "); + printf ("%d %s\n", global_total_width, result); +} + +int +main (void) +{ + checkit ("%d", 0x12345678); + checkit ("%200d", 5); + checkit ("%.300d", 6); + checkit ("%100.150d", 7); + checkit ("%s", "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\ +777777777777777777333333333333366666666666622222222222777777777777733333"); + checkit ("%f%s%d%s", 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx"); +} +#endif /* TEST */