1 /*
2 * Copyright (c) 1987, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #if defined(LIBC_SCCS) && !defined(lint)
9 static char sccsid[] = "@(#)getenv.c 8.1 (Berkeley) 06/04/93";
10 #endif /* LIBC_SCCS and not lint */
11
12 #include <stdlib.h>
13 #include <stddef.h>
14 #include <string.h>
15
16 char *__findenv __P((const char *, int *));
17
18 /*
19 * getenv --
20 * Returns ptr to value associated with name, if any, else NULL.
21 */
22 char *
getenv(name)23 getenv(name)
24 const char *name;
25 {
26 int offset;
27
28 return (__findenv(name, &offset));
29 }
30
31 /*
32 * __findenv --
33 * Returns pointer to value associated with name, if any, else NULL.
34 * Sets offset to be the offset of the name/value combination in the
35 * environmental array, for use by setenv(3) and unsetenv(3).
36 * Explicitly removes '=' in argument name.
37 *
38 * This routine *should* be a static; don't use it.
39 */
40 char *
__findenv(name,offset)41 __findenv(name, offset)
42 register const char *name;
43 int *offset;
44 {
45 extern char **environ;
46 register int len;
47 register const char *np;
48 register char **p, *c;
49
50 if (name == NULL || environ == NULL)
51 return (NULL);
52 for (np = name; *np && *np != '='; ++np)
53 continue;
54 len = np - name;
55 for (p = environ; (c = *p) != NULL; ++p)
56 if (strncmp(c, name, len) == 0 && c[len] == '=') {
57 *offset = p - environ;
58 return (c + len + 1);
59 }
60 return (NULL);
61 }
62