+sub shmFlush {
+ return if ($$ != $::bot_pid); # fork protection.
+
+ if (@_) {
+ &ScheduleThis(5, "shmFlush");
+ return if ($_[0] eq "2");
+ }
+
+ my $time;
+ my $shmmsg = &shmRead($shm);
+ # remove padded \0's.
+ $shmmsg =~ s/\0//g;
+ return if (length($shmmsg) == 0);
+ if ($shmmsg =~ s/^(\S+):(\d+):(\d+): //) {
+ my $n = $1;
+ my $pid = $2;
+ $time = $3;
+ } else {
+ &status("warn: shmmsg='$shmmsg'.");
+ return;
+ }
+
+ foreach (split '\|\|', $shmmsg) {
+ next if (/^$/);
+ &VERB("shm: Processing '$_'.",2);
+
+ if (/^DCC SEND (\S+) (\S+)$/) {
+ my ($nick,$file) = ($1,$2);
+ if (exists $dcc{'SEND'}{$who}) {
+ &msg($nick, "DCC already active.");
+ } else {
+ &DEBUG("shm: dcc sending $2 to $1.");
+ $conn->new_send($1,$2);
+ $dcc{'SEND'}{$who} = time();
+ }
+ } elsif (/^SET FORKPID (\S+) (\S+)/) {
+ $forked{$1}{PID} = $2;
+ } elsif (/^DELETE FORK (\S+)$/) {
+ delete $forked{$1};
+ } elsif (/^EVAL (.*)$/) {
+ &DEBUG("evaling '$1'.");
+ eval $1;
+ } else {
+ &DEBUG("shm: unknown msg. ($_)");
+ }
+ }
+
+ &shmWrite($shm,"") if ($shmmsg ne "");
+}
+