This is the mail archive of the cygwin-patches mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch] Make getenv() functional before the environment is initialized



----- Original Message ----- From: "Corinna Vinschen"
To: <cygwin-patches@cygwin.com>
Sent: Friday, April 21, 2006 1:23 PM
Subject: Re: [Patch] Make getenv() functional before the environment is initialized



On Apr 6 12:35, Pierre A. Humblet wrote:
       * environ.cc (getearly): New function.
          (getenv) : Call getearly if needed.

Thanks for the patch and sorry for the loooong delay. I've applied a slightly tweaked version of your patch, which uses a function pointer in getenv, instead of adding a conditional.


Corinna,


Thanks! Since sending the patch, I have found some issues with it :(

In particular GetEnvironmentStrings returns a big block of
storage that should be free (which we can't do), and that is
going to be lost on a fork, potentially leading to trouble.

Thus I have another implementation using GetEnvironmentValue
and cmalloc. (with HEAP_1_MAX, so that it will be released
on the next exec).
I also take advantage of spawn_info, whose existence I had forgotten.
Overall it's also simpler.

Here is another patch, sorry for not sending this earlier.

Pierre

2006-04-21 Pierre Humblet Pierre.Humblet@ieee.org

       * environ.cc (getearly): Use GetEnvironmentVariable and cmalloc
       instead of GetEnvironmentStrings.

Index: environ.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/environ.cc,v
retrieving revision 1.140
diff -u -p -b -r1.140 environ.cc
--- environ.cc  21 Apr 2006 17:21:41 -0000      1.140
+++ environ.cc  21 Apr 2006 18:37:55 -0000
@@ -231,28 +231,21 @@ my_findenv (const char *name, int *offse
static char * __stdcall
getearly (const char * name, int *offset __attribute__ ((unused)))
{
-  int s = strlen (name);
-  char * rawenv;
-  char ** ptr;
-  child_info *get_cygwin_startup_info ();
-  child_info_spawn *ci = (child_info_spawn *) get_cygwin_startup_info ();
+  int s;
+  char ** ptr, * ret;

-  if (ci && (ptr = ci->moreinfo->envp))
+  if (spawn_info && (ptr = spawn_info->moreinfo->envp))
    {
+      s = strlen (name);
      for (; *ptr; ptr++)
       if (strncasematch (name, *ptr, s)
           && (*(*ptr + s) == '='))
         return *ptr + s + 1;
    }
-  else if ((rawenv = GetEnvironmentStrings ()))
-    {
-      while (*rawenv)
-       if (strncasematch (name, rawenv, s)
-           && (*(rawenv + s) == '='))
-         return rawenv + s + 1;
-       else
-         rawenv = strchr (rawenv, 0) + 1;
-    }
+  else if ((s = GetEnvironmentVariable (name, NULL, 0))
+          && (ret = (char *) cmalloc (HEAP_1_MAX, s))
+          && GetEnvironmentVariable (name, ret, s))
+    return ret;
  return NULL;
}




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]