From 4531be12ace34a952e5d84e70f464f4643957793 Mon Sep 17 00:00:00 2001 From: Nagy Gabor <ngaba@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@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