Fri Aug 5 07:04:28 2011 UTC ()
Fix for pkg_delete on NFS from Anthony Mallet.

Problem analysis from Anthony:

	On Wednesday, at 23:52, Anthony Mallet wrote:
	> # rm -rf ~tmp && mkdir ~/tmp
	> # pkg_add -K ~/tmp/var/db/pkg -p ~/tmp /usr/pkgsrc/packages/All/digest-20080510.tgz
	> # pkg_add -U -K ~/tmp/var/db/pkg -p ~/tmp /usr/pkgsrc/packages/All/digest-20080510.tgz
	> pkg_delete: Couldn't remove package directory in `/home/tho/tmp/var/db/pkg/digest-20080510'
	> Also, the dir var/db/pkg/digest-20080510.xxxxxxx is never cleaned.
	>
	> The problem apparently is that pkg_delete finds some stalled NFS entries
	> (.nfs*) in the var/db/pkg/digest-20080510 dir, so it does not delete the
	> directory. Is this due to pkg_add not correctly closing file descriptors before
	> exec'ing pkg_delete? For instance, I really don't understand the logic in
	> check_already_installed() (add/perform.c:375) regarding the open() of +CONTENTS
	> which is almost never closed (and never used as well...). Shouldn't this be
	> closed before running pkg_delete?

	ktrace shows that the +CONTENTS file is open() by pkg_add, I believe this is in
	check_already_installed(), add/perform.c:381. Then pkg_delete is run and when
	it comes to deleting the pkgdir entry, it finds that .nfs file and aborts.

Bump version to 20110805


(agc)
diff -r1.99 -r1.100 pkgsrc/pkgtools/pkg_install/files/add/perform.c
diff -r1.161 -r1.162 pkgsrc/pkgtools/pkg_install/files/lib/version.h

cvs diff -r1.99 -r1.100 pkgsrc/pkgtools/pkg_install/files/add/perform.c (expand / switch to context diff)
--- pkgsrc/pkgtools/pkg_install/files/add/perform.c 2010/12/12 13:18:38 1.99
+++ pkgsrc/pkgtools/pkg_install/files/add/perform.c 2011/08/05 07:04:28 1.100
@@ -1,4 +1,4 @@
-/*	$NetBSD: perform.c,v 1.99 2010/12/12 13:18:38 wiz Exp $	*/
+/*	$NetBSD: perform.c,v 1.100 2011/08/05 07:04:28 agc Exp $	*/
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -6,7 +6,7 @@
 #if HAVE_SYS_CDEFS_H
 #include <sys/cdefs.h>
 #endif
-__RCSID("$NetBSD: perform.c,v 1.99 2010/12/12 13:18:38 wiz Exp $");
+__RCSID("$NetBSD: perform.c,v 1.100 2011/08/05 07:04:28 agc Exp $");
 
 /*-
  * Copyright (c) 2003 Grant Beattie <grant@NetBSD.org>
@@ -382,6 +382,7 @@
 	free(filename);
 	if (fd == -1)
 		return 1;
+	close(fd);
 
 	if (ReplaceSame) {
 		struct stat sb;
@@ -411,7 +412,6 @@
 		warnx("package `%s' already recorded as installed",
 		      pkg->pkgname);
 	}
-	close(fd);
 	return 0;
 
 }

cvs diff -r1.161 -r1.162 pkgsrc/pkgtools/pkg_install/files/lib/version.h (expand / switch to context diff)
--- pkgsrc/pkgtools/pkg_install/files/lib/version.h 2011/02/18 15:59:52 1.161
+++ pkgsrc/pkgtools/pkg_install/files/lib/version.h 2011/08/05 07:04:28 1.162
@@ -1,4 +1,4 @@
-/*	$NetBSD: version.h,v 1.161 2011/02/18 15:59:52 aymeric Exp $	*/
+/*	$NetBSD: version.h,v 1.162 2011/08/05 07:04:28 agc Exp $	*/
 
 /*
  * Copyright (c) 2001 Thomas Klausner.  All rights reserved.
@@ -27,6 +27,6 @@
 #ifndef _INST_LIB_VERSION_H_
 #define _INST_LIB_VERSION_H_
 
-#define PKGTOOLS_VERSION 20110215
+#define PKGTOOLS_VERSION 20110805
 
 #endif /* _INST_LIB_VERSION_H_ */