Add private __getenv_reentrant()

A reentrant variant of getenv().
This commit is contained in:
Ingo Weinhold 2013-11-17 19:00:51 +01:00
parent b38fed9370
commit 8a3fe6d1bf
2 changed files with 42 additions and 0 deletions

View File

@ -0,0 +1,23 @@
/*
* Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#ifndef _LIBROOT_STDLIB_PRIVATE_H
#define _LIBROOT_STDLIB_PRIVATE_H
#include <sys/cdefs.h>
#include <sys/types.h>
__BEGIN_DECLS
ssize_t __getenv_reentrant(const char* name, char* buffer,
size_t bufferSize);
__END_DECLS
#endif /* _LIBROOT_STDLIB_PRIVATE_H */

View File

@ -15,6 +15,7 @@
#include <libroot_private.h> #include <libroot_private.h>
#include <locks.h> #include <locks.h>
#include <runtime_loader.h> #include <runtime_loader.h>
#include <stdlib_private.h>
#include <syscall_utils.h> #include <syscall_utils.h>
#include <user_runtime.h> #include <user_runtime.h>
@ -315,3 +316,21 @@ putenv(const char *string)
RETURN_AND_SET_ERRNO(status); RETURN_AND_SET_ERRNO(status);
} }
ssize_t
__getenv_reentrant(const char* name, char* buffer, size_t bufferSize)
{
size_t nameLength = strlen(name);
lock_variables();
char* value = find_variable(name, nameLength, NULL);
ssize_t result = value != NULL
? strlcpy(buffer, value + nameLength + 1, bufferSize)
: B_NAME_NOT_FOUND;
unlock_variables();
return result;
}