From 95119d46d486168e7fddd5e8eece93be8e9ca719 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 19 Sep 2011 19:55:16 -0500 Subject: Flip getcwd()/chdir() for open()/fchdir() in the frontend Just like we did in libalpm in commit 288a81d8470b1. Signed-off-by: Dan McGee --- src/pacman/conf.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/pacman/conf.c b/src/pacman/conf.c index 6587be91..e8b34f7d 100644 --- a/src/pacman/conf.c +++ b/src/pacman/conf.c @@ -23,10 +23,12 @@ #include #include #include +#include /* open */ #include #include #include /* strdup */ #include +#include #include /* uname */ #include @@ -118,13 +120,11 @@ static char *get_tempfile(const char *path, const char *filename) { /** External fetch callback */ static int download_with_xfercommand(const char *url, const char *localpath, int force) { - int ret = 0; - int retval; + int ret = 0, retval; int usepart = 0; + int cwdfd; struct stat st; char *parsedcmd,*tempcmd; - char cwd[PATH_MAX]; - int restore_cwd = 0; char *destfile, *tempfile, *filename; if(!config->xfercommand) { @@ -158,10 +158,11 @@ static int download_with_xfercommand(const char *url, const char *localpath, free(tempcmd); /* save the cwd so we can restore it later */ - if(getcwd(cwd, PATH_MAX) == NULL) { + do { + cwdfd = open(".", O_RDONLY); + } while(cwdfd == -1 && errno == EINTR); + if(cwdfd < 0) { pm_printf(ALPM_LOG_ERROR, _("could not get current working directory\n")); - } else { - restore_cwd = 1; } /* cwd to the download directory */ @@ -196,9 +197,12 @@ static int download_with_xfercommand(const char *url, const char *localpath, cleanup: /* restore the old cwd if we have it */ - if(restore_cwd && chdir(cwd) != 0) { - pm_printf(ALPM_LOG_ERROR, _("could not change directory to %s (%s)\n"), - cwd, strerror(errno)); + if(cwdfd >= 0) { + if(fchdir(cwdfd) != 0) { + pm_printf(ALPM_LOG_ERROR, _("could not restore working directory (%s)\n"), + strerror(errno)); + } + close(cwdfd); } if(ret == -1) { -- cgit v1.2.3-24-g4f1b