#!./perl BEGIN { chdir 't' if -d 't'; @INC = '../lib'; require Config; import Config; my $reason; if ($Config{'extensions'} !~ /\bIPC\/SysV\b/) { $reason = 'IPC::SysV was not built'; } elsif ($Config{'d_sem'} ne 'define') { $reason = '$Config{d_sem} undefined'; } elsif ($Config{'d_msg'} ne 'define') { $reason = '$Config{d_msg} undefined'; } if ($reason) { print "1..0 # Skip: $reason\n"; exit 0; } } # These constants are common to all tests. # Later the sem* tests will import more for themselves. use IPC::SysV qw(IPC_PRIVATE IPC_NOWAIT IPC_STAT IPC_RMID S_IRWXU); use strict; print "1..16\n"; my $msg; my $sem; $SIG{__DIE__} = 'cleanup'; # will cleanup $msg and $sem if needed # FreeBSD is known to throw this if there's no SysV IPC in the kernel. $SIG{SYS} = sub { print STDERR <= 0; print "ok 1\n"; #Putting a message on the queue my $msgtype = 1; my $msgtext = "hello"; my $test2bad; my $test5bad; my $test6bad; unless (msgsnd($msg,pack("L! a*",$msgtype,$msgtext),IPC_NOWAIT)) { print "not "; $test2bad = 1; } print "ok 2\n"; if ($test2bad) { print <= 0; print "ok 7\n"; my $data; semctl($sem,0,IPC_STAT,$data) or print "not "; print "ok 8\n"; print "not " unless length($data); print "ok 9\n"; my $nsem = 10; semctl($sem,0,SETALL,pack("s!*",(0) x $nsem)) or print "not "; print "ok 10\n"; $data = ""; semctl($sem,0,GETALL,$data) or print "not "; print "ok 11\n"; print "not " unless length($data) == length(pack("s!*",(0) x $nsem)); print "ok 12\n"; my @data = unpack("s!*",$data); my $adata = "0" x $nsem; print "not " unless @data == $nsem and join("",@data) eq $adata; print "ok 13\n"; my $poke = 2; $data[$poke] = 1; semctl($sem,0,SETALL,pack("s!*",@data)) or print "not "; print "ok 14\n"; $data = ""; semctl($sem,0,GETALL,$data) or print "not "; print "ok 15\n"; @data = unpack("s!*",$data); my $bdata = "0" x $poke . "1" . "0" x ($nsem-$poke-1); print "not " unless join("",@data) eq $bdata; print "ok 16\n"; } else { for (7..16) { print "ok $_ # skipped, no semctl possible\n"; } } } else { for (7..16) { print "ok $_\n"; # fake it } } sub cleanup { msgctl($msg,IPC_RMID,0) if defined $msg; semctl($sem,0,IPC_RMID,undef) if defined $sem; } cleanup;