diff options
author | Stef Walter <stefw@collabora.co.uk> | 2011-10-17 14:51:31 +0200 |
---|---|---|
committer | Stef Walter <stefw@collabora.co.uk> | 2011-10-17 15:32:41 +0200 |
commit | db92b76e3acb11e330309ebce071ec2e61400a71 (patch) | |
tree | cb11139880974ef8db53dd83a70de8f32d94cc09 /tools | |
parent | b1d9fd5f88ade222fbd2206c7e11c5514c8b5634 (diff) |
Initial port to win32
* Tests do not all yet pass, at least not on wine
* Added abstraction of some non-portable functions in compat.h/c
* Build with an argument like this for win32 support:
./autogen.sh --host=i586-mingw32msvc
* This win32 port needs more work from interested parties
Diffstat (limited to 'tools')
-rw-r--r-- | tools/Makefile.am | 4 | ||||
-rw-r--r-- | tools/compat.c | 228 | ||||
-rw-r--r-- | tools/compat.h | 63 | ||||
-rw-r--r-- | tools/p11-kit.c | 5 |
4 files changed, 298 insertions, 2 deletions
diff --git a/tools/Makefile.am b/tools/Makefile.am index 13920d7..e38d1a4 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -7,6 +7,10 @@ INCLUDES = \ bin_PROGRAMS = \ p11-kit +p11_kit_SOURCES = \ + compat.c compat.h \ + p11-kit.c + p11_kit_LDADD = \ $(top_builddir)/p11-kit/libp11-kit.la \ $(LTLIBINTL) diff --git a/tools/compat.c b/tools/compat.c new file mode 100644 index 0000000..93ba77c --- /dev/null +++ b/tools/compat.c @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2011 Collabora Ltd. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * * Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and + * the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * * The names of contributors to this software may not be + * used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * Author: Stef Walter <stefw@collabora.co.uk> + */ + +#include "config.h" + +#include "compat.h" + +#ifndef HAVE_ERR_H + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdarg.h> + +static const char * +calc_prog_name (void) +{ + static char prognamebuf[256]; + static int prepared = 0; + + if(!prepared) + { + const char* beg = strrchr(__argv[0], '\\'); + const char* temp = strrchr(__argv[0], '/'); + beg = (beg > temp) ? beg : temp; + beg = (beg) ? beg + 1 : __argv[0]; + + temp = strrchr(__argv[0], '.'); + temp = (temp > beg) ? temp : __argv[0] + strlen(__argv[0]); + + if((temp - beg) > 255) + temp = beg + 255; + + strncpy(prognamebuf, beg, temp - beg); + prognamebuf[temp - beg] = 0; + prepared = 1; + } + + return prognamebuf; +} + +static FILE *err_file; /* file to use for error output */ + +/* + * This is declared to take a `void *' so that the caller is not required + * to include <stdio.h> first. However, it is really a `FILE *', and the + * manual page documents it as such. + */ +void +err_set_file (void *fp) +{ + if (fp) + err_file = fp; + else + err_file = stderr; +} + +void +err (int eval, + const char *fmt, + ...) +{ + va_list ap; + va_start(ap, fmt); + verrc(eval, errno, fmt, ap); + va_end(ap); +} + +void +verr (int eval, + const char *fmt, + va_list ap) +{ + verrc(eval, errno, fmt, ap); +} + +void +errc (int eval, + int code, + const char *fmt, + ...) +{ + va_list ap; + va_start(ap, fmt); + verrc(eval, code, fmt, ap); + va_end(ap); +} + +void +verrc (int eval, + int code, + const char *fmt, + va_list ap) +{ + if (err_file == 0) + err_set_file((FILE *)0); + fprintf(err_file, "%s: ", calc_prog_name()); + if (fmt != NULL) { + vfprintf(err_file, fmt, ap); + fprintf(err_file, ": "); + } + fprintf(err_file, "%s\n", strerror(code)); + exit(eval); +} + +void +errx (int eval, + const char *fmt, + ...) +{ + va_list ap; + va_start(ap, fmt); + verrx(eval, fmt, ap); + va_end(ap); +} + +void +verrx (int eval, + const char *fmt, + va_list ap) +{ + if (err_file == 0) + err_set_file((FILE *)0); + fprintf(err_file, "%s: ", calc_prog_name()); + if (fmt != NULL) + vfprintf(err_file, fmt, ap); + fprintf(err_file, "\n"); + exit(eval); +} + +void +warn (const char *fmt, + ...) +{ + va_list ap; + va_start(ap, fmt); + vwarnc(errno, fmt, ap); + va_end(ap); +} + +void +vwarn (const char *fmt, + va_list ap) +{ + vwarnc(errno, fmt, ap); +} + +void +warnc (int code, + const char *fmt, + ...) +{ + va_list ap; + va_start(ap, fmt); + vwarnc(code, fmt, ap); + va_end(ap); +} + +void +vwarnc (int code, + const char *fmt, + va_list ap) +{ + if (err_file == 0) + err_set_file((FILE *)0); + fprintf(err_file, "%s: ", calc_prog_name()); + if (fmt != NULL) + { + vfprintf(err_file, fmt, ap); + fprintf(err_file, ": "); + } + fprintf(err_file, "%s\n", strerror(code)); +} + +void +warnx (const char *fmt, + ...) +{ + va_list ap; + va_start(ap, fmt); + vwarnx(fmt, ap); + va_end(ap); +} + +void +vwarnx (const char *fmt, + va_list ap) +{ + if(err_file == 0) + err_set_file((FILE*)0); + fprintf(err_file, "%s: ", calc_prog_name()); + if(fmt != NULL) + vfprintf(err_file, fmt, ap); + fprintf(err_file, "\n"); +} + +#endif /* HAVE_ERR_H */ diff --git a/tools/compat.h b/tools/compat.h new file mode 100644 index 0000000..1562964 --- /dev/null +++ b/tools/compat.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2011 Collabora Ltd. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * * Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and + * the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * * The names of contributors to this software may not be + * used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * Author: Stef Walter <stefw@collabora.co.uk> + */ + +#ifndef __ERR_H__ +#define __ERR_H__ + +#include "config.h" + +#ifdef HAVE_ERR_H +#include <err.h> + +#else /* !HAVE_ERR_H */ + +#include <stdarg.h> +void err_set_file (void *fp); +void err_set_exit (void (*ef)(int)); +void err (int eval, const char *fmt, ...); +void verr (int eval, const char *fmt, va_list ap); +void errc (int eval, int code, const char *fmt, ...); +void verrc (int eval, int code, const char *fmt, va_list ap); +void errx (int eval, const char *fmt, ...); +void verrx (int eval, const char *fmt, va_list ap); +void warn (const char *fmt, ...); +void vwarn (const char *fmt, va_list ap); +void warnc (int code, const char *fmt, ...); +void vwarnc (int code, const char *fmt, va_list ap); +void warnx (const char *fmt, ...); +void vwarnx (const char *fmt, va_list ap); + +#endif /* !HAVE_ERR_H */ + +#endif /* __ERR_H__ */ diff --git a/tools/p11-kit.c b/tools/p11-kit.c index 44062d0..f63779e 100644 --- a/tools/p11-kit.c +++ b/tools/p11-kit.c @@ -34,9 +34,10 @@ #include "config.h" +#include "compat.h" + #include <assert.h> #include <ctype.h> -#include <err.h> #include <string.h> #include <stdio.h> #include <stdlib.h> @@ -253,7 +254,7 @@ main (int argc, char *argv[]) break; case 'v': verbose = 1; - setenv ("P11_KIT_DEBUG", "all", 1); + putenv ("P11_KIT_DEBUG=all"); break; case 'h': case '?': |