e600da0add70bb96fe03c5c59e7cce9de4ae3cf1
[p5sagit/p5-mst-13.2.git] / ext / Sys / Syslog / Syslog.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #ifdef I_SYSLOG
6 #include <syslog.h>
7 #endif
8
9 static double
10 constant_LOG_NO(char *name, int len)
11 {
12     switch (name[6 + 0]) {
13     case 'T':
14         if (strEQ(name + 6, "TICE")) {  /* "LOG_NO" removed */
15 #ifdef LOG_NOTICE
16             return LOG_NOTICE;
17 #else
18             goto not_there;
19 #endif
20         }
21     case 'W':
22         if (strEQ(name + 6, "WAIT")) {  /* "LOG_NO" removed */
23 #ifdef LOG_NOWAIT
24             return LOG_NOWAIT;
25 #else
26             goto not_there;
27 #endif
28         }
29     }
30     errno = EINVAL;
31     return 0;
32
33 #if !defined(LOG_NOTICE) || !defined(LOG_NOWAIT)
34 not_there:
35     errno = ENOENT;
36     return 0;
37 #endif
38 }
39
40 static double
41 constant_LOG_N(char *name, int len)
42 {
43     switch (name[5 + 0]) {
44     case 'D':
45         if (strEQ(name + 5, "DELAY")) { /* "LOG_N" removed */
46 #ifdef LOG_NDELAY
47             return LOG_NDELAY;
48 #else
49             goto not_there;
50 #endif
51         }
52     case 'E':
53         if (strEQ(name + 5, "EWS")) {   /* "LOG_N" removed */
54 #ifdef LOG_NEWS
55             return LOG_NEWS;
56 #else
57             goto not_there;
58 #endif
59         }
60     case 'F':
61         if (strEQ(name + 5, "FACILITIES")) {    /* "LOG_N" removed */
62 #ifdef LOG_NFACILITIES
63             return LOG_NFACILITIES;
64 #else
65             goto not_there;
66 #endif
67         }
68     case 'O':
69         return constant_LOG_NO(name, len);
70     }
71     errno = EINVAL;
72     return 0;
73
74 #if !defined(LOG_NDELAY) || !defined(LOG_NEWS) || !defined(LOG_NFACILITIES)
75 not_there:
76     errno = ENOENT;
77     return 0;
78 #endif
79 }
80
81 static double
82 constant_LOG_P(char *name, int len)
83 {
84     switch (name[5 + 0]) {
85     case 'E':
86         if (strEQ(name + 5, "ERROR")) { /* "LOG_P" removed */
87 #ifdef LOG_PERROR
88             return LOG_PERROR;
89 #else
90             goto not_there;
91 #endif
92         }
93     case 'I':
94         if (strEQ(name + 5, "ID")) {    /* "LOG_P" removed */
95 #ifdef LOG_PID
96             return LOG_PID;
97 #else
98             goto not_there;
99 #endif
100         }
101     case 'R':
102         if (strEQ(name + 5, "RIMASK")) {        /* "LOG_P" removed */
103 #ifdef LOG_PRIMASK
104             return LOG_PRIMASK;
105 #else
106             goto not_there;
107 #endif
108         }
109     }
110     errno = EINVAL;
111     return 0;
112
113 #if !defined(LOG_PERROR) || !defined(LOG_PID) || !defined(LOG_PRIMASK)
114 not_there:
115     errno = ENOENT;
116     return 0;
117 #endif
118 }
119
120 static double
121 constant_LOG_AU(char *name, int len)
122 {
123     if (6 + 2 > len ) {
124         errno = EINVAL;
125         return 0;
126     }
127     switch (name[6 + 2]) {
128     case '\0':
129         if (strEQ(name + 6, "TH")) {    /* "LOG_AU" removed */
130 #ifdef LOG_AUTH
131             return LOG_AUTH;
132 #else
133             goto not_there;
134 #endif
135         }
136     case 'P':
137         if (strEQ(name + 6, "THPRIV")) {        /* "LOG_AU" removed */
138 #ifdef LOG_AUTHPRIV
139             return LOG_AUTHPRIV;
140 #else
141             goto not_there;
142 #endif
143         }
144     }
145     errno = EINVAL;
146     return 0;
147
148 #if !defined(LOG_AUTH) || !defined(LOG_AUTHPRIV)
149 not_there:
150     errno = ENOENT;
151     return 0;
152 #endif
153 }
154
155 static double
156 constant_LOG_A(char *name, int len)
157 {
158     switch (name[5 + 0]) {
159     case 'L':
160         if (strEQ(name + 5, "LERT")) {  /* "LOG_A" removed */
161 #ifdef LOG_ALERT
162             return LOG_ALERT;
163 #else
164             goto not_there;
165 #endif
166         }
167     case 'U':
168         return constant_LOG_AU(name, len);
169     }
170     errno = EINVAL;
171     return 0;
172
173 #if !defined(LOG_ALERT)
174 not_there:
175     errno = ENOENT;
176     return 0;
177 #endif
178 }
179
180 static double
181 constant_LOG_CR(char *name, int len)
182 {
183     switch (name[6 + 0]) {
184     case 'I':
185         if (strEQ(name + 6, "IT")) {    /* "LOG_CR" removed */
186 #ifdef LOG_CRIT
187             return LOG_CRIT;
188 #else
189             goto not_there;
190 #endif
191         }
192     case 'O':
193         if (strEQ(name + 6, "ON")) {    /* "LOG_CR" removed */
194 #ifdef LOG_CRON
195             return LOG_CRON;
196 #else
197             goto not_there;
198 #endif
199         }
200     }
201     errno = EINVAL;
202     return 0;
203
204 #if !defined(LOG_CRIT) || !defined(LOG_CRON)
205 not_there:
206     errno = ENOENT;
207     return 0;
208 #endif
209 }
210
211 static double
212 constant_LOG_C(char *name, int len)
213 {
214     switch (name[5 + 0]) {
215     case 'O':
216         if (strEQ(name + 5, "ONS")) {   /* "LOG_C" removed */
217 #ifdef LOG_CONS
218             return LOG_CONS;
219 #else
220             goto not_there;
221 #endif
222         }
223     case 'R':
224         return constant_LOG_CR(name, len);
225     }
226     errno = EINVAL;
227     return 0;
228
229 #if !defined(LOG_CONS)
230 not_there:
231     errno = ENOENT;
232     return 0;
233 #endif
234 }
235
236 static double
237 constant_LOG_D(char *name, int len)
238 {
239     switch (name[5 + 0]) {
240     case 'A':
241         if (strEQ(name + 5, "AEMON")) { /* "LOG_D" removed */
242 #ifdef LOG_DAEMON
243             return LOG_DAEMON;
244 #else
245             goto not_there;
246 #endif
247         }
248     case 'E':
249         if (strEQ(name + 5, "EBUG")) {  /* "LOG_D" removed */
250 #ifdef LOG_DEBUG
251             return LOG_DEBUG;
252 #else
253             goto not_there;
254 #endif
255         }
256     }
257     errno = EINVAL;
258     return 0;
259
260 #if !defined(LOG_DAEMON) || !defined(LOG_DEBUG)
261 not_there:
262     errno = ENOENT;
263     return 0;
264 #endif
265 }
266
267 static double
268 constant_LOG_U(char *name, int len)
269 {
270     switch (name[5 + 0]) {
271     case 'S':
272         if (strEQ(name + 5, "SER")) {   /* "LOG_U" removed */
273 #ifdef LOG_USER
274             return LOG_USER;
275 #else
276             goto not_there;
277 #endif
278         }
279     case 'U':
280         if (strEQ(name + 5, "UCP")) {   /* "LOG_U" removed */
281 #ifdef LOG_UUCP
282             return LOG_UUCP;
283 #else
284             goto not_there;
285 #endif
286         }
287     }
288     errno = EINVAL;
289     return 0;
290
291 #if !defined(LOG_USER) || !defined(LOG_UUCP)
292 not_there:
293     errno = ENOENT;
294     return 0;
295 #endif
296 }
297
298 static double
299 constant_LOG_E(char *name, int len)
300 {
301     switch (name[5 + 0]) {
302     case 'M':
303         if (strEQ(name + 5, "MERG")) {  /* "LOG_E" removed */
304 #ifdef LOG_EMERG
305             return LOG_EMERG;
306 #else
307             goto not_there;
308 #endif
309         }
310     case 'R':
311         if (strEQ(name + 5, "RR")) {    /* "LOG_E" removed */
312 #ifdef LOG_ERR
313             return LOG_ERR;
314 #else
315             goto not_there;
316 #endif
317         }
318     }
319     errno = EINVAL;
320     return 0;
321
322 #if !defined(LOG_EMERG) || !defined(LOG_ERR)
323 not_there:
324     errno = ENOENT;
325     return 0;
326 #endif
327 }
328
329 static double
330 constant_LOG_F(char *name, int len)
331 {
332     switch (name[5 + 0]) {
333     case 'A':
334         if (strEQ(name + 5, "ACMASK")) {        /* "LOG_F" removed */
335 #ifdef LOG_FACMASK
336             return LOG_FACMASK;
337 #else
338             goto not_there;
339 #endif
340         }
341     case 'T':
342         if (strEQ(name + 5, "TP")) {    /* "LOG_F" removed */
343 #ifdef LOG_FTP
344             return LOG_FTP;
345 #else
346             goto not_there;
347 #endif
348         }
349     }
350     errno = EINVAL;
351     return 0;
352
353 #if !defined(LOG_FACMASK) || !defined(LOG_FTP)
354 not_there:
355     errno = ENOENT;
356     return 0;
357 #endif
358 }
359
360 static double
361 constant_LOG_LO(char *name, int len)
362 {
363     if (6 + 3 >= len ) {
364         errno = EINVAL;
365         return 0;
366     }
367     switch (name[6 + 3]) {
368     case '0':
369         if (strEQ(name + 6, "CAL0")) {  /* "LOG_LO" removed */
370 #ifdef LOG_LOCAL0
371             return LOG_LOCAL0;
372 #else
373             goto not_there;
374 #endif
375         }
376     case '1':
377         if (strEQ(name + 6, "CAL1")) {  /* "LOG_LO" removed */
378 #ifdef LOG_LOCAL1
379             return LOG_LOCAL1;
380 #else
381             goto not_there;
382 #endif
383         }
384     case '2':
385         if (strEQ(name + 6, "CAL2")) {  /* "LOG_LO" removed */
386 #ifdef LOG_LOCAL2
387             return LOG_LOCAL2;
388 #else
389             goto not_there;
390 #endif
391         }
392     case '3':
393         if (strEQ(name + 6, "CAL3")) {  /* "LOG_LO" removed */
394 #ifdef LOG_LOCAL3
395             return LOG_LOCAL3;
396 #else
397             goto not_there;
398 #endif
399         }
400     case '4':
401         if (strEQ(name + 6, "CAL4")) {  /* "LOG_LO" removed */
402 #ifdef LOG_LOCAL4
403             return LOG_LOCAL4;
404 #else
405             goto not_there;
406 #endif
407         }
408     case '5':
409         if (strEQ(name + 6, "CAL5")) {  /* "LOG_LO" removed */
410 #ifdef LOG_LOCAL5
411             return LOG_LOCAL5;
412 #else
413             goto not_there;
414 #endif
415         }
416     case '6':
417         if (strEQ(name + 6, "CAL6")) {  /* "LOG_LO" removed */
418 #ifdef LOG_LOCAL6
419             return LOG_LOCAL6;
420 #else
421             goto not_there;
422 #endif
423         }
424     case '7':
425         if (strEQ(name + 6, "CAL7")) {  /* "LOG_LO" removed */
426 #ifdef LOG_LOCAL7
427             return LOG_LOCAL7;
428 #else
429             goto not_there;
430 #endif
431         }
432     }
433     errno = EINVAL;
434     return 0;
435
436 #if !defined(LOG_LOCAL0) || !defined(LOG_LOCAL1) || !defined(LOG_LOCAL2) || !defined(LOG_LOCAL3) || !defined(LOG_LOCAL4) || !defined(LOG_LOCAL5) || !defined(LOG_LOCAL6) || !defined(LOG_LOCAL7)
437 not_there:
438     errno = ENOENT;
439     return 0;
440 #endif
441 }
442
443 static double
444 constant_LOG_L(char *name, int len)
445 {
446     switch (name[5 + 0]) {
447     case 'F':
448         if (strEQ(name + 5, "FMT")) {   /* "LOG_L" removed */
449 #ifdef LOG_LFMT
450             return LOG_LFMT;
451 #else
452             goto not_there;
453 #endif
454         }
455     case 'O':
456         return constant_LOG_LO(name, len);
457     case 'P':
458         if (strEQ(name + 5, "PR")) {    /* "LOG_L" removed */
459 #ifdef LOG_LPR
460             return LOG_LPR;
461 #else
462             goto not_there;
463 #endif
464         }
465     }
466     errno = EINVAL;
467     return 0;
468
469 #if !defined(LOG_LFMT) || !defined(LOG_LPR)
470 not_there:
471     errno = ENOENT;
472     return 0;
473 #endif
474 }
475
476 static double
477 constant(char *name, int len)
478 {
479     errno = 0;
480     if (0 + 4 >= len ) {
481         errno = EINVAL;
482         return 0;
483     }
484     switch (name[0 + 4]) {
485     case 'A':
486         if (!strnEQ(name + 0,"LOG_", 4))
487             break;
488         return constant_LOG_A(name, len);
489     case 'C':
490         if (!strnEQ(name + 0,"LOG_", 4))
491             break;
492         return constant_LOG_C(name, len);
493     case 'D':
494         if (!strnEQ(name + 0,"LOG_", 4))
495             break;
496         return constant_LOG_D(name, len);
497     case 'E':
498         if (!strnEQ(name + 0,"LOG_", 4))
499             break;
500         return constant_LOG_E(name, len);
501     case 'F':
502         if (!strnEQ(name + 0,"LOG_", 4))
503             break;
504         return constant_LOG_F(name, len);
505     case 'I':
506         if (strEQ(name + 0, "LOG_INFO")) {      /* "" removed */
507 #ifdef LOG_INFO
508             return LOG_INFO;
509 #else
510             goto not_there;
511 #endif
512         }
513     case 'K':
514         if (strEQ(name + 0, "LOG_KERN")) {      /* "" removed */
515 #ifdef LOG_KERN
516             return LOG_KERN;
517 #else
518             goto not_there;
519 #endif
520         }
521     case 'L':
522         if (!strnEQ(name + 0,"LOG_", 4))
523             break;
524         return constant_LOG_L(name, len);
525     case 'M':
526         if (strEQ(name + 0, "LOG_MAIL")) {      /* "" removed */
527 #ifdef LOG_MAIL
528             return LOG_MAIL;
529 #else
530             goto not_there;
531 #endif
532         }
533     case 'N':
534         if (!strnEQ(name + 0,"LOG_", 4))
535             break;
536         return constant_LOG_N(name, len);
537     case 'O':
538         if (strEQ(name + 0, "LOG_ODELAY")) {    /* "" removed */
539 #ifdef LOG_ODELAY
540             return LOG_ODELAY;
541 #else
542             goto not_there;
543 #endif
544         }
545     case 'P':
546         if (!strnEQ(name + 0,"LOG_", 4))
547             break;
548         return constant_LOG_P(name, len);
549     case 'S':
550         if (strEQ(name + 0, "LOG_SYSLOG")) {    /* "" removed */
551 #ifdef LOG_SYSLOG
552             return LOG_SYSLOG;
553 #else
554             goto not_there;
555 #endif
556         }
557     case 'U':
558         if (!strnEQ(name + 0,"LOG_", 4))
559             break;
560         return constant_LOG_U(name, len);
561     case 'W':
562         if (strEQ(name + 0, "LOG_WARNING")) {   /* "" removed */
563 #ifdef LOG_WARNING
564             return LOG_WARNING;
565 #else
566             goto not_there;
567 #endif
568         }
569     }
570     errno = EINVAL;
571     return 0;
572
573 #if !defined(LOG_INFO) || !defined(LOG_KERN) || !defined(LOG_MAIL) || !defined(LOG_ODELAY) || !defined(LOG_SYSLOG) || !defined(LOG_WARNING)
574 not_there:
575     errno = ENOENT;
576     return 0;
577 #endif
578 }
579
580
581 MODULE = Sys::Syslog            PACKAGE = Sys::Syslog           
582
583 char *
584 _PATH_LOG()
585     CODE:
586 #ifdef _PATH_LOG
587         RETVAL = _PATH_LOG;
588 #else
589         RETVAL = "";
590 #endif
591     OUTPUT:
592         RETVAL
593
594 int
595 LOG_FAC(p)
596     INPUT:
597         int             p
598     CODE:
599 #ifdef LOG_FAC
600         RETVAL = LOG_FAC(p);
601 #else
602         croak("Your vendor has not defined the Sys::Syslog macro LOG_FAC");
603         RETVAL = -1;
604 #endif
605     OUTPUT:
606         RETVAL
607
608 int
609 LOG_PRI(p)
610     INPUT:
611         int             p
612     CODE:
613 #ifdef LOG_PRI
614         RETVAL = LOG_PRI(p);
615 #else
616         croak("Your vendor has not defined the Sys::Syslog macro LOG_PRI");
617         RETVAL = -1;
618 #endif
619     OUTPUT:
620         RETVAL
621
622 int
623 LOG_MAKEPRI(fac,pri)
624     INPUT:
625         int             fac
626         int             pri
627     CODE:
628 #ifdef LOG_MAKEPRI
629         RETVAL = LOG_MAKEPRI(fac,pri);
630 #else
631         croak("Your vendor has not defined the Sys::Syslog macro LOG_MAKEPRI");
632         RETVAL = -1;
633 #endif
634     OUTPUT:
635         RETVAL
636
637 int
638 LOG_MASK(pri)
639     INPUT:
640         int             pri
641     CODE:
642 #ifdef LOG_MASK
643         RETVAL = LOG_MASK(pri);
644 #else
645         croak("Your vendor has not defined the Sys::Syslog macro LOG_MASK");
646         RETVAL = -1;
647 #endif
648     OUTPUT:
649         RETVAL
650
651 int
652 LOG_UPTO(pri)
653     INPUT:
654         int             pri
655     CODE:
656 #ifdef LOG_UPTO
657         RETVAL = LOG_UPTO(pri);
658 #else
659         croak("Your vendor has not defined the Sys::Syslog macro LOG_UPTO");
660         RETVAL = -1;
661 #endif
662     OUTPUT:
663         RETVAL
664
665
666 double
667 constant(sv)
668     PREINIT:
669         STRLEN          len;
670     INPUT:
671         SV *            sv
672         char *          s = SvPV(sv, len);
673     CODE:
674         RETVAL = constant(s,len);
675     OUTPUT:
676         RETVAL
677