X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/1f2f436a38f7ae2d39a943ad2898d8fed4ed2e58..a9aaacca3a68bb8d74fec09d8d8681a0efda2581:/stdlib/FreeBSD/putenv.c diff --git a/stdlib/FreeBSD/putenv.c b/stdlib/FreeBSD/putenv.c index e74d346..6458d63 100644 --- a/stdlib/FreeBSD/putenv.c +++ b/stdlib/FreeBSD/putenv.c @@ -35,22 +35,75 @@ __FBSDID("$FreeBSD: src/lib/libc/stdlib/putenv.c,v 1.6 2007/05/01 16:02:41 ache #include #include +#include +#include +#include +#include + +extern struct owned_ptr *__env_owned; + +#ifdef LEGACY_CRT1_ENVIRON +extern char **_saved_environ; +#endif /* LEGACY_CRT1_ENVIRON */ + +__private_extern__ int __init__env_owned_locked(int); +__private_extern__ int __setenv_locked(const char *, const char *, int, int, char ***, struct owned_ptr *); +__private_extern__ void __environ_lock(void); +__private_extern__ void __environ_unlock(void); + +#ifndef BUILDING_VARIANT +/* + * _putenvp -- SPI using an arbitrary pointer to string array (the array must + * have been created with malloc) and an env state, created by _allocenvstate(). + * Returns ptr to value associated with name, if any, else NULL. + */ +int +_putenvp(char *str, char ***envp, void *state) +{ + __environ_lock(); + if (__init__env_owned_locked(1)) { + __environ_unlock(); + return (-1); + } + int ret = __setenv_locked(str, NULL, 1, 0, envp, + (state ? (struct owned_ptr *)state : __env_owned)); + __environ_unlock(); + return ret; +} +#endif /* BUILDING_VARIANT */ int putenv(str) - const char *str; + char *str; { - char *p, *equal; - int rval; + int ret; + int copy; - if ((p = strdup(str)) == NULL) +#if __DARWIN_UNIX03 + if (str == NULL || *str == 0 || index(str, '=') == NULL) { + errno = EINVAL; return (-1); - if ((equal = index(p, '=')) == NULL) { - (void)free(p); + } +#else /* !__DARWIN_UNIX03 */ + if (index(str, '=') == NULL) + return (-1); +#endif /* __DARWIN_UNIX03 */ + +#if __DARWIN_UNIX03 + copy = 0; +#else /* !__DARWIN_UNIX03 */ + copy = -1; +#endif /* __DARWIN_UNIX03 */ + + __environ_lock(); + if (__init__env_owned_locked(1)) { + __environ_unlock(); return (-1); } - *equal = '\0'; - rval = setenv(p, equal + 1, 1); - (void)free(p); - return (rval); + ret = __setenv_locked(str, NULL, 1, copy, _NSGetEnviron(), __env_owned); +#ifdef LEGACY_CRT1_ENVIRON + _saved_environ = *_NSGetEnviron(); +#endif /* LEGACY_CRT1_ENVIRON */ + __environ_unlock(); + return ret; }