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