|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.0 (the 'License'). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License."
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24: /*
25: * objc-errors.m
26: * Copyright 1988, NeXT, Inc.
27: */
28:
29: /*
30: NXLogObjcError was snarfed from "logErrorInc.c" in the kit.
31:
32: Contains code for writing error messages to stderr or syslog.
33:
34: This code is included in errors.m in the kit, and in pbs.c
35: so pbs can use it also.
36: */
37:
38: #ifdef SHLIB
39: #import "shlib.h"
40: #endif SHLIB
41:
42: #include <stdarg.h>
43: #import <syslog.h>
44:
45: #import "objc-private.h"
46:
47: /*
48: * this routine handles errors that involve an object (or class).
49: */
50: volatile void __objc_error(id rcv, const char *fmt, ...)
51: {
52: va_list vp;
53:
54: va_start(vp,fmt);
55: (*_error)(rcv, fmt, vp);
56: va_end(vp);
57: _objc_error (rcv, fmt, vp); /* In case (*_error)() returns. */
58: }
59:
60: #ifndef KERNEL
61:
62: static int hasTerminal()
63: {
64: static char hasTerm = -1;
65:
66: if (hasTerm == -1) {
67: int fd = open("/dev/tty", O_RDWR, 0);
68: if (fd >= 0) {
69: (void)close(fd);
70: hasTerm = 1;
71: } else
72: hasTerm = 0;
73: }
74: return hasTerm;
75: }
76:
77: void _NXLogError(const char *format, ...)
78: {
79: va_list ap;
80: char bigBuffer[4*1024];
81:
82: va_start(ap, format);
83: vsprintf(bigBuffer, format, ap);
84: va_end(ap);
85: if (hasTerminal()) {
86: fwrite(bigBuffer, sizeof(char), strlen(bigBuffer), stderr);
87: if (bigBuffer[strlen(bigBuffer)-1] != '\n')
88: fputc('\n', stderr);
89: } else
90: syslog(LOG_ERR, "%s", bigBuffer);
91: }
92:
93: /*
94: * this routine is never called directly...it is only called indirectly
95: * through "_error", which can be overriden by an application. It is
96: * not declared static because it needs to be referenced in
97: * "objc-globaldata.m" (this file organization simplifies the shlib
98: * maintenance problem...oh well). It is, however, a "private extern".
99: */
100: volatile void _objc_error(id self, const char *fmt, va_list ap)
101: {
102: char bigBuffer[4*1024];
103:
104: vsprintf (bigBuffer, fmt, ap);
105: _NXLogError ("objc: %s: %s", object_getClassName (self), bigBuffer);
106:
107: abort(); /* generates a core file */
108: }
109:
110: /*
111: * this routine handles severe runtime errors...like not being able
112: * to read the mach headers, allocate space, etc...very uncommon.
113: */
114: volatile void _objc_fatal(const char *msg)
115: {
116: _NXLogError("objc: %s\n", msg);
117:
118: exit(1);
119: }
120:
121: /*
122: * this routine handles soft runtime errors...like not being able
123: * add a category to a class (because it wasn't linked in).
124: */
125: void _objc_inform(const char *fmt, ...)
126: {
127: va_list ap;
128: char bigBuffer[4*1024];
129:
130: va_start (ap,fmt);
131: vsprintf (bigBuffer, fmt, ap);
132: _NXLogError ("objc: %s", bigBuffer);
133: va_end (ap);
134: }
135:
136: #else /* not KERNEL */
137:
138: extern int vlog(int level, const char *format, va_list ap);
139: extern volatile void panic(const char *reason);
140:
141: /* special panic versions of the objc error routines */
142:
143: void _NXLogError(const char *format, ...)
144: {
145: va_list ap;
146:
147: va_start(ap, format);
148: vlog(LOG_ERR, format, ap);
149: va_end(ap);
150: if(format[strlen(format)-1] != '\n') {
151: log(LOG_ERR, "\n");
152: }
153: }
154:
155: volatile void _objc_error(id self, const char *fmt, va_list ap)
156: {
157: log(LOG_ERR, "objc error: %s ", object_getClassName(self));
158: vlog(LOG_ERR, fmt, ap);
159: if(fmt[strlen(fmt)-1] != '\n') {
160: log(LOG_ERR, "\n");
161: }
162: abort();
163: }
164:
165: volatile void _objc_fatal(const char *msg)
166: {
167: printf("objc fatal: %s\n", msg);
168: panic("Objective-C fatal");
169: }
170:
171: void _objc_inform(const char *fmt, ...)
172: {
173: va_list ap;
174:
175: va_start(ap, fmt);
176: vlog(LOG_ERR, fmt, ap);
177: va_end(ap);
178: if(fmt[strlen(fmt)-1] != '\n') {
179: log(LOG_ERR, "\n");
180: }
181: }
182:
183: #endif /* not KERNEL */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.