git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 03/13] Win32: Unicode environment (incoming)

From
Stepan Kasal <kasal@ucw.cz>
Date
Jul 17, 2014, 15:37 UTC
Message-ID
<1405611486-10176-4-git-send-email-kasal@ucw.cz>
In-Reply-To
<1405611486-10176-1-git-send-email-kasal@ucw.cz>
From: Karsten Blees <blees@dcon.de>
Convert environment from UTF-16 to UTF-8 on startup.

No changes to getenv() are necessary, as the MSVCRT version is implemented on top of char **environ.

However, putenv / _wputenv from MSVCRT no longer work, for two reasons:
1. they try to keep environ, _wenviron and the Win32 process environment
in sync, using the default system encoding instead of UTF-8 to convert
between charsets
2. msysgit and MSVCRT use different allocators, memory allocated in git
cannot be freed by the CRT and vice versa

Implement mingw_putenv using the env_setenv helper function from the environment merge code.

Note that in case of memory allocation failure, putenv now dies with error message (due to xrealloc) instead of failing with ENOMEM. As git assumes setenv / putenv to always succeed, this prevents it from continuing with incorrect settings.

Signed-off-by: Karsten Blees <blees@dcon.de>
Signed-off-by: Stepan Kasal <kasal@ucw.cz>
---
 compat/mingw.c | 15 +++++++++++++++
 compat/mingw.h |  2 ++
 2 files changed, 17 insertions(+)
diff --git a/compat/mingw.c b/compat/mingw.c
index bd45950..eadba8a 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -1259,6 +1259,12 @@ char *mingw_getenv(const char *name)
 	return result;
 }
 
+int mingw_putenv(const char *namevalue)
+{
+	environ = env_setenv(environ, namevalue);
+	return 0;
+}
+
 /*
  * Note, this isn't a complete replacement for getaddrinfo. It assumes
  * that service contains a numerical port, or that it is null. It
@@ -2051,6 +2057,11 @@ void mingw_startup()
 	maxlen = wcslen(_wpgmptr);
 	for (i = 1; i < argc; i++)
 		maxlen = max(maxlen, wcslen(wargv[i]));
+	for (i = 0; wenv[i]; i++)
+		maxlen = max(maxlen, wcslen(wenv[i]));
+
+	/* nedmalloc can't free CRT memory, allocate resizable environment list */
+	environ = xcalloc(i + 1, sizeof(char*));
 
 	/* allocate buffer (wchar_t encodes to max 3 UTF-8 bytes) */
 	maxlen = 3 * maxlen + 1;
@@ -2063,6 +2074,10 @@ void mingw_startup()
 		len = xwcstoutf(buffer, wargv[i], maxlen);
 		__argv[i] = xmemdupz(buffer, len);
 	}
+	for (i = 0; wenv[i]; i++) {
+		len = xwcstoutf(buffer, wenv[i], maxlen);
+		environ[i] = xmemdupz(buffer, len);
+	}
 	free(buffer);
 
 	/* initialize critical section for waitpid pinfo_t list */
diff --git a/compat/mingw.h b/compat/mingw.h
index 510530c..c3889ca 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -210,6 +210,8 @@ char *mingw_getcwd(char *pointer, int len);
 
 char *mingw_getenv(const char *name);
 #define getenv mingw_getenv
+int mingw_putenv(const char *namevalue);
+#define putenv mingw_putenv
 
 int mingw_gethostname(char *host, int namelen);
 #define gethostname mingw_gethostname
-- 
2.0.0.9635.g0be03cb

-- 
-- 
*** Please reply-to-all at all times ***
*** (do not pretend to know who is subscribed and who is not) ***
*** Please avoid top-posting. ***
The msysGit Wiki is here: https://github.com/msysgit/msysgit/wiki - Github accounts are free.

You received this message because you are subscribed to the Google
Groups "msysGit" group.
To post to this group, send email to msysgit@googlegroups.com
To unsubscribe from this group, send email to
msysgit+unsubscribe@googlegroups.com
For more options, and view previous threads, visit this group at
http://groups.google.com/group/msysgit?hl=en_US?hl=en

--- 
You received this message because you are subscribed to the Google Groups "msysGit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to msysgit+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Previous: Junio C HamanoNext: Stepan Kasal
Message 6 of 23 in “mingw unicode environment”
  1. 00/13 mingw unicode environmentStepan Kasal, Jul 17, 2014
  2. 01/13 Revert "Windows: teach getenv to do a case-sensitive search"Stepan Kasal, Jul 17, 2014
  3. 02/13 Win32: Unicode environment (outgoing)Stepan Kasal, Jul 17, 2014
  4. fixup! Win32: Unicode environment (outgoing)Karsten Blees, Jul 19, 2014
  5. Junio C HamanoJul 21, 2014
  6. 03/13 Win32: Unicode environment (incoming)Stepan Kasal, Jul 17, 2014
  7. 04/13 Win32: fix environment memory leaksStepan Kasal, Jul 17, 2014
  8. 05/13 Win32: unify environment case-sensitivityStepan Kasal, Jul 17, 2014
  9. 06/13 Win32: unify environment function namesStepan Kasal, Jul 17, 2014
  10. 07/13 Win32: factor out environment block creationStepan Kasal, Jul 17, 2014
  11. 08/13 Win32: don't copy the environment twice when spawning child processesStepan Kasal, Jul 17, 2014
  12. 09/13 Win32: reduce environment array reallocationsStepan Kasal, Jul 17, 2014
  13. 10/13 Win32: use low-level memory allocation during initializationStepan Kasal, Jul 17, 2014
  14. 11/13 Win32: keep the environment sortedStepan Kasal, Jul 17, 2014
  15. 12/13 Win32: patch Windows environment on startupStepan Kasal, Jul 17, 2014
  16. 13/13 Enable color output in Windows cmd.exeStepan Kasal, Jul 17, 2014
  17. Junio C HamanoJul 17, 2014
  18. Karsten BleesJul 17, 2014
  19. Junio C HamanoJul 17, 2014
  20. Stepan KasalJul 17, 2014
  21. Junio C HamanoJul 17, 2014
  22. Karsten BleesJul 17, 2014
  23. Stepan KasalJul 18, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.