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

16
NEWS
View File

@ -1,4 +1,16 @@
xbps-0.6.0 (2010-07-01): xbps-0.5.2 (2010-07-18):
* 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.
* xbps-repo(8): fixed the 'genindex' target to not return error if any
package is already registered in the index.
* xbps-repo(8): improved the 'search' target to also match substrings in * xbps-repo(8): improved the 'search' target to also match substrings in
package/version tuples. package/version tuples.
@ -18,7 +30,7 @@ xbps-0.5.1 (2010-05-12):
xbps-0.5.0 (2010-05-01): xbps-0.5.0 (2010-05-01):
* xbps-repo(8): fixed the 'search' target to also match patterns against * xbps-repo(8): fixed the 'search' target to also match patterns against
its description, and not only from the package/version touple. its description, and not only from the package/version tuple.
* Cleaned up the code by using the LLVM's clang static analyzer, found * Cleaned up the code by using the LLVM's clang static analyzer, found
two possible NULL pointer dereferences in error branches and dead code. two possible NULL pointer dereferences in error branches and dead code.

View File

@ -59,7 +59,7 @@ __BEGIN_DECLS
* @def XBPS_RELVER * @def XBPS_RELVER
* Current library release date. * Current library release date.
*/ */
#define XBPS_RELVER "20100511" #define XBPS_RELVER "20100518:0.5.2"
/** /**
* @def XBPS_META_PATH * @def XBPS_META_PATH

View File

@ -1,5 +1,5 @@
/*- /*-
* Copyright (c) 2009 Juan Romero Pardines. * Copyright (c) 2009-2010 Juan Romero Pardines.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -150,8 +150,9 @@ xbps_configure_pkg(const char *pkgname, const char *version, bool check_state,
} }
if (access(buf, X_OK) == 0) { if (access(buf, X_OK) == 0) {
if ((rv = xbps_file_chdir_exec(rootdir, buf, "post", rv = xbps_file_chdir_exec(rootdir, buf, "post",
pkgname, lver, update ? "yes" : "no", NULL)) != 0) { pkgname, lver, update ? "yes" : "no", NULL);
if (rv != 0 && errno != ENOENT) {
free(buf); free(buf);
fprintf(stderr, "%s: post INSTALL action " fprintf(stderr, "%s: post INSTALL action "
"returned: %s\n", pkgname, strerror(errno)); "returned: %s\n", pkgname, strerror(errno));

View File

@ -222,7 +222,7 @@ xbps_remove_pkg(const char *pkgname, const char *version, bool update)
prepostf = true; prepostf = true;
rv = xbps_file_chdir_exec(rootdir, buf, "pre", pkgname, rv = xbps_file_chdir_exec(rootdir, buf, "pre", pkgname,
version, update ? "yes" : "no", NULL); version, update ? "yes" : "no", NULL);
if (rv != 0) { if (rv != 0 && errno != ENOENT) {
fprintf(stderr, fprintf(stderr,
"%s: prerm action target error (%s)\n", pkgname, "%s: prerm action target error (%s)\n", pkgname,
strerror(errno)); strerror(errno));
@ -284,8 +284,9 @@ xbps_remove_pkg(const char *pkgname, const char *version, bool update)
* and we aren't updating a package. * and we aren't updating a package.
*/ */
if (update == false && prepostf) { if (update == false && prepostf) {
if ((rv = xbps_file_chdir_exec(rootdir, buf, "post", rv = xbps_file_chdir_exec(rootdir, buf, "post",
pkgname, version, NULL)) != 0) { pkgname, version, NULL);
if (rv != 0 && errno != ENOENT) {
fprintf(stderr, fprintf(stderr,
"%s: postrm action target error (%s)\n", "%s: postrm action target error (%s)\n",
pkgname, strerror(errno)); pkgname, strerror(errno));

View File

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

View File

@ -183,9 +183,9 @@ unpack_archive_fini(struct archive *ar, prop_dictionary_t pkg)
} }
} }
if ((rv = xbps_file_chdir_exec(rootdir, buf, "pre", rv = xbps_file_chdir_exec(rootdir, buf, "pre",
pkgname, version, update ? "yes" : "no", pkgname, version, update ? "yes" : "no", NULL);
NULL)) != 0) { if (rv != 0 && errno != ENOENT) {
free(buf); free(buf);
fprintf(stderr, fprintf(stderr,
"%s: preinst action target error %s\n", "%s: preinst action target error %s\n",