More Configure/subconfigure.com syncing.
[p5sagit/p5-mst-13.2.git] / t / op / lfs.t
CommitLineData
ea2b5ef6 1# NOTE: this file tests how large files (>2GB) work with perlio (stdio/sfio).
2# sysopen(), sysseek(), syswrite(), sysread() are tested in t/lib/syslfs.t.
3# If you modify/add tests here, remember to update also t/lib/syslfs.t.
4
817e2dcb 5BEGIN {
05f8a9f5 6 # Don't bother if there are no quads.
ea2b5ef6 7 eval { my $q = pack "q", 0 };
817e2dcb 8 if ($@) {
9 print "1..0\n# no 64-bit types\n";
48ea9154 10 exit(0);
817e2dcb 11 }
ea2b5ef6 12 chdir 't' if -d 't';
13 unshift @INC, '../lib';
9f8fdb7d 14 # Don't bother if there are no quad offsets.
15 require Config; import Config;
16 if ($Config{lseeksize} < 8) {
64215065 17 print "1..0\n# no 64-bit file offsets\n";
48ea9154 18 exit(0);
9f8fdb7d 19 }
817e2dcb 20}
21
6da84e39 22sub bye {
23 close(BIG);
24 unlink "big";
25 exit(0);
26}
27
fcbfa962 28sub explain {
29 print STDERR <<EOM;
30#
31# If the lfs (large file support: large meaning larger than two gigabytes)
32# tests fail, it may mean either that your process is not allowed to write
33# large files or that the file system you are running the tests on doesn't
34# support large files, or both.
35#
36# Perl may still be able to support large files, once you have
37# such a process and such a file system.
38#
39EOM
40}
41
05f8a9f5 42# Known have-nots.
817e2dcb 43if ($^O eq 'win32' || $^O eq 'vms') {
44 print "1..0\n# no sparse files\n";
6da84e39 45 bye();
46}
47
05f8a9f5 48# Then try to deduce whether we have sparse files.
49
64215065 50# Let's not depend on Fcntl or any other extension.
51
ea2b5ef6 52my ($SEEK_SET, $SEEK_CUR, $SEEK_END) = (0, 1, 2);
6da84e39 53
ea2b5ef6 54# We'll start off by creating a one megabyte file which has
05f8a9f5 55# only three "true" bytes. If we have sparseness, we should
56# consume less blocks than one megabyte (assuming nobody has
57# one megabyte blocks...)
817e2dcb 58
ea2b5ef6 59open(BIG, ">big") or do { warn "open failed: $!\n"; bye };
6da84e39 60binmode BIG;
ea2b5ef6 61seek(BIG, 1_000_000, $SEEK_SET);
6da84e39 62print BIG "big";
817e2dcb 63close(BIG);
64
65my @s;
66
67@s = stat("big");
68
ea2b5ef6 69print "# @s\n";
70
5cec1e3b 71my $BLOCKSIZE = 512; # is this really correct everywhere?
72
6da84e39 73unless (@s == 13 &&
ea2b5ef6 74 $s[7] == 1_000_003 &&
6da84e39 75 defined $s[12] &&
5cec1e3b 76 $BLOCKSIZE * $s[12] < 1_000_003) {
ea2b5ef6 77 print "1..0\n# no sparse files?\n";
6da84e39 78 bye();
817e2dcb 79}
80
81# By now we better be sure that we do have sparse files:
82# if we are not, the following will hog 5 gigabytes of disk. Ooops.
83
ea2b5ef6 84open(BIG, ">big") or do { warn "open failed: $!\n"; bye };
817e2dcb 85binmode BIG;
6da84e39 86seek(BIG, 5_000_000_000, $SEEK_SET);
fcbfa962 87# Either the print or (more likely, thanks to buffering) the close will
88# fail if there are are filesize limitations (process or fs).
89my $print = print BIG "big";
90my $close = close BIG if $print;
91unless ($print && $close) {
92 $ENV{LC_ALL} = "C";
93 if ($! =~/File too large/) {
94 print "1..0\n# writing past 2GB failed\n";
95 explain();
96 }
97 bye();
98}
817e2dcb 99
100@s = stat("big");
101
ea2b5ef6 102print "# @s\n";
103
05f8a9f5 104sub fail () {
64215065 105 print "not ";
05f8a9f5 106 $fail++;
107}
108
fcbfa962 109print "1..8\n";
110
111my $fail = 0;
112
64215065 113fail unless $s[7] == 5_000_000_003; # exercizes pp_stat
817e2dcb 114print "ok 1\n";
115
64215065 116fail unless -s "big" == 5_000_000_003; # exercizes pp_ftsize
817e2dcb 117print "ok 2\n";
118
ea2b5ef6 119open(BIG, "big") or do { warn "open failed: $!\n"; bye };
817e2dcb 120binmode BIG;
121
6da84e39 122seek(BIG, 4_500_000_000, $SEEK_SET);
817e2dcb 123
05f8a9f5 124fail unless tell(BIG) == 4_500_000_000;
817e2dcb 125print "ok 3\n";
126
6da84e39 127seek(BIG, 1, $SEEK_CUR);
817e2dcb 128
05f8a9f5 129fail unless tell(BIG) == 4_500_000_001;
817e2dcb 130print "ok 4\n";
131
6da84e39 132seek(BIG, -1, $SEEK_CUR);
817e2dcb 133
05f8a9f5 134fail unless tell(BIG) == 4_500_000_000;
817e2dcb 135print "ok 5\n";
136
6da84e39 137seek(BIG, -3, $SEEK_END);
817e2dcb 138
05f8a9f5 139fail unless tell(BIG) == 5_000_000_000;
817e2dcb 140print "ok 6\n";
141
142my $big;
143
05f8a9f5 144fail unless read(BIG, $big, 3) == 3;
817e2dcb 145print "ok 7\n";
146
05f8a9f5 147fail unless $big eq "big";
817e2dcb 148print "ok 8\n";
149
fcbfa962 150explain if $fail;
05f8a9f5 151
e9a694fc 152bye();
153
6da84e39 154# eof