6 plan skip_all => "POSIX is unavailable" if $Config{'extensions'} !~ m!\bPOSIX\b!;
12 use Scalar::Util qw(looks_like_number);
15 grep { eval "&$_;1" or $@!~/vendor has not defined POSIX macro/ } @_
18 my @path_consts = check qw(
19 _PC_CHOWN_RESTRICTED _PC_LINK_MAX _PC_NAME_MAX
20 _PC_NO_TRUNC _PC_PATH_MAX
23 my @path_consts_terminal = check qw(
24 _PC_MAX_CANON _PC_MAX_INPUT _PC_VDISABLE
27 my @path_consts_fifo = check qw(
31 my @sys_consts = check qw(
32 _SC_ARG_MAX _SC_CHILD_MAX _SC_CLK_TCK _SC_JOB_CONTROL
33 _SC_NGROUPS_MAX _SC_OPEN_MAX _SC_PAGESIZE _SC_SAVED_IDS
34 _SC_STREAM_MAX _SC_VERSION _SC_TZNAME_MAX
37 my $tests = 2 * 3 * @path_consts +
38 2 * 3 * @path_consts_terminal +
39 2 * 3 * @path_consts_fifo +
43 : (skip_all => "No tests to run on this OS")
46 # Don't test on "." as it can be networked storage which returns EINVAL
47 # Testing on "/" may not be portable to non-Unix as it may not be readable
48 # "/tmp" should be readable and likely also local.
49 my $testdir = File::Spec->tmpdir;
50 $testdir = VMS::Filespec::fileify($testdir) if $^O eq 'VMS';
56 sub _check_and_report {
57 my ($eval_status, $return_val, $description) = @_;
58 my $success = defined($return_val) || $! == 0;
59 is( $eval_status, '', $description );
61 skip "terminal constants set errno on QNX", 1
62 if $^O eq 'nto' and $description =~ $TTY;
63 ok( $success, "\tchecking that the returned value is defined ("
64 . (defined($return_val) ? "yes, it's $return_val)" : "it isn't)"
65 . " or that errno is clear ("
66 . (!($!+0) ? "it is)" : "it isn't, it's $!)"))
70 skip "constant not implemented on $^O or no limit in effect", 1
71 if !defined($return_val);
72 ok( looks_like_number($return_val), "\tchecking that the returned value looks like a number" );
76 # testing fpathconf() on a non-terminal file
78 my $fd = POSIX::open($testdir, O_RDONLY)
79 or skip "could not open test directory '$testdir' ($!)",
82 for my $constant (@path_consts) {
84 $r = eval { fpathconf( $fd, eval "$constant()" ) };
85 _check_and_report( $@, $r, "calling fpathconf($fd, $constant) " );
91 # testing pathconf() on a non-terminal file
92 for my $constant (@path_consts) {
94 $r = eval { pathconf( $testdir, eval "$constant()" ) };
95 _check_and_report( $@, $r, qq[calling pathconf("$testdir", $constant)] );
99 my $n = 2 * 3 * @path_consts_terminal;
102 or skip("$TTY not a character file", $n);
104 or skip("failed to open $TTY: $!", $n);
106 or skip("TTY ($TTY) not a terminal file", $n);
108 my $fd = fileno(TTY);
110 # testing fpathconf() on a terminal file
111 for my $constant (@path_consts_terminal) {
113 $r = eval { fpathconf( $fd, eval "$constant()" ) };
114 _check_and_report( $@, $r, qq[calling fpathconf($fd, $constant) ($TTY)] );
118 # testing pathconf() on a terminal file
119 for my $constant (@path_consts_terminal) {
121 $r = eval { pathconf( $TTY, eval "$constant()" ) };
122 _check_and_report( $@, $r, qq[calling pathconf($TTY, $constant)] );
129 eval { mkfifo($fifo, 0666) }
130 or skip("could not create fifo $fifo ($!)", 2 * 3 * @path_consts_fifo);
133 my $fd = POSIX::open($fifo, O_RDWR)
134 or skip("could not open $fifo ($!)", 3 * @path_consts_fifo);
136 for my $constant (@path_consts_fifo) {
138 $r = eval { fpathconf( $fd, eval "$constant()" ) };
139 _check_and_report( $@, $r, "calling fpathconf($fd, $constant) ($fifo)" );
145 # testing pathconf() on a fifo file
146 for my $constant (@path_consts_fifo) {
148 $r = eval { pathconf( $fifo, eval "$constant()" ) };
149 _check_and_report( $@, $r, qq[calling pathconf($fifo, $constant)] );
154 1 while unlink($fifo);
158 if($^O eq 'cygwin') {
160 skip("No _SC_TZNAME_MAX on Cygwin", 3);
165 for my $constant (@sys_consts) {
167 $r = eval { sysconf( eval "$constant()" ) };
168 _check_and_report( $@, $r, "calling sysconf($constant)" );