140266059SGregory Neil Shapiro /*
25dd76dd0SGregory Neil Shapiro * Copyright (c) 2000-2003, 2007 Proofpoint, Inc. and its suppliers.
340266059SGregory Neil Shapiro * All rights reserved.
440266059SGregory Neil Shapiro *
540266059SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set
640266059SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of
740266059SGregory Neil Shapiro * the sendmail distribution.
840266059SGregory Neil Shapiro *
940266059SGregory Neil Shapiro */
1040266059SGregory Neil Shapiro
1140266059SGregory Neil Shapiro #include <sm/gen.h>
124313cc83SGregory Neil Shapiro SM_RCSID("@(#)$Id: config.c,v 1.32 2013-11-22 20:51:42 ca Exp $")
1340266059SGregory Neil Shapiro
1440266059SGregory Neil Shapiro #include <stdlib.h>
1540266059SGregory Neil Shapiro #include <sm/heap.h>
1640266059SGregory Neil Shapiro #include <sm/string.h>
1740266059SGregory Neil Shapiro #include <sm/conf.h>
1840266059SGregory Neil Shapiro
1940266059SGregory Neil Shapiro /*
2040266059SGregory Neil Shapiro ** PUTENV -- emulation of putenv() in terms of setenv()
2140266059SGregory Neil Shapiro **
2240266059SGregory Neil Shapiro ** Not needed on Posix-compliant systems.
2340266059SGregory Neil Shapiro ** This doesn't have full Posix semantics, but it's good enough
2440266059SGregory Neil Shapiro ** for sendmail.
2540266059SGregory Neil Shapiro **
2640266059SGregory Neil Shapiro ** Parameter:
2740266059SGregory Neil Shapiro ** env -- the environment to put.
2840266059SGregory Neil Shapiro **
2940266059SGregory Neil Shapiro ** Returns:
3040266059SGregory Neil Shapiro ** 0 on success, < 0 on failure.
3140266059SGregory Neil Shapiro */
3240266059SGregory Neil Shapiro
3340266059SGregory Neil Shapiro #if NEEDPUTENV
3440266059SGregory Neil Shapiro
3540266059SGregory Neil Shapiro # if NEEDPUTENV == 2 /* no setenv(3) call available */
3640266059SGregory Neil Shapiro
3740266059SGregory Neil Shapiro int
3840266059SGregory Neil Shapiro putenv(str)
3940266059SGregory Neil Shapiro char *str;
4040266059SGregory Neil Shapiro {
4140266059SGregory Neil Shapiro char **current;
4240266059SGregory Neil Shapiro int matchlen, envlen = 0;
4340266059SGregory Neil Shapiro char *tmp;
4440266059SGregory Neil Shapiro char **newenv;
4540266059SGregory Neil Shapiro static bool first = true;
4640266059SGregory Neil Shapiro extern char **environ;
4740266059SGregory Neil Shapiro
4840266059SGregory Neil Shapiro /*
4940266059SGregory Neil Shapiro ** find out how much of str to match when searching
5040266059SGregory Neil Shapiro ** for a string to replace.
5140266059SGregory Neil Shapiro */
5240266059SGregory Neil Shapiro
5340266059SGregory Neil Shapiro if ((tmp = strchr(str, '=')) == NULL || tmp == str)
5440266059SGregory Neil Shapiro matchlen = strlen(str);
5540266059SGregory Neil Shapiro else
5640266059SGregory Neil Shapiro matchlen = (int) (tmp - str);
5740266059SGregory Neil Shapiro ++matchlen;
5840266059SGregory Neil Shapiro
5940266059SGregory Neil Shapiro /*
6040266059SGregory Neil Shapiro ** Search for an existing string in the environment and find the
6140266059SGregory Neil Shapiro ** length of environ. If found, replace and exit.
6240266059SGregory Neil Shapiro */
6340266059SGregory Neil Shapiro
6440266059SGregory Neil Shapiro for (current = environ; *current != NULL; current++)
6540266059SGregory Neil Shapiro {
6640266059SGregory Neil Shapiro ++envlen;
6740266059SGregory Neil Shapiro
6840266059SGregory Neil Shapiro if (strncmp(str, *current, matchlen) == 0)
6940266059SGregory Neil Shapiro {
7040266059SGregory Neil Shapiro /* found it, now insert the new version */
7140266059SGregory Neil Shapiro *current = (char *) str;
7240266059SGregory Neil Shapiro return 0;
7340266059SGregory Neil Shapiro }
7440266059SGregory Neil Shapiro }
7540266059SGregory Neil Shapiro
7640266059SGregory Neil Shapiro /*
7740266059SGregory Neil Shapiro ** There wasn't already a slot so add space for a new slot.
7840266059SGregory Neil Shapiro ** If this is our first time through, use malloc(), else realloc().
7940266059SGregory Neil Shapiro */
8040266059SGregory Neil Shapiro
8140266059SGregory Neil Shapiro if (first)
8240266059SGregory Neil Shapiro {
8340266059SGregory Neil Shapiro newenv = (char **) sm_malloc(sizeof(char *) * (envlen + 2));
8440266059SGregory Neil Shapiro if (newenv == NULL)
8540266059SGregory Neil Shapiro return -1;
8640266059SGregory Neil Shapiro
8740266059SGregory Neil Shapiro first = false;
8840266059SGregory Neil Shapiro (void) memcpy(newenv, environ, sizeof(char *) * envlen);
8940266059SGregory Neil Shapiro }
9040266059SGregory Neil Shapiro else
9140266059SGregory Neil Shapiro {
9240266059SGregory Neil Shapiro newenv = (char **) sm_realloc((char *) environ,
9340266059SGregory Neil Shapiro sizeof(char *) * (envlen + 2));
9440266059SGregory Neil Shapiro if (newenv == NULL)
9540266059SGregory Neil Shapiro return -1;
9640266059SGregory Neil Shapiro }
9740266059SGregory Neil Shapiro
9840266059SGregory Neil Shapiro /* actually add in the new entry */
9940266059SGregory Neil Shapiro environ = newenv;
10040266059SGregory Neil Shapiro environ[envlen] = (char *) str;
10140266059SGregory Neil Shapiro environ[envlen + 1] = NULL;
10240266059SGregory Neil Shapiro
10340266059SGregory Neil Shapiro return 0;
10440266059SGregory Neil Shapiro }
10540266059SGregory Neil Shapiro
10640266059SGregory Neil Shapiro # else /* NEEDPUTENV == 2 */
10740266059SGregory Neil Shapiro
10840266059SGregory Neil Shapiro int
10940266059SGregory Neil Shapiro putenv(env)
11040266059SGregory Neil Shapiro char *env;
11140266059SGregory Neil Shapiro {
11240266059SGregory Neil Shapiro char *p;
11340266059SGregory Neil Shapiro int l;
11440266059SGregory Neil Shapiro char nbuf[100];
11540266059SGregory Neil Shapiro
11640266059SGregory Neil Shapiro p = strchr(env, '=');
11740266059SGregory Neil Shapiro if (p == NULL)
11840266059SGregory Neil Shapiro return 0;
11940266059SGregory Neil Shapiro l = p - env;
12040266059SGregory Neil Shapiro if (l > sizeof nbuf - 1)
12140266059SGregory Neil Shapiro l = sizeof nbuf - 1;
12240266059SGregory Neil Shapiro memmove(nbuf, env, l);
12340266059SGregory Neil Shapiro nbuf[l] = '\0';
12440266059SGregory Neil Shapiro return setenv(nbuf, ++p, 1);
12540266059SGregory Neil Shapiro }
12640266059SGregory Neil Shapiro
12740266059SGregory Neil Shapiro # endif /* NEEDPUTENV == 2 */
12840266059SGregory Neil Shapiro #endif /* NEEDPUTENV */
12940266059SGregory Neil Shapiro /*
13040266059SGregory Neil Shapiro ** UNSETENV -- remove a variable from the environment
13140266059SGregory Neil Shapiro **
13240266059SGregory Neil Shapiro ** Not needed on newer systems.
13340266059SGregory Neil Shapiro **
13440266059SGregory Neil Shapiro ** Parameters:
13540266059SGregory Neil Shapiro ** name -- the string name of the environment variable to be
13640266059SGregory Neil Shapiro ** deleted from the current environment.
13740266059SGregory Neil Shapiro **
13840266059SGregory Neil Shapiro ** Returns:
13940266059SGregory Neil Shapiro ** none.
14040266059SGregory Neil Shapiro **
14140266059SGregory Neil Shapiro ** Globals:
14240266059SGregory Neil Shapiro ** environ -- a pointer to the current environment.
14340266059SGregory Neil Shapiro **
14440266059SGregory Neil Shapiro ** Side Effects:
14540266059SGregory Neil Shapiro ** Modifies environ.
14640266059SGregory Neil Shapiro */
14740266059SGregory Neil Shapiro
14840266059SGregory Neil Shapiro #if !HASUNSETENV
14940266059SGregory Neil Shapiro
15040266059SGregory Neil Shapiro void
unsetenv(name)15140266059SGregory Neil Shapiro unsetenv(name)
15240266059SGregory Neil Shapiro char *name;
15340266059SGregory Neil Shapiro {
15440266059SGregory Neil Shapiro extern char **environ;
15540266059SGregory Neil Shapiro register char **pp;
15640266059SGregory Neil Shapiro int len = strlen(name);
15740266059SGregory Neil Shapiro
15840266059SGregory Neil Shapiro for (pp = environ; *pp != NULL; pp++)
15940266059SGregory Neil Shapiro {
16040266059SGregory Neil Shapiro if (strncmp(name, *pp, len) == 0 &&
16140266059SGregory Neil Shapiro ((*pp)[len] == '=' || (*pp)[len] == '\0'))
16240266059SGregory Neil Shapiro break;
16340266059SGregory Neil Shapiro }
16440266059SGregory Neil Shapiro
16540266059SGregory Neil Shapiro for (; *pp != NULL; pp++)
16640266059SGregory Neil Shapiro *pp = pp[1];
16740266059SGregory Neil Shapiro }
16840266059SGregory Neil Shapiro
16940266059SGregory Neil Shapiro #endif /* !HASUNSETENV */
17040266059SGregory Neil Shapiro
17140266059SGregory Neil Shapiro char *SmCompileOptions[] =
17240266059SGregory Neil Shapiro {
17340266059SGregory Neil Shapiro #if SM_CONF_BROKEN_STRTOD
17440266059SGregory Neil Shapiro "SM_CONF_BROKEN_STRTOD",
1755b0945b5SGregory Neil Shapiro #endif
17640266059SGregory Neil Shapiro #if SM_CONF_GETOPT
17740266059SGregory Neil Shapiro "SM_CONF_GETOPT",
1785b0945b5SGregory Neil Shapiro #endif
179e92d3f3fSGregory Neil Shapiro #if SM_CONF_LDAP_INITIALIZE
180e92d3f3fSGregory Neil Shapiro "SM_CONF_LDAP_INITIALIZE",
1815b0945b5SGregory Neil Shapiro #endif
182605302a5SGregory Neil Shapiro #if SM_CONF_LDAP_MEMFREE
183605302a5SGregory Neil Shapiro "SM_CONF_LDAP_MEMFREE",
1845b0945b5SGregory Neil Shapiro #endif
18540266059SGregory Neil Shapiro #if SM_CONF_LONGLONG
18640266059SGregory Neil Shapiro "SM_CONF_LONGLONG",
1875b0945b5SGregory Neil Shapiro #endif
18840266059SGregory Neil Shapiro #if SM_CONF_MEMCHR
18940266059SGregory Neil Shapiro "SM_CONF_MEMCHR",
1905b0945b5SGregory Neil Shapiro #endif
19140266059SGregory Neil Shapiro #if SM_CONF_MSG
19240266059SGregory Neil Shapiro "SM_CONF_MSG",
1935b0945b5SGregory Neil Shapiro #endif
19440266059SGregory Neil Shapiro #if SM_CONF_QUAD_T
19540266059SGregory Neil Shapiro "SM_CONF_QUAD_T",
1965b0945b5SGregory Neil Shapiro #endif
19740266059SGregory Neil Shapiro #if SM_CONF_SEM
19840266059SGregory Neil Shapiro "SM_CONF_SEM",
1995b0945b5SGregory Neil Shapiro #endif
20040266059SGregory Neil Shapiro #if SM_CONF_SETITIMER
20140266059SGregory Neil Shapiro "SM_CONF_SETITIMER",
2025b0945b5SGregory Neil Shapiro #endif
2035ef517c0SGregory Neil Shapiro #if SM_CONF_SIGSETJMP
2045ef517c0SGregory Neil Shapiro "SM_CONF_SIGSETJMP",
2055b0945b5SGregory Neil Shapiro #endif
20640266059SGregory Neil Shapiro #if SM_CONF_SHM
20740266059SGregory Neil Shapiro "SM_CONF_SHM",
2085b0945b5SGregory Neil Shapiro #endif
20940266059SGregory Neil Shapiro #if SM_CONF_SHM_DELAY
21040266059SGregory Neil Shapiro "SM_CONF_SHM_DELAY",
2115b0945b5SGregory Neil Shapiro #endif
21240266059SGregory Neil Shapiro #if SM_CONF_SSIZE_T
21340266059SGregory Neil Shapiro "SM_CONF_SSIZE_T",
2145b0945b5SGregory Neil Shapiro #endif
21540266059SGregory Neil Shapiro #if SM_CONF_STDBOOL_H
21640266059SGregory Neil Shapiro "SM_CONF_STDBOOL_H",
2175b0945b5SGregory Neil Shapiro #endif
21840266059SGregory Neil Shapiro #if SM_CONF_STDDEF_H
21940266059SGregory Neil Shapiro "SM_CONF_STDDEF_H",
2205b0945b5SGregory Neil Shapiro #endif
22140266059SGregory Neil Shapiro
22240266059SGregory Neil Shapiro /* XXX this is always enabled (for now) */
2232fb4f839SGregory Neil Shapiro #if SM_CONF_STRL && 0
22440266059SGregory Neil Shapiro "SM_CONF_STRL",
2255b0945b5SGregory Neil Shapiro #endif
22640266059SGregory Neil Shapiro
22740266059SGregory Neil Shapiro #if SM_CONF_SYS_CDEFS_H
22840266059SGregory Neil Shapiro "SM_CONF_SYS_CDEFS_H",
2295b0945b5SGregory Neil Shapiro #endif
23040266059SGregory Neil Shapiro #if SM_CONF_SYSEXITS_H
23140266059SGregory Neil Shapiro "SM_CONF_SYSEXITS_H",
2325b0945b5SGregory Neil Shapiro #endif
23340266059SGregory Neil Shapiro #if SM_CONF_UID_GID
23440266059SGregory Neil Shapiro "SM_CONF_UID_GID",
2355b0945b5SGregory Neil Shapiro #endif
236e92d3f3fSGregory Neil Shapiro #if DO_NOT_USE_STRCPY
237e92d3f3fSGregory Neil Shapiro "DO_NOT_USE_STRCPY",
2385b0945b5SGregory Neil Shapiro #endif
23940266059SGregory Neil Shapiro #if SM_HEAP_CHECK
24040266059SGregory Neil Shapiro "SM_HEAP_CHECK",
2415b0945b5SGregory Neil Shapiro #endif
24240266059SGregory Neil Shapiro #if defined(SM_OS_NAME) && defined(__STDC__)
24340266059SGregory Neil Shapiro "SM_OS=sm_os_" SM_OS_NAME,
2445b0945b5SGregory Neil Shapiro #endif
24540266059SGregory Neil Shapiro #if SM_VA_STD
24640266059SGregory Neil Shapiro "SM_VA_STD",
2475b0945b5SGregory Neil Shapiro #endif
248d0cef73dSGregory Neil Shapiro #if USEKSTAT
249d0cef73dSGregory Neil Shapiro "USEKSTAT",
2505b0945b5SGregory Neil Shapiro #endif
251d0cef73dSGregory Neil Shapiro #if USEPROCMEMINFO
252d0cef73dSGregory Neil Shapiro "USEPROCMEMINFO",
2535b0945b5SGregory Neil Shapiro #endif
254d0cef73dSGregory Neil Shapiro #if USESWAPCTL
255d0cef73dSGregory Neil Shapiro "USESWAPCTL",
2565b0945b5SGregory Neil Shapiro #endif
25740266059SGregory Neil Shapiro NULL
25840266059SGregory Neil Shapiro };
259