File: putenv.c

package info (click to toggle)
mmh 0.4-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 4,976 kB
  • sloc: ansic: 26,132; sh: 6,871; makefile: 680; awk: 74
file content (76 lines) | stat: -rw-r--r-- 1,209 bytes parent folder | download | duplicates (3)
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 == '=');
}