The .pm changes to go with #10428.
[p5sagit/p5-mst-13.2.git] / ext / Sys / Syslog / Syslog.xs
CommitLineData
8ce86de8 1#include "EXTERN.h"
2#include "perl.h"
3#include "XSUB.h"
4
d76d5647 5#ifdef I_SYSLOG
6#include <syslog.h>
7#endif
8ce86de8 8
18085af4 9#define PERL_constant_NOTFOUND 1
10#define PERL_constant_NOTDEF 2
11#define PERL_constant_ISIV 3
12#define PERL_constant_ISNV 4
13#define PERL_constant_ISPV 5
14#define PERL_constant_ISPVN 6
15#define PERL_constant_ISUV 7
16
17#ifndef NVTYPE
18typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it. */
19#endif
20
21static int
22constant_7 (const char *name, IV *iv_return) {
23 /* Names all of length 7. */
24 /* When generated this function returned values for the list of names given
25 here. However, subsequent manual editing may have added or removed some.
26 LOG_ERR LOG_FTP LOG_LPR LOG_PID */
27 /* Offset 4 gives the best switch position. */
28 switch (name[4]) {
29 case 'E':
30 if (memEQ(name, "LOG_ERR", 7)) {
31 /* ^ */
32#ifdef LOG_ERR
33 *iv_return = LOG_ERR;
34 return PERL_constant_ISIV;
8ce86de8 35#else
18085af4 36 return PERL_constant_NOTDEF;
8ce86de8 37#endif
8ce86de8 38 }
18085af4 39 break;
40 case 'F':
41 if (memEQ(name, "LOG_FTP", 7)) {
42 /* ^ */
43#ifdef LOG_FTP
44 *iv_return = LOG_FTP;
45 return PERL_constant_ISIV;
8ce86de8 46#else
18085af4 47 return PERL_constant_NOTDEF;
8ce86de8 48#endif
8ce86de8 49 }
18085af4 50 break;
51 case 'L':
52 if (memEQ(name, "LOG_LPR", 7)) {
53 /* ^ */
54#ifdef LOG_LPR
55 *iv_return = LOG_LPR;
56 return PERL_constant_ISIV;
b64ef0c1 57#else
18085af4 58 return PERL_constant_NOTDEF;
b64ef0c1 59#endif
18085af4 60 }
61 break;
62 case 'P':
63 if (memEQ(name, "LOG_PID", 7)) {
64 /* ^ */
8ce86de8 65#ifdef LOG_PID
18085af4 66 *iv_return = LOG_PID;
67 return PERL_constant_ISIV;
8ce86de8 68#else
18085af4 69 return PERL_constant_NOTDEF;
8ce86de8 70#endif
8ce86de8 71 }
18085af4 72 break;
73 }
74 return PERL_constant_NOTFOUND;
8ce86de8 75}
76
18085af4 77static int
78constant_8 (const char *name, IV *iv_return) {
79 /* Names all of length 8. */
80 /* When generated this function returned values for the list of names given
81 here. However, subsequent manual editing may have added or removed some.
82 LOG_AUTH LOG_CONS LOG_CRIT LOG_CRON LOG_INFO LOG_KERN LOG_LFMT LOG_MAIL
83 LOG_NEWS LOG_USER LOG_UUCP */
84 /* Offset 6 gives the best switch position. */
85 switch (name[6]) {
86 case 'C':
87 if (memEQ(name, "LOG_UUCP", 8)) {
88 /* ^ */
89#ifdef LOG_UUCP
90 *iv_return = LOG_UUCP;
91 return PERL_constant_ISIV;
8ce86de8 92#else
18085af4 93 return PERL_constant_NOTDEF;
8ce86de8 94#endif
18085af4 95 }
96 break;
97 case 'E':
98 if (memEQ(name, "LOG_USER", 8)) {
99 /* ^ */
100#ifdef LOG_USER
101 *iv_return = LOG_USER;
102 return PERL_constant_ISIV;
8ce86de8 103#else
18085af4 104 return PERL_constant_NOTDEF;
8ce86de8 105#endif
8ce86de8 106 }
18085af4 107 break;
108 case 'F':
109 if (memEQ(name, "LOG_INFO", 8)) {
110 /* ^ */
111#ifdef LOG_INFO
112 *iv_return = LOG_INFO;
113 return PERL_constant_ISIV;
8ce86de8 114#else
18085af4 115 return PERL_constant_NOTDEF;
8ce86de8 116#endif
8ce86de8 117 }
18085af4 118 break;
119 case 'I':
120 if (memEQ(name, "LOG_CRIT", 8)) {
121 /* ^ */
8ce86de8 122#ifdef LOG_CRIT
18085af4 123 *iv_return = LOG_CRIT;
124 return PERL_constant_ISIV;
8ce86de8 125#else
18085af4 126 return PERL_constant_NOTDEF;
8ce86de8 127#endif
18085af4 128 }
129 if (memEQ(name, "LOG_MAIL", 8)) {
130 /* ^ */
131#ifdef LOG_MAIL
132 *iv_return = LOG_MAIL;
133 return PERL_constant_ISIV;
8ce86de8 134#else
18085af4 135 return PERL_constant_NOTDEF;
8ce86de8 136#endif
8ce86de8 137 }
18085af4 138 break;
139 case 'M':
140 if (memEQ(name, "LOG_LFMT", 8)) {
141 /* ^ */
142#ifdef LOG_LFMT
143 *iv_return = LOG_LFMT;
144 return PERL_constant_ISIV;
145#else
146 return PERL_constant_NOTDEF;
8fa7f367 147#endif
18085af4 148 }
149 break;
150 case 'N':
151 if (memEQ(name, "LOG_CONS", 8)) {
152 /* ^ */
8ce86de8 153#ifdef LOG_CONS
18085af4 154 *iv_return = LOG_CONS;
155 return PERL_constant_ISIV;
8ce86de8 156#else
18085af4 157 return PERL_constant_NOTDEF;
8ce86de8 158#endif
8ce86de8 159 }
18085af4 160 break;
161 case 'O':
162 if (memEQ(name, "LOG_CRON", 8)) {
163 /* ^ */
164#ifdef LOG_CRON
165 *iv_return = LOG_CRON;
166 return PERL_constant_ISIV;
8ce86de8 167#else
18085af4 168 return PERL_constant_NOTDEF;
8ce86de8 169#endif
18085af4 170 }
171 break;
172 case 'R':
173 if (memEQ(name, "LOG_KERN", 8)) {
174 /* ^ */
175#ifdef LOG_KERN
176 *iv_return = LOG_KERN;
177 return PERL_constant_ISIV;
8ce86de8 178#else
18085af4 179 return PERL_constant_NOTDEF;
8ce86de8 180#endif
8ce86de8 181 }
18085af4 182 break;
183 case 'T':
184 if (memEQ(name, "LOG_AUTH", 8)) {
185 /* ^ */
186#ifdef LOG_AUTH
187 *iv_return = LOG_AUTH;
188 return PERL_constant_ISIV;
8ce86de8 189#else
18085af4 190 return PERL_constant_NOTDEF;
8ce86de8 191#endif
18085af4 192 }
193 break;
194 case 'W':
195 if (memEQ(name, "LOG_NEWS", 8)) {
196 /* ^ */
197#ifdef LOG_NEWS
198 *iv_return = LOG_NEWS;
199 return PERL_constant_ISIV;
8ce86de8 200#else
18085af4 201 return PERL_constant_NOTDEF;
8ce86de8 202#endif
8ce86de8 203 }
18085af4 204 break;
205 }
206 return PERL_constant_NOTFOUND;
8ce86de8 207}
208
18085af4 209static int
210constant_9 (const char *name, IV *iv_return) {
211 /* Names all of length 9. */
212 /* When generated this function returned values for the list of names given
213 here. However, subsequent manual editing may have added or removed some.
214 LOG_ALERT LOG_DEBUG LOG_EMERG */
215 /* Offset 4 gives the best switch position. */
216 switch (name[4]) {
217 case 'A':
218 if (memEQ(name, "LOG_ALERT", 9)) {
219 /* ^ */
220#ifdef LOG_ALERT
221 *iv_return = LOG_ALERT;
222 return PERL_constant_ISIV;
8ce86de8 223#else
18085af4 224 return PERL_constant_NOTDEF;
8ce86de8 225#endif
8ce86de8 226 }
18085af4 227 break;
228 case 'D':
229 if (memEQ(name, "LOG_DEBUG", 9)) {
230 /* ^ */
231#ifdef LOG_DEBUG
232 *iv_return = LOG_DEBUG;
233 return PERL_constant_ISIV;
8ce86de8 234#else
18085af4 235 return PERL_constant_NOTDEF;
8ce86de8 236#endif
18085af4 237 }
238 break;
239 case 'E':
240 if (memEQ(name, "LOG_EMERG", 9)) {
241 /* ^ */
242#ifdef LOG_EMERG
243 *iv_return = LOG_EMERG;
244 return PERL_constant_ISIV;
8ce86de8 245#else
18085af4 246 return PERL_constant_NOTDEF;
8ce86de8 247#endif
8ce86de8 248 }
18085af4 249 break;
250 }
251 return PERL_constant_NOTFOUND;
8ce86de8 252}
253
18085af4 254static int
255constant_10 (const char *name, IV *iv_return) {
256 /* Names all of length 10. */
257 /* When generated this function returned values for the list of names given
258 here. However, subsequent manual editing may have added or removed some.
259 LOG_DAEMON LOG_LOCAL0 LOG_LOCAL1 LOG_LOCAL2 LOG_LOCAL3 LOG_LOCAL4
260 LOG_LOCAL5 LOG_LOCAL6 LOG_LOCAL7 LOG_NDELAY LOG_NOTICE LOG_NOWAIT
261 LOG_ODELAY LOG_PERROR LOG_SYSLOG */
262 /* Offset 9 gives the best switch position. */
263 switch (name[9]) {
264 case '0':
265 if (memEQ(name, "LOG_LOCAL0", 10)) {
266 /* ^ */
8ce86de8 267#ifdef LOG_LOCAL0
18085af4 268 *iv_return = LOG_LOCAL0;
269 return PERL_constant_ISIV;
8ce86de8 270#else
18085af4 271 return PERL_constant_NOTDEF;
8ce86de8 272#endif
18085af4 273 }
274 break;
275 case '1':
276 if (memEQ(name, "LOG_LOCAL1", 10)) {
277 /* ^ */
8ce86de8 278#ifdef LOG_LOCAL1
18085af4 279 *iv_return = LOG_LOCAL1;
280 return PERL_constant_ISIV;
8ce86de8 281#else
18085af4 282 return PERL_constant_NOTDEF;
8ce86de8 283#endif
18085af4 284 }
285 break;
286 case '2':
287 if (memEQ(name, "LOG_LOCAL2", 10)) {
288 /* ^ */
8ce86de8 289#ifdef LOG_LOCAL2
18085af4 290 *iv_return = LOG_LOCAL2;
291 return PERL_constant_ISIV;
8ce86de8 292#else
18085af4 293 return PERL_constant_NOTDEF;
8ce86de8 294#endif
18085af4 295 }
296 break;
297 case '3':
298 if (memEQ(name, "LOG_LOCAL3", 10)) {
299 /* ^ */
8ce86de8 300#ifdef LOG_LOCAL3
18085af4 301 *iv_return = LOG_LOCAL3;
302 return PERL_constant_ISIV;
8ce86de8 303#else
18085af4 304 return PERL_constant_NOTDEF;
8ce86de8 305#endif
18085af4 306 }
307 break;
308 case '4':
309 if (memEQ(name, "LOG_LOCAL4", 10)) {
310 /* ^ */
8ce86de8 311#ifdef LOG_LOCAL4
18085af4 312 *iv_return = LOG_LOCAL4;
313 return PERL_constant_ISIV;
8ce86de8 314#else
18085af4 315 return PERL_constant_NOTDEF;
8ce86de8 316#endif
18085af4 317 }
318 break;
319 case '5':
320 if (memEQ(name, "LOG_LOCAL5", 10)) {
321 /* ^ */
8ce86de8 322#ifdef LOG_LOCAL5
18085af4 323 *iv_return = LOG_LOCAL5;
324 return PERL_constant_ISIV;
8ce86de8 325#else
18085af4 326 return PERL_constant_NOTDEF;
8ce86de8 327#endif
18085af4 328 }
329 break;
330 case '6':
331 if (memEQ(name, "LOG_LOCAL6", 10)) {
332 /* ^ */
8ce86de8 333#ifdef LOG_LOCAL6
18085af4 334 *iv_return = LOG_LOCAL6;
335 return PERL_constant_ISIV;
8ce86de8 336#else
18085af4 337 return PERL_constant_NOTDEF;
8ce86de8 338#endif
18085af4 339 }
340 break;
341 case '7':
342 if (memEQ(name, "LOG_LOCAL7", 10)) {
343 /* ^ */
8ce86de8 344#ifdef LOG_LOCAL7
18085af4 345 *iv_return = LOG_LOCAL7;
346 return PERL_constant_ISIV;
8ce86de8 347#else
18085af4 348 return PERL_constant_NOTDEF;
8ce86de8 349#endif
8ce86de8 350 }
18085af4 351 break;
352 case 'E':
353 if (memEQ(name, "LOG_NOTICE", 10)) {
354 /* ^ */
355#ifdef LOG_NOTICE
356 *iv_return = LOG_NOTICE;
357 return PERL_constant_ISIV;
8ce86de8 358#else
18085af4 359 return PERL_constant_NOTDEF;
8ce86de8 360#endif
18085af4 361 }
362 break;
363 case 'G':
364 if (memEQ(name, "LOG_SYSLOG", 10)) {
365 /* ^ */
366#ifdef LOG_SYSLOG
367 *iv_return = LOG_SYSLOG;
368 return PERL_constant_ISIV;
8ce86de8 369#else
18085af4 370 return PERL_constant_NOTDEF;
8ce86de8 371#endif
8ce86de8 372 }
18085af4 373 break;
374 case 'N':
375 if (memEQ(name, "LOG_DAEMON", 10)) {
376 /* ^ */
377#ifdef LOG_DAEMON
378 *iv_return = LOG_DAEMON;
379 return PERL_constant_ISIV;
380#else
381 return PERL_constant_NOTDEF;
8fa7f367 382#endif
18085af4 383 }
384 break;
385 case 'R':
386 if (memEQ(name, "LOG_PERROR", 10)) {
387 /* ^ */
388#ifdef LOG_PERROR
389 *iv_return = LOG_PERROR;
390 return PERL_constant_ISIV;
8ce86de8 391#else
18085af4 392 return PERL_constant_NOTDEF;
8ce86de8 393#endif
18085af4 394 }
395 break;
396 case 'T':
397 if (memEQ(name, "LOG_NOWAIT", 10)) {
398 /* ^ */
399#ifdef LOG_NOWAIT
400 *iv_return = LOG_NOWAIT;
401 return PERL_constant_ISIV;
8ce86de8 402#else
18085af4 403 return PERL_constant_NOTDEF;
8ce86de8 404#endif
18085af4 405 }
406 break;
407 case 'Y':
408 if (memEQ(name, "LOG_NDELAY", 10)) {
409 /* ^ */
410#ifdef LOG_NDELAY
411 *iv_return = LOG_NDELAY;
412 return PERL_constant_ISIV;
8ce86de8 413#else
18085af4 414 return PERL_constant_NOTDEF;
8ce86de8 415#endif
18085af4 416 }
417 if (memEQ(name, "LOG_ODELAY", 10)) {
418 /* ^ */
8ce86de8 419#ifdef LOG_ODELAY
18085af4 420 *iv_return = LOG_ODELAY;
421 return PERL_constant_ISIV;
8ce86de8 422#else
18085af4 423 return PERL_constant_NOTDEF;
8ce86de8 424#endif
18085af4 425 }
426 break;
427 }
428 return PERL_constant_NOTFOUND;
429}
430
431static int
432constant_11 (const char *name, IV *iv_return) {
433 /* Names all of length 11. */
434 /* When generated this function returned values for the list of names given
435 here. However, subsequent manual editing may have added or removed some.
436 LOG_FACMASK LOG_PRIMASK LOG_WARNING */
437 /* Offset 6 gives the best switch position. */
438 switch (name[6]) {
439 case 'C':
440 if (memEQ(name, "LOG_FACMASK", 11)) {
441 /* ^ */
442#ifdef LOG_FACMASK
443 *iv_return = LOG_FACMASK;
444 return PERL_constant_ISIV;
445#else
446 return PERL_constant_NOTDEF;
447#endif
448 }
449 break;
450 case 'I':
451 if (memEQ(name, "LOG_PRIMASK", 11)) {
452 /* ^ */
453#ifdef LOG_PRIMASK
454 *iv_return = LOG_PRIMASK;
455 return PERL_constant_ISIV;
8ce86de8 456#else
18085af4 457 return PERL_constant_NOTDEF;
8ce86de8 458#endif
18085af4 459 }
460 break;
461 case 'R':
462 if (memEQ(name, "LOG_WARNING", 11)) {
463 /* ^ */
8ce86de8 464#ifdef LOG_WARNING
18085af4 465 *iv_return = LOG_WARNING;
466 return PERL_constant_ISIV;
8ce86de8 467#else
18085af4 468 return PERL_constant_NOTDEF;
8ce86de8 469#endif
8ce86de8 470 }
18085af4 471 break;
472 }
473 return PERL_constant_NOTFOUND;
474}
8ce86de8 475
18085af4 476static int
477constant (const char *name, STRLEN len, IV *iv_return) {
478 /* Initially switch on the length of the name. */
479 /* When generated this function returned values for the list of names given
480 in this section of perl code. Rather than manually editing these functions
481 to add or remove constants, which would result in this comment and section
482 of code becoming inaccurate, we recommend that you edit this section of
483 code, and use it to regenerate a new set of constant functions which you
484 then use to replace the originals.
485
486 Regenerate these constant functions by feeding this entire source file to
487 perl -x
488
489#!perl -w
490use ExtUtils::Constant qw (constant_types C_constant XS_constant);
491
492my $types = {IV => 1};
493my @names = (qw(LOG_ALERT LOG_AUTH LOG_AUTHPRIV LOG_CONS LOG_CRIT LOG_CRON
494 LOG_DAEMON LOG_DEBUG LOG_EMERG LOG_ERR LOG_FACMASK LOG_FTP
495 LOG_INFO LOG_KERN LOG_LFMT LOG_LOCAL0 LOG_LOCAL1 LOG_LOCAL2
496 LOG_LOCAL3 LOG_LOCAL4 LOG_LOCAL5 LOG_LOCAL6 LOG_LOCAL7 LOG_LPR
497 LOG_MAIL LOG_NDELAY LOG_NEWS LOG_NFACILITIES LOG_NOTICE
498 LOG_NOWAIT LOG_ODELAY LOG_PERROR LOG_PID LOG_PRIMASK LOG_SYSLOG
499 LOG_USER LOG_UUCP LOG_WARNING));
500
501print constant_types(); # macro defs
502foreach (C_constant ("Sys::Syslog", 'constant', 'IV', $types, undef, undef, @names) ) {
503 print $_, "\n"; # C constant subs
504}
505print "#### XS Section:\n";
506print XS_constant ("Sys::Syslog", $types);
507__END__
508 */
509
510 switch (len) {
511 case 7:
512 return constant_7 (name, iv_return);
513 break;
514 case 8:
515 return constant_8 (name, iv_return);
516 break;
517 case 9:
518 return constant_9 (name, iv_return);
519 break;
520 case 10:
521 return constant_10 (name, iv_return);
522 break;
523 case 11:
524 return constant_11 (name, iv_return);
525 break;
526 case 12:
527 if (memEQ(name, "LOG_AUTHPRIV", 12)) {
528#ifdef LOG_AUTHPRIV
529 *iv_return = LOG_AUTHPRIV;
530 return PERL_constant_ISIV;
531#else
532 return PERL_constant_NOTDEF;
533#endif
534 }
535 break;
536 case 15:
537 if (memEQ(name, "LOG_NFACILITIES", 15)) {
538#ifdef LOG_NFACILITIES
539 *iv_return = LOG_NFACILITIES;
540 return PERL_constant_ISIV;
541#else
542 return PERL_constant_NOTDEF;
8fa7f367 543#endif
18085af4 544 }
545 break;
546 }
547 return PERL_constant_NOTFOUND;
8ce86de8 548}
549
8ce86de8 550MODULE = Sys::Syslog PACKAGE = Sys::Syslog
551
552char *
553_PATH_LOG()
554 CODE:
555#ifdef _PATH_LOG
556 RETVAL = _PATH_LOG;
557#else
150b260b 558 RETVAL = "";
8ce86de8 559#endif
560 OUTPUT:
561 RETVAL
562
563int
564LOG_FAC(p)
565 INPUT:
566 int p
567 CODE:
568#ifdef LOG_FAC
569 RETVAL = LOG_FAC(p);
570#else
571 croak("Your vendor has not defined the Sys::Syslog macro LOG_FAC");
b621ec8a 572 RETVAL = -1;
8ce86de8 573#endif
574 OUTPUT:
575 RETVAL
576
577int
578LOG_PRI(p)
579 INPUT:
580 int p
581 CODE:
582#ifdef LOG_PRI
583 RETVAL = LOG_PRI(p);
584#else
585 croak("Your vendor has not defined the Sys::Syslog macro LOG_PRI");
b621ec8a 586 RETVAL = -1;
8ce86de8 587#endif
588 OUTPUT:
589 RETVAL
590
591int
592LOG_MAKEPRI(fac,pri)
593 INPUT:
594 int fac
595 int pri
596 CODE:
597#ifdef LOG_MAKEPRI
598 RETVAL = LOG_MAKEPRI(fac,pri);
599#else
600 croak("Your vendor has not defined the Sys::Syslog macro LOG_MAKEPRI");
b621ec8a 601 RETVAL = -1;
8ce86de8 602#endif
603 OUTPUT:
604 RETVAL
605
606int
607LOG_MASK(pri)
608 INPUT:
609 int pri
610 CODE:
611#ifdef LOG_MASK
612 RETVAL = LOG_MASK(pri);
613#else
614 croak("Your vendor has not defined the Sys::Syslog macro LOG_MASK");
b621ec8a 615 RETVAL = -1;
8ce86de8 616#endif
617 OUTPUT:
618 RETVAL
619
620int
621LOG_UPTO(pri)
622 INPUT:
623 int pri
624 CODE:
625#ifdef LOG_UPTO
626 RETVAL = LOG_UPTO(pri);
627#else
628 croak("Your vendor has not defined the Sys::Syslog macro LOG_UPTO");
b621ec8a 629 RETVAL = -1;
8ce86de8 630#endif
631 OUTPUT:
632 RETVAL
633
634
18085af4 635void
b193a46a 636constant(sv)
8ce86de8 637 PREINIT:
18085af4 638#ifdef dXSTARG
639 dXSTARG; /* Faster if we have it. */
640#else
641 dTARGET;
642#endif
8ce86de8 643 STRLEN len;
18085af4 644 int type;
645 IV iv;
646 /* NV nv; Uncomment this if you need to return NVs */
647 /* const char *pv; Uncomment this if you need to return PVs */
8ce86de8 648 INPUT:
18085af4 649 SV * sv;
650 const char * s = SvPV(sv, len);
651 PPCODE:
652 /* Change this to constant(s, len, &iv, &nv);
653 if you need to return both NVs and IVs */
654 type = constant(s, len, &iv);
655 /* Return 1 or 2 items. First is error message, or undef if no error.
656 Second, if present, is found value */
657 switch (type) {
658 case PERL_constant_NOTFOUND:
659 sv = sv_2mortal(newSVpvf("%s is not a valid Sys::Syslog macro", s));
660 PUSHs(sv);
661 break;
662 case PERL_constant_NOTDEF:
663 sv = sv_2mortal(newSVpvf(
664 "Your vendor has not defined Sys::Syslog macro %s used", s));
665 PUSHs(sv);
666 break;
667 case PERL_constant_ISIV:
668 EXTEND(SP, 1);
669 PUSHs(&PL_sv_undef);
670 PUSHi(iv);
671 break;
672 default:
673 sv = sv_2mortal(newSVpvf(
674 "Unexpected return type %d while processing Sys::Syslog macro %s used",
675 type, s));
676 PUSHs(sv);
677 }