Annotation of src/lib/libc/gen/assert.c, Revision 1.12
1.12 ! lukem 1: /* $NetBSD: assert.c,v 1.11 2000/12/19 21:17:16 christos Exp $ */
1.6 cgd 2:
1.5 cgd 3: /*-
4: * Copyright (c) 1992, 1993
5: * The Regents of the University of California. All rights reserved.
1.1 jtc 6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: * 3. All advertising materials mentioning features or use of this software
16: * must display the following acknowledgement:
1.5 cgd 17: * This product includes software developed by the University of
18: * California, Berkeley and its contributors.
19: * 4. Neither the name of the University nor the names of its contributors
20: * may be used to endorse or promote products derived from this software
21: * without specific prior written permission.
1.1 jtc 22: *
1.5 cgd 23: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33: * SUCH DAMAGE.
1.1 jtc 34: */
35:
1.7 christos 36: #include <sys/cdefs.h>
1.2 mycroft 37: #if defined(LIBC_SCCS) && !defined(lint)
1.6 cgd 38: #if 0
39: static char sccsid[] = "@(#)assert.c 8.1 (Berkeley) 6/4/93";
40: #else
1.12 ! lukem 41: __RCSID("$NetBSD: assert.c,v 1.11 2000/12/19 21:17:16 christos Exp $");
1.6 cgd 42: #endif
1.2 mycroft 43: #endif /* LIBC_SCCS and not lint */
44:
1.5 cgd 45: #include <sys/types.h>
1.8 lukem 46:
1.5 cgd 47: #include <assert.h>
1.1 jtc 48: #include <stdio.h>
49: #include <stdlib.h>
1.8 lukem 50: #include <syslog.h>
1.1 jtc 51:
1.9 christos 52: extern char *__progname;
53:
1.1 jtc 54: void
1.10 kleink 55: __assert13(file, line, function, failedexpr)
56: const char *file, *function, *failedexpr;
57: int line;
58: {
1.12 ! lukem 59:
1.10 kleink 60: (void)fprintf(stderr,
61: "assertion \"%s\" failed: file \"%s\", line %d%s%s%s\n",
62: failedexpr, file, line,
63: function ? ", function \"" : "",
64: function ? function : "",
65: function ? "\"" : "");
66: abort();
67: /* NOTREACHED */
68: }
69:
70: void
1.5 cgd 71: __assert(file, line, failedexpr)
72: const char *file, *failedexpr;
1.1 jtc 73: int line;
74: {
1.12 ! lukem 75:
! 76: __assert13(file, line, NULL, failedexpr);
1.5 cgd 77: /* NOTREACHED */
1.10 kleink 78: }
79:
1.12 ! lukem 80:
! 81: enum {
! 82: DIAGASSERT_ABORT = 1<<0,
! 83: DIAGASSERT_STDERR = 1<<1,
! 84: DIAGASSERT_SYSLOG = 1<<2
! 85: };
! 86:
! 87: static int diagassert_flags = -1;
! 88:
1.10 kleink 89: void
90: __diagassert13(file, line, function, failedexpr)
91: const char *file, *function, *failedexpr;
92: int line;
93: {
1.12 ! lukem 94: char buf[1024];
! 95:
! 96: if (diagassert_flags == -1) {
! 97: char *p;
! 98:
! 99: diagassert_flags = DIAGASSERT_SYSLOG;
! 100:
! 101: for (p = getenv("LIBC_DIAGASSERT"); p && *p; p++) {
! 102: switch (*p) {
! 103: case 'a':
! 104: diagassert_flags |= DIAGASSERT_ABORT;
! 105: break;
! 106: case 'A':
! 107: diagassert_flags &= ~DIAGASSERT_ABORT;
! 108: break;
! 109: case 'e':
! 110: diagassert_flags |= DIAGASSERT_STDERR;
! 111: break;
! 112: case 'E':
! 113: diagassert_flags &= ~DIAGASSERT_STDERR;
! 114: break;
! 115: case 'l':
! 116: diagassert_flags |= DIAGASSERT_SYSLOG;
! 117: break;
! 118: case 'L':
! 119: diagassert_flags &= ~DIAGASSERT_SYSLOG;
! 120: break;
! 121: }
! 122: }
! 123: }
! 124:
! 125: snprintf(buf, sizeof(buf),
1.10 kleink 126: "assertion \"%s\" failed: file \"%s\", line %d%s%s%s",
127: failedexpr, file, line,
128: function ? ", function \"" : "",
129: function ? function : "",
130: function ? "\"" : "");
1.12 ! lukem 131: if (diagassert_flags & DIAGASSERT_STDERR)
! 132: (void)fprintf(stderr, "%s: %s\n", __progname, buf);
! 133: if (diagassert_flags & DIAGASSERT_SYSLOG)
! 134: syslog(LOG_DEBUG | LOG_USER, "%s", buf);
! 135: if (diagassert_flags & DIAGASSERT_ABORT)
! 136: abort();
1.8 lukem 137: }
138:
139: void
140: __diagassert(file, line, failedexpr)
141: const char *file, *failedexpr;
142: int line;
143: {
1.12 ! lukem 144:
! 145: __diagassert13(file, line, NULL, failedexpr);
1.1 jtc 146: }
CVSweb <webmaster@jp.NetBSD.org>