]> granicus.if.org Git - neomutt/commitdiff
Restore setenv function.
authorKevin McCarthy <kevin@8t8.us>
Wed, 7 Jun 2017 01:38:41 +0000 (18:38 -0700)
committerKevin McCarthy <kevin@8t8.us>
Wed, 7 Jun 2017 01:38:41 +0000 (18:38 -0700)
Partially revert fa1192803257, restoring setenv.  It turns out we
still need the function.

configure.ac
m4/gettext.m4
pgp.c
protos.h
setenv.c [new file with mode: 0644]

index 00652991a33262ebc0ff4db1e85785893f04e4dd..4f41632a9b32c40c6ecde29dbf76f818160730db 100644 (file)
@@ -374,7 +374,7 @@ AC_CHECK_TYPE(ssize_t, int)
 
 AC_CHECK_FUNCS(fgetpos memmove setegid srand48 strerror)
 
-AC_REPLACE_FUNCS([strcasecmp strdup strsep strtok_r wcscasecmp])
+AC_REPLACE_FUNCS([setenv strcasecmp strdup strsep strtok_r wcscasecmp])
 AC_REPLACE_FUNCS([strcasestr mkdtemp])
 
 AC_CHECK_FUNC(getopt)
index 8d68d667ca1f8eadcb656eae5a3caae6cad750a8..b6d1648b4142fe33506a95a2516df59bd47b89b9 100644 (file)
@@ -318,7 +318,7 @@ AC_DEFUN([MUTT_AM_GNU_GETTEXT],
    AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
 stdlib.h string.h unistd.h sys/param.h])
    AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getcwd getegid geteuid \
-getgid getuid mempcpy munmap putenv setlocale stpcpy strchr strcasecmp \
+getgid getuid mempcpy munmap putenv setenv setlocale stpcpy strchr strcasecmp \
 strdup strtoul tsearch __argz_count __argz_stringify __argz_next])
 
    MUTT_AM_ICONV
diff --git a/pgp.c b/pgp.c
index f2eabac3216288c25c6f33ffededb80436254bec..653905f04111f5fb5301abd62bfbddbee7de3c2e 100644 (file)
--- a/pgp.c
+++ b/pgp.c
@@ -114,7 +114,10 @@ int pgp_use_gpg_agent (void)
     return 0;
 
   if ((tty = ttyname(0)))
+  {
+    setenv("GPG_TTY", tty, 0);
     mutt_envlist_set ("GPG_TTY", tty, 0);
+  }
 
   return 1;
 }
index 3336ef43b452974de235793eea961475ccc533c3..98cdbb2c36517eeb593d14aaa2e8e51b56bc51ca 100644 (file)
--- a/protos.h
+++ b/protos.h
@@ -543,6 +543,10 @@ int ci_send_message (int, HEADER *, char *, CONTEXT *, HEADER *);
 
 /* prototypes for compatibility functions */
 
+#ifndef HAVE_SETENV
+int setenv (const char *, const char *, int);
+#endif
+
 #ifndef HAVE_STRCASECMP
 int strcasecmp (char *, char *);
 int strncasecmp (char *, char *, size_t);
diff --git a/setenv.c b/setenv.c
new file mode 100644 (file)
index 0000000..36fe7de
--- /dev/null
+++ b/setenv.c
@@ -0,0 +1,45 @@
+/*  Replacement for a missing setenv.
+**
+**  Written by Russ Allbery <rra@stanford.edu>
+**  This work is hereby placed in the public domain by its author.
+**
+**  Provides the same functionality as the standard library routine setenv
+**  for those platforms that don't have it.
+*/
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+int
+setenv(const char *name, const char *value, int overwrite)
+{
+    char *envstring;
+
+    if (!overwrite && getenv(name) != NULL)
+        return 0;
+
+    /* Allocate memory for the environment string.  We intentionally don't
+       use concat here, or the xmalloc family of allocation routines, since
+       the intention is to provide a replacement for the standard library
+       function which sets errno and returns in the event of a memory
+       allocation failure. */
+    envstring = malloc(strlen(name) + 1 + strlen(value) + 1); /* __MEM_CHECKED__ */
+    if (envstring == NULL)
+        return -1;
+
+    /* Build the environment string and add it to the environment using
+       putenv.  Systems without putenv lose, but XPG4 requires it. */
+    strcpy(envstring, name);  /* __STRCPY_CHECKED__ */
+    strcat(envstring, "=");   /* __STRCAT_CHECKED__ */
+    strcat(envstring, value); /* __STRCAT_CHECKED__ */
+    return putenv(envstring);
+
+    /* Note that the memory allocated is not freed.  This is intentional;
+       many implementations of putenv assume that the string passed to
+       putenv will never be freed and don't make a copy of it.  Repeated use
+       of this function will therefore leak memory, since most
+       implementations of putenv also don't free strings removed from the
+       environment (due to being overwritten). */
+}