#!/usr/local/bin/perl
# cgi2args
# Convert cgi's POST contents to arguments for some process.
# (c ) 1995-1997 by HIROSE Yuuji [yuuji@ae.keio.ac.jp]
# Last modified Tue Sep  2 18:34:42 1997 on crx
# $Id: cgi2args,v 1.2 1997/02/21 08:01:36 yuuji Exp yuuji $
#
# How to use this package:
#  This script converts cgi variables to option vs. contents pairs.
# You must specify cgi variable `execcmd' set to command to execute.
# And the contents of cgi variable `args' is passed to the command
#  Ex.)	<form  method=POST action="/cgi-bin/cgi2args">
#	<input name="execcmd" type="hidden" value="./foo">
#	<input name="args" type="hidden" value="bar">
#	<input name="hoge">
#  will execute /cgi-bin/./foo with args as;
#	./foo -hoge InputValue bar
# Note that `execcmd' must start with "./"
# 
# [cgi-bin $B$N0z?t$rIaDL$N%3%^%s%I%i%$%s0z?t$KE83+$7$F%3%^%s%I$r5/F0$9$k(B]
# 
# $B",$N$h$&$K$9$k$3$H$G!"(Bcgi-bin$B$GMxMQ$9$k%W%m%0%i%`$N%G%P%C%0$,MF0W$K$J(B
# $B$j$^$9!#(Bcgi2args $B$GMxMQ$9$kFC<lJQ?t$O(B execcmd, args $B$NFs$D$G!"(B
# 
# execcmd	$B<B:]$K8F$S=P$9%W%m%0%i%`(B("./" $B$G;O$^$k%+%l%s%H%G%#%l%/%H(B
#		$B%j$N%3%^%s%I$r;XDj$7$J$1$l$P$J$i$J$$(B)
# args		$B$=$N%W%m%0%i%`$KEO$9(B($B%*%W%7%g%s$G$O$J$$(B)$B0z?t!#(B
# 
# $B$H$J$C$F$$$^$9!#Nc$($P!"(B
# 
#	./foo -year 1995 -month 11 bar
# 
# $B$N$h$&$K%W%m%0%i%`$G$O!"(B-year $B%*%W%7%g%s$K(B1995$B$r;XDj$7!"(B-month $B%*%W%7%g(B
# $B%s$K(B11$B$r;XDj$7!"0z?t$H$7$F(B bar $B$rEO$7$F$$$^$9!#$3$N$h$&$J8F$S=P$7$r$9(B
# $B$k$?$a$K$O!"(Bhtml $B$NF~NO%U%)!<%`$G0J2<$N$h$&$K5-=R$7$^$9!#(B
# 
#	<form method=POST action="/cgi-bin/cgi2args">
#	<input name=execcmd type=hidden value="./foo">
#	<input name=year>
#	<input name=month>
#	<input name=args>
#	</form>
#
# $B$3$NF~NO%U%)!<%`$G8=$l$k(B3$B$D$NF~NOAk$KBP$7!"(Bx, y, z $B$HEz$($?>l9g!"(B
# ./foo -year "x" -month "y" "z"
# $B$H5/F0$5$l$^$9!#(Bexeccmd $B$G8F$S=P$5$l$k%3%^%s%I$O!"(B<html>$B$+$i;O$^$k(Bhtml
# $B%F%-%9%H$rEG$-=P$9$b$N$K$7$^$9!#(B
# 

# require "jcode.pl";
# $B$7$F!"(B
#
# print "HTTP-unchara";
#
# $B$NA0$K(B
#
# foreach (@opts){
#     &jcode::convert(*_,'euc');
# }
#
# $B$r$$$l$k$H4A;z$N%"!<%.%e%a%s%H$b$A$c$s$H=hM}$7$F$/$l$^$9!#(B


require "./jcode.pl" if (-f "./jcode.pl");
package cgi2args;
$log = 1;				  # $B=PNO(Blog$B$r<h$k9T?t(B
local($stream, $var, $val);
if ($ENV{"REQUEST_METHOD"} =~ /POST/i) {
	sysread(STDIN, $stream, $ENV{"CONTENT_LENGTH"});
} else {
	$stream=$ENV{"QUERY_STRING"};
}

foreach (split('&', $stream)) {
	($var, $val) = split('=', $_, 2);
	$val =~ s/\+/ /g;
	$val =~ s/%(..)/pack("c", hex($1))/ge;
	# $val =~ s,\`,\',g;		  # disable backquoting
	if ($var eq "execcmd") {
	    $execcmd = "$val";
	    next;
	} elsif ($var eq "args") {
	    push(@args, "\"$val\"");
	    next;
	}
	# eval "\$$var=$val";		# Set variable directly
	@opts = (@opts, "-$var ", "\"$val\"") if ("$val");
}

if (-f "./jcode.pl") {
    foreach (@opts){
	&jcode'convert(*_,'euc'); #'
    }
}
# print "HTTP/1.0 200\n";		#$B30$7$H$3$&!D(B
print "Content-type: text/html\n\n" ;# unless ($0 =~ /nph-/);
#print "Pragma: no-cache\n\n";
# print "Call `$execcmd @opts @args'<hr>\n";
if (&check($execcmd)) {
    $line=0;
    open(CMD, "$execcmd @opts @args |");
    $|=1;
    select((select(CMD), $|=1)[0]);
    
    if ($log) {
	if (open(LOG, ">>log/cgi2args.log")) {
	    $date = `date`;
	    print LOG "Date: $date";
	    print LOG "Exec: $execcmd @opts @args\n";
	    print LOG "Output: [[[\n";
	}
    }
    while (<CMD>) {
	print;
	if (!/^\s*$/ && !/<(html|title|head|body)\b/ && $line < $log) {
	    print LOG $_;
	    $line++;
	}
    }
    if ($log) {
	print LOG "]]]\n";
    }
    close LOG;
    close CMD;
} else {
    print "cgi2args error; illegal command [$execcmd]<br>\n";
}

sub check {
    local($command) = @_;
    local($mydir, $myname) = ($0 =~ m,(.*)/(.*),);
    return 0  if ($command !~ m,^\./,);
    local($dirname);
    ($dirname) = ($command =~ m,(.*)/.*,);
    local($dev1, $ino1) = (stat($mydir))[0,1];
    local($dev2, $ino2) = (stat($dirname))[0,1];
    if ($dev1==$dev2 && $ino1==$ino2) {
	return 1;
    } else {
	print STDERR "Illegal execcmd: $execcmd\n";
	print "cgi2args: Only current directory's commands are allowed.\n";
	return 0;
    }
}

1;
__END__
# Local variables:
# fill-prefix:	"# "
# End:
