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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user