1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #include <pthread.h> 28 #include <stdarg.h> 29 #include <stdio.h> 30 #include <stdlib.h> 31 #include <syslog.h> 32 33 #include "util.h" 34 35 /* 36 * logging.c - contains various logging functions. 37 */ 38 39 boolean_t debug = B_TRUE; 40 41 /* 42 * This idea for having this function is so that you can drop a dtrace probe 43 * here and trace complete strings (not just those containing formatting). Its 44 * important that we actually format the debug strings so we could trace them 45 * even if we choose not to send them to syslog. 46 */ 47 static void 48 log_out(int severity, const char *str) 49 { 50 if (severity == LOG_DEBUG && !debug) 51 return; 52 53 syslog(severity, str); 54 } 55 56 static void 57 log_format(int severity, const char *fmt, va_list ap, char *buf, int bufsize) 58 { 59 int offset; 60 char vbuf[256]; 61 62 if (buf == NULL) { 63 buf = vbuf; 64 bufsize = sizeof (vbuf); 65 } 66 67 offset = snprintf(buf, bufsize, "%d: ", pthread_self()); 68 (void) vsnprintf(buf + offset, bufsize - offset, fmt, ap); 69 70 log_out(severity, buf); 71 } 72 73 /* 74 * This function takes a syslog severity and uses it to determine what to do 75 * with the message (currently send it to syslog). 76 */ 77 void 78 nlog(int severity, const char *fmt, ...) 79 { 80 va_list ap; 81 82 va_start(ap, fmt); 83 log_format(severity, fmt, ap, NULL, 0); 84 va_end(ap); 85 } 86 87 void 88 pfail(const char *fmt, ...) 89 { 90 char *msg; 91 va_list ap; 92 93 msg = malloc(256); 94 95 va_start(ap, fmt); 96 log_format(LOG_ERR, fmt, ap, msg, 256); 97 va_end(ap); 98 99 if (msg == NULL) 100 msg = "ran out of memory exiting. see log."; 101 102 (void) puts(msg); 103 exit(EXIT_FAILURE); 104 } 105