error.c revision ce6676db
1bbe1b32bSmrg/* 2bbe1b32bSmrg * error message handling 3bbe1b32bSmrg */ 4bbe1b32bSmrg/* 5bbe1b32bSmrgCopyright 1994, 1998 The Open Group 6bbe1b32bSmrg 7bbe1b32bSmrgPermission to use, copy, modify, distribute, and sell this software and its 8bbe1b32bSmrgdocumentation for any purpose is hereby granted without fee, provided that 9bbe1b32bSmrgthe above copyright notice appear in all copies and that both that 10bbe1b32bSmrgcopyright notice and this permission notice appear in supporting 11bbe1b32bSmrgdocumentation. 12bbe1b32bSmrg 13bbe1b32bSmrgThe above copyright notice and this permission notice shall be included in 14bbe1b32bSmrgall copies or substantial portions of the Software. 15bbe1b32bSmrg 16bbe1b32bSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17bbe1b32bSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18bbe1b32bSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19bbe1b32bSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 20bbe1b32bSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21bbe1b32bSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22bbe1b32bSmrg 23bbe1b32bSmrgExcept as contained in this notice, the name of The Open Group shall not be 24bbe1b32bSmrgused in advertising or otherwise to promote the sale, use or other dealings 25bbe1b32bSmrgin this Software without prior written authorization from The Open Group. 26bbe1b32bSmrg * Copyright 1991 Network Computing Devices; 27bbe1b32bSmrg * Portions Copyright 1987 by Digital Equipment Corporation 28bbe1b32bSmrg * 29bbe1b32bSmrg * Permission to use, copy, modify, distribute, and sell this software and 30bbe1b32bSmrg * its documentation for any purpose is hereby granted without fee, provided 31bbe1b32bSmrg * that the above copyright notice appear in all copies and that both that 32bbe1b32bSmrg * copyright notice and this permission notice appear in supporting 33bbe1b32bSmrg * documentation, and that the names of Network Computing Devices, or Digital 34bbe1b32bSmrg * not be used in advertising or publicity pertaining to distribution 35bbe1b32bSmrg * of the software without specific, written prior permission. 36bbe1b32bSmrg * 37bbe1b32bSmrg * NETWORK COMPUTING DEVICES, DIGITAL DISCLAIM ALL WARRANTIES WITH 38bbe1b32bSmrg * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF 39bbe1b32bSmrg * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETWORK COMPUTING DEVICES, 40bbe1b32bSmrg * OR DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 41bbe1b32bSmrg * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 42bbe1b32bSmrg * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 43bbe1b32bSmrg * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 44bbe1b32bSmrg * THIS SOFTWARE. 45bbe1b32bSmrg */ 46ce6676dbSmrg 47ce6676dbSmrg#include "xfs-config.h" 48bbe1b32bSmrg 49bbe1b32bSmrg#include <stdio.h> 50bbe1b32bSmrg#include <stdlib.h> 51bbe1b32bSmrg#include <stdarg.h> 52bbe1b32bSmrg#include <X11/Xos.h> 53bbe1b32bSmrg 54bbe1b32bSmrg#ifdef USE_SYSLOG 55bbe1b32bSmrg#include <syslog.h> 56bbe1b32bSmrg#endif 57bbe1b32bSmrg 58bbe1b32bSmrg#include <errno.h> 59bbe1b32bSmrg 60bbe1b32bSmrg#include "misc.h" 61ce6676dbSmrg#include "globals.h" 62ce6676dbSmrg#include "osdep.h" 63bbe1b32bSmrg 64bbe1b32bSmrgBool UseSyslog; 65bbe1b32bSmrgBool log_open = FALSE; 66bbe1b32bSmrgchar ErrorFile[PATH_MAX]; 67bbe1b32bSmrgstatic char CurrentErrorFile[PATH_MAX]; 68bbe1b32bSmrg 69bbe1b32bSmrgstatic void 70bbe1b32bSmrgabort_server(void) 71bbe1b32bSmrg{ 72bbe1b32bSmrg fflush(stderr); 73bbe1b32bSmrg 74bbe1b32bSmrg#ifdef SABER 75bbe1b32bSmrg saber_stop(); 76bbe1b32bSmrg#else 77bbe1b32bSmrg _exit(1); 78bbe1b32bSmrg#endif 79bbe1b32bSmrg} 80bbe1b32bSmrg 81bbe1b32bSmrgvoid 82bbe1b32bSmrgInitErrors(void) 83bbe1b32bSmrg{ 84bbe1b32bSmrg int i; 85bbe1b32bSmrg 86bbe1b32bSmrg#ifdef USE_SYSLOG 87bbe1b32bSmrg if (UseSyslog && !log_open) { 88bbe1b32bSmrg openlog("xfs", LOG_PID, LOG_DAEMON); 89bbe1b32bSmrg log_open = TRUE; 90bbe1b32bSmrg return; 91bbe1b32bSmrg } 92bbe1b32bSmrg#endif 93bbe1b32bSmrg 94ce6676dbSmrg if (ErrorFile[0] && 95ce6676dbSmrg (!log_open || (strcmp(CurrentErrorFile, ErrorFile) != 0)) ) { 96ce6676dbSmrg i = open(ErrorFile, O_WRONLY | O_APPEND | O_CREAT, 0666); 97bbe1b32bSmrg if (i != -1) { 98bbe1b32bSmrg dup2(i, 2); 99bbe1b32bSmrg close(i); 100ce6676dbSmrg log_open = TRUE; 101bbe1b32bSmrg } else { 102bbe1b32bSmrg ErrorF("can't open error file \"%s\"\n", ErrorFile); 103bbe1b32bSmrg } 104bbe1b32bSmrg strncpy(CurrentErrorFile, ErrorFile, sizeof CurrentErrorFile); 105bbe1b32bSmrg } 106bbe1b32bSmrg} 107bbe1b32bSmrg 108bbe1b32bSmrgvoid 109bbe1b32bSmrgCloseErrors(void) 110bbe1b32bSmrg{ 111ce6676dbSmrg int nullfd; 112ce6676dbSmrg 113ce6676dbSmrg if (!log_open) 114ce6676dbSmrg return; 115ce6676dbSmrg 116ce6676dbSmrg log_open = FALSE; 117ce6676dbSmrg 118bbe1b32bSmrg#ifdef USE_SYSLOG 119bbe1b32bSmrg if (UseSyslog) { 120bbe1b32bSmrg closelog(); 121bbe1b32bSmrg return; 122bbe1b32bSmrg } 123bbe1b32bSmrg#endif 124ce6676dbSmrg 125ce6676dbSmrg close (2); 126ce6676dbSmrg nullfd = open ("/dev/null", O_RDWR); 127ce6676dbSmrg if (nullfd != 2) { 128ce6676dbSmrg dup2 (nullfd, 2); 129ce6676dbSmrg close(nullfd); 130ce6676dbSmrg } 131bbe1b32bSmrg} 132bbe1b32bSmrg 133bbe1b32bSmrgvoid 134bbe1b32bSmrgError(char *str) 135bbe1b32bSmrg{ 136bbe1b32bSmrg#ifdef USE_SYSLOG 137bbe1b32bSmrg if (UseSyslog) { 138bbe1b32bSmrg syslog(LOG_ERR, "%s: %s", str, strerror(errno)); 139bbe1b32bSmrg return; 140bbe1b32bSmrg } 141bbe1b32bSmrg#endif 142bbe1b32bSmrg perror(str); 143bbe1b32bSmrg} 144bbe1b32bSmrg 145bbe1b32bSmrg/* 146bbe1b32bSmrg * used for informational messages 147bbe1b32bSmrg */ 148bbe1b32bSmrgvoid 149bbe1b32bSmrgNoticeF(char *f, ...) 150bbe1b32bSmrg{ 151bbe1b32bSmrg /* XXX should Notices just be ignored if not using syslog? */ 152bbe1b32bSmrg va_list args; 153bbe1b32bSmrg va_start(args, f); 154bbe1b32bSmrg#ifdef USE_SYSLOG 155bbe1b32bSmrg if (UseSyslog) { 156bbe1b32bSmrg vsyslog(LOG_NOTICE, f, args); 157bbe1b32bSmrg return; 158bbe1b32bSmrg } 159bbe1b32bSmrg#else 160bbe1b32bSmrg fprintf(stderr, "%s notice: ", progname); 161bbe1b32bSmrg vfprintf(stderr, f, args); 162bbe1b32bSmrg#endif /* USE_SYSLOG */ 163bbe1b32bSmrg va_end(args); 164bbe1b32bSmrg} 165bbe1b32bSmrg 166bbe1b32bSmrg/* 167bbe1b32bSmrg * used for non-fatal error messages 168bbe1b32bSmrg */ 169bbe1b32bSmrgvoid 170bbe1b32bSmrgErrorF(char * f, ...) 171bbe1b32bSmrg{ 172bbe1b32bSmrg va_list args; 173bbe1b32bSmrg va_start(args, f); 174bbe1b32bSmrg#ifdef USE_SYSLOG 175bbe1b32bSmrg if (UseSyslog) { 176bbe1b32bSmrg vsyslog(LOG_WARNING, f, args); 177bbe1b32bSmrg return; 178bbe1b32bSmrg } 179bbe1b32bSmrg#else 180bbe1b32bSmrg fprintf(stderr, "%s error: ", progname); 181bbe1b32bSmrg vfprintf(stderr, f, args); 182bbe1b32bSmrg#endif 183bbe1b32bSmrg va_end(args); 184bbe1b32bSmrg} 185bbe1b32bSmrg 186bbe1b32bSmrgvoid 187bbe1b32bSmrgFatalError(char * f, ...) 188bbe1b32bSmrg{ 189bbe1b32bSmrg va_list args; 190bbe1b32bSmrg va_start(args, f); 191bbe1b32bSmrg#ifdef USE_SYSLOG 192bbe1b32bSmrg if (UseSyslog) { 193bbe1b32bSmrg vsyslog(LOG_ERR, f, args); 194bbe1b32bSmrg return; 195bbe1b32bSmrg } 196bbe1b32bSmrg#else 197bbe1b32bSmrg fprintf(stderr, "%s fatal error: ", progname); 198bbe1b32bSmrg vfprintf(stderr, f, args); 199bbe1b32bSmrg#endif 200bbe1b32bSmrg va_end(args); 201bbe1b32bSmrg abort_server(); 202bbe1b32bSmrg /* NOTREACHED */ 203bbe1b32bSmrg} 204