summaryrefslogtreecommitdiff
path: root/newlib/libc/stdlib/putenv_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/stdlib/putenv_r.c')
-rw-r--r--newlib/libc/stdlib/putenv_r.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/newlib/libc/stdlib/putenv_r.c b/newlib/libc/stdlib/putenv_r.c
new file mode 100644
index 00000000000..f3c368a2115
--- /dev/null
+++ b/newlib/libc/stdlib/putenv_r.c
@@ -0,0 +1,58 @@
+/* This file may have been modified by DJ Delorie (Jan 1991). If so,
+** these modifications are Coyright (C) 1991 DJ Delorie, 24 Kirsten Ave,
+** Rochester NH, 03867-2954, USA.
+*/
+
+/*-
+ * Copyright (c) 1988 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that: (1) source distributions retain this entire copyright
+ * notice and comment, and (2) distributions including binaries display
+ * the following acknowledgement: ``This product includes software
+ * developed by the University of California, Berkeley and its contributors''
+ * in the documentation or other materials provided with the distribution
+ * and in all advertising materials mentioning features or use of this
+ * software. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include <reent.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "envlock.h"
+
+/* _putenv_r - reentrant version of putenv that either adds
+ or replaces the environment variable "name"
+ with "value" which is specified by str as "name=value". */
+int
+_DEFUN (_putenv_r, (reent_ptr, str),
+ struct _reent *reent_ptr _AND
+ _CONST char *str)
+{
+ register char *p, *equal;
+ int rval;
+
+ p = _strdup_r (reent_ptr, str);
+
+ if (!p)
+ return 1;
+
+ if (!(equal = index (p, '=')))
+ {
+ (void) _free_r (reent_ptr, p);
+ return 1;
+ }
+
+ *equal = '\0';
+ rval = _setenv_r (reent_ptr, p, equal + 1, 1);
+ (void) _free_r (reent_ptr, p);
+
+ return rval;
+}