git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Stepan Kasal <kasal@ucw.cz>
To: GIT Mailing-list <git@vger.kernel.org>
Cc: Karsten Blees <karsten.blees@gmail.com>,
	msysGit <msysgit@googlegroups.com>, Karsten Blees <blees@dcon.de>,
	Stepan Kasal <kasal@ucw.cz>
Subject: [PATCH 03/13] Win32: Unicode environment (incoming)
Date: Thu, 17 Jul 2014 17:37:56 +0200	[thread overview]
Message-ID: <1405611486-10176-4-git-send-email-kasal@ucw.cz> (raw)
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.

  parent reply	other threads:[~2014-07-17 15:38 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-17 15:37 [PATCH 00/13] mingw unicode environment Stepan Kasal
2014-07-17 15:37 ` [PATCH 01/13] Revert "Windows: teach getenv to do a case-sensitive search" Stepan Kasal
2014-07-17 15:37 ` [PATCH 02/13] Win32: Unicode environment (outgoing) Stepan Kasal
2014-07-19 19:13   ` [PATCH] fixup! " Karsten Blees
2014-07-21 16:32     ` Junio C Hamano
2014-07-17 15:37 ` Stepan Kasal [this message]
2014-07-17 15:37 ` [PATCH 04/13] Win32: fix environment memory leaks Stepan Kasal
2014-07-17 15:37 ` [PATCH 05/13] Win32: unify environment case-sensitivity Stepan Kasal
2014-07-17 15:37 ` [PATCH 06/13] Win32: unify environment function names Stepan Kasal
2014-07-17 15:38 ` [PATCH 07/13] Win32: factor out environment block creation Stepan Kasal
2014-07-17 15:38 ` [PATCH 08/13] Win32: don't copy the environment twice when spawning child processes Stepan Kasal
2014-07-17 15:38 ` [PATCH 09/13] Win32: reduce environment array reallocations Stepan Kasal
2014-07-17 15:38 ` [PATCH 10/13] Win32: use low-level memory allocation during initialization Stepan Kasal
2014-07-17 15:38 ` [PATCH 11/13] Win32: keep the environment sorted Stepan Kasal
2014-07-17 15:38 ` [PATCH 12/13] Win32: patch Windows environment on startup Stepan Kasal
2014-07-17 15:38 ` [PATCH 13/13] Enable color output in Windows cmd.exe Stepan Kasal
2014-07-17 17:55 ` [PATCH 00/13] mingw unicode environment Junio C Hamano
2014-07-17 18:09 ` Karsten Blees
2014-07-17 18:20   ` Junio C Hamano
2014-07-17 19:00     ` Stepan Kasal
2014-07-17 19:18       ` Junio C Hamano
2014-07-17 19:24       ` Karsten Blees
2014-07-18 18:51         ` Stepan Kasal

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1405611486-10176-4-git-send-email-kasal@ucw.cz \
    --to=kasal@ucw.cz \
    --cc=blees@dcon.de \
    --cc=git@vger.kernel.org \
    --cc=karsten.blees@gmail.com \
    --cc=msysgit@googlegroups.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).