# IPC::Msg.pm # # Copyright (c) 1997 Graham Barr . All rights reserved. # 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); our ($VERSION); use Carp; $VERSION = "1.02"; $VERSION = eval $VERSION; do { 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 { (nelems @_) == 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((nelems @_) == 1) { $ds = shift; } else { croak 'Bad arg count' if (nelems @_) % 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 { (nelems @_) +<= 5 && (nelems @_) +>= 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! a*",$buf); $type; } sub snd { (nelems @_) +<= 4 && (nelems @_) +>= 3 or croak '$msg->snd( TYPE, BUF, FLAGS )'; my $self = shift; msgsnd($$self,pack("l! 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 = new IPC::Msg(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. A new queue is created if =over 4 =item * C is equal to C =item * C does not already have a message queue associated with it, and C & IPC_CREAT> is true. =back On creation of a new message queue C 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. 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 will set the following values of the C structure associated with the message queue. uid gid mode (oly the permission bits) qbytes C accepts either a stat object, as returned by the C method, or a list of I-I pairs. =item snd ( TYPE, MSG [, FLAGS ] ) Place a message on the queue with the data from C and with type C. See L. =item stat Returns an object of type C which is a sub-class of C. 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 L =head1 AUTHOR Graham Barr =head1 COPYRIGHT Copyright (c) 1997 Graham Barr. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut