xref: /freebsd/contrib/sendmail/libsm/config.c (revision 2fb4f839)
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