# データファイル名 $userdata = './user.dat'; # 来客者情報が入ってるデータ $petdata = './pet.dat'; # ペットの情報が入ってるデータ $lockkey = 3; # ファイルのロック(0=no 1=mkdir 2=symlink 3=flock) $lockfile = './petlock'; # ロックファイル名 ver2.1のみ # flockモード定数 sub LOCK_EX{2} # 排他ロック sub LOCK_UN{8} # ロック解除 $method = 'POST'; # POSTかGETを選択 |
# ------------------------- # # Sub Open In Pet Data # ペットデータの読みこみ # ------------------------- # sub openinpetdata { if ($lockkey != 0) { &lock } open(IN,"$petdata") || &error("Can't open $petdata"); $line = <IN>; close(IN); ($petname,$godfather,$birth,$sex,$dead,$lastfeed,$lastplay,$lastvisit,$good,$bad,$out,$outdate,$num) = split(/<>/,$line); &unlock; } |
# ------------------------- # # Sub Open Out Pet Data # ペットデータの更新 # ------------------------- # sub openoutpetdata { $lastvisit = time; $line = "$petname<>$godfather<>$birth<>$sex<>$dead<>$lastfeed<>$lastplay<>$lastvisit<>$good<>$bad<>$out<>$outdate<>$num"; if ($lockkey != 0) { &lock } open(OUT,">$petdata") || &error("Can't write $petdata"); print OUT $line; close(OUT); &unlock; } |
# ------------------------- # # Sub Open In User Data # ユーザーデータの読みこみ # ------------------------- # sub openinuserdata { if ($lockkey != 0) { &lock } open(IN,"$userdata") || &error("Can't open $userdata"); @lines = <IN>; close(IN); &unlock; foreach $line (@lines) { ($name,$pass,$gdate,$love) = split(/<>/,$line); if ($_[0] eq 'checkname') { if ($FORM{'name'} eq $name) { $flag = 1; # データの中にユーザーを確認 if ($FORM{'pass'} ne $pass) { &error("パスワードが間違っています") } |
# ------------------------- # # Sub Open Out User Data # ユーザーデータの書きこみ # ------------------------- # sub openoutuserdata { if ($lockkey != 0) { &lock } open(OUT,">$userdata") || &error("Can't write $userdata"); print OUT @new; close(OUT); &unlock; } |
# ------------------------- # # Sub Lock # ロック # ------------------------- # sub lock { return if !$lockkey; if ($lockkey == 1) { local($flag) = 10; rmdir($lockfile) if (time - (stat($lockfile))[9] > 60); while (!mkdir($lockfile, 606)) { --$flag or &error("現在、他の人が使用しています", 1); select(undef, undef, undef, 1); } } elsif ($lockkey == 2) { unlink($lockfile) if (time - (stat($lockfile))[9] > 60); while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error('現在、他の人が使用しています') } sleep(1); } } elsif ($lockkey == 3) { open(LOCK_FH,"> $lockfile"); flock(LOCK_FH,LOCK_EX); } } # ------------------------- # # Sub Unlock # アンロック # Amend for Ver 2.2 # ------------------------- # sub unlock { if ($lockkey == 1) { rmdir($lockfile) } elsif ($lockkey == 2) { unlink($lockfile) } elsif ($lockkey == 3) { close(LOCK_FH); flock(LOCK_FH,LOCK_UN); } } |
# ------------------------- # # Sub Lock # ロック # Amend for Ver 2.2 # ------------------------- # sub lock { return if !$lockkey; if ($lockkey == 1) { local($flag) = 10; rmdir($lockfile) if (time - (stat($lockfile))[9] > 60); while (!mkdir($lockfile, 606)) { --$flag or &error("現在、他の人が使用しています", 1); select(undef, undef, undef, 1); } } elsif ($lockkey == 2) { unlink($lockfile) if (time - (stat($lockfile))[9] > 60); while (!symlink(".", $lockfile)) { if (--$retry <= 0) { &error('現在、他の人が使用しています') } sleep(1); } } elsif ($lockkey == 3) { open(LOCK_FH,"> $lockfile"); flock(LOCK_FH,LOCK_EX); } } # ------------------------- # # Sub Unlock # アンロック # Amend for Ver 2.2 # ------------------------- # sub unlock { if ($lockkey == 1) { rmdir($lockfile) } elsif ($lockkey == 2) { unlink($lockfile) } elsif ($lockkey == 3) { close(LOCK_FH); flock(LOCK_FH,LOCK_UN); } } |