OSDN Git Service

* environ.cc (getearly): New function.
authorcorinna <corinna>
Fri, 21 Apr 2006 17:21:40 +0000 (17:21 +0000)
committercorinna <corinna>
Fri, 21 Apr 2006 17:21:40 +0000 (17:21 +0000)
(findenv_func): New function pointer, predefined to getearly.
(getenv): Call findenv function over the findenv_func pointer.
(environ_init): Change findenv_func pointer to my_findenv after Cygwin
environment is initialized.

winsup/cygwin/ChangeLog
winsup/cygwin/environ.cc

index c5e937d..d4efcd1 100644 (file)
@@ -1,3 +1,12 @@
+2006-04-21  Pierre Humblet  <Pierre.Humblet@ieee.org>
+           Corinna Vinschen  <corinna@vinschen.de>
+
+       * environ.cc (getearly): New function.
+       (findenv_func): New function pointer, predefined to getearly.
+       (getenv): Call findenv function over the findenv_func pointer.
+       (environ_init): Change findenv_func pointer to my_findenv after Cygwin
+       environment is initialized.
+
 2006-04-21  Lars Munch  <lars@segv.dk>
 
        * include/asm/byteorder.h (__ntohl): Fix the missing uint32_t.
index 99f61e7..edefb8c 100644 (file)
@@ -224,6 +224,41 @@ my_findenv (const char *name, int *offset)
 }
 
 /*
+ * getearly --
+ *     Primitive getenv before the environment is built.
+ */
+
+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 ();
+
+  if (ci && (ptr = ci->moreinfo->envp)) 
+    {
+      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;
+    }
+  return NULL;
+}
+
+static char * (*findenv_func)(const char *, int *) = (char * (*)(const char *, int *)) getearly;
+
+/*
  * getenv --
  *     Returns ptr to value associated with name, if any, else NULL.
  */
@@ -232,8 +267,7 @@ extern "C" char *
 getenv (const char *name)
 {
   int offset;
-
-  return my_findenv (name, &offset);
+  return findenv_func (name, &offset);
 }
 
 static int __stdcall
@@ -808,6 +842,7 @@ environ_init (char **envp, int envc)
   FreeEnvironmentStrings (rawenv);
 
 out:
+  findenv_func = (char * (*)(const char*, int*)) my_findenv;
   __cygwin_environ = envp;
   update_envptrs ();
   if (envp_passed_in)