#!/usr/local/bin/perl
# データ置き場のディレクトリ名
$df = 'data';
#---------------------------------------
# スクリプトの場所の自動取得
#---------------------------------------
$scrdir = $ENV{'SCRIPT_FILENAME'};
$scrdir =~ s|([^/]+)$||;
$datadir = $scrdir.$df;
# 上記自動取得がうまくいかない場合や、
# データ置き場を特殊な場所にする場合は次の行を設定の上、行頭の#をトル。
# $scrdir = '/var/users/a/aho/public_html/cgi-bin/ezget/';
# $datadir = '/var/users/a/aho/public_html/cgi-bin/ezget/data/';
#---------------------------------------
# このスクリプトCGIのURLの自動取得
#---------------------------------------
$url = "http://" . $ENV{'HTTP_HOST'} . $ENV{'SCRIPT_NAME'} ;
$durl = $url;
$durl =~ s|([^/]+)$|$df/|;
# 上記自動取得がうまくいかない場合や、
# データ置き場を特殊な場所にする場合は次の行を設定の上、行頭の#をトル。
# $url = "http://www.aaa.bbb.com/~ccc/ddd/ez.cgi";
# $durl = "http://www.aaa.bbb.com/~ccc/ddd/data/";
#---------------------------------------
# 新しい機種に関する設定
#---------------------------------------
# xhtmlでダウンロードさせるファイルの拡張子を「,」で区切って羅列
$xd = 'amc,pmd,mid,mmf';
# 上記で設定したファイルをCGIで吐く(1)か否(0)か
$xdcgi = 1;
# 以下修正不要
%DT = ( '2bp', 'dev2abm',
'amc', 'devdl1q', # 他にdevdl(1|2)(q|m|n|bp|bm)あり。
'bmp', 'devabm',
'gif', 'devgi0z', # animated-gifはdevga2z
'jpg', 'devjaww',
'jpeg', 'devjaww',
'jpe', 'devjaww',
'kjx', 'devkdjx',
'mid', 'dev16trp',
'mmf', 'devmfan',
'mmf4', 'dev4anm',
'pmd', 'devcman',
'pmd3', 'dev3anp',
'png', 'dev8aww',
'qcp', 'dev13anq',
'smf', 'dev16trp',
'vcf', 'devvcf',
'vcs', 'devvcs',
'txt', '' );
%MIME =('amc', 'application/x-mpeg',
'smd', 'audio/x-smd',
'smz', 'audio/x-smd',
'bmp', 'image/x-MS-bmp',
'2bp', 'image/x-MS-bmp',
'png', 'image/png',
'pnz', 'image/png',
'gif', 'image/gif',
'jpg', 'image/jpeg',
'jpz', 'image/jpeg',
'jpeg', 'image/jpeg',
'jpe', 'image/jpeg',
'mmf', 'application/x-smaf',
'pmd', 'application/x-pmd',
'mld', 'application/x-mld',
'qcp', 'audio/vnd.qcelp',
'als', 'audio/X-Alpha5',
'mid', 'audio/midi',
'wav', 'audio/x-wav',
'html', 'text/html',
'shtml', 'text/html',
'htm', 'text/html',
'sht', 'text/html',
'txt', 'text/plain' );
@PMD = ( 'dev16krt', # 0000 ?
'devcman', # 0001
'dev16krt', # 0010 ?
'dev16krt', # 0011 ?
'dev16krt', # 0100 ?
'dev16krt', # 0101
'dev16krt', # 0110 ?
'dev16krt', # 0111 ?
'dev8sca', # 1000
'dev16tra', # 1001
'dev16krt', # 1010 ?
'dev16krt', # 1011 ?
'dev16krt', # 1100 ?
'dev16krt', # 1101 ?
'dev16krt', # 1110 ?
'dev16krt' ); # 1111 ?
&init;
binmode STDIN;
binmode STDOUT;
$f = $FORM{'f'};
$title = $f unless ( $title = $FORM{'t'} );
$dump = $FORM{ 'dump' };
$name = $FORM{ 'name' };
$count = $FORM{ 'count' };
$offset = $FORM{ 'offset' };
if ( $dump ne '' ) {
$name = $dump;
}
if ( $f ) {
&confirm;
} elsif ( $name ) {
&download;
} else {
&error ( "filename required" );
}
exit;
sub confirm {
open ( R, "$datadir/$f" ) || &error ( "file not found" );
binmode ( R );
$fs = -s R;
read ( R, $buf, $fs );
close ( R );
if ( $c5000 != 0 ) {
$fs += 2 if ( &crc ( *buf ) );
}
unless ( $dev = $FORM{'d'} ) {
$f =~ /\.([^\.]*)$/;
$ext = $1;
$ext =~ tr/A-Z/a-z/;
$dev = $DT{$ext};
$mime = $MIME{$ext};
unless ( ( $ext ne '' ) && ( $xd =~ /\b$ext\b/i ) ) {
$c5000 = 0;
}
# ezweb簡易pngスクリーンセーバ
if ( $f =~ /_s\d\.png$/i ) {
$dev = 'dev6sca';
}
# pmd判別
if ( $ext eq 'pmd' ) {
local ( $b ) = ord ( substr ( $buf, 11, 1 ) );
if ( $b == 1 ) {
if ( ord ( substr ( $buf, 12, 1 ) ) == 1 ) {
$dev = $DT{'pmd3'};
} else {
$dev = $DT{'pmd'};
}
} else {
$dev = $PMD[$b];
}
}
# mmf判別
if ( $ext eq 'mmf' ) {
local ( $i, $j );
$i = ord ( substr ( $buf, 15, 1 ) );
$j = ord ( substr ( $buf, 19 + $i , 1 ) );
if ( $j ) {
$dev = $DT{'mmf'}
} else {
$dev = $DT{'mmf4'}
}
}
}
$ft = $f;
$ft =~ s/\.(.*)$/.txt/;
if ( open ( R, "$datadir/$ft" ) ) {
local ( @c ) = ;
chop ( @c );
$title = $c[0];
$title =~ s/([^\w\.])/sprintf("%%%02X",ord ($1) )/eg;
$des = join ( "
\n", @c );
close ( R );
}
$t = ( stat ( "$datadir/$f" ) )[9];
local ( $mday, $mon, $year ) = ( localtime( $t ) )[3..5];
$ts = sprintf("%02d/%02d/%02d登録", $year % 100, $mon+1, $mday);
local ( $fnesc ) = $f;
$fnesc =~ s/([^\w\.])/sprintf("%%%02X",ord ($1) )/eg;
$dev = '?' unless ( $dev );
if ( $c5000 == 0 ) {
print "Content-type: text/x-hdml;charset=Shift_JIS\n\n";
print qq|\n|;
print qq|\n|;
print qq|[データの情報]
\n|;
print qq|$f($dev)
\n|;
print qq|$ts
\n|;
print qq|$fs bytes
\n|;
print qq|$des\n| if ( $des );
print qq|ダウンロード\n|;
print qq|戻る\n|;
print qq|\n|;
print qq|\n|;
} else {
print "Content-type: text/html;charset=Shift_JIS\n\n";
print qq|\n|;
print qq|\n|;
print qq|\n|;
print qq|\n|;
print qq|[データの情報]
\n|;
print qq|$f($dev)
\n|;
print qq|$ts
\n|;
print qq|$fs bytes
\n|;
print qq|$des\n| if ( $des );
print qq|
\n|;
print qq|\n|;
if ( $xdcgi == 1 ) {
print qq|\n|;
print qq|\n|;
print qq|\n|;
}
return;
}
sub download {
if ( ( $offset >= 0 ) && ( $count > 0 ) || ( $dump ne '' ) ) {
open ( R , "$datadir/$name" ) || &error("file not found");
binmode ( R );
local ( $fsize ) = -s R;
local ( $buf );
read ( R, $buf, $fsize );
close ( R );
local ( $crc ) = 0;
if ( $c5000 != 0 ) {
$crc = &crc ( *buf );
}
if ( $dump ne '' ) {
$offset = 0;
$count = $fsize;
}
if ( $crc != 0 ) {
local ( $c1 ) = ( $crc & 0xff00 ) >> 8;
local ( $c2 ) = $crc & 0x00ff;
$buf .= pack ( 'CC', $c1, $c2 );
}
local ( $out ) = substr ( $buf, $offset, $count );
if ( $dump ne '' ) {
local ( $f ) = $name;
$f =~ /\.([^\.]*)$/;
local ( $ext ) = $1;
$ext =~ tr/A-Z/a-z/;
local ( $mime ) = $MIME{$ext};
print "Content-type: $mime\n";
print "Content-length: $count\n\n";
print $out;
} else {
print "Content-type: application/x-up-download\n";
print "Content-length: $count\n\n";
print $out;
}
} elsif ( ( $offset == 0 ) && ( $count == 0 ) ) {
print "Content-type: application/x-up-download\n";
print "Content-length: 0\n\n";
} elsif ( ( $offset == -1 ) && ( $count == -1 ) ) {
print "Content-type: text/x-hdml;charset=Shift_JIS\n\n";
print qq|\n|;
print qq|\n|;
print qq|\n|;
print qq|\n|;
print qq|\n|;
} elsif ( ( $offset == -1 ) && ( $count == -2 ) ) {
&error ( 'ダウンロード失敗', 'データが壊れているか,表示/再生できない形式です.' );
} else {
&error ( '原因不明のエラー' );
}
}
sub init {
$ua = $ENV{'HTTP_USER_AGENT'};
$c5000 = 0;
$c5000 = -1 if ( $ua =~ 'UP.Browser/6' );
local ( $buffer );
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
}
$buffer .= $ENV{'QUERY_STRING'};
local ( @pairs ) = split(/[&|\;]/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
}
sub error {
local ( $a ) = shift;
local ( $b ) = shift;
print "Content-type: text/x-hdml;charset=Shift_JIS\n\n";
print qq|\n|;
print qq|\n|;
print qq|$a
\n|;
print qq|$b
\n|;
print qq|\n|;
print qq|\n|;
exit;
}
sub crc {
local ( *a ) = shift;
local ( @crctable ) = (
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 );
local ( $crc ) = 0xffff;
local ( $i );
foreach $i ( unpack ( 'C*', $a ) ) {
local ( $ch ) = ( $crc & 0xff00 ) >> 8;
local ( $cs ) = ( $crc << 8 ) & 0xffff ;
$crc = $crctable[ $ch ^ $i ] ^ $cs;
}
return ( $crc & 0xffff );
}
# ez.cgi ver1.2814