#!/usr/bin/perl
#!perl
$| = 1;
# declare the variables
$boarddir = '../dat';
$boardurl = '/cgi-bin';
$cgi = '/cgi-bin/robboard.cgi';
$indexcgi = '/cgi-bin/index.cgi';
$queryswitch = '?';
$html = 1; # 0 = remove all html, 1 = show html as text, 2 = show html as html
$datetype = 4;
$useban = 0;
$encrypt = 0;
$style = 01;
$threaded = 1;
$fontface = 'arial';
$fontsize = 2;
#$tablecolor1 = 'black';
#$tablecolor2 = 'white';
#$tablecolor3 = 'white';
#$fontcolor1 = 'white';
#$fontcolor2 = 'black';
#$fontcolor3 = 'black';
$tablecolor1 = 'white';
$tablecolor2 = 'blue';
$tablecolor3 = 'white';
$fontcolor1 = 'black';
$fontcolor2 = 'yellow';
$fontcolor3 = 'white';
#########################################################################
# Don't change anything below here unless you know what you're doing :) #
#########################################################################
$datadir = "$boarddir/data";
$datafile = "$boarddir/data.txt";
$index_t = "$boarddir/index_t.html";
$page_t = "$boarddir/page_t.html";
$thread_t = "$boarddir/thread_t.html";
$numfile = "$boarddir/number.txt";
$banfile = "$boarddir/ban.txt";
#$pwdfile = "$boarddir/pwd.txt";
$pwdfile = "$boarddir/pass.cfg";
$use_cgi = 1;
$LOCK_EX = 2;
$LOCK_UN = 8;
print "Content-type: text/html\n\n";
&get_date;
&readform;
&post if ($action eq 'post');
&display if ($action eq 'display');
&viewthread if ($action eq 'viewthread');
&admin if ($action eq 'admin');
&remove if ($action eq 'remove');
&remove2 if ($action eq 'remove2');
&ban if ($action eq 'ban');
&ban2 if ($action eq 'ban2');
&unban if ($action eq 'unban');
&unban2 if ($action eq 'unban2');
&password if ($action eq 'password');
&password2 if ($action eq 'password2');
&fatal_error("Эта страница вызвана некорректно. Попробуйте эту взамен.");
sub post {
&bancheck if ($useban == 1);
$follow = $INFO{'follow'};
$name = $FORM{'name'};
$email = $FORM{'email'};
$subject = $FORM{'subject'};
$message = $FORM{'message'};
&post_error("Необходимое поле `Имя` не заполнено.") unless($name);
&post_error("Необходимое поле `E-Mail` не заполнено.") unless($email);
&post_error("Необходимое поле `Тема` не заполнено.") unless($subject);
&post_error("Пустое сообщение.") unless($message);
$name =~ s/`/\'/g;
$email =~ s/`/\'/g;
$message =~ s/`/\'/g;
$subject =~ s/`/\'/g;
$name =~ s/\&/\&/g;
$email =~ s/\&/\&/g;
$subject =~ s/\&/\&/g;
$message =~ s/\&/\&/g;
$name =~ s/"/\"/g;
$email =~ s/"/\"/g;
$subject =~ s/"/\"/g;
$message =~ s/"/\"/g;
$name =~ s/ / \ /g;
$email =~ s/ / \ /g;
$subject =~ s/ / \ /g;
$message =~ s/ / \ /g;
if ($html == 0) {
$name =~ s/<([^>]|\n)*>//g;
$email =~ s/<([^>]|\n)*>//g;
$subject =~ s/<([^>]|\n)*>//g;
$message =~ s/<([^>]|\n)*>//g;
}
elsif ($html == 1) {
$name =~ s/</g;
$name =~ s/>/>/g;
$email =~ s/</g;
$email =~ s/>/>/g;
$subject =~ s/</g;
$subject =~ s/>/>/g;
$message =~ s/</g;
$message =~ s/>/>/g;
}
$message =~ s/\t/ \ \ \ /g;
$message =~ s/\n\n/
\n\n/g;
$message =~ s/\n/ \n/g;
$message =~ s/\cM//g;
open (FILE, "$numfile") || &fatal_error("Не могу открыть $numfile");
&lock(FILE);
@info = ;
&unlock(FILE);
close(FILE);
($postnum,$chop) = split(/``/,$info[0]);
$postnum++;
open (FILE, ">$numfile") || &fatal_error("Не могу открыть $numfile");
&lock(FILE);
print FILE "$postnum";
print FILE "``xx";
&unlock(FILE);
close (FILE);
open (FILE, "$datafile") || &fatal_error("Не могу открыть $datafile");
&lock(FILE);
@messages = ;
&unlock(FILE);
close (FILE);
open (FILE, ">$datafile") || &fatal_error("Не могу открыть $datafile");
&lock(FILE);
if ($follow eq 'no') {
print FILE "$postnum``$subject``1``$name``$email``$date``$ENV{REMOTE_ADDR}``$ENV{HTTP_USER_AGENT}``xx\n";
print FILE @messages;
}
else {
$followto = $FORM{'followto'};
$level = $FORM{'level'} + 1;
for ($a = 0; $a < @messages; $a++) {
($checknum,@junk) = split(/``/,$messages[$a]);
print FILE "$messages[$a]";
if ($checknum == $followto) {
$level = $junk[1] + 1;
print FILE "$postnum``$subject``$level``$name``$email``$date``$ENV{REMOTE_ADDR}``$ENV{HTTP_USER_AGENT}``xx\n";
}
}
}
&unlock(FILE);
close(FILE);
open(FILE, ">$datadir/$postnum\.txt") || &fatal_error("Не могу открыть
$postnum\.txt");
&lock(FILE);
print FILE $message;
&unlock(FILE);
close (FILE);
print "\n";
print " Сообщение отправлено! \n";
print "\n";
print "\n";
print "Сообщение успешно сохранено \n";
print "\n";
print "Ваше сообщение, $subject , было сохранено.\n";
if ($style == 0) {
print "Просмотреть Ваше сообщение \n";
print "На главную
\n";
} elsif ($threaded == 0) {
print "На главную
\n";
} else {
print "Просмотреть эту тему \n";
print "На главную
\n";
}
print "
\n";
print " ";
print "\n";
exit;
}
sub display {
$viewnum = $INFO{'num'};
$viewnum = int ( $viewnum );
&fatal_error("Эта функция была вызвана некорректно. ( не пытались ли вы взломать сайт, не так ли? )") unless ($viewnum > 0);
open (FILE, "$datafile") || &fatal_error("Не могу открыть $datafile");
&lock(FILE);
@messages = ;
&unlock(FILE);
close(FILE);
for ($a = 0; $a < @messages; $a++) {
($mnum[$a],$msub[$a],$mfollow[$a],$mname[$a],$memail[$a],$mdate[$a],$mip[$a],$mbrowser[$a],$chop) = split(/``/,$messages[$a]);
if ($viewnum == $mnum[$a]) {
$idnum = $a;
}
}
open (FILE, "$datadir/$viewnum\.txt") || &fatal_error("Не могу открыть
$viewnum\.txt");
&lock(FILE);
@body = ;
&unlock(FILE);
close(FILE);
open (FILE, "$page_t") || &fatal_error("Не могу открыть $page_t");
&lock(FILE);
@template = ;
&unlock(FILE);
close(FILE);
for ($a = 0; $a < @template; $a++) {
$_ = $template[$a];
if (//) {
print @body;
}
elsif (//) {
print "\n\n";
}
elsif (//) {
if ($mfollow[$idnum] >= $mfollow[$idnum+1]) {
print "Никто не ответил на это сообщение. ";
}
else {
print "\n";
$last = $mfollow[$idnum+1];
for ($d = $idnum+1; $d < @messages; $d++) {
if ($mfollow[$d] <= $mfollow[$idnum]) {
$d = @messages;
$count = $last - $mfollow[$idnum];
}
else {
if ($mfollow[$d] > $last) {
print "\n";
}
elsif ($mfollow[$d] < $last) {
for ($e = 0; $e < $last - $mfollow[$d]; $e++) {
print " \n";
}
}
print "\n";
print "$msub[$d] ";
print "- $mname[$d] , $mdate[$d] \n";
}
$last = $mfollow[$d];
}
for ($b = 0; $b < $count; $b++) {
print " \n";
}
}
}
elsif (//) {
print "$msub[$idnum]\n";
}
elsif (//) {
print "$mname[$idnum] \n";
}
elsif (//) {
print "$mname[$idnum]\n";
}
elsif (//) {
print "$memail[$idnum]\n";
}
elsif (//) {
print "$mdate[$idnum]\n";
}
elsif (//) {
print "$mbrowser[$idnum]\n";
}
elsif (//) {
print "$mip[$idnum]\n";
}
else {
print "$_";
}
}
exit;
}
sub viewthread {
$viewnum = $INFO{'num'};
$viewnum = int ( $viewnum );
&fatal_error("Эта функция была вызвана некорректно. ( не пытались ли вы взломать сайт, не так ли? )") unless ($viewnum > 0);
open (FILE, "$datafile") || &fatal_error("Не могу открыть $datafile");
&lock(FILE);
@messages = ;
&unlock(FILE);
close(FILE);
for ($a = 0; $a < @messages; $a++) {
($mnum[$a],$msub[$a],$mfollow[$a],$mname[$a],$memail[$a],$mdate[$a],$mip[$a],$mbrowser[$a],$chop) = split(/``/,$messages[$a]);
if ($viewnum == $mnum[$a]) {
$idnum = $a;
}
}
while ($mfollow[$idnum] > 1) {
$idnum--;
}
$depth = 1;
$messcount = -1;
for ($a = $idnum+1; $a < @messages; $a++) {
if ($mfollow[$a] == 1) {
$messcount = $a - $idnum;
$a = @messages;
} elsif ($mfollow[$a] > $depth) {
$depth = $mfollow[$a];
}
}
$messcount = @messages - $idnum if ($messcount == -1);
open (FILE, "$thread_t") || &fatal_error("Не могу открыть $thread_t");
&lock(FILE);
@template = ;
&unlock(FILE);
close(FILE);
for ($a = 0; $a < @template; $a++) {
$_ = $template[$a];
if (//) {
for ($b = $idnum; $b < $idnum + $messcount; $b++) {
print "\n";
open (FILE, "$datadir/$mnum[$b]\.txt") || &fatal_error("Не могу открыть
$mnum[$b]\.txt");
&lock(FILE);
@body = ;
&unlock(FILE);
close(FILE);
$colspan = $depth - $mfollow[$b] + 2;
$colspan2 = $colspan - 1;
print "";
for ($c = 1; $c < $mfollow[$b]; $c++) {
print " \n";
}
print "$mdate[$b] \n";
print "";
for ($c = 1; $c < $mfollow[$b]; $c++) {
print " \n";
}
print "Поместил: \n";
print "$mname[$b] \n";
print "";
for ($c = 1; $c < $mfollow[$b]; $c++) {
print " \n";
}
print "Тема: \n";
print "$msub[$b] \n";
print "";
for ($c = 1; $c < $mfollow[$b]; $c++) {
print " \n";
}
print "Сообщение: \n";
print "@body \n";
print "";
for ($c = 1; $c < $mfollow[$b]; $c++) {
print " \n";
}
print "Инфо: \n";
print "Ответить на это сообщение . \n";
print "
\n";
}
}
elsif (//) {
print "\n";
print " \n\n";
}
elsif (//) {
print "$msub[$idnum] \n";
}
elsif (//) {
print "$mname[$idnum] \n";
}
elsif (//) {
print "$mname[$idnum]\n";
}
elsif (//) {
print "$memail[$idnum]\n";
}
elsif (//) {
print "$mdate[$idnum]\n";
}
elsif (//) {
print "$mbrowser[$idnum]\n";
}
elsif (//) {
print "$mip[$idnum]\n";
}
else {
print "$_";
}
}
exit;
}
sub bancheck {
open (FILE, "$banfile") || &fatal_error("Не могу открыть $banfile");
&lock(FILE);
@banlist = ;
&unlock(FILE);
close(FILE);
($this1,$this2,$this3,$this4) = split(/\./,$ENV{REMOTE_ADDR});
for ($x = 0; $x < @banlist; $x++) {
($ip1,$ip2,$ip3,$ip4,$chop) = split(/``/,$banlist[$x]);
if ( ("$this1" eq "$ip1" && "$this2" eq "$ip2" && "$this3" eq "$ip3" && "$this4" eq "$ip4") ||
("$this1" eq "$ip1" && "$this2" eq "$ip2" && "$this3" eq "$ip3" && "$ip4" eq 'X') ||
("$this1" eq "$ip1" && "$this2" eq "$ip2" && "$ip3" eq 'X') ||
("$this1" eq "$ip1" && "$ip2" eq 'X') ) {
&fatal_error("Вы не можете поместить это сообщение. Ваш IP запрещен.");
}
}
}
sub admin {
print "\n";
print " Администрирование \n";
print "\n";
print "\n";
print "Администрирование \n";
print "Давай поадминим! \n";
print "Удалить сообщения \n";
# print "Запретить пользователя \n";
# print "Разрешить пользователя \n";
print "Сменить пароль
\n";
# print "
\n";
#
# print "Настройки \n\n";
#
# print "Переменная \n";
# print "Значение \n";
# print "Примечание \n\n";
#
# print "\n";
# print "\$useban \n";
# print "$useban \n";
# print "";
#
# if ($useban == 1) {
# print "Пользователи с этими IP в запр. списке не смогут писать в форум.";
# } else {
# print "Список запрета не используется. В форум могут писать все.";
# }
#
# print " \n";
#
# print "\n";
# print "\$html \n";
# print "$html \n";
# print "";
#
# if ($html == 0) {
#
# print "Все теги HTML удаляются из сообщений.";
#
# } elsif ($html == 1) {
#
# print "Теги HTML выводятся простым текстом.";
#
# } else {
#
# print "Теги HTML включены (возможны неприятности).";
#
# }
#
# print " \n";
#
# print "\n";
# print "\$datetype \n";
# print "$datetype \n";
# print "Пример: $date ";
#
# print " \n";
#
# print "\n";
# print "\$encrypt \n";
# print "$encrypt \n";
# print "";
#
# if ($encrypt == 1) {
# print "Пароль шифруется .";
# } else {
# print "Пароль не зашифрован.";
# }
#
# print " \n";
#
# print "";
# print "Эти переменные могут быть изменены в robboard.cgi \n";
#
# print "
\n";
print "или...
\n";
print "Назад к доске сообщений \n";
print "
\n";
print "\n";
exit;
}
sub remove {
open (FILE, "$datafile") || &fatal_error("Не могу открыть $datafile");
&lock(FILE);
@messages = ;
&unlock(FILE);
close(FILE);
for ($a = 0; $a < @messages; $a++) {
($mnum[$a],$msub[$a],$mfollow[$a],$mname[$a],$memail[$a],$mdate[$a],$mip[$a],$mbrowser[$a],$chop) = split(/``/,$messages[$a]);
if ($viewnum == $mnum[$a]) {
$idnum = $a;
}
}
print "\n";
print " Удаление сообщений \n";
print "\n";
print "\n";
print "Удаление сообщений \n";
print "\n\n";
print "Пароль: \n";
print "
\n";
print " \n";
print " \n";
print " \n";
print " \n";
print " \n";
print "\n";
exit;
}
sub remove2 {
&checkpass;
$something = 0;
$delcounter = 0;
for ($x = 0; $x < $FORM{'total'}; $x++) {
$okiedokie[$x] = $FORM{"line$x"};
$something = 1 if ($okiedokie[$x] eq "yes");
}
if ($something == 1) {
open (FILE, "$datafile") || &fatal_error("Не могу открыть $datafile");
&lock(FILE);
@messages = ;
&unlock(FILE);
close(FILE);
for ($a = 0; $a < @messages; $a++) {
($mnum[$a],$msub[$a],$mfollow[$a],$mname[$a],$memail[$a],$mdate[$a],$mip[$a],$mbrowser[$a],$chop) = split(/``/,$messages[$a]);
}
open (FILE, ">$datafile") || &fatal_error("Не могу открыть $datafile");
&lock(FILE);
for ($x = 0; $x < @messages; $x++) {
if ($okiedokie[$x] eq 'yes') {
$y = $x;
while ( $x==$y || ( $mnum[$x] > $mnum[$y] && $x < @messages ) ) {
unlink("$datadir/$mnum[$x]\.txt");
$delcounter++;
$x++;
}
$x--;
}
else {
print FILE $messages[$x];
}
}
&unlock (FILE);
close (FILE);
}
print "\n";
print " Удаление сообщений \n";
print "\n";
print "\n";
print "Удаление сообщений \n";
print "$delcounter сообщений(е,я) удалено.\n\n";
print "Админ \n";
print "Назад к доске сообщений \n\n";
print "
\n";
print "\n";
exit;
}
sub ban {
print "\n";
print " Запрещение пользователей \n";
print "\n";
print "\n";
print "RobBoard - Ban a User \n";
print "\n\n";
print "Пароль: \n";
print "Заретить IP
\n";
print " .\n";
print " .\n";
print " .\n";
print "
\n";
print " \n";
print " \n";
print "
\n";
print "\n";
print "\n";
print "Введите IP, который вы хотите запретить в текстовые поля. Вы можете запретить диапазон\n";
print "IP адресов введя один прописной X в поле. Например, введите\n";
print "123 234 345 123 для блокирования IP 123.234.345.123, или ввдетите\n";
print "123 234 345 X, чтобы блокировать 123.234.345.* - все IP адреса, которые начинаются с 123 234 345\n";
print ". Аналогично, 123 234 X блокирует 123.234.*.* . Вы также можете блокировать людей редактируя файл ban.txt \n";
print "вручную, но будте осторожны. Если вы не уверены в том, как в ban.txt\n";
print "хранятся данные, воспользуйтесь лучше этой формой.\n";
print "
\n";
print "
\n";
print "\n";
exit;
}
sub ban2 {
&checkpass;
open (FILE, ">>$banfile") || &fatal_error("Не могу открыть $banfile");
&lock(FILE);
print FILE "$FORM{'box1'}``$FORM{'box2'}``$FORM{'box3'}``$FORM{'box4'}``xx\n";
&unlock(FILE);
close(FILE);
print "\n";
print " Запрещение пользователей \n";
print "\n";
print "\n";
print "Запрещение пользователей \n";
print "$FORM{'box1'}\.$FORM{'box2'}\.$FORM{'box3'}\.$FORM{'box4'} has been added to the ban list.\n\n";
print "Админ \n";
print "Назад к доске сообщений \n\n";
print "
\n";
print "\n";
exit;
}
sub unban {
open (FILE, "$banfile") || &fatal_error("Не могу открыть $banfile");
&lock(FILE);
@banlist = ;
&unlock(FILE);
close(FILE);
print "\n";
print " Разблокирование пользователей \n";
print "\n";
print "\n";
print "Разблокирование пользвателей \n";
print "\n\n";
print "Пароль: \n";
print "
\n\n";
print " \n";
print " \n";
print " \n";
print " \n\n";
print " \n";
print "\n";
exit;
}
sub unban2 {
&checkpass;
$something = 0;
$delcounter = 0;
for ($x = 0; $x < $FORM{'total'}; $x++) {
$okiedokie[$x] = $FORM{"line$x"};
$something = 1 if ($okiedokie[$x] eq "yes");
}
if ($something == 1) {
open (FILE, "$banfile") || &fatal_error("Не могу открыть $banfile");
&lock(FILE);
@banlist = ;
&unlock(FILE);
close(FILE);
open (FILE, ">$banfile") || &fatal_error("Не могу открыть $banfile");
&lock(FILE);
for ($x = 0; $x < @banlist; $x++) {
if ($okiedokie[$x] eq 'yes') {
$delcounter++;
} else {
print FILE $banlist[$x];
}
}
&unlock(FILE);
close (FILE);
}
print "\n";
print " Разблокирование пользователей \n";
print "\n";
print "\n";
print "Разблокирование пользователей \n";
print "$delcounter вхождение(й) было удалено из списка.\n\n";
print "Админ \n";
print "Назад в форум \n\n";
print "
\n";
print "\n";
exit;
}
sub password {
print "\n";
print " Изменение пароля \n";
print "\n";
print "\n";
print "Изменение пароля \n";
print "\n\n";
print "\n\n";
print " \n";
print " \n";
print " \n";
print " \n";
print "\n";
exit;
}
sub password2 {
&checkpass;
&fatal_error("Пароли не совпадают") if ($FORM{'new1'} ne $FORM{'new2'});
&fatal_error("Новый пароль не введен") unless ($FORM{'new1'});
open(FILE, "$pwdfile") || &fatal_error("Can't find $pwdfile");
@lines = ;
close(FILE);
($p, $nochop) = split(/``/,$lines[0]);
($p2, $nochop) = split(/``/,$lines[1]);
if ($encrypt == 1) {
$new = crypt($FORM{'new1'}, substr($p, 0, 2));
} else {
$new = $FORM{'new1'};
}
open (FILE, ">$pwdfile") || &fatal_error("Не могу найти $pwdfile");
if ($encrypt == 1) {
print FILE "$new``xx\n";
print FILE "$p2``xx";
} else {
print FILE "$p``xx\n";
print FILE "$new``xx";
}
close (FILE);
print "\n";
print " Изменение пароля \n";
print "\n";
print "\n";
print "Изменение пароля \n";
print "Пароль успешно изменен.\n";
print "Админ \n";
#print "Назад в форум \n\n";
print "
\n";
print "\n";
exit;
}
sub checkpass {
open(FILE, "$pwdfile") || &fatal_error("Не могу найти $pwdfile");
@lines = ;
close(FILE);
($p, $nochop) = split(/``/,$lines[0]);
($p2, $nochop) = split(/``/,$lines[1]);
&fatal_error("Неверный пароль") if ($p ne crypt($FORM{'pass'}, substr($p, 0, 2)) && $encrypt == 1);
&fatal_error("Неверный пароль") if ($p2 ne $FORM{'pass'} && $encrypt != 1);
}
sub post_error {
local($e) = @_;
print "\n";
print " Ошибка размещения \n";
print "\n";
print "\n";
print "Ошибка размещения \n";
print "\n";
print "Ошибка размещения вашего сообщения:\n";
print "$e
\n\n";
print "Вы можете нажать кнопку 'Назад' вашго обозревателя, чтобы исправить ошибку.
\n";
print "На главную
\n";
print "
\n";
print " ";
print "\n";
exit;
}
sub fatal_error {
local($e) = @_;
print "\n";
print " Фатальная ошибка \n";
print "\n";
print "\n";
print "Фатальная ошибка \n";
print "\n";
print "Произошла неисправимая ошибка:\n";
print "$e
\n\n";
print "Если эта ошибка повториться, свяжитесь с администратором.
\n";
print "На главную
\n";
print "
\n";
print " ";
print "\n";
exit;
}
sub readform {
read(STDIN, $input, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $input);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
@vars = split(/&/, $ENV{QUERY_STRING});
foreach $var (@vars) {
($v,$i) = split(/=/, $var);
$v =~ tr/+/ /;
$v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$i =~ tr/+/ /;
$i =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$i =~ s///g;
$INFO{$v} = $i;
}
$action = $INFO{'action'};
}
sub get_date {
@days = ('Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота');
@months = ('Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь');
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$mon_num = $mon+1;
$savehour = $hour;
$hour = "0$hour" if ($hour < 10);
$min = "0$min" if ($min < 10);
$sec = "0$sec" if ($sec < 10);
$saveyear = ($year % 100);
$year = 1900 + $year;
if ($datetype == 1) {
$date = "$days[$wday], $months[$mon] $mday, $year в $hour\:$min\:$sec";
} elsif ($datetype == 2) {
$date = "$months[$mon] $mday, $year в $hour\:$min\:$sec";
} elsif ($datetype == 3) {
$xxx3 = substr($months[$mon],1,3);
$date = "$xxx3\. $mday, $year - $hour\:$min\:$sec";
} elsif ($datetype == 4) {
$mon_num = "0$mon_num" if ($mon_num < 10);
$mday = "0$mday" if ($mday < 10);
$saveyear = "0$saveyear" if ($saveyear < 10);
$date = "$mday-$mon_num-$saveyear - $hour\:$min\:$sec";
}
}
sub lock {
local($file)=@_;
flock($file, $LOCK_EX);
}
sub unlock {
local($file)=@_;
flock($file, $LOCK_UN);
}