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