Put back the cygwin32 Configure fix of 3582 undone by 3597.
[p5sagit/p5-mst-13.2.git] / util.c
diff --git a/util.c b/util.c
index 1f6fa1e..3655cef 100644 (file)
--- a/util.c
+++ b/util.c
@@ -66,6 +66,10 @@ long lastxycount[MAXXCOUNT][MAXYCOUNT];
 
 #endif
 
+#if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
+#  define FD_CLOEXEC 1                 /* NeXT needs this */
+#endif
+
 /* paranoid version of system's malloc() */
 
 /* NOTE:  Do not call the next three routines directly.  Use the macros
@@ -80,8 +84,9 @@ Perl_safesysmalloc(MEM_SIZE size)
     Malloc_t ptr;
 #ifdef HAS_64K_LIMIT
        if (size > 0xffff) {
-               PerlIO_printf(PerlIO_stderr(), "Allocation too large: %lx\n", size) FLUSH;
-               WITH_THX(my_exit(1));
+           PerlIO_printf(PerlIO_stderr(),
+                         "Allocation too large: %lx\n", size) FLUSH;
+           WITH_THX(my_exit(1));
        }
 #endif /* HAS_64K_LIMIT */
 #ifdef DEBUGGING
@@ -1484,7 +1489,7 @@ Perl_die_nocontext(const char* pat, ...)
     OP *o;
     va_list args;
     va_start(args, pat);
-    o = do_die(aTHX_ pat, &args);
+    o = do_die(pat, &args);
     va_end(args);
     return o;
 }
@@ -1496,7 +1501,7 @@ Perl_die(pTHX_ const char* pat, ...)
     OP *o;
     va_list args;
     va_start(args, pat);
-    o = do_die(aTHX_ pat, &args);
+    o = do_die(pat, &args);
     va_end(args);
     return o;
 }
@@ -1813,6 +1818,41 @@ Perl_my_setenv(pTHX_ char *nam, char *val)
 #endif  /* PERL_USE_SAFE_PUTENV */
 }
 
+#else /* WIN32 || CYGWIN32 */
+#if defined(CYGWIN32)
+/*
+ * Save environ of perl.exe, currently Cygwin links in separate environ's
+ * for each exe/dll.  Probably should be a member of impure_ptr.
+ */
+static char ***Perl_main_environ;
+
+EXTERN_C void
+Perl_my_setenv_init(char ***penviron)
+{
+    Perl_main_environ = penviron;
+}
+
+void
+my_setenv(char *nam, char *val)
+{
+    /* You can not directly manipulate the environ[] array because
+     * the routines do some additional work that syncs the Cygwin
+     * environment with the Windows environment.
+     */
+    char *oldstr = environ[setenv_getix(nam)];
+
+    if (!val) {
+       if (!oldstr)
+           return;
+       unsetenv(nam);
+       Safefree(oldstr);
+       return;
+    }
+    setenv(nam, val, 1);
+    environ = *Perl_main_environ; /* environ realloc can occur in setenv */
+    if(oldstr && environ[setenv_getix(nam)] != oldstr)
+       Safefree(oldstr);
+}
 #else /* if WIN32 */
 
 void
@@ -1874,6 +1914,7 @@ Perl_my_setenv(pTHX_ char *nam,char *val)
 }
 
 #endif /* WIN32 */
+#endif
 
 I32
 Perl_setenv_getix(pTHX_ char *nam)
@@ -3466,7 +3507,7 @@ Perl_my_fflush_all(pTHX)
 }
 
 double
-Perl_my_atof(const char* s) {
+Perl_my_atof(pTHX_ const char* s) {
 #ifdef USE_LOCALE_NUMERIC
     if ((PL_hints & HINT_LOCALE) && PL_numeric_local) {
        double x, y;