[PATCH 5.004_65] Config_65-02-03.diff: SunOS and Solaris hints
[p5sagit/p5-mst-13.2.git] / t / op / ipcsem.t
CommitLineData
9b599b2a 1#!./perl
2
3BEGIN {
4 chdir 't' if -d 't';
5 @INC = '../lib';
6}
7
8my @define;
9
10BEGIN {
11 @define = qw(
12 GETALL
13 SETALL
14 IPC_PRIVATE
15 IPC_CREAT
16 IPC_RMID
17 IPC_STAT
18 S_IRWXU
19 S_IRWXG
20 S_IRWXO
21 );
22}
23
24use Config;
25use vars map { '$' . $_ } @define;
26
27BEGIN {
28 unless($Config{'d_semget'} eq 'define' &&
29 $Config{'d_semctl'} eq 'define') {
55d729e4 30 print "1..0\n";
9b599b2a 31 exit;
32 }
1abb42fe 33
34 use strict;
35
9b599b2a 36 my @incpath = (split(/\s+/, $Config{usrinc}), split(/\s+/ ,$Config{locincpth}));
37 my %done = ();
38 my %define = ();
39
40 sub process_file {
1abb42fe 41 my($file, $level) = @_;
9b599b2a 42
43 return unless defined $file;
44
45 my $path = undef;
46 my $dir;
47 foreach $dir (@incpath) {
48 my $tmp = $dir . "/" . $file;
49 next unless -r $tmp;
50 $path = $tmp;
51 last;
52 }
53
54 return if exists $done{$path};
55 $done{$path} = 1;
56
57 unless(defined $path) {
1abb42fe 58 warn "Cannot find '$file'" if $level == 0;
9b599b2a 59 return;
60 }
61
1abb42fe 62 local *F;
63
9b599b2a 64 open(F,$path) or return;
1abb42fe 65 $level = 0 unless defined $level;
9b599b2a 66 while(<F>) {
67 s#/\*.*(\*/|$)##;
68
1abb42fe 69 process_file($1,$level+1)
9b599b2a 70 if /^#\s*include\s*[<"]([^>"]+)[>"]/;
71
72 s/(?:\([^)]*\)\s*)//;
73
74 $define{$1} = $2
75 if /^#\s*define\s+(\w+)\s+((0x)?\d+|\w+)/;
76 }
77 close(F);
78 }
79
80 process_file("sys/sem.h");
81 process_file("sys/ipc.h");
82 process_file("sys/stat.h");
83
1abb42fe 84 foreach my $d (@define) {
9b599b2a 85 while(defined($define{$d}) && $define{$d} !~ /^(0x)?\d+$/) {
86 $define{$d} = exists $define{$define{$d}}
87 ? $define{$define{$d}} : undef;
88 }
89 unless(defined $define{$d}) {
4682965a 90 print "1..0\n";
9b599b2a 91 exit;
92 };
1abb42fe 93 {
94 no strict 'refs';
95 ${ $d } = eval $define{$d};
96 }
9b599b2a 97 }
98}
99
100use strict;
101
102print "1..10\n";
103
104my $sem = semget($IPC_PRIVATE, 10, $S_IRWXU | $S_IRWXG | $S_IRWXO | $IPC_CREAT)
105 || die "semget: $!\n";
106
107print "ok 1\n";
108
109my $data;
110semctl($sem,0,$IPC_STAT,$data) or print "not ";
111print "ok 2\n";
112
113print "not " unless length($data);
114print "ok 3\n";
115
116semctl($sem,0,$SETALL,pack("s*",(0) x 10)) or print "not ";
117print "ok 4\n";
118
119$data = "";
120semctl($sem,0,$GETALL,$data) or print "not ";
121print "ok 5\n";
122
123print "not " unless length($data);
124print "ok 6\n";
125
126my @data = unpack("s*",$data);
127
128print "not " unless join("",@data) eq "0000000000";
129print "ok 7\n";
130
131$data[2] = 1;
132semctl($sem,0,$SETALL,pack("s*",@data)) or print "not ";
133print "ok 8\n";
134
135$data = "";
136semctl($sem,0,$GETALL,$data) or print "not ";
137print "ok 9\n";
138
139@data = unpack("s*",$data);
140
141print "not " unless join("",@data) eq "0010000000";
142print "ok 10\n";
143
144semctl($sem,0,$IPC_RMID,undef);
145