1b528cefcSMark Murray /* 2*ae771770SStanislav Sedov * Copyright (c) 1997 - 2001 Kungliga Tekniska Högskolan 3b528cefcSMark Murray * (Royal Institute of Technology, Stockholm, Sweden). 4b528cefcSMark Murray * All rights reserved. 5b528cefcSMark Murray * 6b528cefcSMark Murray * Redistribution and use in source and binary forms, with or without 7b528cefcSMark Murray * modification, are permitted provided that the following conditions 8b528cefcSMark Murray * are met: 9b528cefcSMark Murray * 10b528cefcSMark Murray * 1. Redistributions of source code must retain the above copyright 11b528cefcSMark Murray * notice, this list of conditions and the following disclaimer. 12b528cefcSMark Murray * 13b528cefcSMark Murray * 2. Redistributions in binary form must reproduce the above copyright 14b528cefcSMark Murray * notice, this list of conditions and the following disclaimer in the 15b528cefcSMark Murray * documentation and/or other materials provided with the distribution. 16b528cefcSMark Murray * 17b528cefcSMark Murray * 3. Neither the name of the Institute nor the names of its contributors 18b528cefcSMark Murray * may be used to endorse or promote products derived from this software 19b528cefcSMark Murray * without specific prior written permission. 20b528cefcSMark Murray * 21b528cefcSMark Murray * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22b528cefcSMark Murray * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23b528cefcSMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24b528cefcSMark Murray * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25b528cefcSMark Murray * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26b528cefcSMark Murray * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27b528cefcSMark Murray * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28b528cefcSMark Murray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29b528cefcSMark Murray * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30b528cefcSMark Murray * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31b528cefcSMark Murray * SUCH DAMAGE. 32b528cefcSMark Murray */ 33b528cefcSMark Murray 34b528cefcSMark Murray #include "krb5_locl.h" 35b528cefcSMark Murray #include <err.h> 36b528cefcSMark Murray 37adb0ddaeSAssar Westerlund static krb5_error_code _warnerr(krb5_context context, int do_errtext, 38adb0ddaeSAssar Westerlund krb5_error_code code, int level, const char *fmt, va_list ap) 39adb0ddaeSAssar Westerlund __attribute__((__format__(__printf__, 5, 0))); 40b528cefcSMark Murray 41b528cefcSMark Murray static krb5_error_code 42b528cefcSMark Murray _warnerr(krb5_context context, int do_errtext, 43b528cefcSMark Murray krb5_error_code code, int level, const char *fmt, va_list ap) 44b528cefcSMark Murray { 45b528cefcSMark Murray char xfmt[7] = ""; 46b528cefcSMark Murray const char *args[2], **arg; 47b528cefcSMark Murray char *msg = NULL; 48*ae771770SStanislav Sedov const char *err_str = NULL; 49*ae771770SStanislav Sedov krb5_error_code ret; 50b528cefcSMark Murray 515e9cd1aeSAssar Westerlund args[0] = args[1] = NULL; 52b528cefcSMark Murray arg = args; 53b528cefcSMark Murray if(fmt){ 54bbd80c28SJacques Vidrine strlcat(xfmt, "%s", sizeof(xfmt)); 55b528cefcSMark Murray if(do_errtext) 56bbd80c28SJacques Vidrine strlcat(xfmt, ": ", sizeof(xfmt)); 57*ae771770SStanislav Sedov ret = vasprintf(&msg, fmt, ap); 58*ae771770SStanislav Sedov if(ret < 0 || msg == NULL) 59b528cefcSMark Murray return ENOMEM; 60b528cefcSMark Murray *arg++ = msg; 61b528cefcSMark Murray } 62b528cefcSMark Murray if(context && do_errtext){ 63bbd80c28SJacques Vidrine strlcat(xfmt, "%s", sizeof(xfmt)); 64b528cefcSMark Murray 65*ae771770SStanislav Sedov err_str = krb5_get_error_message(context, code); 66adb0ddaeSAssar Westerlund if (err_str != NULL) { 67*ae771770SStanislav Sedov *arg = err_str; 68adb0ddaeSAssar Westerlund } else { 69*ae771770SStanislav Sedov *arg= "<unknown error>"; 70b528cefcSMark Murray } 71adb0ddaeSAssar Westerlund } 72b528cefcSMark Murray 73b528cefcSMark Murray if(context && context->warn_dest) 74b528cefcSMark Murray krb5_log(context, context->warn_dest, level, xfmt, args[0], args[1]); 75b528cefcSMark Murray else 76b528cefcSMark Murray warnx(xfmt, args[0], args[1]); 77b528cefcSMark Murray free(msg); 78*ae771770SStanislav Sedov krb5_free_error_message(context, err_str); 79b528cefcSMark Murray return 0; 80b528cefcSMark Murray } 81b528cefcSMark Murray 82b528cefcSMark Murray #define FUNC(ETEXT, CODE, LEVEL) \ 83b528cefcSMark Murray krb5_error_code ret; \ 84b528cefcSMark Murray va_list ap; \ 85b528cefcSMark Murray va_start(ap, fmt); \ 86b528cefcSMark Murray ret = _warnerr(context, ETEXT, CODE, LEVEL, fmt, ap); \ 87b528cefcSMark Murray va_end(ap); 88b528cefcSMark Murray 89b528cefcSMark Murray #undef __attribute__ 90b528cefcSMark Murray #define __attribute__(X) 91b528cefcSMark Murray 92*ae771770SStanislav Sedov /** 93*ae771770SStanislav Sedov * Log a warning to the log, default stderr, include the error from 94*ae771770SStanislav Sedov * the last failure. 95*ae771770SStanislav Sedov * 96*ae771770SStanislav Sedov * @param context A Kerberos 5 context. 97*ae771770SStanislav Sedov * @param code error code of the last error 98*ae771770SStanislav Sedov * @param fmt message to print 99*ae771770SStanislav Sedov * @param ap arguments 100*ae771770SStanislav Sedov * 101*ae771770SStanislav Sedov * @ingroup krb5_error 102*ae771770SStanislav Sedov */ 103*ae771770SStanislav Sedov 104*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 105b528cefcSMark Murray krb5_vwarn(krb5_context context, krb5_error_code code, 106b528cefcSMark Murray const char *fmt, va_list ap) 107b528cefcSMark Murray __attribute__ ((format (printf, 3, 0))) 108b528cefcSMark Murray { 109b528cefcSMark Murray return _warnerr(context, 1, code, 1, fmt, ap); 110b528cefcSMark Murray } 111b528cefcSMark Murray 112*ae771770SStanislav Sedov /** 113*ae771770SStanislav Sedov * Log a warning to the log, default stderr, include the error from 114*ae771770SStanislav Sedov * the last failure. 115*ae771770SStanislav Sedov * 116*ae771770SStanislav Sedov * @param context A Kerberos 5 context. 117*ae771770SStanislav Sedov * @param code error code of the last error 118*ae771770SStanislav Sedov * @param fmt message to print 119*ae771770SStanislav Sedov * 120*ae771770SStanislav Sedov * @ingroup krb5_error 121*ae771770SStanislav Sedov */ 122b528cefcSMark Murray 123*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 124b528cefcSMark Murray krb5_warn(krb5_context context, krb5_error_code code, const char *fmt, ...) 125b528cefcSMark Murray __attribute__ ((format (printf, 3, 4))) 126b528cefcSMark Murray { 127b528cefcSMark Murray FUNC(1, code, 1); 128b528cefcSMark Murray return ret; 129b528cefcSMark Murray } 130b528cefcSMark Murray 131*ae771770SStanislav Sedov /** 132*ae771770SStanislav Sedov * Log a warning to the log, default stderr. 133*ae771770SStanislav Sedov * 134*ae771770SStanislav Sedov * @param context A Kerberos 5 context. 135*ae771770SStanislav Sedov * @param fmt message to print 136*ae771770SStanislav Sedov * @param ap arguments 137*ae771770SStanislav Sedov * 138*ae771770SStanislav Sedov * @ingroup krb5_error 139*ae771770SStanislav Sedov */ 140*ae771770SStanislav Sedov 141*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 142b528cefcSMark Murray krb5_vwarnx(krb5_context context, const char *fmt, va_list ap) 143b528cefcSMark Murray __attribute__ ((format (printf, 2, 0))) 144b528cefcSMark Murray { 145b528cefcSMark Murray return _warnerr(context, 0, 0, 1, fmt, ap); 146b528cefcSMark Murray } 147b528cefcSMark Murray 148*ae771770SStanislav Sedov /** 149*ae771770SStanislav Sedov * Log a warning to the log, default stderr. 150*ae771770SStanislav Sedov * 151*ae771770SStanislav Sedov * @param context A Kerberos 5 context. 152*ae771770SStanislav Sedov * @param fmt message to print 153*ae771770SStanislav Sedov * 154*ae771770SStanislav Sedov * @ingroup krb5_error 155*ae771770SStanislav Sedov */ 156*ae771770SStanislav Sedov 157*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 158b528cefcSMark Murray krb5_warnx(krb5_context context, const char *fmt, ...) 159b528cefcSMark Murray __attribute__ ((format (printf, 2, 3))) 160b528cefcSMark Murray { 161b528cefcSMark Murray FUNC(0, 0, 1); 162b528cefcSMark Murray return ret; 163b528cefcSMark Murray } 164b528cefcSMark Murray 165*ae771770SStanislav Sedov /** 166*ae771770SStanislav Sedov * Log a warning to the log, default stderr, include bthe error from 167*ae771770SStanislav Sedov * the last failure and then exit. 168*ae771770SStanislav Sedov * 169*ae771770SStanislav Sedov * @param context A Kerberos 5 context 170*ae771770SStanislav Sedov * @param eval the exit code to exit with 171*ae771770SStanislav Sedov * @param code error code of the last error 172*ae771770SStanislav Sedov * @param fmt message to print 173*ae771770SStanislav Sedov * @param ap arguments 174*ae771770SStanislav Sedov * 175*ae771770SStanislav Sedov * @ingroup krb5_error 176*ae771770SStanislav Sedov */ 177*ae771770SStanislav Sedov 178*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 179b528cefcSMark Murray krb5_verr(krb5_context context, int eval, krb5_error_code code, 180b528cefcSMark Murray const char *fmt, va_list ap) 181b528cefcSMark Murray __attribute__ ((noreturn, format (printf, 4, 0))) 182b528cefcSMark Murray { 183b528cefcSMark Murray _warnerr(context, 1, code, 0, fmt, ap); 184b528cefcSMark Murray exit(eval); 185*ae771770SStanislav Sedov UNREACHABLE(return 0); 186b528cefcSMark Murray } 187b528cefcSMark Murray 188*ae771770SStanislav Sedov /** 189*ae771770SStanislav Sedov * Log a warning to the log, default stderr, include bthe error from 190*ae771770SStanislav Sedov * the last failure and then exit. 191*ae771770SStanislav Sedov * 192*ae771770SStanislav Sedov * @param context A Kerberos 5 context 193*ae771770SStanislav Sedov * @param eval the exit code to exit with 194*ae771770SStanislav Sedov * @param code error code of the last error 195*ae771770SStanislav Sedov * @param fmt message to print 196*ae771770SStanislav Sedov * 197*ae771770SStanislav Sedov * @ingroup krb5_error 198*ae771770SStanislav Sedov */ 199b528cefcSMark Murray 200*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 201b528cefcSMark Murray krb5_err(krb5_context context, int eval, krb5_error_code code, 202b528cefcSMark Murray const char *fmt, ...) 203b528cefcSMark Murray __attribute__ ((noreturn, format (printf, 4, 5))) 204b528cefcSMark Murray { 205b528cefcSMark Murray FUNC(1, code, 0); 206b528cefcSMark Murray exit(eval); 207*ae771770SStanislav Sedov UNREACHABLE(return 0); 208b528cefcSMark Murray } 209b528cefcSMark Murray 210*ae771770SStanislav Sedov /** 211*ae771770SStanislav Sedov * Log a warning to the log, default stderr, and then exit. 212*ae771770SStanislav Sedov * 213*ae771770SStanislav Sedov * @param context A Kerberos 5 context 214*ae771770SStanislav Sedov * @param eval the exit code to exit with 215*ae771770SStanislav Sedov * @param fmt message to print 216*ae771770SStanislav Sedov * @param ap arguments 217*ae771770SStanislav Sedov * 218*ae771770SStanislav Sedov * @ingroup krb5_error 219*ae771770SStanislav Sedov */ 220*ae771770SStanislav Sedov 221*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 222b528cefcSMark Murray krb5_verrx(krb5_context context, int eval, const char *fmt, va_list ap) 223b528cefcSMark Murray __attribute__ ((noreturn, format (printf, 3, 0))) 224b528cefcSMark Murray { 225b528cefcSMark Murray _warnerr(context, 0, 0, 0, fmt, ap); 226b528cefcSMark Murray exit(eval); 227*ae771770SStanislav Sedov UNREACHABLE(return 0); 228b528cefcSMark Murray } 229b528cefcSMark Murray 230*ae771770SStanislav Sedov /** 231*ae771770SStanislav Sedov * Log a warning to the log, default stderr, and then exit. 232*ae771770SStanislav Sedov * 233*ae771770SStanislav Sedov * @param context A Kerberos 5 context 234*ae771770SStanislav Sedov * @param eval the exit code to exit with 235*ae771770SStanislav Sedov * @param fmt message to print 236*ae771770SStanislav Sedov * 237*ae771770SStanislav Sedov * @ingroup krb5_error 238*ae771770SStanislav Sedov */ 239*ae771770SStanislav Sedov 240*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 241b528cefcSMark Murray krb5_errx(krb5_context context, int eval, const char *fmt, ...) 242b528cefcSMark Murray __attribute__ ((noreturn, format (printf, 3, 4))) 243b528cefcSMark Murray { 244b528cefcSMark Murray FUNC(0, 0, 0); 245b528cefcSMark Murray exit(eval); 246*ae771770SStanislav Sedov UNREACHABLE(return 0); 247b528cefcSMark Murray } 248b528cefcSMark Murray 249*ae771770SStanislav Sedov /** 250*ae771770SStanislav Sedov * Log a warning to the log, default stderr, include bthe error from 251*ae771770SStanislav Sedov * the last failure and then abort. 252*ae771770SStanislav Sedov * 253*ae771770SStanislav Sedov * @param context A Kerberos 5 context 254*ae771770SStanislav Sedov * @param code error code of the last error 255*ae771770SStanislav Sedov * @param fmt message to print 256*ae771770SStanislav Sedov * @param ap arguments 257*ae771770SStanislav Sedov * 258*ae771770SStanislav Sedov * @ingroup krb5_error 259*ae771770SStanislav Sedov */ 260*ae771770SStanislav Sedov 261*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 262b528cefcSMark Murray krb5_vabort(krb5_context context, krb5_error_code code, 263b528cefcSMark Murray const char *fmt, va_list ap) 264b528cefcSMark Murray __attribute__ ((noreturn, format (printf, 3, 0))) 265b528cefcSMark Murray { 266b528cefcSMark Murray _warnerr(context, 1, code, 0, fmt, ap); 267b528cefcSMark Murray abort(); 268*ae771770SStanislav Sedov UNREACHABLE(return 0); 269b528cefcSMark Murray } 270b528cefcSMark Murray 271*ae771770SStanislav Sedov /** 272*ae771770SStanislav Sedov * Log a warning to the log, default stderr, include the error from 273*ae771770SStanislav Sedov * the last failure and then abort. 274*ae771770SStanislav Sedov * 275*ae771770SStanislav Sedov * @param context A Kerberos 5 context 276*ae771770SStanislav Sedov * @param code error code of the last error 277*ae771770SStanislav Sedov * @param fmt message to print 278*ae771770SStanislav Sedov * 279*ae771770SStanislav Sedov * @ingroup krb5_error 280*ae771770SStanislav Sedov */ 281b528cefcSMark Murray 282*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 283b528cefcSMark Murray krb5_abort(krb5_context context, krb5_error_code code, const char *fmt, ...) 284b528cefcSMark Murray __attribute__ ((noreturn, format (printf, 3, 4))) 285b528cefcSMark Murray { 286b528cefcSMark Murray FUNC(1, code, 0); 287b528cefcSMark Murray abort(); 288*ae771770SStanislav Sedov UNREACHABLE(return 0); 289b528cefcSMark Murray } 290b528cefcSMark Murray 291*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 292b528cefcSMark Murray krb5_vabortx(krb5_context context, const char *fmt, va_list ap) 293b528cefcSMark Murray __attribute__ ((noreturn, format (printf, 2, 0))) 294b528cefcSMark Murray { 295b528cefcSMark Murray _warnerr(context, 0, 0, 0, fmt, ap); 296b528cefcSMark Murray abort(); 297*ae771770SStanislav Sedov UNREACHABLE(return 0); 298b528cefcSMark Murray } 299b528cefcSMark Murray 300*ae771770SStanislav Sedov /** 301*ae771770SStanislav Sedov * Log a warning to the log, default stderr, and then abort. 302*ae771770SStanislav Sedov * 303*ae771770SStanislav Sedov * @param context A Kerberos 5 context 304*ae771770SStanislav Sedov * @param code error code of the last error 305*ae771770SStanislav Sedov * @param fmt message to print 306*ae771770SStanislav Sedov * 307*ae771770SStanislav Sedov * @ingroup krb5_error 308*ae771770SStanislav Sedov */ 309*ae771770SStanislav Sedov 310*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 311b528cefcSMark Murray krb5_abortx(krb5_context context, const char *fmt, ...) 312b528cefcSMark Murray __attribute__ ((noreturn, format (printf, 2, 3))) 313b528cefcSMark Murray { 314b528cefcSMark Murray FUNC(0, 0, 0); 315b528cefcSMark Murray abort(); 316*ae771770SStanislav Sedov UNREACHABLE(return 0); 317b528cefcSMark Murray } 318b528cefcSMark Murray 319*ae771770SStanislav Sedov /** 320*ae771770SStanislav Sedov * Set the default logging facility. 321*ae771770SStanislav Sedov * 322*ae771770SStanislav Sedov * @param context A Kerberos 5 context 323*ae771770SStanislav Sedov * @param fac Facility to use for logging. 324*ae771770SStanislav Sedov * 325*ae771770SStanislav Sedov * @ingroup krb5_error 326*ae771770SStanislav Sedov */ 327*ae771770SStanislav Sedov 328*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL 329b528cefcSMark Murray krb5_set_warn_dest(krb5_context context, krb5_log_facility *fac) 330b528cefcSMark Murray { 331b528cefcSMark Murray context->warn_dest = fac; 332b528cefcSMark Murray return 0; 333b528cefcSMark Murray } 334c19800e8SDoug Rabson 335*ae771770SStanislav Sedov /** 336*ae771770SStanislav Sedov * Get the default logging facility. 337*ae771770SStanislav Sedov * 338*ae771770SStanislav Sedov * @param context A Kerberos 5 context 339*ae771770SStanislav Sedov * 340*ae771770SStanislav Sedov * @ingroup krb5_error 341*ae771770SStanislav Sedov */ 342*ae771770SStanislav Sedov 343*ae771770SStanislav Sedov KRB5_LIB_FUNCTION krb5_log_facility * KRB5_LIB_CALL 344c19800e8SDoug Rabson krb5_get_warn_dest(krb5_context context) 345c19800e8SDoug Rabson { 346c19800e8SDoug Rabson return context->warn_dest; 347c19800e8SDoug Rabson } 348