155682Smarkm/* 2233294Sstas * Copyright (c) 1995 - 2000 Kungliga Tekniska H��gskolan 355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden). 455682Smarkm * All rights reserved. 5233294Sstas * 655682Smarkm * Redistribution and use in source and binary forms, with or without 755682Smarkm * modification, are permitted provided that the following conditions 855682Smarkm * are met: 9233294Sstas * 1055682Smarkm * 1. Redistributions of source code must retain the above copyright 1155682Smarkm * notice, this list of conditions and the following disclaimer. 12233294Sstas * 1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright 1455682Smarkm * notice, this list of conditions and the following disclaimer in the 1555682Smarkm * documentation and/or other materials provided with the distribution. 16233294Sstas * 1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors 1855682Smarkm * may be used to endorse or promote products derived from this software 1955682Smarkm * without specific prior written permission. 20233294Sstas * 2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2455682Smarkm * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3155682Smarkm * SUCH DAMAGE. 3255682Smarkm */ 3355682Smarkm 3455682Smarkm#include <config.h> 3555682Smarkm 3655682Smarkm#ifndef HAVE_VSYSLOG 3755682Smarkm 3855682Smarkm#include <stdio.h> 3955682Smarkm#include <syslog.h> 4055682Smarkm#include <stdarg.h> 4155682Smarkm 4255682Smarkm#include "roken.h" 4355682Smarkm 4472445Sassar/* 4572445Sassar * the theory behind this is that we might be trying to call vsyslog 4672445Sassar * when there's no memory left, and we should try to be as useful as 4772445Sassar * possible. And the format string should say something about what's 4872445Sassar * failing. 4972445Sassar */ 5072445Sassar 5172445Sassarstatic void 5272445Sassarsimple_vsyslog(int pri, const char *fmt, va_list ap) 5372445Sassar{ 5472445Sassar syslog (pri, "%s", fmt); 5572445Sassar} 5672445Sassar 5772445Sassar/* 5872445Sassar * do like syslog but with a `va_list' 5972445Sassar */ 6072445Sassar 61233294SstasROKEN_LIB_FUNCTION void ROKEN_LIB_CALL 6255682Smarkmvsyslog(int pri, const char *fmt, va_list ap) 6355682Smarkm{ 6472445Sassar char *fmt2; 6572445Sassar const char *p; 6672445Sassar char *p2; 67233294Sstas int ret; 6872445Sassar int saved_errno = errno; 6972445Sassar int fmt_len = strlen (fmt); 7072445Sassar int fmt2_len = fmt_len; 7172445Sassar char *buf; 7255682Smarkm 7372445Sassar fmt2 = malloc (fmt_len + 1); 7472445Sassar if (fmt2 == NULL) { 7572445Sassar simple_vsyslog (pri, fmt, ap); 7672445Sassar return; 7772445Sassar } 7872445Sassar 7972445Sassar for (p = fmt, p2 = fmt2; *p != '\0'; ++p) { 8072445Sassar if (p[0] == '%' && p[1] == 'm') { 8172445Sassar const char *e = strerror (saved_errno); 8272445Sassar int e_len = strlen (e); 8372445Sassar char *tmp; 8472445Sassar int pos; 8572445Sassar 8672445Sassar pos = p2 - fmt2; 8772445Sassar fmt2_len += e_len - 2; 8872445Sassar tmp = realloc (fmt2, fmt2_len + 1); 8972445Sassar if (tmp == NULL) { 9072445Sassar free (fmt2); 9172445Sassar simple_vsyslog (pri, fmt, ap); 9272445Sassar return; 9372445Sassar } 9472445Sassar fmt2 = tmp; 9572445Sassar p2 = fmt2 + pos; 9672445Sassar memmove (p2, e, e_len); 9772445Sassar p2 += e_len; 9872445Sassar ++p; 9972445Sassar } else 10072445Sassar *p2++ = *p; 10172445Sassar } 10272445Sassar *p2 = '\0'; 10372445Sassar 104233294Sstas ret = vasprintf (&buf, fmt2, ap); 10572445Sassar free (fmt2); 106233294Sstas if (ret < 0 || buf == NULL) { 10772445Sassar simple_vsyslog (pri, fmt, ap); 10872445Sassar return; 10972445Sassar } 11072445Sassar syslog (pri, "%s", buf); 11172445Sassar free (buf); 11255682Smarkm} 11355682Smarkm#endif 114