1
0
mirror of https://github.com/moparisthebest/pacman synced 2024-12-23 00:08:50 -05:00

Flip getcwd()/chdir() for open()/fchdir() in the frontend

Just like we did in libalpm in commit 288a81d847.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2011-09-19 19:55:16 -05:00
parent 288a81d847
commit 95119d46d4

View File

@ -23,10 +23,12 @@
#include <errno.h> #include <errno.h>
#include <glob.h> #include <glob.h>
#include <limits.h> #include <limits.h>
#include <fcntl.h> /* open */
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> /* strdup */ #include <string.h> /* strdup */
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h>
#include <sys/utsname.h> /* uname */ #include <sys/utsname.h> /* uname */
#include <unistd.h> #include <unistd.h>
@ -118,13 +120,11 @@ static char *get_tempfile(const char *path, const char *filename) {
/** External fetch callback */ /** External fetch callback */
static int download_with_xfercommand(const char *url, const char *localpath, static int download_with_xfercommand(const char *url, const char *localpath,
int force) { int force) {
int ret = 0; int ret = 0, retval;
int retval;
int usepart = 0; int usepart = 0;
int cwdfd;
struct stat st; struct stat st;
char *parsedcmd,*tempcmd; char *parsedcmd,*tempcmd;
char cwd[PATH_MAX];
int restore_cwd = 0;
char *destfile, *tempfile, *filename; char *destfile, *tempfile, *filename;
if(!config->xfercommand) { if(!config->xfercommand) {
@ -158,10 +158,11 @@ static int download_with_xfercommand(const char *url, const char *localpath,
free(tempcmd); free(tempcmd);
/* save the cwd so we can restore it later */ /* 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")); pm_printf(ALPM_LOG_ERROR, _("could not get current working directory\n"));
} else {
restore_cwd = 1;
} }
/* cwd to the download directory */ /* cwd to the download directory */
@ -196,9 +197,12 @@ static int download_with_xfercommand(const char *url, const char *localpath,
cleanup: cleanup:
/* restore the old cwd if we have it */ /* restore the old cwd if we have it */
if(restore_cwd && chdir(cwd) != 0) { if(cwdfd >= 0) {
pm_printf(ALPM_LOG_ERROR, _("could not change directory to %s (%s)\n"), if(fchdir(cwdfd) != 0) {
cwd, strerror(errno)); pm_printf(ALPM_LOG_ERROR, _("could not restore working directory (%s)\n"),
strerror(errno));
}
close(cwdfd);
} }
if(ret == -1) { if(ret == -1) {