+sub shmFlush {
+ return if ( $$ != $::bot_pid ); # fork protection.
+
+ if (@_) {
+ &ScheduleThis( 15 * 60, 'shmFlush' ); # 15 minutes
+ 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 '' );
+}
+