Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 Aug 2010 21:23:24 GMT
From:      Julien Laffaye <jlaffaye@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 181848 for review
Message-ID:  <201008042123.o74LNO3d060880@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@181848?ac=10

Change 181848 by jlaffaye@jlaffaye-chulak on 2010/08/04 21:23:05

	Abort a complete package installation if a package in the set failed to install.
	A 'already installed with the same version' error is not a valid justification 
	to abort a complete package installation.
	Thus, extract_archive() returns a special error code in this case. 

Affected files ...

.. //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/complete.c#2 edit
.. //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/extract.c#14 edit
.. //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/perform.c#13 edit

Differences ...

==== //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/complete.c#2 (text+ko) ====

@@ -49,14 +49,19 @@
 		    archive_read_finish(a);
 		    return (1);
 		}
-		retcode += extract_package(a, &pkg, data->fname);
+		retcode = extract_package(a, &pkg, data->fname);
 		free_plist(&pkg);
+		if (retcode == 1) {
+		    warnx("aborting complete package installation.");
+		    archive_read_finish(a);
+		    return (1);
+		}
 	    }
 
 	    archive_read_finish(a);
 	}
 
-	return (retcode);
+	return (0);
 }
 
 static ssize_t

==== //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/extract.c#14 (text+ko) ====

@@ -36,8 +36,17 @@
 char	db_dir_tmp[FILENAME_MAX];
 char	db_dir[FILENAME_MAX];
 
+/*
+ * Extract and parse the plist of a package archive.
+ * The archive `a' must be opened by libarchive, with its internal iterator
+ * at CONTENTS_FNAME position. `archive_entry' must be a valid libarchive
+ * representation of this entry.
+ * The plist is stored in `pkg'.
+ * Returns 0 on success, 1 otherwise.
+ */
 int
-extract_plist(struct archive *a, struct archive_entry *entry, Package *pkg) {
+extract_plist(struct archive *a, struct archive_entry *entry, Package *pkg)
+{
 	char *plist_buf;
 	ssize_t s;
 	int retcode;
@@ -65,6 +74,12 @@
 	return (0);
 }
 
+/*
+ * Extract a package `fname' already opened via libarchive in `a'.
+ * The internal libarchive iterator of `a' must be at the plist entry position.
+ * Returns 0 on success, 1 on error, 2 if the package is already installed with
+ * the same version.
+ */
 int
 extract_package(struct archive *a, Package *pkg, const char *fname)
 {
@@ -111,10 +126,14 @@
 	* See if we're already registered either with the same name (the same
 	* version) or some other version with the same origin.
 	*/
-	if ((isinstalledpkg(pkg->name) > 0 ||
-	    matchbyorigin(pkg->origin, NULL) != NULL) && !Force) {
-	    warnx("package '%s' or its older version already installed%s",
-		pkg->name, FailOnAlreadyInstalled ? "" : " (ignored)");
+	if (!Force && isinstalledpkg(pkg->name) > 0) {
+	    warnx("package '%s' already installed%s", pkg->name,
+		  FailOnAlreadyInstalled ? "!" : " (ignored)");
+	    if (FailOnAlreadyInstalled == TRUE)
+		return (2);
+	} else if (!Force && matchbyorigin(pkg->origin, NULL) != NULL) {
+	    warnx("an other version of '%s' is already installed%s",
+		  pkg->origin, FailOnAlreadyInstalled ? "!" : " (ignored)");
 	    if (FailOnAlreadyInstalled == TRUE)
 		return (1);
 	}

==== //depot/projects/soc2010/pkg_complete/usr.sbin/pkg_install/add/perform.c#13 (text+ko) ====

@@ -110,7 +110,8 @@
 		    retcode = 1;
 		    goto cleanup;
 		}
-		retcode = extract_package(a, &pkg, fname);
+		if (extract_package(a, &pkg, fname) != 0)
+		    retcode = 1;
 		free_plist(&pkg);
 	    } else if (strcmp(pathname, PKG_COMPLETE_FNAME) == 0) {
 		if (Verbose)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008042123.o74LNO3d060880>