This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
amigaos4: flock unimplemented
[perl5.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 #  endif
30 #endif
31
32 static SV *ident_svptr;
33
34
35 #ifndef LOG_FAC
36 #define LOG_FACMASK     0x03f8
37 #define LOG_FAC(p)      (((p) & LOG_FACMASK) >> 3)
38 #endif
39
40 #ifndef LOG_PRIMASK
41 #define LOG_PRIMASK     0x07
42 #endif
43
44 #ifndef LOG_PRI
45 #define LOG_PRI(p)      ((p) & LOG_PRIMASK)
46 #endif
47
48 #ifndef LOG_MAKEPRI
49 #define LOG_MAKEPRI(fac, pri)   (((fac) << 3) | (pri))
50 #endif
51
52 #ifndef LOG_MASK
53 #define LOG_MASK(pri)   (1 << (pri))
54 #endif
55
56 #ifndef LOG_UPTO
57 #define LOG_UPTO(pri)   ((1 << ((pri)+1)) - 1)
58 #endif
59
60 #include "const-c.inc"
61
62
63 MODULE = Sys::Syslog            PACKAGE = Sys::Syslog           
64
65 INCLUDE: const-xs.inc
66
67 int
68 LOG_FAC(p)
69     INPUT:
70         int             p
71
72 int
73 LOG_PRI(p)
74     INPUT:
75         int             p
76
77 int
78 LOG_MAKEPRI(fac,pri)
79     INPUT:
80         int             fac
81         int             pri
82
83 int
84 LOG_MASK(pri)
85     INPUT:
86         int             pri
87
88 int
89 LOG_UPTO(pri)
90     INPUT:
91         int             pri
92
93 #ifdef HAVE_SYSLOG
94
95 void
96 openlog_xs(ident, option, facility)
97     INPUT:
98         SV*   ident
99         int   option
100         int   facility
101     PREINIT:
102         STRLEN len;
103         char*  ident_pv;
104     CODE:
105         ident_svptr = newSVsv(ident);
106         ident_pv    = SvPV(ident_svptr, len);
107         openlog(ident_pv, option, facility);
108
109 void
110 syslog_xs(priority, message)
111     INPUT:
112         int   priority
113         const char * message
114     CODE:
115         syslog(priority, "%s", message);
116
117 int
118 setlogmask_xs(mask)
119     INPUT:
120         int mask
121     CODE:
122         RETVAL = setlogmask(mask);
123     OUTPUT:
124         RETVAL
125
126 void
127 closelog_xs()
128     PREINIT:
129         U32 refcnt;
130     CODE:
131         if (!ident_svptr)
132             return;
133         closelog();
134         refcnt = SvREFCNT(ident_svptr);
135         if (refcnt) {
136             SvREFCNT_dec(ident_svptr);
137             if (refcnt == 1)
138                 ident_svptr = NULL;
139         }
140
141 #else  /* HAVE_SYSLOG */
142
143 void
144 openlog_xs(ident, option, facility)
145     INPUT:
146         SV*   ident
147         int   option
148         int   facility
149     CODE:
150
151 void
152 syslog_xs(priority, message)
153     INPUT:
154         int   priority
155         const char * message
156     CODE:
157
158 int
159 setlogmask_xs(mask)
160     INPUT:
161         int mask
162     CODE:
163
164 void
165 closelog_xs()
166     CODE:
167
168 #endif /* HAVE_SYSLOG */