Skip to content

Commit

Permalink
WIP: win32: detect unix socket support at runtime
Browse files Browse the repository at this point in the history
Windows 10 build 17063 introduced support for unix sockets to Windows.
bb390b1 (git-compat-util: include declaration for unix sockets in
windows, 2021-09-14) introduced a way to build git with unix socket
support on Windows, but you still had to know at build time which
Windows version the compiled executable was supposed to run on.

We can detect at runtime wether the operating system supports unix
sockets and act accordingly for all supported Windows versions.

Signed-off-by: Matthias Aßhauer <mha1993@live.de>
  • Loading branch information
rimrul committed Jan 10, 2024
1 parent 4b968f3 commit d733052
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 2 deletions.
3 changes: 3 additions & 0 deletions builtin/credential-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,9 @@ int cmd_credential_cache(int argc, const char **argv, const char *prefix)
usage_with_options(usage, options);
op = argv[0];

if (!can_use_unix_sockets())
die(_("credential-cache unavailable; no unix socket support"));

if (!socket_path)
socket_path = get_socket_path();
if (!socket_path)
Expand Down
19 changes: 19 additions & 0 deletions compat/mingw.c
Original file line number Diff line number Diff line change
Expand Up @@ -4157,3 +4157,22 @@ int file_attr_to_st_mode (DWORD attr, DWORD tag, const char *path)
fMode |= S_IWRITE;
return fMode;
}

int mingw_can_use_unix_sockets(void)
{
SC_HANDLE scm, srvc;
SERVICE_STATUS_PROCESS status;
DWORD bytes;
int ret = 0;
scm = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
if (scm) {
srvc = OpenServiceA(scm, "afunix", SERVICE_QUERY_STATUS);
if (srvc) {
if(QueryServiceStatusEx(srvc, SC_STATUS_PROCESS_INFO, (LPBYTE)&status, sizeof(SERVICE_STATUS_PROCESS), &bytes))
ret = status.dwCurrentState == SERVICE_RUNNING;
CloseServiceHandle(srvc);
}
CloseServiceHandle(scm);
}
return ret;
}
6 changes: 6 additions & 0 deletions compat/mingw.h
Original file line number Diff line number Diff line change
Expand Up @@ -729,3 +729,9 @@ int err_win_to_posix(DWORD winerr);
* Check current process is inside Windows Container.
*/
int is_inside_windows_container(void);

#ifndef NO_UNIX_SOCKETS
int mingw_can_use_unix_sockets(void);
#undef can_use_unix_sockets
#define can_use_unix_sockets mingw_can_use_unix_sockets
#endif
4 changes: 2 additions & 2 deletions config.mak.uname
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ ifeq ($(uname_S),Windows)
NO_POLL = YesPlease
NO_SYMLINK_HEAD = YesPlease
NO_IPV6 = YesPlease
NO_UNIX_SOCKETS = YesPlease
#NO_UNIX_SOCKETS = YesPlease
NO_SETENV = YesPlease
NO_STRCASESTR = YesPlease
NO_STRLCPY = YesPlease
Expand Down Expand Up @@ -639,7 +639,7 @@ ifeq ($(uname_S),MINGW)
NO_LIBGEN_H = YesPlease
NO_POLL = YesPlease
NO_SYMLINK_HEAD = YesPlease
NO_UNIX_SOCKETS = YesPlease
#NO_UNIX_SOCKETS = YesPlease
NO_SETENV = YesPlease
NO_STRCASESTR = YesPlease
NO_STRLCPY = YesPlease
Expand Down
11 changes: 11 additions & 0 deletions git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -1617,4 +1617,15 @@ static inline void *container_of_or_null_offset(void *ptr, size_t offset)
((uintptr_t)&(ptr)->member - (uintptr_t)(ptr))
#endif /* !__GNUC__ */

#ifndef GIT_WINDOWS_NATIVE
static inline int _can_use_unix_sockets(void)
{
#if defined(NO_UNIX_SOCKETS)
return 0;
#else
return 1;
#endif
}
#define can_use_unix_sockets _can_use_unix_sockets
#endif
#endif

0 comments on commit d733052

Please sign in to comment.