1/* 2 * Syslog.xs 3 * 4 * XS wrapper for the syslog(3) facility. 5 * 6 */ 7 8#if defined(_WIN32) 9# include <windows.h> 10#endif 11 12#include "EXTERN.h" 13#include "perl.h" 14#include "XSUB.h" 15#ifdef USE_PPPORT_H 16# include "ppport.h" 17#endif 18 19#ifndef HAVE_SYSLOG 20#define HAVE_SYSLOG 1 21#endif 22 23#if defined(_WIN32) && !defined(__CYGWIN__) 24# undef HAVE_SYSLOG 25# include "fallback/syslog.h" 26#else 27# if defined(I_SYSLOG) || PATCHLEVEL < 6 28# include <syslog.h> 29# else 30# undef HAVE_SYSLOG 31# include "fallback/syslog.h" 32# endif 33#endif 34 35static SV *ident_svptr; 36 37 38#ifndef LOG_FAC 39#define LOG_FACMASK 0x03f8 40#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3) 41#endif 42 43#ifndef LOG_PRIMASK 44#define LOG_PRIMASK 0x07 45#endif 46 47#ifndef LOG_PRI 48#define LOG_PRI(p) ((p) & LOG_PRIMASK) 49#endif 50 51#ifndef LOG_MAKEPRI 52#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri)) 53#endif 54 55#ifndef LOG_MASK 56#define LOG_MASK(pri) (1 << (pri)) 57#endif 58 59#ifndef LOG_UPTO 60#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) 61#endif 62 63#include "const-c.inc" 64 65 66MODULE = Sys::Syslog PACKAGE = Sys::Syslog 67 68INCLUDE: const-xs.inc 69 70int 71LOG_FAC(p) 72 INPUT: 73 int p 74 75int 76LOG_PRI(p) 77 INPUT: 78 int p 79 80int 81LOG_MAKEPRI(fac,pri) 82 INPUT: 83 int fac 84 int pri 85 86int 87LOG_MASK(pri) 88 INPUT: 89 int pri 90 91int 92LOG_UPTO(pri) 93 INPUT: 94 int pri 95 96#ifdef HAVE_SYSLOG 97 98void 99openlog_xs(ident, option, facility) 100 INPUT: 101 SV* ident 102 int option 103 int facility 104 PREINIT: 105 STRLEN len; 106 char* ident_pv; 107 CODE: 108 ident_svptr = newSVsv(ident); 109 ident_pv = SvPV(ident_svptr, len); 110 openlog(ident_pv, option, facility); 111 112void 113syslog_xs(priority, message) 114 INPUT: 115 int priority 116 const char * message 117 CODE: 118 syslog(priority, "%s", message); 119 120int 121setlogmask_xs(mask) 122 INPUT: 123 int mask 124 CODE: 125 RETVAL = setlogmask(mask); 126 OUTPUT: 127 RETVAL 128 129void 130closelog_xs() 131 PREINIT: 132 U32 refcnt; 133 CODE: 134 if (!ident_svptr) 135 return; 136 closelog(); 137 refcnt = SvREFCNT(ident_svptr); 138 if (refcnt) { 139 SvREFCNT_dec(ident_svptr); 140 if (refcnt == 1) 141 ident_svptr = NULL; 142 } 143 144#else /* HAVE_SYSLOG */ 145 146void 147openlog_xs(ident, option, facility) 148 INPUT: 149 SV* ident 150 int option 151 int facility 152 CODE: 153 154void 155syslog_xs(priority, message) 156 INPUT: 157 int priority 158 const char * message 159 CODE: 160 161int 162setlogmask_xs(mask) 163 INPUT: 164 int mask 165 CODE: 166 167void 168closelog_xs() 169 CODE: 170 171#endif /* HAVE_SYSLOG */ 172