[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Bug/Problem ${HOME} variable not honored on WIndows
[Thread Prev] | [Thread Next]
- Subject: Re: Bug/Problem ${HOME} variable not honored on WIndows
- From: Andreas Schneider <asn@xxxxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Tue, 15 Jan 2019 11:56:26 +0100
- To: libssh@xxxxxxxxxx
- Cc: Duane Ellis <duane@xxxxxxxxxxxxxx>
On Tuesday, January 15, 2019 9:41:38 AM CET Andreas Schneider wrote: > On Tuesday, January 15, 2019 9:21:29 AM CET Duane Ellis wrote: > > duane> Effectively - this is described as: C:\users\<USERNAME> - aka: > > The > > duane > windows Home Directory > > > > Andreas> Which seems to be correct as profiles are normally synced when > > logging in an out. > > > > Hmm - In my specific case - and numerous coworkers, my experience at large > > and small companies is this: Only a very few files are synced between the > > network and my local machine. > > > > For me - my "~/.ssh" directory is *NOT* synchronized, if it was - I would > > not be here talking about it. And turning on SYNC often greatly destroys > > unix-like "chmod" settings on windows machines. > > > > Andreas> But this only happens in MinGW? > > > > Bottom line - in my case: > > Using "Git Bash" - aka: https://git-scm.com/ > > Both Win 7 and Win 10 > > > > I'm not totally sure the difference between "git bash" which I get from > > here: "https://git-scm.com" What I know as "MingGW" = it seems to be very > > much so identical to "git-bash" but there are little "got-yas" Grrr... > > > > That said, if I set the variable "${HOME}" I expect it to be used. If not > > that, then at least something like "${SSH_CONFIG_DIR}" would be an > > alternate > > > > Others with similar problems: > > > > https://stackoverflow.com/questions/2840871/ssh-is-looking-in-the-wrong-pl > > ac e-for-the-public-private-key-pair-on-windows > > > > See the *LAST* entry - the poster refers to "Z:\" as his network domain > > policy That's my example > > Ok, so git-bash is setting the profile path correctly. However why does the > Windows function not return that path if it is set in the network and what > is the correct way to do it. > > Currently this sounds like a Windows bug we need to work around here ... > > My guess would be that %HOMEDRIVE% and %HOMEPATH% are set and used. Could you test the attached patch? Thanks -- Andreas Schneider asn@xxxxxxxxxxxxxx GPG-ID: 8DFF53E18F2ABC8D8F3C92237EE0FC4DCC014E3D
From 44cb4fe59dc814a837df7e9493e587b1c63d320e Mon Sep 17 00:00:00 2001
From: Andreas Schneider <asn@xxxxxxxxxxxxxx>
Date: Mon, 14 Jan 2019 11:51:20 +0100
Subject: [PATCH] misc: Improve home dir detection on Windows
Signed-off-by: Andreas Schneider <asn@xxxxxxxxxxxxxx>
---
src/misc.c | 100 +++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 74 insertions(+), 26 deletions(-)
diff --git a/src/misc.c b/src/misc.c
index 782b7bc0..e8bf6def 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -24,17 +24,6 @@
#include "config.h"
-#ifndef _WIN32
-/* This is needed for a standard getpwuid_r on opensolaris */
-#define _POSIX_PTHREAD_SEMANTICS
-#include <pwd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#endif /* _WIN32 */
-
#include <errno.h>
#include <limits.h>
#include <stdio.h>
@@ -51,9 +40,10 @@
#ifdef _WIN32
-#ifndef _WIN32_IE
-# define _WIN32_IE 0x0501 // SHGetSpecialFolderPath
-#endif
+#undef WINVER
+#define WINVER _WIN32_WINNT_VISTA
+#undef _WIN32_WINNT
+#define _WIN32_WINNT _WIN32_WINNT_VISTA
#include <winsock2.h> // Must be the first to include
#include <ws2tcpip.h>
@@ -64,6 +54,16 @@
#include <io.h>
#endif /* HAVE_IO_H */
+#else /* NOT WIN32 */
+
+/* This is needed for a standard getpwuid_r on opensolaris */
+#define _POSIX_PTHREAD_SEMANTICS
+#include <pwd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
#endif /* _WIN32 */
#include "libssh/priv.h"
@@ -104,21 +104,69 @@
*/
#ifdef _WIN32
-char *ssh_get_user_home_dir(void) {
- char tmp[MAX_PATH] = {0};
- char *szPath = NULL;
-
- if (SHGetSpecialFolderPathA(NULL, tmp, CSIDL_PROFILE, TRUE)) {
- szPath = malloc(strlen(tmp) + 1);
- if (szPath == NULL) {
- return NULL;
+char *ssh_get_user_home_dir(void)
+{
+ size_t home_len = 0;
+ size_t homedrive_len = 0;
+ size_t userprofile_len = 0;
+ char home[MAX_PATH] = {0};
+ char *userprofile = NULL;
+ HRESULT res;
+ int len;
+
+ len = GetEnvironmentVariable("HOME", home, sizeof(home));
+ if (len > 0 && len != sizeof(home)) {
+ if (strlen(home) == 0) {
+ goto homedrive;
+ }
+
+ return strdup(home);
}
- strcpy(szPath, tmp);
- return szPath;
- }
+homedrive:
+ len = GetEnvironmentVariable("HOMEDRIVE", home, sizeof(home));
+ if (len > 0 && len < 4) {
+ char homepath[MAX_PATH] = {0};
+ size_t userprofile_len = 0;
- return NULL;
+ len = GetEnvironmentVariable("HOMEPATH", home, sizeof(home));
+ if (len == 0 || len >= MAX_PATH) {
+ goto userprofile;
+ }
+
+ userprofile_len = strlen(home) + strlen(homepath) + 1;
+ userprofile = malloc(userprofile_len * sizeof(char));
+ if (userprofile == NULL) {
+ return NULL;
+ }
+
+ len = snprintf(userprofile, userprofile_len, "%s%s", home, homepath);
+ if (len < 0) {
+ free(userprofile);
+ return NULL;
+ }
+
+ return userprofile;
+ }
+
+userprofile:
+ res = SHGetKnownFolderPath(&FOLDERID_Profile,
+ 0,
+ NULL, /* current user */
+ (PWSTR *)home);
+ if (res != S_OK) {
+ return NULL;
+ }
+
+ userprofile_len = strlen(home) + 1;
+ userprofile = malloc(userprofile_len * sizeof(char));
+ if (userprofile == NULL) {
+ return NULL;
+ }
+
+ snprintf(userprofile, userprofile_len, "%s", home);
+
+ return userprofile;
}
/* we have read access on file */
--
2.20.1
| Re: Bug/Problem ${HOME} variable not honored on WIndows | Duane Ellis <duane@xxxxxxxxxxxxxx> |
| Bug/Problem ${HOME} variable not honored on WIndows | Duane Ellis <duane@xxxxxxxxxxxxxx> |
| RE: Bug/Problem ${HOME} variable not honored on WIndows | Duane Ellis <duane@xxxxxxxxxxxxxx> |
| Re: Bug/Problem ${HOME} variable not honored on WIndows | Andreas Schneider <asn@xxxxxxxxxxxxxx> |