1 //===-- Implementation of getenv ------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "src/stdlib/getenv.h" 10 #include "config/linux/app.h" 11 #include "src/__support/CPP/StringView.h" 12 #include "src/__support/common.h" 13 14 #include <stddef.h> // For size_t. 15 16 namespace __llvm_libc { 17 18 LLVM_LIBC_FUNCTION(char *, getenv, (const char *name)) { 19 char **env_ptr = reinterpret_cast<char **>(__llvm_libc::app.envPtr); 20 21 if (name == nullptr || env_ptr == nullptr) 22 return nullptr; 23 24 __llvm_libc::cpp::StringView env_var_name(name); 25 if (env_var_name.size() == 0) 26 return nullptr; 27 for (char **env = env_ptr; *env != nullptr; env++) { 28 __llvm_libc::cpp::StringView cur(*env); 29 if (!cur.starts_with(env_var_name)) 30 continue; 31 32 if (cur[env_var_name.size()] != '=') 33 continue; 34 35 // Remove the name and the equals sign. 36 cur.remove_prefix(env_var_name.size() + 1); 37 // We know that data is null terminated, so this is safe. 38 return const_cast<char *>(cur.data()); 39 } 40 41 return nullptr; 42 } 43 44 } // namespace __llvm_libc 45