1b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner/*	$OpenBSD: getenv.c,v 1.10 2010/08/23 22:31:50 millert Exp $ */
2b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner/*
3b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * Copyright (c) 1987, 1993
4b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *	The Regents of the University of California.  All rights reserved.
5b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *
6b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * Redistribution and use in source and binary forms, with or without
7b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * modification, are permitted provided that the following conditions
8b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * are met:
9b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * 1. Redistributions of source code must retain the above copyright
10b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *    notice, this list of conditions and the following disclaimer.
11b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * 2. Redistributions in binary form must reproduce the above copyright
12b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *    notice, this list of conditions and the following disclaimer in the
13b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *    documentation and/or other materials provided with the distribution.
14b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * 3. Neither the name of the University nor the names of its contributors
15b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *    may be used to endorse or promote products derived from this software
16b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *    without specific prior written permission.
17b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *
18b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19d53f09254ed48365d3a5149d640437d76aed2e5dJorim Jaggi * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20031384556ede1678e9c7f5bff21a6b9eefb3502fRobert Carr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
213797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwale * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
223797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwale * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
230bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24d53f09254ed48365d3a5149d640437d76aed2e5dJorim Jaggi * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25d53f09254ed48365d3a5149d640437d76aed2e5dJorim Jaggi * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
261ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2799db1863a84364339fc5dc9142f15910cdd96ed8Wale Ogunwale * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
283797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwale * SUCH DAMAGE.
29b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale */
30e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
31e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale#include <stdlib.h>
322c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner#include <string.h>
3342bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner
34e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwalechar *__findenv(const char *name, int len, int *offset);
35e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
36e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale/*
37e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner * __findenv --
382c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner *	Returns pointer to value associated with name, if any, else NULL.
39e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale *	Starts searching within the environmental array at offset.
40e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale *	Sets offset to be the offset of the name/value combination in the
41f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale *	environmental array, for use by putenv(3), setenv(3) and unsetenv(3).
42b9b16a74e5543b7b707e55a7382bbe82d300e2e5Wale Ogunwale *	Explicitly removes '=' in argument name.
432cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale *
443eadad75664e71519deebcf7a978b492952616ffWale Ogunwale *	This routine *should* be a static; don't use it.
452cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale */
463eadad75664e71519deebcf7a978b492952616ffWale Ogunwalechar *
472cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale__findenv(const char *name, int len, int *offset)
483eadad75664e71519deebcf7a978b492952616ffWale Ogunwale{
492cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale	extern char **environ;
50f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale	int i;
51c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner	const char *np;
5283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner	char **p, *cp;
53ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
543eadad75664e71519deebcf7a978b492952616ffWale Ogunwale	if (name == NULL || environ == NULL)
55e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner		return (NULL);
56b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner	for (p = environ + *offset; (cp = *p) != NULL; ++p) {
57e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale		for (np = name, i = len; i && *cp; i--)
58e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale			if (*cp++ != *np++)
590429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi				break;
6026c8c42bbb2b998e609983886fad5968f033268dJorim Jaggi		if (i == 0 && *cp++ == '=') {
61e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale			*offset = p - environ;
62dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi			return (cp);
63dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi		}
64dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi	}
65e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale	return (NULL);
663eadad75664e71519deebcf7a978b492952616ffWale Ogunwale}
67e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
68e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale/*
695a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale * getenv --
70e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale *	Returns ptr to value associated with name, if any, else NULL.
71e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale */
72e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwalechar *
73e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwalegetenv(const char *name)
74e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale{
75e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale	int offset = 0;
76b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale	const char *np;
77b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale
78b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang	for (np = name; *np && *np != '='; ++np)
793005e75585dcda30b64603e320e0711b583624ddChong Zhang		;
803005e75585dcda30b64603e320e0711b583624ddChong Zhang	return (__findenv(name, (int)(np - name), &offset));
810b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi}
823005e75585dcda30b64603e320e0711b583624ddChong Zhang