#!/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|; } else { print qq|\n|; } print qq| \n|; print qq| \n|; print qq| \n|; 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