From f157fbbfa81c71c2e68ed701bf18638e247d938c Mon Sep 17 00:00:00 2001 From: dms Date: Tue, 1 May 2001 12:13:26 +0000 Subject: [PATCH] - if a forked process "died", forked{}{PID} somehow became $$ - fixed. - chanServCheck now returns bool - gettimeofday mistakenly used instead of &timeget() - when nickserv pass accept, call chanserv ops in case nickserv was brought back to life. - fixed up fm ][ code not to use tons of memory - nice rewrite git-svn-id: https://svn.code.sf.net/p/infobot/code/trunk/blootbot@470 c11ca15a-4712-0410-83d8-924469b57eb5 --- src/IRC/IrcHelpers.pl | 9 ++--- src/IRC/IrcHooks.pl | 13 +++++-- src/Misc.pl | 2 +- src/Modules/Freshmeat.pl | 77 ++++++++++++++++++++++++++++++++-------- src/Shm.pl | 6 ++-- 5 files changed, 84 insertions(+), 23 deletions(-) diff --git a/src/IRC/IrcHelpers.pl b/src/IRC/IrcHelpers.pl index 9e4c1cd..fc96d28 100644 --- a/src/IRC/IrcHelpers.pl +++ b/src/IRC/IrcHelpers.pl @@ -301,7 +301,7 @@ sub chanServCheck { if (!defined $chan or $chan =~ /^$/) { &WARN("chanServCheck: chan == NULL."); - return; + return 0; } if ($chan =~ tr/A-Z/a-z/) { @@ -309,19 +309,20 @@ sub chanServCheck { } if (! &IsChanConf("chanServ_ops") ) { - return; + return 0; } &DEBUG("chanServCheck($chan) called."); if ( &IsParam("nickServ_pass") and !$nickserv) { &DEBUG("chanServ_ops($chan): nickserv enabled but not alive? (ircCheck)"); - return; + return 0; } - return if (exists $channels{$chan}{'o'}{$ident}); + return 0 if (exists $channels{$chan}{'o'}{$ident}); &status("ChanServ ==> Requesting ops for $chan. (chanServCheck)"); &rawout("PRIVMSG ChanServ :OP $chan $ident"); + return 1; } 1; diff --git a/src/IRC/IrcHooks.pl b/src/IRC/IrcHooks.pl index facce29..b1010b9 100644 --- a/src/IRC/IrcHooks.pl +++ b/src/IRC/IrcHooks.pl @@ -356,7 +356,7 @@ sub on_endofnames { # sync time should be done in on_endofwho like in BitchX if (exists $cache{jointime}{$chan}) { - my $delta_time = sprintf("%.03f", &gettimeofday() - $cache{jointime}{$chan}); + my $delta_time = sprintf("%.03f", &timeget() - $cache{jointime}{$chan}); $delta_time = 0 if ($delta_time < 0); &status("$b_blue$chan$ob: sync in ${delta_time}s."); @@ -495,7 +495,7 @@ sub on_join { } ### TODO: move this to &joinchan()? - $cache{jointime}{$chan} = &gettimeofday(); + $cache{jointime}{$chan} = &timeget(); rawout("WHO $chan"); return; @@ -684,6 +684,15 @@ sub on_notice { # password accepted. if ($args =~ /^Password a/i) { + my $done = 0; + + foreach ( &ChanConfList("chanServ_ops") ) { + next unless &chanServCheck($_); + next if ($done); + &DEBUG("nickserv activated or restarted; doing chanserv check."); + $done++; + } + $nickserv++; } } elsif ($nick =~ /^ChanServ$/i) { # chanserv. diff --git a/src/Misc.pl b/src/Misc.pl index ce98779..52cbc7b 100644 --- a/src/Misc.pl +++ b/src/Misc.pl @@ -90,7 +90,7 @@ sub timeget { if ($no_timehires) { # fallback. return time(); } else { # the real thing. - return [gettimeofday()]; + return gettimeofday(); } } diff --git a/src/Modules/Freshmeat.pl b/src/Modules/Freshmeat.pl index 41c013b..cb6f7fd 100644 --- a/src/Modules/Freshmeat.pl +++ b/src/Modules/Freshmeat.pl @@ -108,13 +108,14 @@ sub randPackage { if (scalar @fm) { #1: perfect match of name. my $retval; - $retval = "$fm[0] \002(\002$fm[11]\002)\002, "; - $retval .= "section $fm[3], "; - $retval .= "is $fm[4]. "; - $retval .= "Stable: \002$fm[1]\002, "; - $retval .= "Development: \002$fm[2]\002. "; - $retval .= $fm[5] || $fm[6]; # fallback to 'download'. - $retval .= " deb: ".$fm[8] if ($fm[8] ne ""); # 'deb'. + $retval = "$fm[0] \002(\002$fm[5]\002)\002, "; +# $retval .= "section $fm[3], "; + $retval .= "is $fm[2]. "; + $retval .= "Version: \002$fm[1]\002, "; +# $retval .= "Development: \002$fm[2]\002. "; + $retval .= $fm[4]; +### ??? +# $retval .= " deb: ".$fm[3] if ($fm[3] ne ""); # 'deb'. return $retval; } else { @@ -188,11 +189,55 @@ sub downloadIndex { @cols = &::dbGetColInfo("freshmeat"); $locktime = time(); - # todo: prevent severe memory usage whilst opening this file!!! - $p->parse(*IN, ProtocolEncoding => 'ISO-8859-1'); + + # this mess is to not dump IN to memory. + $_ = ; + $_ = ; + $_ = ; + + my $str; + while () { + chop; + + $str .= $_; + + next unless (/<\/project>/); + + # XML::Parser's parse() doesn't like the following. + # but parsefile() does... why! + for ($str) { + s/®/_/g; + s/ô//g; + s/"//g; + s/é/e/g; + s/à/a/g; + s/í/i/g; + s/­/_/g; # ??? + s/´/a/g; + s/»/_/g; # ??? + s/«/_/g; # ??? + s/©/[C]/g; + s/°/deg/g; + s/Æ/A/g; + s/\cN//g; # fucking openbsd morons. + s/ /-/g; + s/ö/o/g; + s/¶//g; # ??? + s/ã//g; + s/\cM/ /g; # stupid windows morons + s/²/square/g; + s/ü/?/g; + s/µ/u/g; + s/æ/a/g; + s/ø/o/g; + s/ð/e/g; + } + + $p->parse($str, ProtocolEncoding => 'ISO-8859-1'); + $str = ""; + } close IN; - &::DEBUG("FM: data ".scalar(@data) ); &::dbRaw("UNLOCK", "UNLOCK TABLES"); my $delta_time = &::timedelta($start_time); @@ -256,11 +301,12 @@ sub freshmeatAnnounce { return "Freshmeat update: ".join(" \002::\002 ", @new); } + sub xml_text { - my($expat,$text) = @_; - return if ($text =~ /^\s+$/); + my ($e,$t) = @_; + return if ($t =~ /^\s*$/); - $string = $text; + $string = $t; } sub xml_end { @@ -268,7 +314,7 @@ sub xml_end { $pkg{$text} = $string; - if ($expat->depth == 1) { + if ($expat->depth == 0) { for (my $j=0; $j $forked{$name}{PID}"); + $continue++ if ($forked{$name}{PID} == $$); - if ( -d "/proc/$forked{$name}{PID}") { + if ($continue) { + &DEBUG("hrm.. fork pid == mypid == $$; how did this happen?"); + } elsif ( -d "/proc/$forked{$name}{PID}") { &status("fork: still running; good. BAIL OUT."); return 0; } else { -- 2.39.2