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