From 95119d46d486168e7fddd5e8eece93be8e9ca719 Mon Sep 17 00:00:00 2001
From: Dan McGee <dan@archlinux.org>
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 <dan@archlinux.org>
---
 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 <errno.h>
 #include <glob.h>
 #include <limits.h>
+#include <fcntl.h> /* open */
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h> /* strdup */
 #include <sys/stat.h>
+#include <sys/types.h>
 #include <sys/utsname.h> /* uname */
 #include <unistd.h>
 
@@ -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-54-g00ecf