1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef VMS
# include <file.h>
#else
#if defined(__GNUC__) && defined(__cplusplus) && defined(WIN32)
#define _NO_OLDNAMES
#endif
# include <fcntl.h>
#if defined(__GNUC__) && defined(__cplusplus) && defined(WIN32)
#undef _NO_OLDNAMES
#endif
#endif
#ifdef I_UNISTD
#include <unistd.h>
#endif
/* This comment is a kludge to get metaconfig to see the symbols
VAL_O_NONBLOCK
VAL_EAGAIN
RD_NODATA
EOF_NONBLOCK
and include the appropriate metaconfig unit
so that Configure will test how to turn on non-blocking I/O
for a file descriptor. See config.h for how to use these
in your extension.
While I'm at it, I'll have metaconfig look for HAS_POLL too.
--AD October 16, 1995
*/
static XS(XS_Fcntl_S_ISREG); /* prototype to pass -Wmissing-prototypes */
static
XS(XS_Fcntl_S_ISREG)
{
dVAR;
dXSARGS;
dXSI32;
/* Preserve the semantics of the perl code, which was:
sub S_ISREG { ( $_[0] & _S_IFMT() ) == S_IFREG() }
*/
SV *mode;
PERL_UNUSED_VAR(cv); /* -W */
SP -= items;
if (items > 0)
mode = ST(0);
else {
mode = &PL_sv_undef;
EXTEND(SP, 1);
}
PUSHs(((SvUV(mode) & S_IFMT) == ix) ? &PL_sv_yes : &PL_sv_no);
PUTBACK;
}
#include "const-c.inc"
MODULE = Fcntl PACKAGE = Fcntl
INCLUDE: const-xs.inc
void
S_IMODE(...)
PREINIT:
dXSTARG;
SV *mode;
PPCODE:
if (items > 0)
mode = ST(0);
else {
mode = &PL_sv_undef;
EXTEND(SP, 1);
}
PUSHu(SvUV(mode) & 07777);
void
S_IFMT(...)
PREINIT:
dXSTARG;
PPCODE:
PUSHu(items ? (SvUV(ST(0)) & S_IFMT) : S_IFMT);
BOOT:
{
CV *cv;
#ifdef S_IFREG
cv = newXS("Fcntl::S_ISREG", XS_Fcntl_S_ISREG, file);
XSANY.any_i32 = S_IFREG;
#endif
#ifdef S_IFDIR
cv = newXS("Fcntl::S_ISDIR", XS_Fcntl_S_ISREG, file);
XSANY.any_i32 = S_IFDIR;
#endif
#ifdef S_IFLNK
cv = newXS("Fcntl::S_ISLNK", XS_Fcntl_S_ISREG, file);
XSANY.any_i32 = S_IFLNK;
#endif
#ifdef S_IFSOCK
cv = newXS("Fcntl::S_ISSOCK", XS_Fcntl_S_ISREG, file);
XSANY.any_i32 = S_IFSOCK;
#endif
#ifdef S_IFBLK
cv = newXS("Fcntl::S_ISBLK", XS_Fcntl_S_ISREG, file);
XSANY.any_i32 = S_IFBLK;
#endif
#ifdef S_IFCHR
cv = newXS("Fcntl::S_ISCHR", XS_Fcntl_S_ISREG, file);
XSANY.any_i32 = S_IFCHR;
#endif
#ifdef S_IFIFO
cv = newXS("Fcntl::S_ISFIFO", XS_Fcntl_S_ISREG, file);
XSANY.any_i32 = S_IFIFO;
#endif
#ifdef S_IFWHT
cv = newXS("Fcntl::S_ISWHT", XS_Fcntl_S_ISREG, file);
XSANY.any_i32 = S_IFWHT;
#endif
#ifdef S_IFENFMT
cv = newXS("Fcntl::S_ISENFMT", XS_Fcntl_S_ISREG, file);
XSANY.any_i32 = S_ENFMT;
#endif
}
|