diff options
author | Kevin McCarthy <kevin@8t8.us> | 2017-06-06 18:38:41 -0700 |
---|---|---|
committer | Kevin McCarthy <kevin@8t8.us> | 2017-06-06 18:38:41 -0700 |
commit | 74a49627fc283c9ea896a812eacfb562d1f262fe (patch) | |
tree | c2c45710c8a0869987147d17d1c71f0d0079a468 | |
parent | 701329d930769e827c95c430ba82ec3f27c6446f (diff) |
Restore setenv function.
Partially revert fa1192803257, restoring setenv. It turns out we
still need the function.
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | m4/gettext.m4 | 2 | ||||
-rw-r--r-- | pgp.c | 3 | ||||
-rw-r--r-- | protos.h | 4 | ||||
-rw-r--r-- | setenv.c | 45 |
5 files changed, 54 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac index 00652991..4f41632a 100644 --- a/configure.ac +++ b/configure.ac @@ -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) diff --git a/m4/gettext.m4 b/m4/gettext.m4 index 8d68d667..b6d1648b 100644 --- a/m4/gettext.m4 +++ b/m4/gettext.m4 @@ -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 @@ -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; } @@ -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 index 00000000..36fe7def --- /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). */ +} |