diff options
Diffstat (limited to 'src/pacman.c')
-rw-r--r-- | src/pacman.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/pacman.c b/src/pacman.c index 4d06dd32..df0c7454 100644 --- a/src/pacman.c +++ b/src/pacman.c @@ -115,6 +115,7 @@ int main(int argc, char *argv[]) char *ptr = NULL; pacdb_t *db_local = NULL; char *cenv = NULL; + uid_t myuid; cenv = getenv("COLUMNS"); if(cenv) { @@ -144,6 +145,13 @@ int main(int argc, char *argv[]) return(ret); } + /* see if we're root or not */ + myuid = geteuid(); + if(!myuid && getenv("FAKEROOTKEY")) { + /* fakeroot doesn't count, we're non-root */ + myuid = 99; + } + /* check for permission */ pm_access = READ_ONLY; if(pmo_op != PM_MAIN && pmo_op != PM_QUERY && pmo_op != PM_DEPTEST) { @@ -151,7 +159,7 @@ int main(int argc, char *argv[]) (pmo_s_search || pmo_s_printuris || pmo_group || pmo_q_list || pmo_q_info)) { /* special case: PM_SYNC can be used w/ pmo_s_search by any user */ } else { - if(geteuid() != 0) { + if(myuid) { fprintf(stderr, "error: you cannot perform this operation unless you are root.\n"); return(1); } @@ -178,7 +186,7 @@ int main(int argc, char *argv[]) if(pmo_usesyslog) { openlog("pacman", 0, LOG_USER); } - if(pmo_logfile && geteuid() == 0) { + if(pmo_logfile && myuid == 0) { /* open the log file */ logfd = fopen(pmo_logfile, "a"); if(logfd == NULL) { @@ -1664,7 +1672,6 @@ int pacman_add(pacdb_t *db, PMList *targets) /* see if this is an upgrade. if so, remove the old package first */ if(pmo_upgrade) { if(is_pkgin(info, pm_packages)) { - PMList* tmp = list_new(); int retcode; printf("upgrading %s... ", info->name); @@ -1701,10 +1708,10 @@ int pacman_add(pacdb_t *db, PMList *targets) } if(oldpkg) { - list_add(tmp, strdup(info->name)); + PMList* tmp = list_add(NULL, strdup(info->name)); vprint("removing old package first...\n"); retcode = pacman_remove(db, tmp); - list_free(tmp); + FREELIST(tmp); if(retcode == 1) { fprintf(stderr, "\nupgrade aborted.\n"); return(1); |