Provide setenv/unsetenv for environments lacking them. Bug 1578
authorJeremy Harris <jgh146exb@wizmail.org>
Sun, 27 Dec 2015 13:18:42 +0000 (13:18 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Sun, 27 Dec 2015 13:28:00 +0000 (13:28 +0000)
Currently this covers HP-UX and older Solaris.

src/OS/Makefile-Base
src/OS/os.h-HP-UX
src/OS/os.h-SunOS5
src/scripts/MakeLinks
src/src/setenv.c [new file with mode: 0644]
src/src/tls.c

index 9c713f0a11640ee3dca23b249ac04bc9997d79da..960c9afd6f83a478299883b796195cee59f89957 100644 (file)
@@ -620,7 +620,9 @@ spool_out.o:     $(HDRS) spool_out.c
 std-crypto.o:    $(HDRS) std-crypto.c
 store.o:         $(HDRS) store.c
 string.o:        $(HDRS) string.c
-tls.o:           $(HDRS) tls.c tls-gnu.c tlscert-gnu.c tls-openssl.c tlscert-openssl.c
+tls.o:           $(HDRS) tls.c setenv.c \
+                tls-gnu.c tlscert-gnu.c \
+                tls-openssl.c tlscert-openssl.c
 tod.o:           $(HDRS) tod.c
 transport.o:     $(HDRS) transport.c
 tree.o:          $(HDRS) tree.c
index 4998734f6c57917b350d941a152e53380e7effe6..1b599231dad10ce435625ab8c0a14b4b59346797 100644 (file)
@@ -10,6 +10,7 @@
 #define FSCALE          1.0
 
 #define HAVE_SYS_STATVFS_H
+#define MISSING_UNSETENV_3
 
 #define F_FREESP           O_TRUNC
 #define NEED_H_ERRNO       1
index dd14f25c8c7655474ebe1313ef22936b2291dec7..bb1d77fe9cff2c3025c5718e08d33b4722d35886 100644 (file)
@@ -28,7 +28,13 @@ it seems. */
 
 #define PAM_CONVERSE_ARG2_TYPE  struct pam_message
 
+
 /* default is non-const */
 #define ICONV_ARG2_TYPE const char **
 
+#if _POSIX_C_SOURCE < 200112L
+# define MISSING_UNSETENV_3
+#endof
+
+
 /* End */
index b7e0fabbd41459603eaf19bbfba17b91bcbbd3c4..e011c3ca14e37080e4fdb4a3cdf7dad6afe06408 100755 (executable)
@@ -106,6 +106,7 @@ for f in dbfunctions.h dbstuff.h exim.h functions.h globals.h local_scan.h \
   exim_dbutil.c exim_lock.c expand.c filter.c filtertest.c globals.c \
   header.c host.c ip.c log.c lss.c match.c moan.c parse.c perl.c queue.c \
   rda.c readconf.c receive.c retry.c rewrite.c rfc2047.c route.c search.c \
+  setenv.c \
   sieve.c smtp_in.c smtp_out.c spool_in.c spool_out.c std-crypto.c store.c \
   string.c tls.c tlscert-gnu.c tlscert-openssl.c tls-gnu.c tls-openssl.c \
   tod.c transport.c tree.c verify.c version.c dkim.c dkim.h dmarc.c dmarc.h \
diff --git a/src/src/setenv.c b/src/src/setenv.c
new file mode 100644 (file)
index 0000000..6da56d5
--- /dev/null
@@ -0,0 +1,55 @@
+/*************************************************
+*     Exim - an Internet mail transport agent    *
+*************************************************/
+
+/* Copyright (c) Michael Haardt 2015 */
+/* Copyright (c) Jeremy Harris 2015 */
+/* See the file NOTICE for conditions of use and distribution. */
+
+/* This module provides (un)setenv routines for those environments
+lacking them in libraries. */
+
+
+static int
+setenv(const char * name, const char * val, int overwrite)
+{
+uschar * s;
+if (Ustrchr(name, '=')) return -1;
+if (overwrite || !getenv(name))
+  putenv(CS string_copy_malloc(string_sprintf("%s=%s", name, val)));
+return 0;
+}
+
+static int
+unsetenv(const char *name)
+{
+size_t len;
+const char * end;
+char ** e;
+extern char ** environ;
+
+if (!name)
+  {
+  errno = EINVAL;
+  return -1;
+  }
+
+for (end = name; *end != '=' && *end; ) end++;
+len = end - name;
+  
+/* Find name in environment and move remaining variables down.
+Do not early-out in case there are duplicate names. */
+
+for (e = environ; *e; e++)
+  if (strncmp(*e, name, len) == 0 && (*e)[len] == '=')
+    {
+    char ** sp = e;
+    do *sp = sp[1]; while (*++sp);
+    }
+
+return 0;
+}
+
+/* vi: aw ai sw=2
+*/
+/* End of setenv.c */
index a3658276fcca5bd13d58dc04f17fce470ef95e90..5958dfc1c115648beec667046c801847e5ece08c 100644 (file)
@@ -84,22 +84,26 @@ return TRUE;
 *        Timezone environment flipping           *
 *************************************************/
 
+#ifdef MISSING_UNSETENV_3
+# include "setenv.c"
+#endif
+
 static uschar *
 to_tz(uschar * tz)
 {
   uschar * old = US getenv("TZ");
-  setenv("TZ", CS tz, 1);
-  tzset();
+  (void) setenv("TZ", CCS tz, 1);
+  tzset(); 
   return old;
 }
 static void
 restore_tz(uschar * tz)
 {
   if (tz)
-    setenv("TZ", CS tz, 1);
+    (void) setenv("TZ", CCS tz, 1);
   else
-    unsetenv("TZ");
-  tzset();
+    (void) unsetenv("TZ");
+  tzset(); 
 }
 
 /*************************************************