The #10402 didn't take. Weird.
[p5sagit/p5-mst-13.2.git] / ext / Fcntl / Fcntl.xs
1 #define PERL_NO_GET_CONTEXT
2 #include "EXTERN.h"
3 #include "perl.h"
4 #include "XSUB.h"
5
6 #ifdef VMS
7 #  include <file.h>
8 #else
9 #if defined(__GNUC__) && defined(__cplusplus) && defined(WIN32)
10 #define _NO_OLDNAMES
11 #endif 
12 #  include <fcntl.h>
13 #if defined(__GNUC__) && defined(__cplusplus) && defined(WIN32)
14 #undef _NO_OLDNAMES
15 #endif 
16 #endif
17
18 #ifdef I_UNISTD
19 #include <unistd.h>
20 #endif
21
22 /* This comment is a kludge to get metaconfig to see the symbols
23     VAL_O_NONBLOCK
24     VAL_EAGAIN
25     RD_NODATA
26     EOF_NONBLOCK
27    and include the appropriate metaconfig unit
28    so that Configure will test how to turn on non-blocking I/O
29    for a file descriptor.  See config.h for how to use these
30    in your extension. 
31    
32    While I'm at it, I'll have metaconfig look for HAS_POLL too.
33    --AD  October 16, 1995
34 */
35
36 #define PERL_constant_NOTFOUND  1
37 #define PERL_constant_NOTDEF    2
38 #define PERL_constant_ISIV      3
39 #define PERL_constant_ISNV      4
40 #define PERL_constant_ISPV      5
41 #define PERL_constant_ISPVN     6
42 #define PERL_constant_ISUV      7
43
44 #ifndef NVTYPE
45 typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it.  */
46 #endif
47
48 static int
49 constant_5 (const char *name, IV *iv_return) {
50   /* Names all of length 5.  */
51   /* When generated this function returned values for the list of names given
52      here.  However, subsequent manual editing may have added or removed some.
53      FEXCL FSYNC O_RAW */
54   /* Offset 2 gives the best switch position.  */
55   switch (name[2]) {
56   case 'R':
57     if (memEQ(name, "O_RAW", 5)) {
58     /*                 ^        */
59 #ifdef O_RAW
60       *iv_return = O_RAW;
61       return PERL_constant_ISIV;
62 #else
63       return PERL_constant_NOTDEF;
64 #endif
65     }
66     break;
67   case 'X':
68     if (memEQ(name, "FEXCL", 5)) {
69     /*                 ^        */
70 #ifdef FEXCL
71       *iv_return = FEXCL;
72       return PERL_constant_ISIV;
73 #else
74       return PERL_constant_NOTDEF;
75 #endif
76     }
77     break;
78   case 'Y':
79     if (memEQ(name, "FSYNC", 5)) {
80     /*                 ^        */
81 #ifdef FSYNC
82       *iv_return = FSYNC;
83       return PERL_constant_ISIV;
84 #else
85       return PERL_constant_NOTDEF;
86 #endif
87     }
88     break;
89   }
90   return PERL_constant_NOTFOUND;
91 }
92
93 static int
94 constant_6 (const char *name, IV *iv_return) {
95   /* Names all of length 6.  */
96   /* When generated this function returned values for the list of names given
97      here.  However, subsequent manual editing may have added or removed some.
98      FASYNC FCREAT FDEFER FDSYNC FRSYNC FTRUNC O_EXCL O_RDWR O_RSRC O_SYNC
99      O_TEXT */
100   /* Offset 3 gives the best switch position.  */
101   switch (name[3]) {
102   case 'D':
103     if (memEQ(name, "O_RDWR", 6)) {
104     /*                  ^        */
105 #ifdef O_RDWR
106       *iv_return = O_RDWR;
107       return PERL_constant_ISIV;
108 #else
109       return PERL_constant_NOTDEF;
110 #endif
111     }
112     break;
113   case 'E':
114     if (memEQ(name, "FCREAT", 6)) {
115     /*                  ^        */
116 #ifdef FCREAT
117       *iv_return = FCREAT;
118       return PERL_constant_ISIV;
119 #else
120       return PERL_constant_NOTDEF;
121 #endif
122     }
123     if (memEQ(name, "O_TEXT", 6)) {
124     /*                  ^        */
125 #ifdef O_TEXT
126       *iv_return = O_TEXT;
127       return PERL_constant_ISIV;
128 #else
129       return PERL_constant_NOTDEF;
130 #endif
131     }
132     break;
133   case 'F':
134     if (memEQ(name, "FDEFER", 6)) {
135     /*                  ^        */
136 #ifdef FDEFER
137       *iv_return = FDEFER;
138       return PERL_constant_ISIV;
139 #else
140       return PERL_constant_NOTDEF;
141 #endif
142     }
143     break;
144   case 'S':
145     if (memEQ(name, "O_RSRC", 6)) {
146     /*                  ^        */
147 #ifdef O_RSRC
148       *iv_return = O_RSRC;
149       return PERL_constant_ISIV;
150 #else
151       return PERL_constant_NOTDEF;
152 #endif
153     }
154     break;
155   case 'U':
156     if (memEQ(name, "FTRUNC", 6)) {
157     /*                  ^        */
158 #ifdef FTRUNC
159       *iv_return = FTRUNC;
160       return PERL_constant_ISIV;
161 #else
162       return PERL_constant_NOTDEF;
163 #endif
164     }
165     break;
166   case 'X':
167     if (memEQ(name, "O_EXCL", 6)) {
168     /*                  ^        */
169 #ifdef O_EXCL
170       *iv_return = O_EXCL;
171       return PERL_constant_ISIV;
172 #else
173       return PERL_constant_NOTDEF;
174 #endif
175     }
176     break;
177   case 'Y':
178     if (memEQ(name, "FASYNC", 6)) {
179     /*                  ^        */
180 #ifdef FASYNC
181       *iv_return = FASYNC;
182       return PERL_constant_ISIV;
183 #else
184       return PERL_constant_NOTDEF;
185 #endif
186     }
187     if (memEQ(name, "FDSYNC", 6)) {
188     /*                  ^        */
189 #ifdef FDSYNC
190       *iv_return = FDSYNC;
191       return PERL_constant_ISIV;
192 #else
193       return PERL_constant_NOTDEF;
194 #endif
195     }
196     if (memEQ(name, "FRSYNC", 6)) {
197     /*                  ^        */
198 #ifdef FRSYNC
199       *iv_return = FRSYNC;
200       return PERL_constant_ISIV;
201 #else
202       return PERL_constant_NOTDEF;
203 #endif
204     }
205     if (memEQ(name, "O_SYNC", 6)) {
206     /*                  ^        */
207 #ifdef O_SYNC
208       *iv_return = O_SYNC;
209       return PERL_constant_ISIV;
210 #else
211       return PERL_constant_NOTDEF;
212 #endif
213     }
214     break;
215   }
216   return PERL_constant_NOTFOUND;
217 }
218
219 static int
220 constant_7 (const char *name, IV *iv_return) {
221   /* Names all of length 7.  */
222   /* When generated this function returned values for the list of names given
223      here.  However, subsequent manual editing may have added or removed some.
224      FAPPEND FNDELAY F_DUPFD F_EXLCK F_FSYNC F_GETFD F_GETFL F_GETLK F_NODNY
225      F_POSIX F_RDACC F_RDDNY F_RDLCK F_RWACC F_RWDNY F_SETFD F_SETFL F_SETLK
226      F_SHARE F_SHLCK F_UNLCK F_WRACC F_WRDNY F_WRLCK LOCK_EX LOCK_NB LOCK_SH
227      LOCK_UN O_ALIAS O_ASYNC O_CREAT O_DEFER O_DSYNC O_RSYNC O_TRUNC S_ENFMT
228      S_IEXEC S_IFBLK S_IFCHR S_IFDIR S_IFIFO S_IFLNK S_IFREG S_IFWHT S_IREAD
229      S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU S_ISGID S_ISTXT S_ISUID
230      S_ISVTX S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR _S_IFMT */
231   /* Offset 4 gives the best switch position.  */
232   switch (name[4]) {
233   case 'A':
234     if (memEQ(name, "F_RDACC", 7)) {
235     /*                   ^        */
236 #ifdef F_RDACC
237       *iv_return = F_RDACC;
238       return PERL_constant_ISIV;
239 #else
240       return PERL_constant_NOTDEF;
241 #endif
242     }
243     if (memEQ(name, "F_RWACC", 7)) {
244     /*                   ^        */
245 #ifdef F_RWACC
246       *iv_return = F_RWACC;
247       return PERL_constant_ISIV;
248 #else
249       return PERL_constant_NOTDEF;
250 #endif
251     }
252     if (memEQ(name, "F_SHARE", 7)) {
253     /*                   ^        */
254 #ifdef F_SHARE
255       *iv_return = F_SHARE;
256       return PERL_constant_ISIV;
257 #else
258       return PERL_constant_NOTDEF;
259 #endif
260     }
261     if (memEQ(name, "F_WRACC", 7)) {
262     /*                   ^        */
263 #ifdef F_WRACC
264       *iv_return = F_WRACC;
265       return PERL_constant_ISIV;
266 #else
267       return PERL_constant_NOTDEF;
268 #endif
269     }
270     break;
271   case 'B':
272     if (memEQ(name, "S_IFBLK", 7)) {
273     /*                   ^        */
274 #ifdef S_IFBLK
275       *iv_return = S_IFBLK;
276       return PERL_constant_ISIV;
277 #else
278       return PERL_constant_NOTDEF;
279 #endif
280     }
281     break;
282   case 'C':
283     if (memEQ(name, "S_IFCHR", 7)) {
284     /*                   ^        */
285 #ifdef S_IFCHR
286       *iv_return = S_IFCHR;
287       return PERL_constant_ISIV;
288 #else
289       return PERL_constant_NOTDEF;
290 #endif
291     }
292     break;
293   case 'D':
294     if (memEQ(name, "F_NODNY", 7)) {
295     /*                   ^        */
296 #ifdef F_NODNY
297       *iv_return = F_NODNY;
298       return PERL_constant_ISIV;
299 #else
300       return PERL_constant_NOTDEF;
301 #endif
302     }
303     if (memEQ(name, "F_RDDNY", 7)) {
304     /*                   ^        */
305 #ifdef F_RDDNY
306       *iv_return = F_RDDNY;
307       return PERL_constant_ISIV;
308 #else
309       return PERL_constant_NOTDEF;
310 #endif
311     }
312     if (memEQ(name, "F_RWDNY", 7)) {
313     /*                   ^        */
314 #ifdef F_RWDNY
315       *iv_return = F_RWDNY;
316       return PERL_constant_ISIV;
317 #else
318       return PERL_constant_NOTDEF;
319 #endif
320     }
321     if (memEQ(name, "F_WRDNY", 7)) {
322     /*                   ^        */
323 #ifdef F_WRDNY
324       *iv_return = F_WRDNY;
325       return PERL_constant_ISIV;
326 #else
327       return PERL_constant_NOTDEF;
328 #endif
329     }
330     if (memEQ(name, "S_IFDIR", 7)) {
331     /*                   ^        */
332 #ifdef S_IFDIR
333       *iv_return = S_IFDIR;
334       return PERL_constant_ISIV;
335 #else
336       return PERL_constant_NOTDEF;
337 #endif
338     }
339     break;
340   case 'E':
341     if (memEQ(name, "FAPPEND", 7)) {
342     /*                   ^        */
343 #ifdef FAPPEND
344       *iv_return = FAPPEND;
345       return PERL_constant_ISIV;
346 #else
347       return PERL_constant_NOTDEF;
348 #endif
349     }
350     if (memEQ(name, "O_CREAT", 7)) {
351     /*                   ^        */
352 #ifdef O_CREAT
353       *iv_return = O_CREAT;
354       return PERL_constant_ISIV;
355 #else
356       return PERL_constant_NOTDEF;
357 #endif
358     }
359     if (memEQ(name, "S_IREAD", 7)) {
360     /*                   ^        */
361 #ifdef S_IREAD
362       *iv_return = S_IREAD;
363       return PERL_constant_ISIV;
364 #else
365       return PERL_constant_NOTDEF;
366 #endif
367     }
368     break;
369   case 'F':
370     if (memEQ(name, "O_DEFER", 7)) {
371     /*                   ^        */
372 #ifdef O_DEFER
373       *iv_return = O_DEFER;
374       return PERL_constant_ISIV;
375 #else
376       return PERL_constant_NOTDEF;
377 #endif
378     }
379     if (memEQ(name, "S_ENFMT", 7)) {
380     /*                   ^        */
381 #ifdef S_ENFMT
382       *iv_return = S_ENFMT;
383       return PERL_constant_ISIV;
384 #else
385       return PERL_constant_NOTDEF;
386 #endif
387     }
388     if (memEQ(name, "_S_IFMT", 7)) {
389     /*                   ^        */
390 #ifdef S_IFMT
391       *iv_return = S_IFMT;
392       return PERL_constant_ISIV;
393 #else
394       return PERL_constant_NOTDEF;
395 #endif
396     }
397     break;
398   case 'G':
399     if (memEQ(name, "S_IRGRP", 7)) {
400     /*                   ^        */
401 #ifdef S_IRGRP
402       *iv_return = S_IRGRP;
403       return PERL_constant_ISIV;
404 #else
405       return PERL_constant_NOTDEF;
406 #endif
407     }
408     if (memEQ(name, "S_ISGID", 7)) {
409     /*                   ^        */
410 #ifdef S_ISGID
411       *iv_return = S_ISGID;
412       return PERL_constant_ISIV;
413 #else
414       return PERL_constant_NOTDEF;
415 #endif
416     }
417     if (memEQ(name, "S_IWGRP", 7)) {
418     /*                   ^        */
419 #ifdef S_IWGRP
420       *iv_return = S_IWGRP;
421       return PERL_constant_ISIV;
422 #else
423       return PERL_constant_NOTDEF;
424 #endif
425     }
426     if (memEQ(name, "S_IXGRP", 7)) {
427     /*                   ^        */
428 #ifdef S_IXGRP
429       *iv_return = S_IXGRP;
430       return PERL_constant_ISIV;
431 #else
432       return PERL_constant_NOTDEF;
433 #endif
434     }
435     break;
436   case 'I':
437     if (memEQ(name, "O_ALIAS", 7)) {
438     /*                   ^        */
439 #ifdef O_ALIAS
440       *iv_return = O_ALIAS;
441       return PERL_constant_ISIV;
442 #else
443       return PERL_constant_NOTDEF;
444 #endif
445     }
446     if (memEQ(name, "S_IFIFO", 7)) {
447     /*                   ^        */
448 #ifdef S_IFIFO
449       *iv_return = S_IFIFO;
450       return PERL_constant_ISIV;
451 #else
452       return PERL_constant_NOTDEF;
453 #endif
454     }
455     break;
456   case 'L':
457     if (memEQ(name, "FNDELAY", 7)) {
458     /*                   ^        */
459 #ifdef FNDELAY
460       *iv_return = FNDELAY;
461       return PERL_constant_ISIV;
462 #else
463       return PERL_constant_NOTDEF;
464 #endif
465     }
466     if (memEQ(name, "F_EXLCK", 7)) {
467     /*                   ^        */
468 #ifdef F_EXLCK
469       *iv_return = F_EXLCK;
470       return PERL_constant_ISIV;
471 #else
472       return PERL_constant_NOTDEF;
473 #endif
474     }
475     if (memEQ(name, "F_RDLCK", 7)) {
476     /*                   ^        */
477 #ifdef F_RDLCK
478       *iv_return = F_RDLCK;
479       return PERL_constant_ISIV;
480 #else
481       return PERL_constant_NOTDEF;
482 #endif
483     }
484     if (memEQ(name, "F_SHLCK", 7)) {
485     /*                   ^        */
486 #ifdef F_SHLCK
487       *iv_return = F_SHLCK;
488       return PERL_constant_ISIV;
489 #else
490       return PERL_constant_NOTDEF;
491 #endif
492     }
493     if (memEQ(name, "F_UNLCK", 7)) {
494     /*                   ^        */
495 #ifdef F_UNLCK
496       *iv_return = F_UNLCK;
497       return PERL_constant_ISIV;
498 #else
499       return PERL_constant_NOTDEF;
500 #endif
501     }
502     if (memEQ(name, "F_WRLCK", 7)) {
503     /*                   ^        */
504 #ifdef F_WRLCK
505       *iv_return = F_WRLCK;
506       return PERL_constant_ISIV;
507 #else
508       return PERL_constant_NOTDEF;
509 #endif
510     }
511     if (memEQ(name, "S_IFLNK", 7)) {
512     /*                   ^        */
513 #ifdef S_IFLNK
514       *iv_return = S_IFLNK;
515       return PERL_constant_ISIV;
516 #else
517       return PERL_constant_NOTDEF;
518 #endif
519     }
520     break;
521   case 'O':
522     if (memEQ(name, "S_IROTH", 7)) {
523     /*                   ^        */
524 #ifdef S_IROTH
525       *iv_return = S_IROTH;
526       return PERL_constant_ISIV;
527 #else
528       return PERL_constant_NOTDEF;
529 #endif
530     }
531     if (memEQ(name, "S_IWOTH", 7)) {
532     /*                   ^        */
533 #ifdef S_IWOTH
534       *iv_return = S_IWOTH;
535       return PERL_constant_ISIV;
536 #else
537       return PERL_constant_NOTDEF;
538 #endif
539     }
540     if (memEQ(name, "S_IXOTH", 7)) {
541     /*                   ^        */
542 #ifdef S_IXOTH
543       *iv_return = S_IXOTH;
544       return PERL_constant_ISIV;
545 #else
546       return PERL_constant_NOTDEF;
547 #endif
548     }
549     break;
550   case 'P':
551     if (memEQ(name, "F_DUPFD", 7)) {
552     /*                   ^        */
553 #ifdef F_DUPFD
554       *iv_return = F_DUPFD;
555       return PERL_constant_ISIV;
556 #else
557       return PERL_constant_NOTDEF;
558 #endif
559     }
560     break;
561   case 'R':
562     if (memEQ(name, "S_IFREG", 7)) {
563     /*                   ^        */
564 #ifdef S_IFREG
565       *iv_return = S_IFREG;
566       return PERL_constant_ISIV;
567 #else
568       return PERL_constant_NOTDEF;
569 #endif
570     }
571     break;
572   case 'S':
573     if (memEQ(name, "F_POSIX", 7)) {
574     /*                   ^        */
575 #ifdef F_POSIX
576       *iv_return = F_POSIX;
577       return PERL_constant_ISIV;
578 #else
579       return PERL_constant_NOTDEF;
580 #endif
581     }
582     break;
583   case 'T':
584     if (memEQ(name, "F_GETFD", 7)) {
585     /*                   ^        */
586 #ifdef F_GETFD
587       *iv_return = F_GETFD;
588       return PERL_constant_ISIV;
589 #else
590       return PERL_constant_NOTDEF;
591 #endif
592     }
593     if (memEQ(name, "F_GETFL", 7)) {
594     /*                   ^        */
595 #ifdef F_GETFL
596       *iv_return = F_GETFL;
597       return PERL_constant_ISIV;
598 #else
599       return PERL_constant_NOTDEF;
600 #endif
601     }
602     if (memEQ(name, "F_GETLK", 7)) {
603     /*                   ^        */
604 #ifdef F_GETLK
605       *iv_return = F_GETLK;
606       return PERL_constant_ISIV;
607 #else
608       return PERL_constant_NOTDEF;
609 #endif
610     }
611     if (memEQ(name, "F_SETFD", 7)) {
612     /*                   ^        */
613 #ifdef F_SETFD
614       *iv_return = F_SETFD;
615       return PERL_constant_ISIV;
616 #else
617       return PERL_constant_NOTDEF;
618 #endif
619     }
620     if (memEQ(name, "F_SETFL", 7)) {
621     /*                   ^        */
622 #ifdef F_SETFL
623       *iv_return = F_SETFL;
624       return PERL_constant_ISIV;
625 #else
626       return PERL_constant_NOTDEF;
627 #endif
628     }
629     if (memEQ(name, "F_SETLK", 7)) {
630     /*                   ^        */
631 #ifdef F_SETLK
632       *iv_return = F_SETLK;
633       return PERL_constant_ISIV;
634 #else
635       return PERL_constant_NOTDEF;
636 #endif
637     }
638     if (memEQ(name, "S_ISTXT", 7)) {
639     /*                   ^        */
640 #ifdef S_ISTXT
641       *iv_return = S_ISTXT;
642       return PERL_constant_ISIV;
643 #else
644       return PERL_constant_NOTDEF;
645 #endif
646     }
647     break;
648   case 'U':
649     if (memEQ(name, "O_TRUNC", 7)) {
650     /*                   ^        */
651 #ifdef O_TRUNC
652       *iv_return = O_TRUNC;
653       return PERL_constant_ISIV;
654 #else
655       return PERL_constant_NOTDEF;
656 #endif
657     }
658     if (memEQ(name, "S_IRUSR", 7)) {
659     /*                   ^        */
660 #ifdef S_IRUSR
661       *iv_return = S_IRUSR;
662       return PERL_constant_ISIV;
663 #else
664       return PERL_constant_NOTDEF;
665 #endif
666     }
667     if (memEQ(name, "S_ISUID", 7)) {
668     /*                   ^        */
669 #ifdef S_ISUID
670       *iv_return = S_ISUID;
671       return PERL_constant_ISIV;
672 #else
673       return PERL_constant_NOTDEF;
674 #endif
675     }
676     if (memEQ(name, "S_IWUSR", 7)) {
677     /*                   ^        */
678 #ifdef S_IWUSR
679       *iv_return = S_IWUSR;
680       return PERL_constant_ISIV;
681 #else
682       return PERL_constant_NOTDEF;
683 #endif
684     }
685     if (memEQ(name, "S_IXUSR", 7)) {
686     /*                   ^        */
687 #ifdef S_IXUSR
688       *iv_return = S_IXUSR;
689       return PERL_constant_ISIV;
690 #else
691       return PERL_constant_NOTDEF;
692 #endif
693     }
694     break;
695   case 'V':
696     if (memEQ(name, "S_ISVTX", 7)) {
697     /*                   ^        */
698 #ifdef S_ISVTX
699       *iv_return = S_ISVTX;
700       return PERL_constant_ISIV;
701 #else
702       return PERL_constant_NOTDEF;
703 #endif
704     }
705     break;
706   case 'W':
707     if (memEQ(name, "S_IFWHT", 7)) {
708     /*                   ^        */
709 #ifdef S_IFWHT
710       *iv_return = S_IFWHT;
711       return PERL_constant_ISIV;
712 #else
713       return PERL_constant_NOTDEF;
714 #endif
715     }
716     if (memEQ(name, "S_IRWXG", 7)) {
717     /*                   ^        */
718 #ifdef S_IRWXG
719       *iv_return = S_IRWXG;
720       return PERL_constant_ISIV;
721 #else
722       return PERL_constant_NOTDEF;
723 #endif
724     }
725     if (memEQ(name, "S_IRWXO", 7)) {
726     /*                   ^        */
727 #ifdef S_IRWXO
728       *iv_return = S_IRWXO;
729       return PERL_constant_ISIV;
730 #else
731       return PERL_constant_NOTDEF;
732 #endif
733     }
734     if (memEQ(name, "S_IRWXU", 7)) {
735     /*                   ^        */
736 #ifdef S_IRWXU
737       *iv_return = S_IRWXU;
738       return PERL_constant_ISIV;
739 #else
740       return PERL_constant_NOTDEF;
741 #endif
742     }
743     break;
744   case 'X':
745     if (memEQ(name, "S_IEXEC", 7)) {
746     /*                   ^        */
747 #ifdef S_IEXEC
748       *iv_return = S_IEXEC;
749       return PERL_constant_ISIV;
750 #else
751       return PERL_constant_NOTDEF;
752 #endif
753     }
754     break;
755   case 'Y':
756     if (memEQ(name, "F_FSYNC", 7)) {
757     /*                   ^        */
758 #ifdef F_FSYNC
759       *iv_return = F_FSYNC;
760       return PERL_constant_ISIV;
761 #else
762       return PERL_constant_NOTDEF;
763 #endif
764     }
765     if (memEQ(name, "O_ASYNC", 7)) {
766     /*                   ^        */
767 #ifdef O_ASYNC
768       *iv_return = O_ASYNC;
769       return PERL_constant_ISIV;
770 #else
771       return PERL_constant_NOTDEF;
772 #endif
773     }
774     if (memEQ(name, "O_DSYNC", 7)) {
775     /*                   ^        */
776 #ifdef O_DSYNC
777       *iv_return = O_DSYNC;
778       return PERL_constant_ISIV;
779 #else
780       return PERL_constant_NOTDEF;
781 #endif
782     }
783     if (memEQ(name, "O_RSYNC", 7)) {
784     /*                   ^        */
785 #ifdef O_RSYNC
786       *iv_return = O_RSYNC;
787       return PERL_constant_ISIV;
788 #else
789       return PERL_constant_NOTDEF;
790 #endif
791     }
792     break;
793   case '_':
794     if (memEQ(name, "LOCK_EX", 7)) {
795     /*                   ^        */
796 #ifdef LOCK_EX
797       *iv_return = LOCK_EX;
798       return PERL_constant_ISIV;
799 #else
800       *iv_return = 2;
801       return PERL_constant_ISIV;
802 #endif
803     }
804     if (memEQ(name, "LOCK_NB", 7)) {
805     /*                   ^        */
806 #ifdef LOCK_NB
807       *iv_return = LOCK_NB;
808       return PERL_constant_ISIV;
809 #else
810       *iv_return = 4;
811       return PERL_constant_ISIV;
812 #endif
813     }
814     if (memEQ(name, "LOCK_SH", 7)) {
815     /*                   ^        */
816 #ifdef LOCK_SH
817       *iv_return = LOCK_SH;
818       return PERL_constant_ISIV;
819 #else
820       *iv_return = 1;
821       return PERL_constant_ISIV;
822 #endif
823     }
824     if (memEQ(name, "LOCK_UN", 7)) {
825     /*                   ^        */
826 #ifdef LOCK_UN
827       *iv_return = LOCK_UN;
828       return PERL_constant_ISIV;
829 #else
830       *iv_return = 8;
831       return PERL_constant_ISIV;
832 #endif
833     }
834     break;
835   }
836   return PERL_constant_NOTFOUND;
837 }
838
839 static int
840 constant_8 (const char *name, IV *iv_return) {
841   /* Names all of length 8.  */
842   /* When generated this function returned values for the list of names given
843      here.  However, subsequent manual editing may have added or removed some.
844      F_COMPAT F_DUP2FD F_FREESP F_GETOWN F_SETLKW F_SETOWN O_APPEND O_BINARY
845      O_DIRECT O_EXLOCK O_NDELAY O_NOCTTY O_RANDOM O_RDONLY O_SHLOCK O_WRONLY
846      SEEK_CUR SEEK_END SEEK_SET S_IFSOCK S_IWRITE */
847   /* Offset 3 gives the best switch position.  */
848   switch (name[3]) {
849   case 'A':
850     if (memEQ(name, "O_RANDOM", 8)) {
851     /*                  ^          */
852 #ifdef O_RANDOM
853       *iv_return = O_RANDOM;
854       return PERL_constant_ISIV;
855 #else
856       return PERL_constant_NOTDEF;
857 #endif
858     }
859     break;
860   case 'D':
861     if (memEQ(name, "O_NDELAY", 8)) {
862     /*                  ^          */
863 #ifdef O_NDELAY
864       *iv_return = O_NDELAY;
865       return PERL_constant_ISIV;
866 #else
867       return PERL_constant_NOTDEF;
868 #endif
869     }
870     if (memEQ(name, "O_RDONLY", 8)) {
871     /*                  ^          */
872 #ifdef O_RDONLY
873       *iv_return = O_RDONLY;
874       return PERL_constant_ISIV;
875 #else
876       return PERL_constant_NOTDEF;
877 #endif
878     }
879     break;
880   case 'E':
881     if (memEQ(name, "F_GETOWN", 8)) {
882     /*                  ^          */
883 #ifdef F_GETOWN
884       *iv_return = F_GETOWN;
885       return PERL_constant_ISIV;
886 #else
887       return PERL_constant_NOTDEF;
888 #endif
889     }
890     if (memEQ(name, "F_SETLKW", 8)) {
891     /*                  ^          */
892 #ifdef F_SETLKW
893       *iv_return = F_SETLKW;
894       return PERL_constant_ISIV;
895 #else
896       return PERL_constant_NOTDEF;
897 #endif
898     }
899     if (memEQ(name, "F_SETOWN", 8)) {
900     /*                  ^          */
901 #ifdef F_SETOWN
902       *iv_return = F_SETOWN;
903       return PERL_constant_ISIV;
904 #else
905       return PERL_constant_NOTDEF;
906 #endif
907     }
908     break;
909   case 'F':
910     if (memEQ(name, "S_IFSOCK", 8)) {
911     /*                  ^          */
912 #ifdef S_IFSOCK
913       *iv_return = S_IFSOCK;
914       return PERL_constant_ISIV;
915 #else
916       return PERL_constant_NOTDEF;
917 #endif
918     }
919     break;
920   case 'H':
921     if (memEQ(name, "O_SHLOCK", 8)) {
922     /*                  ^          */
923 #ifdef O_SHLOCK
924       *iv_return = O_SHLOCK;
925       return PERL_constant_ISIV;
926 #else
927       return PERL_constant_NOTDEF;
928 #endif
929     }
930     break;
931   case 'I':
932     if (memEQ(name, "O_BINARY", 8)) {
933     /*                  ^          */
934 #ifdef O_BINARY
935       *iv_return = O_BINARY;
936       return PERL_constant_ISIV;
937 #else
938       return PERL_constant_NOTDEF;
939 #endif
940     }
941     if (memEQ(name, "O_DIRECT", 8)) {
942     /*                  ^          */
943 #ifdef O_DIRECT
944       *iv_return = O_DIRECT;
945       return PERL_constant_ISIV;
946 #else
947       return PERL_constant_NOTDEF;
948 #endif
949     }
950     break;
951   case 'K':
952     if (memEQ(name, "SEEK_CUR", 8)) {
953     /*                  ^          */
954 #ifdef SEEK_CUR
955       *iv_return = SEEK_CUR;
956       return PERL_constant_ISIV;
957 #else
958       *iv_return = 1;
959       return PERL_constant_ISIV;
960 #endif
961     }
962     if (memEQ(name, "SEEK_END", 8)) {
963     /*                  ^          */
964 #ifdef SEEK_END
965       *iv_return = SEEK_END;
966       return PERL_constant_ISIV;
967 #else
968       *iv_return = 2;
969       return PERL_constant_ISIV;
970 #endif
971     }
972     if (memEQ(name, "SEEK_SET", 8)) {
973     /*                  ^          */
974 #ifdef SEEK_SET
975       *iv_return = SEEK_SET;
976       return PERL_constant_ISIV;
977 #else
978       *iv_return = 0;
979       return PERL_constant_ISIV;
980 #endif
981     }
982     break;
983   case 'O':
984     if (memEQ(name, "F_COMPAT", 8)) {
985     /*                  ^          */
986 #ifdef F_COMPAT
987       *iv_return = F_COMPAT;
988       return PERL_constant_ISIV;
989 #else
990       return PERL_constant_NOTDEF;
991 #endif
992     }
993     if (memEQ(name, "O_NOCTTY", 8)) {
994     /*                  ^          */
995 #ifdef O_NOCTTY
996       *iv_return = O_NOCTTY;
997       return PERL_constant_ISIV;
998 #else
999       return PERL_constant_NOTDEF;
1000 #endif
1001     }
1002     break;
1003   case 'P':
1004     if (memEQ(name, "O_APPEND", 8)) {
1005     /*                  ^          */
1006 #ifdef O_APPEND
1007       *iv_return = O_APPEND;
1008       return PERL_constant_ISIV;
1009 #else
1010       return PERL_constant_NOTDEF;
1011 #endif
1012     }
1013     break;
1014   case 'R':
1015     if (memEQ(name, "F_FREESP", 8)) {
1016     /*                  ^          */
1017 #ifdef F_FREESP
1018       *iv_return = F_FREESP;
1019       return PERL_constant_ISIV;
1020 #else
1021       return PERL_constant_NOTDEF;
1022 #endif
1023     }
1024     if (memEQ(name, "O_WRONLY", 8)) {
1025     /*                  ^          */
1026 #ifdef O_WRONLY
1027       *iv_return = O_WRONLY;
1028       return PERL_constant_ISIV;
1029 #else
1030       return PERL_constant_NOTDEF;
1031 #endif
1032     }
1033     break;
1034   case 'U':
1035     if (memEQ(name, "F_DUP2FD", 8)) {
1036     /*                  ^          */
1037 #ifdef F_DUP2FD
1038       *iv_return = F_DUP2FD;
1039       return PERL_constant_ISIV;
1040 #else
1041       return PERL_constant_NOTDEF;
1042 #endif
1043     }
1044     break;
1045   case 'W':
1046     if (memEQ(name, "S_IWRITE", 8)) {
1047     /*                  ^          */
1048 #ifdef S_IWRITE
1049       *iv_return = S_IWRITE;
1050       return PERL_constant_ISIV;
1051 #else
1052       return PERL_constant_NOTDEF;
1053 #endif
1054     }
1055     break;
1056   case 'X':
1057     if (memEQ(name, "O_EXLOCK", 8)) {
1058     /*                  ^          */
1059 #ifdef O_EXLOCK
1060       *iv_return = O_EXLOCK;
1061       return PERL_constant_ISIV;
1062 #else
1063       return PERL_constant_NOTDEF;
1064 #endif
1065     }
1066     break;
1067   }
1068   return PERL_constant_NOTFOUND;
1069 }
1070
1071 static int
1072 constant_9 (const char *name, IV *iv_return) {
1073   /* Names all of length 9.  */
1074   /* When generated this function returned values for the list of names given
1075      here.  However, subsequent manual editing may have added or removed some.
1076      FNONBLOCK F_ALLOCSP F_FSYNC64 F_GETLK64 F_SETLK64 F_UNSHARE O_ACCMODE */
1077   /* Offset 2 gives the best switch position.  */
1078   switch (name[2]) {
1079   case 'A':
1080     if (memEQ(name, "F_ALLOCSP", 9)) {
1081     /*                 ^            */
1082 #ifdef F_ALLOCSP
1083       *iv_return = F_ALLOCSP;
1084       return PERL_constant_ISIV;
1085 #else
1086       return PERL_constant_NOTDEF;
1087 #endif
1088     }
1089     if (memEQ(name, "O_ACCMODE", 9)) {
1090     /*                 ^            */
1091 #ifdef O_ACCMODE
1092       *iv_return = O_ACCMODE;
1093       return PERL_constant_ISIV;
1094 #else
1095       return PERL_constant_NOTDEF;
1096 #endif
1097     }
1098     break;
1099   case 'F':
1100     if (memEQ(name, "F_FSYNC64", 9)) {
1101     /*                 ^            */
1102 #ifdef F_FSYNC64
1103       *iv_return = F_FSYNC64;
1104       return PERL_constant_ISIV;
1105 #else
1106       return PERL_constant_NOTDEF;
1107 #endif
1108     }
1109     break;
1110   case 'G':
1111     if (memEQ(name, "F_GETLK64", 9)) {
1112     /*                 ^            */
1113 #ifdef F_GETLK64
1114       *iv_return = F_GETLK64;
1115       return PERL_constant_ISIV;
1116 #else
1117       return PERL_constant_NOTDEF;
1118 #endif
1119     }
1120     break;
1121   case 'O':
1122     if (memEQ(name, "FNONBLOCK", 9)) {
1123     /*                 ^            */
1124 #ifdef FNONBLOCK
1125       *iv_return = FNONBLOCK;
1126       return PERL_constant_ISIV;
1127 #else
1128       return PERL_constant_NOTDEF;
1129 #endif
1130     }
1131     break;
1132   case 'S':
1133     if (memEQ(name, "F_SETLK64", 9)) {
1134     /*                 ^            */
1135 #ifdef F_SETLK64
1136       *iv_return = F_SETLK64;
1137       return PERL_constant_ISIV;
1138 #else
1139       return PERL_constant_NOTDEF;
1140 #endif
1141     }
1142     break;
1143   case 'U':
1144     if (memEQ(name, "F_UNSHARE", 9)) {
1145     /*                 ^            */
1146 #ifdef F_UNSHARE
1147       *iv_return = F_UNSHARE;
1148       return PERL_constant_ISIV;
1149 #else
1150       return PERL_constant_NOTDEF;
1151 #endif
1152     }
1153     break;
1154   }
1155   return PERL_constant_NOTFOUND;
1156 }
1157
1158 static int
1159 constant_10 (const char *name, IV *iv_return) {
1160   /* Names all of length 10.  */
1161   /* When generated this function returned values for the list of names given
1162      here.  However, subsequent manual editing may have added or removed some.
1163      FD_CLOEXEC FLARGEFILE F_FREESP64 F_SETLKW64 O_NOFOLLOW O_NONBLOCK */
1164   /* Offset 4 gives the best switch position.  */
1165   switch (name[4]) {
1166   case 'E':
1167     if (memEQ(name, "F_FREESP64", 10)) {
1168     /*                   ^            */
1169 #ifdef F_FREESP64
1170       *iv_return = F_FREESP64;
1171       return PERL_constant_ISIV;
1172 #else
1173       return PERL_constant_NOTDEF;
1174 #endif
1175     }
1176     break;
1177   case 'F':
1178     if (memEQ(name, "O_NOFOLLOW", 10)) {
1179     /*                   ^            */
1180 #ifdef O_NOFOLLOW
1181       *iv_return = O_NOFOLLOW;
1182       return PERL_constant_ISIV;
1183 #else
1184       return PERL_constant_NOTDEF;
1185 #endif
1186     }
1187     break;
1188   case 'G':
1189     if (memEQ(name, "FLARGEFILE", 10)) {
1190     /*                   ^            */
1191 #ifdef FLARGEFILE
1192       *iv_return = FLARGEFILE;
1193       return PERL_constant_ISIV;
1194 #else
1195       return PERL_constant_NOTDEF;
1196 #endif
1197     }
1198     break;
1199   case 'L':
1200     if (memEQ(name, "FD_CLOEXEC", 10)) {
1201     /*                   ^            */
1202 #ifdef FD_CLOEXEC
1203       *iv_return = FD_CLOEXEC;
1204       return PERL_constant_ISIV;
1205 #else
1206       return PERL_constant_NOTDEF;
1207 #endif
1208     }
1209     break;
1210   case 'N':
1211     if (memEQ(name, "O_NONBLOCK", 10)) {
1212     /*                   ^            */
1213 #ifdef O_NONBLOCK
1214       *iv_return = O_NONBLOCK;
1215       return PERL_constant_ISIV;
1216 #else
1217       return PERL_constant_NOTDEF;
1218 #endif
1219     }
1220     break;
1221   case 'T':
1222     if (memEQ(name, "F_SETLKW64", 10)) {
1223     /*                   ^            */
1224 #ifdef F_SETLKW64
1225       *iv_return = F_SETLKW64;
1226       return PERL_constant_ISIV;
1227 #else
1228       return PERL_constant_NOTDEF;
1229 #endif
1230     }
1231     break;
1232   }
1233   return PERL_constant_NOTFOUND;
1234 }
1235
1236 static int
1237 constant_11 (const char *name, IV *iv_return) {
1238   /* Names all of length 11.  */
1239   /* When generated this function returned values for the list of names given
1240      here.  However, subsequent manual editing may have added or removed some.
1241      F_ALLOCSP64 O_DIRECTORY O_LARGEFILE O_NOINHERIT O_TEMPORARY */
1242   /* Offset 5 gives the best switch position.  */
1243   switch (name[5]) {
1244   case 'E':
1245     if (memEQ(name, "O_DIRECTORY", 11)) {
1246     /*                    ^            */
1247 #ifdef O_DIRECTORY
1248       *iv_return = O_DIRECTORY;
1249       return PERL_constant_ISIV;
1250 #else
1251       return PERL_constant_NOTDEF;
1252 #endif
1253     }
1254     break;
1255   case 'G':
1256     if (memEQ(name, "O_LARGEFILE", 11)) {
1257     /*                    ^            */
1258 #ifdef O_LARGEFILE
1259       *iv_return = O_LARGEFILE;
1260       return PERL_constant_ISIV;
1261 #else
1262       return PERL_constant_NOTDEF;
1263 #endif
1264     }
1265     break;
1266   case 'N':
1267     if (memEQ(name, "O_NOINHERIT", 11)) {
1268     /*                    ^            */
1269 #ifdef O_NOINHERIT
1270       *iv_return = O_NOINHERIT;
1271       return PERL_constant_ISIV;
1272 #else
1273       return PERL_constant_NOTDEF;
1274 #endif
1275     }
1276     break;
1277   case 'O':
1278     if (memEQ(name, "F_ALLOCSP64", 11)) {
1279     /*                    ^            */
1280 #ifdef F_ALLOCSP64
1281       *iv_return = F_ALLOCSP64;
1282       return PERL_constant_ISIV;
1283 #else
1284       return PERL_constant_NOTDEF;
1285 #endif
1286     }
1287     break;
1288   case 'P':
1289     if (memEQ(name, "O_TEMPORARY", 11)) {
1290     /*                    ^            */
1291 #ifdef O_TEMPORARY
1292       *iv_return = O_TEMPORARY;
1293       return PERL_constant_ISIV;
1294 #else
1295       return PERL_constant_NOTDEF;
1296 #endif
1297     }
1298     break;
1299   }
1300   return PERL_constant_NOTFOUND;
1301 }
1302
1303 static int
1304 constant (const char *name, STRLEN len, IV *iv_return) {
1305   /* Initially switch on the length of the name.  */
1306   /* When generated this function returned values for the list of names given
1307      in this section of perl code.  Rather than manually editing these functions
1308      to add or remove constants, which would result in this comment and section
1309      of code becoming inaccurate, we recommend that you edit this section of
1310      code, and use it to regenerate a new set of constant functions which you
1311      then use to replace the originals.
1312
1313      Regenerate these constant functions by feeding this entire source file to
1314      perl -x
1315
1316 #!perl -w
1317 use ExtUtils::Constant qw (constant_types C_constant XS_constant);
1318
1319 my $types = {IV => 1};
1320 my @names = (qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FD_CLOEXEC FEXCL FLARGEFILE
1321                FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC F_ALLOCSP F_ALLOCSP64
1322                F_COMPAT F_DUP2FD F_DUPFD F_EXLCK F_FREESP F_FREESP64 F_FSYNC
1323                F_FSYNC64 F_GETFD F_GETFL F_GETLK F_GETLK64 F_GETOWN F_NODNY
1324                F_POSIX F_RDACC F_RDDNY F_RDLCK F_RWACC F_RWDNY F_SETFD F_SETFL
1325                F_SETLK F_SETLK64 F_SETLKW F_SETLKW64 F_SETOWN F_SHARE F_SHLCK
1326                F_UNLCK F_UNSHARE F_WRACC F_WRDNY F_WRLCK O_ACCMODE O_ALIAS
1327                O_APPEND O_ASYNC O_BINARY O_CREAT O_DEFER O_DIRECT O_DIRECTORY
1328                O_DSYNC O_EXCL O_EXLOCK O_LARGEFILE O_NDELAY O_NOCTTY O_NOFOLLOW
1329                O_NOINHERIT O_NONBLOCK O_RANDOM O_RAW O_RDONLY O_RDWR O_RSRC
1330                O_RSYNC O_SEQUENTIAL O_SHLOCK O_SYNC O_TEMPORARY O_TEXT O_TRUNC
1331                O_WRONLY S_ENFMT S_IEXEC S_IFBLK S_IFCHR S_IFDIR S_IFIFO S_IFLNK
1332                S_IFREG S_IFSOCK S_IFWHT S_IREAD S_IRGRP S_IROTH S_IRUSR S_IRWXG
1333                S_IRWXO S_IRWXU S_ISGID S_ISTXT S_ISUID S_ISVTX S_IWGRP S_IWOTH
1334                S_IWRITE S_IWUSR S_IXGRP S_IXOTH S_IXUSR),
1335             {name=>"LOCK_EX", type=>"IV", default=>["IV", "2"]},
1336             {name=>"LOCK_NB", type=>"IV", default=>["IV", "4"]},
1337             {name=>"LOCK_SH", type=>"IV", default=>["IV", "1"]},
1338             {name=>"LOCK_UN", type=>"IV", default=>["IV", "8"]},
1339             {name=>"SEEK_CUR", type=>"IV", default=>["IV", "1"]},
1340             {name=>"SEEK_END", type=>"IV", default=>["IV", "2"]},
1341             {name=>"SEEK_SET", type=>"IV", default=>["IV", "0"]},
1342             {name=>"_S_IFMT", type=>"IV", macro=>"S_IFMT", value=>"S_IFMT"});
1343
1344 print constant_types(); # macro defs
1345 foreach (C_constant ("Fcntl", 'constant', 'IV', $types, undef, undef, @names) ) {
1346     print $_, "\n"; # C constant subs
1347 }
1348 print "#### XS Section:\n";
1349 print XS_constant ("Fcntl", $types);
1350 __END__
1351    */
1352
1353   switch (len) {
1354   case 5:
1355     return constant_5 (name, iv_return);
1356     break;
1357   case 6:
1358     return constant_6 (name, iv_return);
1359     break;
1360   case 7:
1361     return constant_7 (name, iv_return);
1362     break;
1363   case 8:
1364     return constant_8 (name, iv_return);
1365     break;
1366   case 9:
1367     return constant_9 (name, iv_return);
1368     break;
1369   case 10:
1370     return constant_10 (name, iv_return);
1371     break;
1372   case 11:
1373     return constant_11 (name, iv_return);
1374     break;
1375   case 12:
1376     if (memEQ(name, "O_SEQUENTIAL", 12)) {
1377 #ifdef O_SEQUENTIAL
1378       *iv_return = O_SEQUENTIAL;
1379       return PERL_constant_ISIV;
1380 #else
1381       return PERL_constant_NOTDEF;
1382 #endif
1383     }
1384     break;
1385   }
1386   return PERL_constant_NOTFOUND;
1387 }
1388
1389 MODULE = Fcntl          PACKAGE = Fcntl
1390
1391 void
1392 constant(sv)
1393     PREINIT:
1394 #ifdef dXSTARG
1395         dXSTARG; /* Faster if we have it.  */
1396 #else
1397         dTARGET;
1398 #endif
1399         STRLEN          len;
1400         int             type;
1401         IV              iv;
1402         /* NV           nv;     Uncomment this if you need to return NVs */
1403         /* const char   *pv;    Uncomment this if you need to return PVs */
1404     INPUT:
1405         SV *            sv;
1406         const char *    s = SvPV(sv, len);
1407     PPCODE:
1408         /* Change this to constant(s, len, &iv, &nv);
1409            if you need to return both NVs and IVs */
1410         type = constant(s, len, &iv);
1411       /* Return 1 or 2 items. First is error message, or undef if no error.
1412            Second, if present, is found value */
1413         switch (type) {
1414         case PERL_constant_NOTFOUND:
1415           sv = sv_2mortal(newSVpvf("%s is not a valid Fcntl macro", s));
1416           PUSHs(sv);
1417           break;
1418         case PERL_constant_NOTDEF:
1419           sv = sv_2mortal(newSVpvf(
1420             "Your vendor has not defined Fcntl macro %s, used", s));
1421           PUSHs(sv);
1422           break;
1423         case PERL_constant_ISIV:
1424           EXTEND(SP, 1);
1425           PUSHs(&PL_sv_undef);
1426           PUSHi(iv);
1427           break;
1428         /* Uncomment this if you need to return UVs
1429         case PERL_constant_ISUV:
1430           EXTEND(SP, 1);
1431           PUSHs(&PL_sv_undef);
1432           PUSHu((UV)iv);
1433           break; */
1434         default:
1435           sv = sv_2mortal(newSVpvf(
1436             "Unexpected return type %d while processing Fcntl macro %s used",
1437                type, s));
1438           PUSHs(sv);
1439         }