It now correctly backs up the (still corrupt) status file

This commit is contained in:
Glenn L McGrath 2001-04-08 07:18:08 +00:00
parent 0e757a2f3f
commit 13e9c7ad82
2 changed files with 42 additions and 20 deletions

View File

@ -478,7 +478,6 @@ static int status_merge(void *status, package_t *pkgs)
char *line = NULL; char *line = NULL;
package_t *pkg = 0, *statpkg = 0; package_t *pkg = 0, *statpkg = 0;
package_t locpkg; package_t locpkg;
int r = 0;
if ((fout = wfopen(new_statusfile, "w")) == NULL) { if ((fout = wfopen(new_statusfile, "w")) == NULL) {
return 0; return 0;
@ -486,7 +485,10 @@ static int status_merge(void *status, package_t *pkgs)
if (getenv(udpkg_quiet) == NULL) { if (getenv(udpkg_quiet) == NULL) {
printf("(Updating database...)\n"); printf("(Updating database...)\n");
} }
if ((fin = wfopen(statusfile, "r")) != NULL) { /*
* Dont use wfopen here, handle errors ourself
*/
if ((fin = fopen(statusfile, "r")) != NULL) {
while (((line = get_line_from_file(fin)) != NULL) && !feof(fin)) { while (((line = get_line_from_file(fin)) != NULL) && !feof(fin)) {
line[strlen(line) - 1] = '\0'; /* trim newline */ line[strlen(line) - 1] = '\0'; /* trim newline */
/* If we see a package header, find out if it's a package /* If we see a package header, find out if it's a package
@ -495,14 +497,14 @@ static int status_merge(void *status, package_t *pkgs)
* *
* we also look at packages in the status cache and update * we also look at packages in the status cache and update
* their status fields * their status fields
*/ */
if (strstr(line, "Package: ") == line) { if (strstr(line, "Package: ") == line) {
for (pkg = pkgs; pkg != 0 && strcmp(line + 9, for (pkg = pkgs; pkg != 0 && strcmp(line + 9,
pkg->package) != 0; pkg = pkg->next) ; pkg->package) != 0; pkg = pkg->next) ;
locpkg.package = line + 9; locpkg.package = line + 9;
statpkg = tfind(&locpkg, &status, package_compare); statpkg = tfind(&locpkg, &status, package_compare);
/* note: statpkg should be non-zero, unless the status /* note: statpkg should be non-zero, unless the status
* file was changed while we are processing (no locking * file was changed while we are processing (no locking
* is currently done... * is currently done...
@ -521,6 +523,7 @@ static int status_merge(void *status, package_t *pkgs)
fputs(line, fout); fputs(line, fout);
fputc('\n', fout); fputc('\n', fout);
} }
fclose(fin);
} }
free(line); free(line);
@ -538,16 +541,24 @@ static int status_merge(void *status, package_t *pkgs)
fprintf(fout, "Description: %s\n", pkg->description); fprintf(fout, "Description: %s\n", pkg->description);
fputc('\n', fout); fputc('\n', fout);
} }
fclose(fin);
fclose(fout); fclose(fout);
r = rename(statusfile, bak_statusfile); /*
if (r == 0) { * Its ok if renaming statusfile fails becasue it doesnt exist
r = rename(new_statusfile, statusfile); */
if (rename(statusfile, bak_statusfile) == -1) {
struct stat stat_buf;
error_msg("Couldnt create backup status file");
if (stat(statusfile, &stat_buf) == 0) {
return(EXIT_FAILURE);
}
} }
return 0; if (rename(new_statusfile, statusfile) == -1) {
error_msg("Couldnt create status file");
return(EXIT_FAILURE);
}
return(EXIT_SUCCESS);
} }
static int is_file(const char *fn) static int is_file(const char *fn)

31
dpkg.c
View File

@ -478,7 +478,6 @@ static int status_merge(void *status, package_t *pkgs)
char *line = NULL; char *line = NULL;
package_t *pkg = 0, *statpkg = 0; package_t *pkg = 0, *statpkg = 0;
package_t locpkg; package_t locpkg;
int r = 0;
if ((fout = wfopen(new_statusfile, "w")) == NULL) { if ((fout = wfopen(new_statusfile, "w")) == NULL) {
return 0; return 0;
@ -486,7 +485,10 @@ static int status_merge(void *status, package_t *pkgs)
if (getenv(udpkg_quiet) == NULL) { if (getenv(udpkg_quiet) == NULL) {
printf("(Updating database...)\n"); printf("(Updating database...)\n");
} }
if ((fin = wfopen(statusfile, "r")) != NULL) { /*
* Dont use wfopen here, handle errors ourself
*/
if ((fin = fopen(statusfile, "r")) != NULL) {
while (((line = get_line_from_file(fin)) != NULL) && !feof(fin)) { while (((line = get_line_from_file(fin)) != NULL) && !feof(fin)) {
line[strlen(line) - 1] = '\0'; /* trim newline */ line[strlen(line) - 1] = '\0'; /* trim newline */
/* If we see a package header, find out if it's a package /* If we see a package header, find out if it's a package
@ -495,14 +497,14 @@ static int status_merge(void *status, package_t *pkgs)
* *
* we also look at packages in the status cache and update * we also look at packages in the status cache and update
* their status fields * their status fields
*/ */
if (strstr(line, "Package: ") == line) { if (strstr(line, "Package: ") == line) {
for (pkg = pkgs; pkg != 0 && strcmp(line + 9, for (pkg = pkgs; pkg != 0 && strcmp(line + 9,
pkg->package) != 0; pkg = pkg->next) ; pkg->package) != 0; pkg = pkg->next) ;
locpkg.package = line + 9; locpkg.package = line + 9;
statpkg = tfind(&locpkg, &status, package_compare); statpkg = tfind(&locpkg, &status, package_compare);
/* note: statpkg should be non-zero, unless the status /* note: statpkg should be non-zero, unless the status
* file was changed while we are processing (no locking * file was changed while we are processing (no locking
* is currently done... * is currently done...
@ -521,6 +523,7 @@ static int status_merge(void *status, package_t *pkgs)
fputs(line, fout); fputs(line, fout);
fputc('\n', fout); fputc('\n', fout);
} }
fclose(fin);
} }
free(line); free(line);
@ -538,16 +541,24 @@ static int status_merge(void *status, package_t *pkgs)
fprintf(fout, "Description: %s\n", pkg->description); fprintf(fout, "Description: %s\n", pkg->description);
fputc('\n', fout); fputc('\n', fout);
} }
fclose(fin);
fclose(fout); fclose(fout);
r = rename(statusfile, bak_statusfile); /*
if (r == 0) { * Its ok if renaming statusfile fails becasue it doesnt exist
r = rename(new_statusfile, statusfile); */
if (rename(statusfile, bak_statusfile) == -1) {
struct stat stat_buf;
error_msg("Couldnt create backup status file");
if (stat(statusfile, &stat_buf) == 0) {
return(EXIT_FAILURE);
}
} }
return 0; if (rename(new_statusfile, statusfile) == -1) {
error_msg("Couldnt create status file");
return(EXIT_FAILURE);
}
return(EXIT_SUCCESS);
} }
static int is_file(const char *fn) static int is_file(const char *fn)