+2006-03-14 Christopher Faylor <cgf@timesys.com>
+
+ * dcrt0.cc (main_environ): Initialize to &__cygwin_environment.
+ (dll_crt0_1): Move resourcelocks, thread interface, pinfo_init, and
+ uinfo_init...
+ (dll_crt0_0): ...to here.
+ (_dll_crt0): Call update_envptrs here after setting main_environ.
+ * environ.cc (environ_init): Eliminate initted variable. Don't call
+ update_envptrs here.
+ * sigproc.cc (wait_sig): Use my_sendsig when calling CreatePipe to
+ avoid a dereference.
+
2006-03-13 Christopher Faylor <cgf@timesys.com>
* child_info.h (child_info_fork::handle_failure): Declare new function.
#include "dll_init.h"
#include "sync.h"
#include "heap.h"
+#include "environ.h"
#define MAX_AT_FILE_LEVEL 10
/* This is an exported copy of environ which can be used by DLLs
which use cygwin.dll. */
char **__cygwin_environ;
- char ***main_environ;
+ char ***main_environ = &__cygwin_environ;
/* __progname used in getopt error message */
char *__progname;
struct per_process __cygwin_user_data =
}
}
+ user_data->resourcelocks->Init ();
+ user_data->threadinterface->Init ();
+
+ if (!in_forkee)
+ {
+ pinfo_init (envp, envc);
+ uinfo_init (); /* initialize user info */
+ }
_cygtls::init ();
/* Initialize events */
small_printf ("cmalloc returns %p\n", cmalloc (HEAP_STR, n));
#endif
- user_data->resourcelocks->Init ();
- user_data->threadinterface->Init ();
ProtectHandle (hMainProc);
ProtectHandle (hMainThread);
}
#endif
- /* Initialize our process table entry. */
- pinfo_init (envp, envc);
-
/* Can be set only after environment has been initialized. */
if (wincap.has_security ())
set_cygwin_privileges (hProcImpToken);
/* Allocate cygheap->fdtab */
dtable_init ();
- /* Initialize user info. */
- uinfo_init ();
-
/* Connect to tty. */
tty_init ();
system_printf ("internal error: couldn't determine location of thread function on stack. Expect signal problems.");
main_environ = user_data->envptr;
+ update_envptrs ();
char padding[CYGTLS_PADSIZE];
void __stdcall
update_envptrs ()
{
- extern char ***main_environ;
for (dll *d = dlls.istart (DLL_ANY); d; d = dlls.inext ())
*(d->p.envptr) = __cygwin_environ;
*main_environ = __cygwin_environ;
if (efault.faulted ())
api_fatal ("internal error reading the windows environment - too many environment variables?");
- static int initted;
- if (!initted)
- {
- for (int i = 0; conv_envvars[i].name != NULL; i++)
- {
- conv_start_chars[(int) cyg_tolower (conv_envvars[i].name[0])] = 1;
- conv_start_chars[(int) cyg_toupper (conv_envvars[i].name[0])] = 1;
- }
- initted = 1;
- }
+ if (!conv_start_chars[0])
+ for (int i = 0; conv_envvars[i].name != NULL; i++)
+ {
+ conv_start_chars[(int) cyg_tolower (conv_envvars[i].name[0])] = 1;
+ conv_start_chars[(int) cyg_toupper (conv_envvars[i].name[0])] = 1;
+ }
got_something_from_registry = regopt ("default");
if (myself->progname[0])
out:
__cygwin_environ = envp;
- update_envptrs ();
if (envp_passed_in)
{
p = getenv ("CYGWIN");
else
{
#ifdef DEBUGGING
- system_printf ("internal signal sent while signals are on hold");
+ system_printf ("signal %d sent to %p while signals are on hold", p, sig);
#endif
return -1;
}
/* Initialization */
SetThreadPriority (GetCurrentThread (), WAIT_SIG_PRIORITY);
- if (!CreatePipe (&readsig, &myself->sendsig, sec_user_nih (sa_buf), 0))
+ sigCONT = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
+ if (!CreatePipe (&readsig, &my_sendsig, sec_user_nih (sa_buf), 0))
api_fatal ("couldn't create signal pipe, %E");
ProtectHandle (readsig);
- sigCONT = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
- my_sendsig = myself->sendsig;
+ myself->sendsig = my_sendsig;
/* Setting dwProcessId flags that this process is now capable of receiving
signals. Prior to this, dwProcessId was set to the windows pid of