+sub size_display ($)
+{
+my($size)=@_;
+
+ if ($size<4096)
+ {}
+ elsif ($size<1024*1024)
+ { $size=sprintf "%.1fK",$size/1024; }
+ else
+ { $size=sprintf "%.1fM",$size/1024/1024; }
+ $size.="B";
+ return $size;
+}
+
+sub url_is_local ($)
+{
+my($url)=@_;
+
+ return $url!~m#^[a-z]+://#;
+}
+
+sub a_href ($;$%)
+{
+my($url,$contents,%args)=@_;
+
+ do { $$_=1 if !defined $$_; } for (\$args{"size"});
+ if (!defined $contents) {
+ $contents=$url;
+ $contents=File::Basename::basename($contents) if $args{"basename"};
+ $contents=CGI::escapeHTML($contents);
+ }
+ $contents=~s#<a\b[^>]*>##gi;
+ $contents=~s#</a>##gi;
+
+ $url=top_dir($url) if url_is_local $url && $url=~m#^/#;
+
+ my $r='<a href="';
+ my $urlent=CGI::escapeHTML($url);
+ if ($url eq $urlent)
+ { $r.=$url; }
+ elsif (url_is_local $url)
+ { $r.=$urlent; }
+ elsif (defined $W->{"have_ent"} && !$W->{"have_ent"}) # non-ent client
+ { $r.=$url; }
+ elsif ($W->{"have_ent"}) # ent client
+ { $r.=$urlent; }
+ else # unknown client, &CGI::escapeHTML should not be needed here
+ { $r.=CGI::escapeHTML(top_dir('/Redirect.pl?location='.uri_escape($url))); }
+ $r.='"';
+ do { $r.=" $_" if $_; } for ($args{"attr"});
+ $r.='>'.$contents.'</a>';
+ if ($args{"size"} && url_is_local($url) && ($args{"size"}>=2 || $url=~/[.](?:gz|Z|rpm|zip|deb|lha)/)) { # Downloadable?
+ $url=top_dir_disk().$url if $url=~m#^/#;
+ if (!-r $url)
+ { cluck "File not readable: $url"; }
+ else {
+ $r.=' ('.size_display((stat($url))[7]).')';
+ }
+ }
+ return $r;
+}
+
+sub remote_ip ()
+{
+ # Do not: PerlModule Apache::ForwardedFor
+ # PerlPostReadRequestHandler Apache::ForwardedFor
+ # As 'Apache::ForwardedFor' takes the first of $ENV{"HTTP_X_FORWARDED_FOR"}
+ # while the contents is '127.0.0.1, 213.220.195.171' if client has its own proxy.
+ # We must take the last item ourselves.
+ my $r=$ENV{"HTTP_X_FORWARDED_FOR"} || $W->{"r"}->get_remote_host();
+ $r=~s/^.*,\s*//;
+ return $r;
+}
+
+sub is_cz ()
+{
+ return "CZ" eq Geo::IP->new()->country_code_by_addr(remote_ip());
+}
+
+sub a_href_cz ($$;%)
+{
+my($url,$contents,%args)=@_;
+
+ return a_href $url,$contents,%args if is_cz();
+ return $contents;
+}
+
+sub make ($)
+{
+my($cmd)=@_;
+
+ system {'flock'} 'flock','-x',top_dir_disk(),$cmd.' >&2';
+}
+