aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2019-04-01 10:30:40 +0100
committerRon Yorston <rmy@pobox.com>2019-04-01 10:30:40 +0100
commit69d328022ebbde0595d328dd0e9d569a93a2d662 (patch)
treeedba59f541e332027cc8f973a4b95e25fb785eeb
parent8b340122e5c5014358a4919d1e87ef2f81c83b6f (diff)
downloadbusybox-w32-69d328022ebbde0595d328dd0e9d569a93a2d662.tar.gz
busybox-w32-69d328022ebbde0595d328dd0e9d569a93a2d662.tar.bz2
busybox-w32-69d328022ebbde0595d328dd0e9d569a93a2d662.zip
win32: track current directory of mapped drives
Drives mapped to a network share or path didn't have their current directory tracked when using path names of the form 'c:path'. This was because commit 585d17d26 used realpath(3) to canonicalise paths in chdir(2). Use readlink(2) instead so that mapped drives aren't canonicalised but symlinks are resolved. See GitHub issue #147.
-rw-r--r--win32/mingw.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/win32/mingw.c b/win32/mingw.c
index ec7d6c456..22a3ede58 100644
--- a/win32/mingw.c
+++ b/win32/mingw.c
@@ -1204,13 +1204,16 @@ int mingw_mkdir(const char *path, int mode UNUSED_PARAM)
1204#undef chdir 1204#undef chdir
1205int mingw_chdir(const char *dirname) 1205int mingw_chdir(const char *dirname)
1206{ 1206{
1207 struct stat st;
1207 int ret = -1; 1208 int ret = -1;
1208 char *realdir = xmalloc_realpath(dirname); 1209 const char *realdir = dirname;
1210
1211 if (lstat(dirname, &st) == 0 && S_ISLNK(st.st_mode))
1212 realdir = auto_string(xmalloc_readlink(dirname));
1209 1213
1210 if (realdir) { 1214 if (realdir)
1211 ret = chdir(realdir); 1215 ret = chdir(realdir);
1212 free(realdir); 1216
1213 }
1214 return ret; 1217 return ret;
1215} 1218}
1216 1219