From 063ba7455fa6c726771fe0d8495544a38c29fa51 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 10 Nov 2005 10:38:45 +1100 Subject: - (dtucker) [openbsd-compat/setenv.c] Sync changes from OpenBSD setenv.c revs 1.7 - 1.9. --- ChangeLog | 8 ++++--- openbsd-compat/setenv.c | 62 ++++++++++++++++++------------------------------- 2 files changed, 28 insertions(+), 42 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7b9b6a516..1ddf19340 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,11 @@ 20051110 - - (dtucker) [openbsd-compat/getenv.c] Merge changes for __findenv from + - (dtucker) [openbsd-compat/setenv.c] Merge changes for __findenv from OpenBSD getenv.c revs 1.4 - 1.8 (ANSIfication of arguments, removal of "register"). - - (dtucker) [openbsd-compat/getenv.c] Make __findenv static, remove + - (dtucker) [openbsd-compat/setenv.c] Make __findenv static, remove unnecessary prototype. + - (dtucker) [openbsd-compat/setenv.c] Sync changes from OpenBSD setenv.c + revs 1.7 - 1.9. 20051105 - (djm) OpenBSD CVS Sync @@ -3246,4 +3248,4 @@ - (djm) Trim deprecated options from INSTALL. Mention UsePAM - (djm) Fix quote handling in sftp; Patch from admorten AT umich.edu -$Id: ChangeLog,v 1.3956 2005/11/09 23:13:06 dtucker Exp $ +$Id: ChangeLog,v 1.3957 2005/11/09 23:38:45 dtucker Exp $ diff --git a/openbsd-compat/setenv.c b/openbsd-compat/setenv.c index 7894c485a..93a681152 100644 --- a/openbsd-compat/setenv.c +++ b/openbsd-compat/setenv.c @@ -1,5 +1,6 @@ /* OPENBSD ORIGINAL: lib/libc/stdlib/setenv.c */ +/* $OpenBSD: setenv.c,v 1.9 2005/08/08 08:05:37 espie Exp $ */ /* * Copyright (c) 1987 Regents of the University of California. * All rights reserved. @@ -32,15 +33,12 @@ #include "includes.h" #if !defined(HAVE_SETENV) || !defined(HAVE_UNSETENV) -#if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: setenv.c,v 1.6 2003/06/02 20:18:38 millert Exp $"; -#endif /* LIBC_SCCS and not lint */ - #include #include -/* OpenSSH Portable: __findenv is from getenv.c rev 1.8, made static */ +extern char **environ; +/* OpenSSH Portable: __findenv is from getenv.c rev 1.8, made static */ /* * __findenv -- * Returns pointer to value associated with name, if any, else NULL. @@ -80,14 +78,10 @@ __findenv(const char *name, int *offset) * "value". If rewrite is set, replace any current value. */ int -setenv(name, value, rewrite) - register const char *name; - register const char *value; - int rewrite; +setenv(const char *name, const char *value, int rewrite) { - extern char **environ; - static int alloced; /* if allocated space before */ - register char *C; + static char **lastenv; /* last value of environ */ + char *C; int l_value, offset; if (*value == '=') /* no `=' in value */ @@ -102,30 +96,23 @@ setenv(name, value, rewrite) return (0); } } else { /* create new slot */ - register int cnt; - register char **P; + size_t cnt; + char **P; - for (P = environ, cnt = 0; *P; ++P, ++cnt); - if (alloced) { /* just increase size */ - P = (char **)realloc((void *)environ, - (size_t)(sizeof(char *) * (cnt + 2))); - if (!P) - return (-1); - environ = P; - } - else { /* get new space */ - alloced = 1; /* copy old entries into it */ - P = (char **)malloc((size_t)(sizeof(char *) * - (cnt + 2))); - if (!P) - return (-1); - memmove(P, environ, cnt * sizeof(char *)); - environ = P; - } - environ[cnt + 1] = NULL; + for (P = environ; *P != NULL; P++) + ; + cnt = P - environ; + P = (char **)realloc(lastenv, sizeof(char *) * (cnt + 2)); + if (!P) + return (-1); + if (lastenv != environ) + memcpy(P, environ, cnt * sizeof(char *)); + lastenv = environ = P; offset = cnt; + environ[cnt + 1] = NULL; } - for (C = (char *)name; *C && *C != '='; ++C); /* no `=' in name */ + for (C = (char *)name; *C && *C != '='; ++C) + ; /* no `=' in name */ if (!(environ[offset] = /* name + `=' + value */ malloc((size_t)((int)(C - name) + l_value + 2)))) return (-1); @@ -143,15 +130,12 @@ setenv(name, value, rewrite) * Delete environmental variable "name". */ void -unsetenv(name) - const char *name; +unsetenv(const char *name) { - extern char **environ; - register char **P; + char **P; int offset; - char *__findenv(); - while (__findenv(name, &offset)) /* if set multiple times */ + while (__findenv(name, &offset)) /* if set multiple times */ for (P = &environ[offset];; ++P) if (!(*P = *(P + 1))) break; -- cgit v1.2.3