Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / perl5 / eg / sysvipc / ipcshm
1 #!/usr/bin/perl
2 eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
3         if $running_under_some_shell;
4
5 require 'sys/ipc.ph';
6 require 'sys/shm.ph';
7
8 $| = 1;
9
10 $mode = shift;
11 die "usage: ipcshm {r|s}\n" unless $mode =~ /^[rs]$/;
12 $send = ($mode eq "s");
13
14 $SIZE = 32;
15 $id = shmget(0x1234, $SIZE, ($send ? 0 : &IPC_CREAT) | 0644);
16 die "Can't get shared memory: $!\n" unless defined($id);
17 print "shared memory id: $id\n";
18
19 if ($send) {
20         while (<STDIN>) {
21                 chop;
22                 unless (shmwrite($id, pack("La*", length($_), $_), 0, $SIZE)) {
23                         die "Can't write to shared memory: $!\n";
24                 }
25         }
26 }
27 else {
28         $SIG{'INT'} = $SIG{'QUIT'} = "leave";
29         for (;;) {
30                 $_ = <STDIN>;
31                 unless (shmread($id, $_, 0, $SIZE)) {
32                         die "Can't read shared memory: $!\n";
33                 }
34                 $len = unpack("L", $_);
35                 $message = substr($_, length(pack("L",0)), $len);
36                 printf "[%d] %s\n", $len, $message;
37         }
38 }
39
40 &leave;
41
42 sub leave {
43         if (!$send) {
44                 $x = shmctl($id, &IPC_RMID, 0);
45                 if (!defined($x) || $x < 0) {
46                         die "Can't remove shared memory: $!\n";
47                 }
48         }
49         exit;
50 }