Browse code

various improvements

git-svn: trunk@3454

Tomasz Kojm authored on 2007/12/22 10:45:40
Showing 2 changed files
... ...
@@ -1,3 +1,8 @@
1
+Sat Dec 22 02:07:55 CET 2007 (tk)
2
+---------------------------------
3
+  * freshclam/manager.c: improve db check; make new db available already
4
+			 in unlink-rename time window
5
+
1 6
 Sat Dec 22 00:10:53 CET 2007 (tk)
2 7
 ---------------------------------
3 8
   * libclamav: various platform-specific cleanups
... ...
@@ -910,7 +910,7 @@ static int updatedb(const char *dbname, const char *hostname, char *ip, int *sig
910 910
 	const struct cfgstruct *cpt;
911 911
 	unsigned int nodb = 0, currver = 0, newver = 0, port = 0, i, j;
912 912
 	int ret, ims = -1;
913
-	char *pt, cvdfile[32], localname[32], *tmpdir = NULL, *newfile, cwd[512];
913
+	char *pt, cvdfile[32], localname[32], *tmpdir = NULL, *newfile, newdb[512], cwd[512];
914 914
 	const char *proxy = NULL, *user = NULL, *pass = NULL, *uas = NULL;
915 915
 	unsigned int flevel = cl_retflevel(), maxattempts;
916 916
 	int ctimeout, rtimeout;
... ...
@@ -1099,32 +1099,49 @@ static int updatedb(const char *dbname, const char *hostname, char *ip, int *sig
1099 1099
 	}
1100 1100
     }
1101 1101
 
1102
-    if(!nodb && !access(cvdfile, R_OK) && unlink(cvdfile)) {
1103
-	logg("!Can't unlink %s. Please fix it and try again.\n", cvdfile);
1102
+    if(!(current = cl_cvdhead(newfile))) {
1103
+	logg("!Can't parse new database %s\n",newfile);
1104 1104
 	unlink(newfile);
1105 1105
 	free(newfile);
1106
-	return 53;
1106
+	return 55; /* FIXME */
1107 1107
     }
1108 1108
 
1109
-    if(!nodb && strcmp(cvdfile, localname) && !access(localname, R_OK) && unlink(localname)) {
1110
-	logg("!Can't unlink %s. Please fix it and try again.\n", localname);
1109
+    if(strlen(newfile) > 507) { /* shouldn't happen */
1110
+	logg("!newfile: File name too long\n");
1111 1111
 	unlink(newfile);
1112 1112
 	free(newfile);
1113
-	return 53;
1113
+	return 70; /* FIXME */
1114 1114
     }
1115 1115
 
1116
-    if(rename(newfile, localname) == -1) {
1117
-	logg("!Can't rename %s to %s\n", newfile, localname);
1116
+    if(strstr(localname, ".cld"))
1117
+	snprintf(newdb, sizeof(newdb), "%s.cld", newfile);
1118
+    else
1119
+	snprintf(newdb, sizeof(newdb), "%s.cvd", newfile);
1120
+
1121
+    if(rename(newfile, newdb) == -1) {
1122
+	logg("!Can't rename %s to %s\n", newfile, newdb);
1118 1123
 	unlink(newfile);
1119 1124
 	free(newfile);
1120 1125
 	return 57;
1121 1126
     }
1122 1127
     free(newfile);
1123 1128
 
1124
-    if(!(current = cl_cvdhead(localname))) {
1125
-	logg("!Can't parse new database %s\n", localname);
1126
-	unlink(localname);
1127
-	return 55; /* FIXME */
1129
+    if(!nodb && !access(cvdfile, R_OK) && unlink(cvdfile)) {
1130
+	logg("!Can't unlink %s. Please fix it and try again.\n", cvdfile);
1131
+	unlink(newdb);
1132
+	return 53;
1133
+    }
1134
+
1135
+    if(!nodb && strcmp(cvdfile, localname) && !access(localname, R_OK) && unlink(localname)) {
1136
+	logg("!Can't unlink %s. Please fix it and try again.\n", localname);
1137
+	unlink(newdb);
1138
+	return 53;
1139
+    }
1140
+
1141
+    if(rename(newdb, localname) == -1) {
1142
+	logg("!Can't rename %s to %s\n", newdb, localname);
1143
+	unlink(newdb);
1144
+	return 57;
1128 1145
     }
1129 1146
 
1130 1147
     logg("%s updated (version: %d, sigs: %d, f-level: %d, builder: %s)\n", localname, current->version, current->sigs, current->fl, current->builder);