svn commit: r238461 - head/usr.sbin/pkg

Alexander Kabaev kan at FreeBSD.org
Sun Jul 15 04:15:28 UTC 2012


Author: kan
Date: Sun Jul 15 04:15:27 2012
New Revision: 238461
URL: http://svn.freebsd.org/changeset/base/238461

Log:
  Make pkg bootstrap program ask for confirmation before proceeding.
  
  The previous behaviour was to silently download and install the pkg
  package, without ever telling user about what it was doing and why.
  
  Discussed with:	bapt
  Reviewed by: kib

Modified:
  head/usr.sbin/pkg/pkg.c

Modified: head/usr.sbin/pkg/pkg.c
==============================================================================
--- head/usr.sbin/pkg/pkg.c	Sun Jul 15 03:43:56 2012	(r238460)
+++ head/usr.sbin/pkg/pkg.c	Sun Jul 15 04:15:27 2012	(r238461)
@@ -389,6 +389,28 @@ cleanup:
 	return (ret);
 }
 
+static const char confirmation_message[] =
+"The package management tool is not yet installed on your system.\n"
+"Do you want to fetch and install it now? [y/N]: ";
+
+static int
+pkg_query_yes_no(void)
+{
+	int ret, c;
+
+	c = getchar();
+
+	if (c == 'y' || c == 'Y')
+		ret = 1;
+	else
+		ret = 0;
+
+	while (c != '\n' && c != EOF)
+		c = getchar();
+
+	return (ret);
+}
+
 int
 main(__unused int argc, char *argv[])
 {
@@ -397,9 +419,21 @@ main(__unused int argc, char *argv[])
 	snprintf(pkgpath, MAXPATHLEN, "%s/sbin/pkg",
 	    getenv("LOCALBASE") ? getenv("LOCALBASE") : _LOCALBASE);
 
-	if (access(pkgpath, X_OK) == -1)
+	if (access(pkgpath, X_OK) == -1) {
+		/*
+		 * Do not ask for confirmation if either of stdin or stdout is
+		 * not tty. Check the environment to see if user has answer
+		 * tucked in there already.
+		 */
+		if (getenv("ALWAYS_ASSUME_YES") == NULL &&
+		    isatty(fileno(stdin))) {
+			printf("%s", confirmation_message);
+			if (pkg_query_yes_no() == 0)
+				exit(EXIT_FAILURE);
+		}
 		if (bootstrap_pkg() != 0)
 			exit(EXIT_FAILURE);
+	}
 
 	execv(pkgpath, argv);
 


More information about the svn-src-all mailing list