| 655 |
// (2013.3.21 yutaka) |
// (2013.3.21 yutaka) |
| 656 |
static void LogRotate(void) |
static void LogRotate(void) |
| 657 |
{ |
{ |
| 658 |
const int loopmax = 10000; // XXX |
int loopmax = 10000; // XXX |
| 659 |
char filename[1024]; |
char filename[1024]; |
| 660 |
int i; |
char newfile[1024], oldfile[1024]; |
| 661 |
|
int i, k; |
| 662 |
int dwShareMode = 0; |
int dwShareMode = 0; |
| 663 |
|
|
| 664 |
if (! LogVar->FileOpen) return; |
if (! LogVar->FileOpen) return; |
| 681 |
// いったん今のファイルをクローズして、別名のファイルをオープンする。 |
// いったん今のファイルをクローズして、別名のファイルをオープンする。 |
| 682 |
_lclose(LogVar->FileHandle); |
_lclose(LogVar->FileHandle); |
| 683 |
|
|
| 684 |
for (i = 1 ; i < loopmax ; i++) { |
// 世代ローテーションのステップ数の指定があるか |
| 685 |
|
if (LogVar->RotateStep > 0) |
| 686 |
|
loopmax = LogVar->RotateStep; |
| 687 |
|
|
| 688 |
|
for (i = 1 ; i <= loopmax ; i++) { |
| 689 |
_snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i); |
_snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i); |
| 690 |
if (_access_s(filename, 0) != 0) |
if (_access_s(filename, 0) != 0) |
| 691 |
break; |
break; |
| 692 |
} |
} |
| 693 |
if (i >= loopmax) { |
if (i > loopmax) { |
| 694 |
// TODO: |
// 世代がいっぱいになったら、最古のファイルから廃棄する。 |
| 695 |
|
i = loopmax; |
| 696 |
} |
} |
| 697 |
|
|
| 698 |
// 別ファイルにリネーム。 |
// 別ファイルにリネーム。 |
| 699 |
rename(LogVar->FullName, filename); |
for (k = i-1 ; k >= 0 ; k--) { |
| 700 |
|
if (k == 0) |
| 701 |
|
strncpy_s(oldfile, sizeof(oldfile), LogVar->FullName, _TRUNCATE); |
| 702 |
|
else |
| 703 |
|
_snprintf_s(oldfile, sizeof(oldfile), _TRUNCATE, "%s.%d", LogVar->FullName, k); |
| 704 |
|
_snprintf_s(newfile, sizeof(newfile), _TRUNCATE, "%s.%d", LogVar->FullName, k+1); |
| 705 |
|
remove(newfile); |
| 706 |
|
if (rename(oldfile, newfile) != 0) { |
| 707 |
|
OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno); |
| 708 |
|
} |
| 709 |
|
} |
| 710 |
|
|
| 711 |
// 再オープン |
// 再オープン |
| 712 |
if (ts.LogLockExclusive) { |
if (ts.LogLockExclusive) { |