bss_log.c revision 55714
1/* crypto/bio/bss_log.c */ 2/* ==================================================================== 3 * Copyright (c) 1999 The OpenSSL Project. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in 14 * the documentation and/or other materials provided with the 15 * distribution. 16 * 17 * 3. All advertising materials mentioning features or use of this 18 * software must display the following acknowledgment: 19 * "This product includes software developed by the OpenSSL Project 20 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 21 * 22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 23 * endorse or promote products derived from this software without 24 * prior written permission. For written permission, please contact 25 * licensing@OpenSSL.org. 26 * 27 * 5. Products derived from this software may not be called "OpenSSL" 28 * nor may "OpenSSL" appear in their names without prior written 29 * permission of the OpenSSL Project. 30 * 31 * 6. Redistributions of any form whatsoever must retain the following 32 * acknowledgment: 33 * "This product includes software developed by the OpenSSL Project 34 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 35 * 36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 39 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 42 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 47 * OF THE POSSIBILITY OF SUCH DAMAGE. 48 * ==================================================================== 49 * 50 * This product includes cryptographic software written by Eric Young 51 * (eay@cryptsoft.com). This product includes software written by Tim 52 * Hudson (tjh@cryptsoft.com). 53 * 54 */ 55 56/* 57 Why BIO_s_log? 58 59 BIO_s_log is useful for system daemons (or services under NT). 60 It is one-way BIO, it sends all stuff to syslogd (or event log 61 under NT). 62 63*/ 64 65 66#include <stdio.h> 67#include <errno.h> 68 69#ifndef WIN32 70#ifdef __ultrix 71#include <sys/syslog.h> 72#else 73#include <syslog.h> 74#endif 75#endif 76 77#include "cryptlib.h" 78#include <openssl/buffer.h> 79#include <openssl/err.h> 80#ifndef NO_SYSLOG 81 82 83static int MS_CALLBACK slg_write(BIO *h,char *buf,int num); 84static int MS_CALLBACK slg_puts(BIO *h,char *str); 85static long MS_CALLBACK slg_ctrl(BIO *h,int cmd,long arg1,char *arg2); 86static int MS_CALLBACK slg_new(BIO *h); 87static int MS_CALLBACK slg_free(BIO *data); 88static int xopenlog(BIO* bp, const char* name, int level); 89static int xcloselog(BIO* bp); 90 91static BIO_METHOD methods_slg= 92 { 93 BIO_TYPE_MEM,"syslog", 94 slg_write, 95 NULL, 96 slg_puts, 97 NULL, 98 slg_ctrl, 99 slg_new, 100 slg_free, 101 }; 102 103BIO_METHOD *BIO_s_log(void) 104 { 105 return(&methods_slg); 106 } 107 108static int MS_CALLBACK slg_new(BIO *bi) 109 { 110 bi->init=1; 111 bi->num=0; 112 bi->ptr=NULL; 113#ifndef WIN32 114 xopenlog(bi, "application", LOG_DAEMON); 115#else 116 xopenlog(bi, "application", 0); 117#endif 118 return(1); 119 } 120 121static int MS_CALLBACK slg_free(BIO *a) 122 { 123 if (a == NULL) return(0); 124 xcloselog(a); 125 return(1); 126 } 127 128static int MS_CALLBACK slg_write(BIO *b, char *in, int inl) 129 { 130 int ret= inl; 131 char* buf= in; 132 char* pp; 133#if defined(WIN32) 134 LPTSTR lpszStrings[1]; 135 WORD evtype= EVENTLOG_ERROR_TYPE; 136#else 137 int priority; 138#endif 139 140 if((buf= (char *)Malloc(inl+ 1)) == NULL){ 141 return(0); 142 } 143 strncpy(buf, in, inl); 144 buf[inl]= '\0'; 145#if defined(WIN32) 146 if(strncmp(buf, "ERR ", 4) == 0){ 147 evtype= EVENTLOG_ERROR_TYPE; 148 pp= buf+ 4; 149 }else if(strncmp(buf, "WAR ", 4) == 0){ 150 evtype= EVENTLOG_WARNING_TYPE; 151 pp= buf+ 4; 152 }else if(strncmp(buf, "INF ", 4) == 0){ 153 evtype= EVENTLOG_INFORMATION_TYPE; 154 pp= buf+ 4; 155 }else{ 156 evtype= EVENTLOG_ERROR_TYPE; 157 pp= buf; 158 } 159 lpszStrings[0]= pp; 160 161 if(b->ptr) 162 ReportEvent(b->ptr, evtype, 0, 1024, NULL, 1, 0, 163 lpszStrings, NULL); 164#else 165 if(strncmp(buf, "ERR ", 4) == 0){ 166 priority= LOG_ERR; 167 pp= buf+ 4; 168 }else if(strncmp(buf, "WAR ", 4) == 0){ 169 priority= LOG_WARNING; 170 pp= buf+ 4; 171 }else if(strncmp(buf, "INF ", 4) == 0){ 172 priority= LOG_INFO; 173 pp= buf+ 4; 174 }else{ 175 priority= LOG_ERR; 176 pp= buf; 177 } 178 179 syslog(priority, "%s", pp); 180#endif 181 Free(buf); 182 return(ret); 183 } 184 185static long MS_CALLBACK slg_ctrl(BIO *b, int cmd, long num, char *ptr) 186 { 187 switch (cmd) 188 { 189 case BIO_CTRL_SET: 190 xcloselog(b); 191 xopenlog(b, ptr, num); 192 break; 193 default: 194 break; 195 } 196 return(0); 197 } 198 199static int MS_CALLBACK slg_puts(BIO *bp, char *str) 200 { 201 int n,ret; 202 203 n=strlen(str); 204 ret=slg_write(bp,str,n); 205 return(ret); 206 } 207 208static int xopenlog(BIO* bp, const char* name, int level) 209{ 210#if defined(WIN32) 211 if((bp->ptr= (char *)RegisterEventSource(NULL, name)) == NULL){ 212 return(0); 213 } 214#else 215 openlog(name, LOG_PID|LOG_CONS, level); 216#endif 217 return(1); 218} 219 220static int xcloselog(BIO* bp) 221{ 222#if defined(WIN32) 223 if(bp->ptr) 224 DeregisterEventSource((HANDLE)(bp->ptr)); 225 bp->ptr= NULL; 226#else 227 closelog(); 228#endif 229 return(1); 230} 231 232#endif 233