libxbps: some random bugfixes.

* libxbps: while running INSTALL/REMOVE scripts, do not fail if a script
  returns ENOENT but the script exists; that means the script did not match
  the expected action on its switch statement and the fact can be simply
  ignored.

* libxbps: while upgrading packages and searching for obsolete files,
  do not remove the files that did not match previous SHA256 hash. Also,
  only remove obsolete dangling symlinks.
This commit is contained in:
Juan RP
2010-05-18 07:46:27 +02:00
parent 42af3ac533
commit 76ca32e76f
6 changed files with 75 additions and 24 deletions

View File

@@ -1,5 +1,5 @@
/*-
* Copyright (c) 2009 Juan Romero Pardines.
* Copyright (c) 2009-2010 Juan Romero Pardines.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -23,11 +23,14 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <xbps_api.h>
@@ -37,8 +40,10 @@ xbps_remove_obsoletes(prop_dictionary_t oldd, prop_dictionary_t newd)
prop_object_iterator_t iter, iter2 = NULL;
prop_object_t obj, obj2 = NULL;
prop_string_t oldstr = NULL, newstr = NULL;
struct stat st;
const char *array_str = "files";
char *buf = NULL;
const char *oldhash = NULL;
char *file = NULL;
int rv = 0;
bool found, dolinks = false;
@@ -56,12 +61,47 @@ again:
* the old package list not found in new package list.
*/
while ((obj = prop_object_iterator_next(iter))) {
rv = 0;
found = false;
oldstr = prop_dictionary_get(obj, "file");
if (oldstr == NULL) {
rv = errno;
goto out;
}
file = xbps_xasprintf(".%s",
prop_string_cstring_nocopy(oldstr));
if (file == NULL) {
rv = errno;
goto out;
}
if (strcmp(array_str, "files") == 0) {
prop_dictionary_get_cstring_nocopy(obj,
"sha256", &oldhash);
rv = xbps_check_file_hash(file, oldhash);
if (rv == ENOENT || rv == ERANGE) {
/*
* Skip unexistent and files that do not
* match the hash.
*/
free(file);
continue;
}
} else {
/*
* Only remove dangling symlinks.
*/
if (stat(file, &st) == -1) {
if (errno != ENOENT) {
free(file);
rv = errno;
goto out;
}
} else {
free(file);
continue;
}
}
while ((obj2 = prop_object_iterator_next(iter2))) {
newstr = prop_dictionary_get(obj2, "file");
if (newstr == NULL) {
@@ -74,29 +114,26 @@ again:
}
}
prop_object_iterator_reset(iter2);
if (found)
if (found) {
free(file);
continue;
}
/*
* Obsolete file found, remove it.
*/
buf = xbps_xasprintf(".%s", prop_string_cstring_nocopy(oldstr));
if (buf == NULL) {
rv = errno;
goto out;
}
if (remove(buf) == -1) {
if (remove(file) == -1) {
fprintf(stderr,
"WARNING: couldn't remove obsolete %s: %s\n",
dolinks ? "link" : "file",
prop_string_cstring_nocopy(oldstr));
free(buf);
free(file);
continue;
}
printf("Removed obsolete %s: %s\n",
dolinks ? "link" : "file",
prop_string_cstring_nocopy(oldstr));
free(buf);
free(file);
}
if (!dolinks) {
/*
@@ -115,4 +152,4 @@ out:
prop_object_iterator_release(iter);
return rv;
}
}