1/*
2 * Copyright (c) 2000-2003, 2007 Proofpoint, Inc. and its suppliers.
3 *	All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 *
9 */
10
11#include <sm/gen.h>
12SM_RCSID("@(#)$Id: config.c,v 1.32 2013-11-22 20:51:42 ca Exp $")
13
14#include <stdlib.h>
15#include <sm/heap.h>
16#include <sm/string.h>
17#include <sm/conf.h>
18
19/*
20**  PUTENV -- emulation of putenv() in terms of setenv()
21**
22**	Not needed on Posix-compliant systems.
23**	This doesn't have full Posix semantics, but it's good enough
24**		for sendmail.
25**
26**	Parameter:
27**		env -- the environment to put.
28**
29**	Returns:
30**		0 on success, < 0 on failure.
31*/
32
33#if NEEDPUTENV
34
35# if NEEDPUTENV == 2		/* no setenv(3) call available */
36
37int
38putenv(str)
39	char *str;
40{
41	char **current;
42	int matchlen, envlen = 0;
43	char *tmp;
44	char **newenv;
45	static bool first = true;
46	extern char **environ;
47
48	/*
49	**  find out how much of str to match when searching
50	**  for a string to replace.
51	*/
52
53	if ((tmp = strchr(str, '=')) == NULL || tmp == str)
54		matchlen = strlen(str);
55	else
56		matchlen = (int) (tmp - str);
57	++matchlen;
58
59	/*
60	**  Search for an existing string in the environment and find the
61	**  length of environ.  If found, replace and exit.
62	*/
63
64	for (current = environ; *current != NULL; current++)
65	{
66		++envlen;
67
68		if (strncmp(str, *current, matchlen) == 0)
69		{
70			/* found it, now insert the new version */
71			*current = (char *) str;
72			return 0;
73		}
74	}
75
76	/*
77	**  There wasn't already a slot so add space for a new slot.
78	**  If this is our first time through, use malloc(), else realloc().
79	*/
80
81	if (first)
82	{
83		newenv = (char **) sm_malloc(sizeof(char *) * (envlen + 2));
84		if (newenv == NULL)
85			return -1;
86
87		first = false;
88		(void) memcpy(newenv, environ, sizeof(char *) * envlen);
89	}
90	else
91	{
92		newenv = (char **) sm_realloc((char *) environ,
93					      sizeof(char *) * (envlen + 2));
94		if (newenv == NULL)
95			return -1;
96	}
97
98	/* actually add in the new entry */
99	environ = newenv;
100	environ[envlen] = (char *) str;
101	environ[envlen + 1] = NULL;
102
103	return 0;
104}
105
106# else /* NEEDPUTENV == 2 */
107
108int
109putenv(env)
110	char *env;
111{
112	char *p;
113	int l;
114	char nbuf[100];
115
116	p = strchr(env, '=');
117	if (p == NULL)
118		return 0;
119	l = p - env;
120	if (l > sizeof nbuf - 1)
121		l = sizeof nbuf - 1;
122	memmove(nbuf, env, l);
123	nbuf[l] = '\0';
124	return setenv(nbuf, ++p, 1);
125}
126
127# endif /* NEEDPUTENV == 2 */
128#endif /* NEEDPUTENV */
129/*
130**  UNSETENV -- remove a variable from the environment
131**
132**	Not needed on newer systems.
133**
134**	Parameters:
135**		name -- the string name of the environment variable to be
136**			deleted from the current environment.
137**
138**	Returns:
139**		none.
140**
141**	Globals:
142**		environ -- a pointer to the current environment.
143**
144**	Side Effects:
145**		Modifies environ.
146*/
147
148#if !HASUNSETENV
149
150void
151unsetenv(name)
152	char *name;
153{
154	extern char **environ;
155	register char **pp;
156	int len = strlen(name);
157
158	for (pp = environ; *pp != NULL; pp++)
159	{
160		if (strncmp(name, *pp, len) == 0 &&
161		    ((*pp)[len] == '=' || (*pp)[len] == '\0'))
162			break;
163	}
164
165	for (; *pp != NULL; pp++)
166		*pp = pp[1];
167}
168
169#endif /* !HASUNSETENV */
170
171char *SmCompileOptions[] =
172{
173#if SM_CONF_BROKEN_STRTOD
174	"SM_CONF_BROKEN_STRTOD",
175#endif
176#if SM_CONF_GETOPT
177	"SM_CONF_GETOPT",
178#endif
179#if SM_CONF_LDAP_INITIALIZE
180	"SM_CONF_LDAP_INITIALIZE",
181#endif
182#if SM_CONF_LDAP_MEMFREE
183	"SM_CONF_LDAP_MEMFREE",
184#endif
185#if SM_CONF_LONGLONG
186	"SM_CONF_LONGLONG",
187#endif
188#if SM_CONF_MEMCHR
189	"SM_CONF_MEMCHR",
190#endif
191#if SM_CONF_MSG
192	"SM_CONF_MSG",
193#endif
194#if SM_CONF_QUAD_T
195	"SM_CONF_QUAD_T",
196#endif
197#if SM_CONF_SEM
198	"SM_CONF_SEM",
199#endif
200#if SM_CONF_SETITIMER
201	"SM_CONF_SETITIMER",
202#endif
203#if SM_CONF_SIGSETJMP
204	"SM_CONF_SIGSETJMP",
205#endif
206#if SM_CONF_SHM
207	"SM_CONF_SHM",
208#endif
209#if SM_CONF_SHM_DELAY
210	"SM_CONF_SHM_DELAY",
211#endif
212#if SM_CONF_SSIZE_T
213	"SM_CONF_SSIZE_T",
214#endif
215#if SM_CONF_STDBOOL_H
216	"SM_CONF_STDBOOL_H",
217#endif
218#if SM_CONF_STDDEF_H
219	"SM_CONF_STDDEF_H",
220#endif
221
222/* XXX this is always enabled (for now) */
223#if SM_CONF_STRL && 0
224	"SM_CONF_STRL",
225#endif
226
227#if SM_CONF_SYS_CDEFS_H
228	"SM_CONF_SYS_CDEFS_H",
229#endif
230#if SM_CONF_SYSEXITS_H
231	"SM_CONF_SYSEXITS_H",
232#endif
233#if SM_CONF_UID_GID
234	"SM_CONF_UID_GID",
235#endif
236#if DO_NOT_USE_STRCPY
237	"DO_NOT_USE_STRCPY",
238#endif
239#if SM_HEAP_CHECK
240	"SM_HEAP_CHECK",
241#endif
242#if defined(SM_OS_NAME) && defined(__STDC__)
243	"SM_OS=sm_os_" SM_OS_NAME,
244#endif
245#if SM_VA_STD
246	"SM_VA_STD",
247#endif
248#if USEKSTAT
249	"USEKSTAT",
250#endif
251#if USEPROCMEMINFO
252	"USEPROCMEMINFO",
253#endif
254#if USESWAPCTL
255	"USESWAPCTL",
256#endif
257	NULL
258};
259