Hi Thibaut and Radek! From all my testing on three different ThinkPads I can say: Thibaut, your database corruption detection patch appears to work just fine!
On my T520 it received the heaviest testing. Due to Sandybridge gfx lockup problems in 2.6.39 as well as some other issues and testing, I had a lots of unclean shutdowns. The uptime database is intact. So, you provided a solution that works. Please apply it to the package officially. Attached is your patch with the filesize comparison fix you proposed later on. Thanks, -- Martin 'Helios' Steigerwald - http://www.Lichtvoll.de GPG: 03B0 0D6C 0040 0710 4AFA B82F 991B EAAC A599 84C7
diff -Nru uptimed-0.3.16.orig/libuptimed/urec.c uptimed-0.3.16/libuptimed/urec.c
--- uptimed-0.3.16.orig/libuptimed/urec.c 2009-01-02 00:46:00.000000000 +0100
+++ uptimed-0.3.16/libuptimed/urec.c 2011-03-06 21:01:28.000000000 +0100
@@ -215,20 +215,46 @@
time_t utime, btime;
long l_utime, l_btime;
char buf[256], sys[SYSMAX+1];
+ struct stat filestat, filestatold;
+ int useold = 0;
- f = fopen(FILE_RECORDS, "r");
- if (!f) {
- f = fopen(FILE_RECORDS".old", "r");
- if (!f) return;
+ if (stat(FILE_RECORDS, &filestat))
+ useold = 1;
+ if (stat(FILE_RECORDS".old", &filestatold))
+ useold = -1;
+
+ /* assume that backupdb larger than normal db means normal is corrupted */
+ if (!useold && (filestat.st_size < filestatold.st_size))
+ useold = 1;
- printf("uptimed: reading from backup database %s.old\n", FILE_RECORDS);
+dbtry:
+ switch (useold) {
+ case 0:
+ f = fopen(FILE_RECORDS, "r");
+ break;
+ case 1:
+ f = fopen(FILE_RECORDS".old", "r");
+ printf("uptimed: reading from backup database %s.old\n", FILE_RECORDS);
+ break;
+ default:
+ /* this should probably terminate uptimed somehow */
+ printf("uptimed: no useable database found.\n");
+ return;
+ }
+
+ if (!f) {
+ printf("uptimed: error opening database for reading.\n");
+ return;
}
fgets(str, sizeof(str), f);
while (!feof(f)) {
/* Check for validity of input string. */
if (sscanf(str, "%ld:%ld:%[^]\n]", &l_utime, &l_btime, buf) != 3) {
- /* Skip this entry. Do we want feedback here? */
+ /* database is corrupted */
+ fclose(f);
+ useold++;
+ goto dbtry;
} else {
utime = (time_t)l_utime;
btime = (time_t)l_btime;
diff -Nru uptimed-0.3.16.orig/libuptimed/urec.h uptimed-0.3.16/libuptimed/urec.h
--- uptimed-0.3.16.orig/libuptimed/urec.h 2009-01-02 00:46:00.000000000 +0100
+++ uptimed-0.3.16/libuptimed/urec.h 2011-03-06 20:48:49.000000000 +0100
@@ -21,6 +21,7 @@
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
+#include <sys/stat.h>
#ifdef PLATFORM_LINUX
#include <sys/sysinfo.h>
signature.asc
Description: This is a digitally signed message part.

