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