/* * Copyright (c) 2014 Jonas 'Sortie' Termansen. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * stdlib/getenv.c * Get an environment variable. */ #include #include #include #include #include static inline bool matches_environment_variable(const char* what, const char* name, size_t name_length) { return !strncmp(what, name, name_length) && what[name_length] == '='; } char* getenv(const char* name) { if ( !name ) return errno = EINVAL, (char*) NULL; if ( !name[0] ) return errno = EINVAL, (char*) NULL; // Verify the name doesn't contain a '=' character. size_t name_length = 0; while ( name[name_length] ) if ( name[name_length++] == '=' ) return errno = EINVAL, (char*) NULL; if ( !environ ) return NULL; // Find the environment variable with the given name. for ( size_t i = 0; environ[i]; i++ ) if ( matches_environment_variable(environ[i], name, name_length) ) return environ[i] + name_length + 1; return NULL; }