diff options
Diffstat (limited to 'cpan/IPC-SysV/lib/IPC')
-rw-r--r-- | cpan/IPC-SysV/lib/IPC/Msg.pm | 245 | ||||
-rw-r--r-- | cpan/IPC-SysV/lib/IPC/Semaphore.pm | 319 | ||||
-rw-r--r-- | cpan/IPC-SysV/lib/IPC/SharedMem.pm | 278 | ||||
-rw-r--r-- | cpan/IPC-SysV/lib/IPC/SysV.pm | 188 |
4 files changed, 1030 insertions, 0 deletions
diff --git a/cpan/IPC-SysV/lib/IPC/Msg.pm b/cpan/IPC-SysV/lib/IPC/Msg.pm new file mode 100644 index 0000000000..44676757b6 --- /dev/null +++ b/cpan/IPC-SysV/lib/IPC/Msg.pm @@ -0,0 +1,245 @@ +################################################################################ +# +# $Revision: 17 $ +# $Author: mhx $ +# $Date: 2007/10/15 20:29:06 +0200 $ +# +################################################################################ +# +# Version 2.x, Copyright (C) 2007, Marcus Holland-Moritz <mhx@cpan.org>. +# Version 1.x, Copyright (C) 1997, Graham Barr <gbarr@pobox.com>. +# +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +# +################################################################################ + +package IPC::Msg; + +use IPC::SysV qw(IPC_STAT IPC_SET IPC_RMID); +use strict; +use vars qw($VERSION); +use Carp; + +$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' }; +$VERSION = eval $VERSION; + +# Figure out if we have support for native sized types +my $N = do { my $foo = eval { pack "L!", 0 }; $@ ? '' : '!' }; + +{ + package IPC::Msg::stat; + + use Class::Struct qw(struct); + + struct 'IPC::Msg::stat' => [ + uid => '$', + gid => '$', + cuid => '$', + cgid => '$', + mode => '$', + qnum => '$', + qbytes => '$', + lspid => '$', + lrpid => '$', + stime => '$', + rtime => '$', + ctime => '$', + ]; +} + +sub new { + @_ == 3 || croak 'new IPC::Msg ( KEY , FLAGS )'; + my $class = shift; + + my $id = msgget($_[0],$_[1]); + + defined($id) + ? bless \$id, $class + : undef; +} + +sub id { + my $self = shift; + $$self; +} + +sub stat { + my $self = shift; + my $data = ""; + msgctl($$self,IPC_STAT,$data) or + return undef; + IPC::Msg::stat->new->unpack($data); +} + +sub set { + my $self = shift; + my $ds; + + if(@_ == 1) { + $ds = shift; + } + else { + croak 'Bad arg count' if @_ % 2; + my %arg = @_; + $ds = $self->stat + or return undef; + my($key,$val); + $ds->$key($val) + while(($key,$val) = each %arg); + } + + msgctl($$self,IPC_SET,$ds->pack); +} + +sub remove { + my $self = shift; + (msgctl($$self,IPC_RMID,0), undef $$self)[0]; +} + +sub rcv { + @_ <= 5 && @_ >= 3 or croak '$msg->rcv( BUF, LEN, TYPE, FLAGS )'; + my $self = shift; + my $buf = ""; + msgrcv($$self,$buf,$_[1],$_[2] || 0, $_[3] || 0) or + return; + my $type; + ($type,$_[0]) = unpack("l$N a*",$buf); + $type; +} + +sub snd { + @_ <= 4 && @_ >= 3 or croak '$msg->snd( TYPE, BUF, FLAGS )'; + my $self = shift; + msgsnd($$self,pack("l$N a*",$_[0],$_[1]), $_[2] || 0); +} + + +1; + +__END__ + +=head1 NAME + +IPC::Msg - SysV Msg IPC object class + +=head1 SYNOPSIS + + use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR); + use IPC::Msg; + + $msg = IPC::Msg->new(IPC_PRIVATE, S_IRUSR | S_IWUSR); + + $msg->snd(pack("l! a*",$msgtype,$msg)); + + $msg->rcv($buf,256); + + $ds = $msg->stat; + + $msg->remove; + +=head1 DESCRIPTION + +A class providing an object based interface to SysV IPC message queues. + +=head1 METHODS + +=over 4 + +=item new ( KEY , FLAGS ) + +Creates a new message queue associated with C<KEY>. A new queue is +created if + +=over 4 + +=item * + +C<KEY> is equal to C<IPC_PRIVATE> + +=item * + +C<KEY> does not already have a message queue associated with +it, and C<I<FLAGS> & IPC_CREAT> is true. + +=back + +On creation of a new message queue C<FLAGS> is used to set the +permissions. Be careful not to set any flags that the Sys V +IPC implementation does not allow: in some systems setting +execute bits makes the operations fail. + +=item id + +Returns the system message queue identifier. + +=item rcv ( BUF, LEN [, TYPE [, FLAGS ]] ) + +Read a message from the queue. Returns the type of the message read. +See L<msgrcv>. The BUF becomes tainted. + +=item remove + +Remove and destroy the message queue from the system. + +=item set ( STAT ) + +=item set ( NAME => VALUE [, NAME => VALUE ...] ) + +C<set> will set the following values of the C<stat> structure associated +with the message queue. + + uid + gid + mode (oly the permission bits) + qbytes + +C<set> accepts either a stat object, as returned by the C<stat> method, +or a list of I<name>-I<value> pairs. + +=item snd ( TYPE, MSG [, FLAGS ] ) + +Place a message on the queue with the data from C<MSG> and with type C<TYPE>. +See L<msgsnd>. + +=item stat + +Returns an object of type C<IPC::Msg::stat> which is a sub-class of +C<Class::Struct>. It provides the following fields. For a description +of these fields see you system documentation. + + uid + gid + cuid + cgid + mode + qnum + qbytes + lspid + lrpid + stime + rtime + ctime + +=back + +=head1 SEE ALSO + +L<IPC::SysV>, L<Class::Struct> + +=head1 AUTHORS + +Graham Barr <gbarr@pobox.com>, +Marcus Holland-Moritz <mhx@cpan.org> + +=head1 COPYRIGHT + +Version 2.x, Copyright (C) 2007, Marcus Holland-Moritz. + +Version 1.x, Copyright (c) 1997, Graham Barr. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut + diff --git a/cpan/IPC-SysV/lib/IPC/Semaphore.pm b/cpan/IPC-SysV/lib/IPC/Semaphore.pm new file mode 100644 index 0000000000..6f0c251ea4 --- /dev/null +++ b/cpan/IPC-SysV/lib/IPC/Semaphore.pm @@ -0,0 +1,319 @@ +################################################################################ +# +# $Revision: 18 $ +# $Author: mhx $ +# $Date: 2007/10/15 20:29:08 +0200 $ +# +################################################################################ +# +# Version 2.x, Copyright (C) 2007, Marcus Holland-Moritz <mhx@cpan.org>. +# Version 1.x, Copyright (C) 1997, Graham Barr <gbarr@pobox.com>. +# +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +# +################################################################################ + +package IPC::Semaphore; + +use IPC::SysV qw(GETNCNT GETZCNT GETVAL SETVAL GETPID GETALL SETALL + IPC_STAT IPC_SET IPC_RMID); +use strict; +use vars qw($VERSION); +use Carp; + +$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' }; +$VERSION = eval $VERSION; + +# Figure out if we have support for native sized types +my $N = do { my $foo = eval { pack "L!", 0 }; $@ ? '' : '!' }; + +{ + package IPC::Semaphore::stat; + + use Class::Struct qw(struct); + + struct 'IPC::Semaphore::stat' => [ + uid => '$', + gid => '$', + cuid => '$', + cgid => '$', + mode => '$', + ctime => '$', + otime => '$', + nsems => '$', + ]; +} + +sub new { + @_ == 4 || croak 'new ' . __PACKAGE__ . '( KEY, NSEMS, FLAGS )'; + my $class = shift; + + my $id = semget($_[0],$_[1],$_[2]); + + defined($id) + ? bless \$id, $class + : undef; +} + +sub id { + my $self = shift; + $$self; +} + +sub remove { + my $self = shift; + (semctl($$self,0,IPC_RMID,0), undef $$self)[0]; +} + +sub getncnt { + @_ == 2 || croak '$sem->getncnt( SEM )'; + my $self = shift; + my $sem = shift; + my $v = semctl($$self,$sem,GETNCNT,0); + $v ? 0 + $v : undef; +} + +sub getzcnt { + @_ == 2 || croak '$sem->getzcnt( SEM )'; + my $self = shift; + my $sem = shift; + my $v = semctl($$self,$sem,GETZCNT,0); + $v ? 0 + $v : undef; +} + +sub getval { + @_ == 2 || croak '$sem->getval( SEM )'; + my $self = shift; + my $sem = shift; + my $v = semctl($$self,$sem,GETVAL,0); + $v ? 0 + $v : undef; +} + +sub getpid { + @_ == 2 || croak '$sem->getpid( SEM )'; + my $self = shift; + my $sem = shift; + my $v = semctl($$self,$sem,GETPID,0); + $v ? 0 + $v : undef; +} + +sub op { + @_ >= 4 || croak '$sem->op( OPLIST )'; + my $self = shift; + croak 'Bad arg count' if @_ % 3; + my $data = pack("s$N*",@_); + semop($$self,$data); +} + +sub stat { + my $self = shift; + my $data = ""; + semctl($$self,0,IPC_STAT,$data) + or return undef; + IPC::Semaphore::stat->new->unpack($data); +} + +sub set { + my $self = shift; + my $ds; + + if(@_ == 1) { + $ds = shift; + } + else { + croak 'Bad arg count' if @_ % 2; + my %arg = @_; + $ds = $self->stat + or return undef; + my($key,$val); + $ds->$key($val) + while(($key,$val) = each %arg); + } + + my $v = semctl($$self,0,IPC_SET,$ds->pack); + $v ? 0 + $v : undef; +} + +sub getall { + my $self = shift; + my $data = ""; + semctl($$self,0,GETALL,$data) + or return (); + (unpack("s$N*",$data)); +} + +sub setall { + my $self = shift; + my $data = pack("s$N*",@_); + semctl($$self,0,SETALL,$data); +} + +sub setval { + @_ == 3 || croak '$sem->setval( SEM, VAL )'; + my $self = shift; + my $sem = shift; + my $val = shift; + semctl($$self,$sem,SETVAL,$val); +} + +1; + +__END__ + +=head1 NAME + +IPC::Semaphore - SysV Semaphore IPC object class + +=head1 SYNOPSIS + + use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR IPC_CREAT); + use IPC::Semaphore; + + $sem = IPC::Semaphore->new(IPC_PRIVATE, 10, S_IRUSR | S_IWUSR | IPC_CREAT); + + $sem->setall( (0) x 10); + + @sem = $sem->getall; + + $ncnt = $sem->getncnt; + + $zcnt = $sem->getzcnt; + + $ds = $sem->stat; + + $sem->remove; + +=head1 DESCRIPTION + +A class providing an object based interface to SysV IPC semaphores. + +=head1 METHODS + +=over 4 + +=item new ( KEY , NSEMS , FLAGS ) + +Create a new semaphore set associated with C<KEY>. C<NSEMS> is the number +of semaphores in the set. A new set is created if + +=over 4 + +=item * + +C<KEY> is equal to C<IPC_PRIVATE> + +=item * + +C<KEY> does not already have a semaphore identifier +associated with it, and C<I<FLAGS> & IPC_CREAT> is true. + +=back + +On creation of a new semaphore set C<FLAGS> is used to set the +permissions. Be careful not to set any flags that the Sys V +IPC implementation does not allow: in some systems setting +execute bits makes the operations fail. + +=item getall + +Returns the values of the semaphore set as an array. + +=item getncnt ( SEM ) + +Returns the number of processes waiting for the semaphore C<SEM> to +become greater than its current value + +=item getpid ( SEM ) + +Returns the process id of the last process that performed an operation +on the semaphore C<SEM>. + +=item getval ( SEM ) + +Returns the current value of the semaphore C<SEM>. + +=item getzcnt ( SEM ) + +Returns the number of processes waiting for the semaphore C<SEM> to +become zero. + +=item id + +Returns the system identifier for the semaphore set. + +=item op ( OPLIST ) + +C<OPLIST> is a list of operations to pass to C<semop>. C<OPLIST> is +a concatenation of smaller lists, each which has three values. The +first is the semaphore number, the second is the operation and the last +is a flags value. See L<semop> for more details. For example + + $sem->op( + 0, -1, IPC_NOWAIT, + 1, 1, IPC_NOWAIT + ); + +=item remove + +Remove and destroy the semaphore set from the system. + +=item set ( STAT ) + +=item set ( NAME => VALUE [, NAME => VALUE ...] ) + +C<set> will set the following values of the C<stat> structure associated +with the semaphore set. + + uid + gid + mode (only the permission bits) + +C<set> accepts either a stat object, as returned by the C<stat> method, +or a list of I<name>-I<value> pairs. + +=item setall ( VALUES ) + +Sets all values in the semaphore set to those given on the C<VALUES> list. +C<VALUES> must contain the correct number of values. + +=item setval ( N , VALUE ) + +Set the C<N>th value in the semaphore set to C<VALUE> + +=item stat + +Returns an object of type C<IPC::Semaphore::stat> which is a sub-class of +C<Class::Struct>. It provides the following fields. For a description +of these fields see your system documentation. + + uid + gid + cuid + cgid + mode + ctime + otime + nsems + +=back + +=head1 SEE ALSO + +L<IPC::SysV>, L<Class::Struct>, L<semget>, L<semctl>, L<semop> + +=head1 AUTHORS + +Graham Barr <gbarr@pobox.com>, +Marcus Holland-Moritz <mhx@cpan.org> + +=head1 COPYRIGHT + +Version 2.x, Copyright (C) 2007, Marcus Holland-Moritz. + +Version 1.x, Copyright (c) 1997, Graham Barr. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut diff --git a/cpan/IPC-SysV/lib/IPC/SharedMem.pm b/cpan/IPC-SysV/lib/IPC/SharedMem.pm new file mode 100644 index 0000000000..06240f2fb8 --- /dev/null +++ b/cpan/IPC-SysV/lib/IPC/SharedMem.pm @@ -0,0 +1,278 @@ +################################################################################ +# +# $Revision: 3 $ +# $Author: mhx $ +# $Date: 2008/11/26 23:12:27 +0100 $ +# +################################################################################ +# +# Version 2.x, Copyright (C) 2007, Marcus Holland-Moritz <mhx@cpan.org>. +# Version 1.x, Copyright (C) 1997, Graham Barr <gbarr@pobox.com>. +# +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +# +################################################################################ + +package IPC::SharedMem; + +use IPC::SysV qw(IPC_STAT IPC_RMID shmat shmdt memread memwrite); +use strict; +use vars qw($VERSION); +use Carp; + +$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' }; +$VERSION = eval $VERSION; + +# Figure out if we have support for native sized types +my $N = do { my $foo = eval { pack "L!", 0 }; $@ ? '' : '!' }; + +{ + package IPC::SharedMem::stat; + + use Class::Struct qw(struct); + + struct 'IPC::SharedMem::stat' => [ + uid => '$', + gid => '$', + cuid => '$', + cgid => '$', + mode => '$', + segsz => '$', + lpid => '$', + cpid => '$', + nattch => '$', + atime => '$', + dtime => '$', + ctime => '$', + ]; +} + +sub new +{ + @_ == 4 or croak 'IPC::SharedMem->new(KEY, SIZE, FLAGS)'; + my($class, $key, $size, $flags) = @_; + + my $id = shmget $key, $size, $flags; + + return undef unless defined $id; + + bless { _id => $id, _addr => undef, _isrm => 0 }, $class +} + +sub id +{ + my $self = shift; + $self->{_id}; +} + +sub addr +{ + my $self = shift; + $self->{_addr}; +} + +sub stat +{ + my $self = shift; + my $data = ''; + shmctl $self->id, IPC_STAT, $data or return undef; + IPC::SharedMem::stat->new->unpack($data); +} + +sub attach +{ + @_ >= 1 && @_ <= 2 or croak '$shm->attach([FLAG])'; + my($self, $flag) = @_; + defined $self->addr and return undef; + $self->{_addr} = shmat($self->id, undef, $flag || 0); + defined $self->addr; +} + +sub detach +{ + my $self = shift; + defined $self->addr or return undef; + my $rv = defined shmdt($self->addr); + undef $self->{_addr} if $rv; + $rv; +} + +sub remove +{ + my $self = shift; + return undef if $self->is_removed; + my $rv = shmctl $self->id, IPC_RMID, 0; + $self->{_isrm} = 1 if $rv; + return $rv; +} + +sub is_removed +{ + my $self = shift; + $self->{_isrm}; +} + +sub read +{ + @_ == 3 or croak '$shm->read(POS, SIZE)'; + my($self, $pos, $size) = @_; + my $buf = ''; + if (defined $self->addr) { + memread($self->addr, $buf, $pos, $size) or return undef; + } + else { + shmread($self->id, $buf, $pos, $size) or return undef; + } + $buf; +} + +sub write +{ + @_ == 4 or croak '$shm->write(STRING, POS, SIZE)'; + my($self, $str, $pos, $size) = @_; + if (defined $self->addr) { + return memwrite($self->addr, $str, $pos, $size); + } + else { + return shmwrite($self->id, $str, $pos, $size); + } +} + +1; + +__END__ + +=head1 NAME + +IPC::SharedMem - SysV Shared Memory IPC object class + +=head1 SYNOPSIS + + use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR); + use IPC::SharedMem; + + $shm = IPC::SharedMem->new(IPC_PRIVATE, 8, S_IRWXU); + + $shm->write(pack("S", 4711), 2, 2); + + $data = $shm->read(0, 2); + + $ds = $shm->stat; + + $shm->remove; + +=head1 DESCRIPTION + +A class providing an object based interface to SysV IPC shared memory. + +=head1 METHODS + +=over 4 + +=item new ( KEY , SIZE , FLAGS ) + +Creates a new shared memory segment associated with C<KEY>. A new +segment is created if + +=over 4 + +=item * + +C<KEY> is equal to C<IPC_PRIVATE> + +=item * + +C<KEY> does not already have a shared memory segment associated +with it, and C<I<FLAGS> & IPC_CREAT> is true. + +=back + +On creation of a new shared memory segment C<FLAGS> is used to +set the permissions. Be careful not to set any flags that the +Sys V IPC implementation does not allow: in some systems setting +execute bits makes the operations fail. + +=item id + +Returns the shared memory identifier. + +=item read ( POS, SIZE ) + +Read C<SIZE> bytes from the shared memory segment at C<POS>. Returns +the string read, or C<undef> if there was an error. The return value +becomes tainted. See L<shmread>. + +=item write ( STRING, POS, SIZE ) + +Write C<SIZE> bytes to the shared memory segment at C<POS>. Returns +true if successful, or false if there is an error. See L<shmwrite>. + +=item remove + +Remove the shared memory segment from the system or mark it as +removed as long as any processes are still attached to it. + +=item is_removed + +Returns true if the shared memory segment has been removed or +marked for removal. + +=item stat + +Returns an object of type C<IPC::SharedMem::stat> which is a sub-class +of C<Class::Struct>. It provides the following fields. For a description +of these fields see you system documentation. + + uid + gid + cuid + cgid + mode + segsz + lpid + cpid + nattach + atime + dtime + ctime + +=item attach ( [FLAG] ) + +Permanently attach to the shared memory segment. When a C<IPC::SharedMem> +object is attached, it will use L<memread> and L<memwrite> instead of +L<shmread> and L<shmwrite> for accessing the shared memory segment. +Returns true if successful, or false on error. See L<shmat>. + +=item detach + +Detach from the shared memory segment that previously has been attached +to. Returns true if successful, or false on error. See L<shmdt>. + +=item addr + +Returns the address of the shared memory that has been attached to in a +format suitable for use with C<pack('P')>. Returns C<undef> if the shared +memory has not been attached. + +=back + +=head1 SEE ALSO + +L<IPC::SysV>, L<Class::Struct> + +=head1 AUTHORS + +Marcus Holland-Moritz <mhx@cpan.org> + +=head1 COPYRIGHT + +Version 2.x, Copyright (C) 2007, Marcus Holland-Moritz. + +Version 1.x, Copyright (c) 1997, Graham Barr. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut + diff --git a/cpan/IPC-SysV/lib/IPC/SysV.pm b/cpan/IPC-SysV/lib/IPC/SysV.pm new file mode 100644 index 0000000000..eaa068bc46 --- /dev/null +++ b/cpan/IPC-SysV/lib/IPC/SysV.pm @@ -0,0 +1,188 @@ +################################################################################ +# +# $Revision: 24 $ +# $Author: mhx $ +# $Date: 2008/11/28 18:08:10 +0100 $ +# +################################################################################ +# +# Version 2.x, Copyright (C) 2007, Marcus Holland-Moritz <mhx@cpan.org>. +# Version 1.x, Copyright (C) 1997, Graham Barr <gbarr@pobox.com>. +# +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +# +################################################################################ + +package IPC::SysV; + +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION $XS_VERSION $AUTOLOAD); +use Carp; +use Config; + +require Exporter; +@ISA = qw(Exporter); + +$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' }; +$XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + +# To support new constants, just add them to @EXPORT_OK +# and the C/XS code will be generated automagically. +@EXPORT_OK = (qw( + + GETALL GETNCNT GETPID GETVAL GETZCNT + + IPC_ALLOC IPC_CREAT IPC_EXCL IPC_GETACL IPC_INFO IPC_LOCKED + IPC_M IPC_NOERROR IPC_NOWAIT IPC_PRIVATE IPC_R IPC_RMID + IPC_SET IPC_SETACL IPC_SETLABEL IPC_STAT IPC_W IPC_WANTED + + MSG_EXCEPT MSG_FWAIT MSG_INFO MSG_LOCKED MSG_MWAIT MSG_NOERROR + MSG_QWAIT MSG_R MSG_RWAIT MSG_STAT MSG_W MSG_WAIT MSG_WWAIT + + SEM_A SEM_ALLOC SEM_DEST SEM_ERR SEM_INFO SEM_ORDER SEM_R + SEM_STAT SEM_UNDO + + SETALL SETVAL + + SHMLBA + + SHM_A SHM_CLEAR SHM_COPY SHM_DCACHE SHM_DEST SHM_ECACHE + SHM_FMAP SHM_HUGETLB SHM_ICACHE SHM_INFO SHM_INIT SHM_LOCK + SHM_LOCKED SHM_MAP SHM_NORESERVE SHM_NOSWAP SHM_R SHM_RDONLY + SHM_REMAP SHM_REMOVED SHM_RND SHM_SHARE_MMU SHM_SHATTR + SHM_SIZE SHM_STAT SHM_UNLOCK SHM_W + + S_IRUSR S_IWUSR S_IXUSR S_IRWXU + S_IRGRP S_IWGRP S_IXGRP S_IRWXG + S_IROTH S_IWOTH S_IXOTH S_IRWXO + + ENOSPC ENOSYS ENOMEM EACCES + +), qw( + + ftok shmat shmdt memread memwrite + +)); + +sub AUTOLOAD +{ + my $constname = $AUTOLOAD; + $constname =~ s/.*:://; + die "&IPC::SysV::_constant not defined" if $constname eq '_constant'; + my ($error, $val) = _constant($constname); + if ($error) { + my (undef, $file, $line) = caller; + die "$error at $file line $line.\n"; + } + { + no strict 'refs'; + *$AUTOLOAD = sub { $val }; + } + goto &$AUTOLOAD; +} + +BOOT_XS: { + # If I inherit DynaLoader then I inherit AutoLoader and I DON'T WANT TO + require DynaLoader; + + # DynaLoader calls dl_load_flags as a static method. + *dl_load_flags = DynaLoader->can('dl_load_flags'); + + do { + __PACKAGE__->can('bootstrap') || \&DynaLoader::bootstrap + }->(__PACKAGE__, $XS_VERSION); +} + +1; + +__END__ + +=head1 NAME + +IPC::SysV - System V IPC constants and system calls + +=head1 SYNOPSIS + + use IPC::SysV qw(IPC_STAT IPC_PRIVATE); + +=head1 DESCRIPTION + +C<IPC::SysV> defines and conditionally exports all the constants +defined in your system include files which are needed by the SysV +IPC calls. Common ones include + + IPC_CREATE IPC_EXCL IPC_NOWAIT IPC_PRIVATE IPC_RMID IPC_SET IPC_STAT + GETVAL SETVAL GETPID GETNCNT GETZCNT GETALL SETALL + SEM_A SEM_R SEM_UNDO + SHM_RDONLY SHM_RND SHMLBA + +and auxiliary ones + + S_IRUSR S_IWUSR S_IRWXU + S_IRGRP S_IWGRP S_IRWXG + S_IROTH S_IWOTH S_IRWXO + +but your system might have more. + +=over 4 + +=item ftok( PATH ) + +=item ftok( PATH, ID ) + +Return a key based on PATH and ID, which can be used as a key for +C<msgget>, C<semget> and C<shmget>. See L<ftok>. + +If ID is omitted, it defaults to C<1>. If a single character is +given for ID, the numeric value of that character is used. + +=item shmat( ID, ADDR, FLAG ) + +Attach the shared memory segment identified by ID to the address +space of the calling process. See L<shmat>. + +ADDR should be C<undef> unless you really know what you're doing. + +=item shmdt( ADDR ) + +Detach the shared memory segment located at the address specified +by ADDR from the address space of the calling process. See L<shmdt>. + +=item memread( ADDR, VAR, POS, SIZE ) + +Reads SIZE bytes from a memory segment at ADDR starting at position POS. +VAR must be a variable that will hold the data read. Returns true if +successful, or false if there is an error. memread() taints the variable. + +=item memwrite( ADDR, STRING, POS, SIZE ) + +Writes SIZE bytes from STRING to a memory segment at ADDR starting at +position POS. If STRING is too long, only SIZE bytes are used; if STRING +is too short, nulls are written to fill out SIZE bytes. Returns true if +successful, or false if there is an error. + +=back + +=head1 SEE ALSO + +L<IPC::Msg>, L<IPC::Semaphore>, L<IPC::SharedMem>, L<ftok>, L<shmat>, L<shmdt> + +=head1 AUTHORS + +Graham Barr <gbarr@pobox.com>, +Jarkko Hietaniemi <jhi@iki.fi>, +Marcus Holland-Moritz <mhx@cpan.org> + +=head1 COPYRIGHT + +Version 2.x, Copyright (C) 2007, Marcus Holland-Moritz. + +Version 1.x, Copyright (c) 1997, Graham Barr. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut + |