Update Sys-Syslog to CPAN version 0.34
[perl.git] / cpan / Sys-Syslog / Syslog.xs
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
35 static 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
66 MODULE = Sys::Syslog            PACKAGE = Sys::Syslog           
67
68 INCLUDE: const-xs.inc
69
70 int
71 LOG_FAC(p)
72     INPUT:
73         int             p
74
75 int
76 LOG_PRI(p)
77     INPUT:
78         int             p
79
80 int
81 LOG_MAKEPRI(fac,pri)
82     INPUT:
83         int             fac
84         int             pri
85
86 int
87 LOG_MASK(pri)
88     INPUT:
89         int             pri
90
91 int
92 LOG_UPTO(pri)
93     INPUT:
94         int             pri
95
96 #ifdef HAVE_SYSLOG
97
98 void
99 openlog_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
112 void
113 syslog_xs(priority, message)
114     INPUT:
115         int   priority
116         const char * message
117     CODE:
118         syslog(priority, "%s", message);
119
120 int
121 setlogmask_xs(mask)
122     INPUT:
123         int mask
124     CODE:
125         RETVAL = setlogmask(mask);
126     OUTPUT:
127         RETVAL
128
129 void
130 closelog_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
146 void
147 openlog_xs(ident, option, facility)
148     INPUT:
149         SV*   ident
150         int   option
151         int   facility
152     CODE:
153
154 void
155 syslog_xs(priority, message)
156     INPUT:
157         int   priority
158         const char * message
159     CODE:
160
161 int
162 setlogmask_xs(mask)
163     INPUT:
164         int mask
165     CODE:
166
167 void
168 closelog_xs()
169     CODE:
170
171 #endif /* HAVE_SYSLOG */