1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
/*
** putenv.c -- (un)set an envariable
**
** This code is Copyright (c) 2002, by the authors of nmh. See the
** COPYRIGHT file in the root directory of the nmh distribution for
** complete copyright information.
*/
#include <h/mh.h>
#include <h/utils.h>
extern char **environ;
/*
** prototypes
*/
int m_putenv(char *, char *);
int unputenv(char *);
static int nvmatch(char *, char *);
int
m_putenv(char *name, char *value)
{
int i;
char **ep, **nep, *cp;
cp = mh_xcalloc(strlen(name) + strlen(value) + 2, sizeof(char));
sprintf(cp, "%s=%s", name, value);
for (ep = environ, i = 0; *ep; ep++, i++)
if (nvmatch(name, *ep)) {
*ep = cp;
return 0;
}
nep = mh_xcalloc(i + 2, sizeof(*nep));
for (ep = environ, i = 0; *ep; nep[i++] = *ep++)
continue;
nep[i++] = cp;
nep[i] = NULL;
environ = nep;
return 0;
}
int
unputenv(char *name)
{
char **ep, **nep;
for (ep = environ; *ep; ep++)
if (nvmatch(name, *ep))
break;
if (*ep == NULL)
return 1;
for (nep = ep + 1; *nep; nep++)
continue;
*ep = *--nep;
*nep = NULL;
return 0;
}
static int
nvmatch(char *s1, char *s2)
{
while (*s1 == *s2++)
if (*s1++ == '=')
return 1;
return (*s1 == '\0' && *--s2 == '=');
}
|