summaryrefslogtreecommitdiff
path: root/cpan/IPC-SysV/lib/IPC
diff options
context:
space:
mode:
Diffstat (limited to 'cpan/IPC-SysV/lib/IPC')
-rw-r--r--cpan/IPC-SysV/lib/IPC/Msg.pm245
-rw-r--r--cpan/IPC-SysV/lib/IPC/Semaphore.pm319
-rw-r--r--cpan/IPC-SysV/lib/IPC/SharedMem.pm278
-rw-r--r--cpan/IPC-SysV/lib/IPC/SysV.pm188
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
+