use strict;
use warnings;
+use re 'eval';
+
use constant DIR_AD => "/usr/local/squid/etc/ad";
chdir DIR_AD or die "chdir ".DIR_AD.": $!";
-
-my($patt)="";
-open(M4,"-|","m4 -P main") or die "m4 run: $!";
-while (<M4>) {
- chomp;
- next if !$_;
- $patt.="|" if $patt;
- $patt.=$_;
- }
-close M4;
-
select STDOUT;
$|=1;
+my @got;
+
+RELOAD: {
+ my $patt="";
+ open(M4,"-|","m4 --prefix-builtins --synclines main") or die "m4 run: $!";
+ my %files;
+ while (<M4>) {
+ chomp;
+ next if !$_;
+ do { $files{$1}=undef; next; } if /^#\s*line\s+\d+\s+"(.*)"$/;
+ $patt.="|" if $patt;
+ $patt.=$_."(?{ '";
+ s/'/'."'".'/g;
+ $patt.="$_'; })";
+ }
+ close M4;
+ $patt=qr @^http://($patt).*\n$@;
-while (<>) {
- s@^http://($patt).*\n$@http://localhost/cgi-bin/redirector-ad.cgi?$1\n@os;
- print;
- }
+ while ($_=shift @got || <>) {
+ while (my($file,$old)=each %files) {
+ my $new=(stat $file)[9];
+ $files{$file}=$new;
+ next if !defined $old || $old==$new;
+ push @got,$_;
+ redo RELOAD;
+ }
+ s@$patt@http://localhost/cgi-bin/redirector-ad.cgi?$^R\n@;
+ print;
+ }
+ } # RELOAD