diff --git a/lib/com_err/Makefile.am b/lib/com_err/Makefile.am index da9fb6e87..01dcea3c3 100644 --- a/lib/com_err/Makefile.am +++ b/lib/com_err/Makefile.am @@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = no-dependencies foreign INCLUDES = -I$(top_builddir)/include -I$(srcdir) -lib_LIBRARIES = liberror.a +lib_LIBRARIES = liberror.a libcom_err.a SUFFIXES = .et .h @@ -16,6 +16,8 @@ CLEANFILES = asn1_err.c asn1_err.h krb5_err.c krb5_err.h heim_err.c heim_err.h liberror_a_SOURCES = krb5_err.c asn1_err.c error.c heim_err.c +libcom_err_a_SOURCES = error.c comerr.c + all-local: $(inc_DATA) @for i in $(inc_DATA); do \ if cmp -s $$i $(idir)/$$i 2> /dev/null ; then :; else\ diff --git a/lib/com_err/com_err.c b/lib/com_err/com_err.c new file mode 100644 index 000000000..36f824a83 --- /dev/null +++ b/lib/com_err/com_err.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Kungliga Tekniska + * Högskolan and its contributors. + * + * 4. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 INSTITUTE 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. + */ + +#include +#include "com_err.h" + +static struct error_table *et_list; + +const char * +error_message (long code) +{ + static char msg[128]; + const char *p = com_right(et_list, code); + if(p){ + strncpy(msg, p, sizeof(msg)); + msg[sizeof(msg)-1] = '\0'; + } else{ + snprintf(msg, sizeof(msg), "Unknown error %d", code); + } + return msg; +} + +int +init_error_table(const char **msgs, long base, int count) +{ + initialize_error_table(&et_list, msgs, count, base); + return 0; +} + +static void +default_proc (const char *whoami, long code, const char *fmt, va_list args) +{ + char f[sizeof("%s: %s %s\r\n")] = ""; + char *x; + const void *arg[3], **ap = arg; + + if(whoami) { + strcat(f, "%s: "); + *ap++ = whoami; + } + if(code) { + strcat(f, "%s "); + *ap++ = error_message(code); + } + if(fmt) { + strcat(f, "%s"); + *ap++ = fmt; + } + strcat(f, "\r\n"); + asprintf(&x, f, arg[0], arg[1], arg[2]); + vfprintf(stderr, x, args); + free(x); + fflush(stderr); +} + +static errf com_err_hook = default_proc; + +void +com_err_va (const char *whoami, + long code, + const char *fmt, + va_list args) +{ + (*com_err_hook) (whoami, code, fmt, args); +} + +void +com_err (const char *whoami, + long code, + const char *fmt, + ...) +{ + va_list ap; + va_start(ap, fmt); + com_err_va (whoami, code, fmt, ap); + va_end(pvar); +} + +errf +set_com_err_hook (errf new) +{ + errf old = com_err_hook; + + if (new) + com_err_hook = new; + else + com_err_hook = default_proc; + + return old; +} + +errf +reset_com_err_hook (void) +{ + return set_com_err_hook(NULL); +} diff --git a/lib/com_err/com_err.h b/lib/com_err/com_err.h new file mode 100644 index 000000000..88a557491 --- /dev/null +++ b/lib/com_err/com_err.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. 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. + * + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Kungliga Tekniska + * Högskolan and its contributors. + * + * 4. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE 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 INSTITUTE 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. + */ + +/* $Id$ */ + +/* MIT compatible com_err library */ + +#ifndef __COM_ERR_H__ +#define __COM_ERR_H__ + +#ifdef __STDC__ +#include +#endif + +#ifndef __P +#ifdef __STDC__ +#define __P(X) X +#else +#define __P(X) () +#endif +#endif + +#include + +typedef void (*errf) __P((const char *, long, const char *, va_list)); + +const char * error_message __P((long)); +int init_error_table __P((const char**, long, int)); + +void com_err_va __P((const char *, long, const char *, va_list)); +void com_err __P((const char *, long, const char *, ...)); + +errf set_com_err_hook __P((errf)); +errf reset_com_err_hook __P((void)); + +#endif /* __COM_ERR_H__ */ diff --git a/lib/com_err/compile_et.awk b/lib/com_err/compile_et.awk index 20faf7a7f..2933abc18 100644 --- a/lib/com_err/compile_et.awk +++ b/lib/com_err/compile_et.awk @@ -22,6 +22,7 @@ $1 == "error_table" || $1 == "et" { split(name, x, "\\.") name=x[1] c_file = name "_err.c" + c_file_compat = name "_err_compat.c" h_file = name "_err.h" h = "" # gsub("[^a-zA-Z0-9]", "_", H_FILE) @@ -36,7 +37,7 @@ $1 == "error_table" || $1 == "et" { print "/* Generated from " FILENAME " */" > c_file if(id_str != "") print id_str > c_file - print "" > c_file + print "" > c_file_compat print "#include " > c_file # NULL print "#include " > c_file print "#include <" h_file ">" > c_file @@ -52,7 +53,9 @@ $1 == "error_table" || $1 == "et" { print "" > h_file print "#include " > h_file print "" > h_file - print "void initialize_" name "_error_table(struct error_table**);" > h_file + print "void initialize_" name "_error_table_r(struct error_table**);" > h_file + print "" > h_file + print "void initialize_" name "_error_table(void); /* MIT compatible, don't use */" > h_file print "" > h_file print "typedef enum " name "_error_number{" > h_file print "\tERROR_TABLE_BASE_" name " = " base "," > h_file @@ -94,12 +97,18 @@ END { print "\tNULL" > c_file print "};" > c_file print "" > c_file - print "void initialize_" name "_error_table (struct error_table **list)" > c_file + print "void initialize_" name "_error_table_r " > c_file + print "(struct error_table **list)" > c_file print "{" > c_file - printf " initialize_error_table(list, text, " > c_file + printf " initialize_error_table_r(list, text, " > c_file print name "_num_errors, ERROR_TABLE_BASE_" name ");" > c_file print "}" > c_file print "" > c_file + print "void initialize__" name "_error_table(void)" > c_file + print "{" > c_file + printf " init_error_table(text, ERROR_TABLE_BASE_" name ", " > c_file + print name "_num_errors);" > c_file + print "}" > c_file print "\t" name "_num_errors = " number > h_file print "} " name "_error_number;" > h_file