1/* 2 * Copyright (c) 2004-2005 Todd C. Miller <Todd.Miller@courtesan.com> 3 * 4 * Permission to use, copy, modify, and distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17#include <config.h> 18 19#include <sys/types.h> 20 21#include <errno.h> 22#include <stdio.h> 23#include <stdlib.h> 24#include <string.h> 25 26#include "missing.h" 27#include "error.h" 28 29static void _warning __P((int, const char *, va_list)); 30 void cleanup __P((int)); 31 32void 33#ifdef __STDC__ 34error(int eval, const char *fmt, ...) 35#else 36error(eval, fmt, va_alist) 37 int eval; 38 const char *fmt; 39 va_dcl 40#endif 41{ 42 va_list ap; 43#ifdef __STDC__ 44 va_start(ap, fmt); 45#else 46 va_start(ap); 47#endif 48 _warning(1, fmt, ap); 49 va_end(ap); 50 cleanup(0); 51 exit(eval); 52} 53 54void 55#ifdef __STDC__ 56errorx(int eval, const char *fmt, ...) 57#else 58errorx(eval, fmt, va_alist) 59 int eval; 60 const char *fmt; 61 va_dcl 62#endif 63{ 64 va_list ap; 65#ifdef __STDC__ 66 va_start(ap, fmt); 67#else 68 va_start(ap); 69#endif 70 _warning(0, fmt, ap); 71 va_end(ap); 72 cleanup(0); 73 exit(eval); 74} 75 76void 77#ifdef __STDC__ 78warning(const char *fmt, ...) 79#else 80warning(fmt, va_alist) 81 const char *fmt; 82 va_dcl 83#endif 84{ 85 va_list ap; 86#ifdef __STDC__ 87 va_start(ap, fmt); 88#else 89 va_start(ap); 90#endif 91 _warning(1, fmt, ap); 92 va_end(ap); 93} 94 95void 96#ifdef __STDC__ 97warningx(const char *fmt, ...) 98#else 99warningx(fmt, va_alist) 100 const char *fmt; 101 va_dcl 102#endif 103{ 104 va_list ap; 105#ifdef __STDC__ 106 va_start(ap, fmt); 107#else 108 va_start(ap); 109#endif 110 _warning(0, fmt, ap); 111 va_end(ap); 112} 113 114static void 115_warning(use_errno, fmt, ap) 116 int use_errno; 117 const char *fmt; 118 va_list ap; 119{ 120 int serrno = errno; 121 122 fputs(getprogname(), stderr); 123 if (fmt != NULL) { 124 fputs(": ", stderr); 125 vfprintf(stderr, fmt, ap); 126 } 127 if (use_errno) { 128 fputs(": ", stderr); 129 fputs(strerror(serrno), stderr); 130 } 131 putc('\n', stderr); 132} 133