[pacman-dev] [PATCH 2/2] We don't need root with -Sp

Nagy Gabor ngaba at bibl.u-szeged.hu
Sat May 16 12:26:19 EDT 2009


From 4531be12ace34a952e5d84e70f464f4643957793 Mon Sep 17 00:00:00 2001
From: Nagy Gabor <ngaba at bibl.u-szeged.hu>
Date: Sat, 16 May 2009 17:59:45 +0200
Subject: [PATCH 2/2] We don't need root with -Sp

FS#8905 is fixed. The front-end passes PM_TRANS_FLAG_NOLOCK to the back-end,
so it doesn't lock the database. That's why we don't need root anymore.

I reworked (and renamed) needs_transaction() accordingly. I also added
missing -Sc check there (for example, -Sci didn't print non-root error, but
pacman wanted to lock the database).

Signed-off-by: Nagy Gabor <ngaba at bibl.u-szeged.hu>
---
 src/pacman/pacman.c |    3 ++-
 src/pacman/util.c   |   19 ++++++++-----------
 src/pacman/util.h   |    2 +-
 3 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index b94b28e..3b8636c 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -481,6 +481,7 @@ static int parseargs(int argc, char *argv[])
 				config->op_q_isfile = 1;
 				config->op_s_printuris = 1;
 				config->flags |= PM_TRANS_FLAG_NOCONFLICTS;
+				config->flags |= PM_TRANS_FLAG_NOLOCK;
 				break;
 			case 'q':
 				config->quiet = 1;
@@ -900,7 +901,7 @@ int main(int argc, char *argv[])
 
 #if defined(HAVE_GETEUID) && !defined(CYGWIN)
 	/* check if we have sufficient permission for the requested operation */
-	if(myuid > 0 && needs_transaction()) {
+	if(myuid > 0 && needs_root()) {
 		pm_printf(PM_LOG_ERROR, _("you cannot perform this operation unless you are root.\n"));
 		cleanup(EXIT_FAILURE);
 	}
diff --git a/src/pacman/util.c b/src/pacman/util.c
index a280252..8056fbd 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -69,19 +69,16 @@ int trans_release(void)
 	return(0);
 }
 
-int needs_transaction(void)
+int needs_root(void)
 {
-	if(config->op != PM_OP_MAIN && config->op != PM_OP_QUERY && config->op != PM_OP_DEPTEST) {
-		if((config->op == PM_OP_SYNC && !config->op_s_sync &&
-				(config->op_s_search || config->group || config->op_q_list || config->op_q_info))
-			 || config->op == PM_OP_DEPTEST) {
-			/* special case: PM_OP_SYNC can be used w/ config->op_s_search by any user */
-			return(0);
-		} else {
-			return(1);
-		}
+	if(config->op == PM_OP_UPGRADE || config->op == PM_OP_REMOVE || /* -U, -R */
+	   (config->op == PM_OP_SYNC && (config->op_s_clean || config->op_s_sync || /* -Sc, -Sy */
+	      (!config->group && !config->op_s_info && !config->op_q_list /* all other -S combinations, where */
+	        && !config->op_s_search && !config->op_s_printuris)))) {  /* -g, -i, -l, -s, -p is not set */
+		return(1);
+	} else {
+		return(0);
 	}
-	return(0);
 }
 
 /* gets the current screen column width */
diff --git a/src/pacman/util.h b/src/pacman/util.h
index 6416858..b159018 100644
--- a/src/pacman/util.h
+++ b/src/pacman/util.h
@@ -38,7 +38,7 @@
 
 int trans_init(pmtranstype_t type, pmtransflag_t flags);
 int trans_release(void);
-int needs_transaction(void);
+int needs_root(void);
 int getcols(void);
 int makepath(const char *path);
 int rmrf(const char *path);
-- 
1.6.3.1



More information about the pacman-dev mailing list