|
|
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.