Mercurial > hg > octave-shane > gnulib-hg
annotate lib/putenv.c @ 363:ec4b36233380
Get putenv.c from /copies (derived from glibc).
Hack it to work with SGI's __environ junk.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Sun, 04 Dec 1994 21:08:50 +0000 |
parents | 6980a90dddc9 |
children | d249a740d974 |
rev | line source |
---|---|
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
1 /* Copyright (C) 1991, 1994 Free Software Foundation, Inc. |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
2 |
9 | 3 |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
4 NOTE: The canonical source of this file is maintained with the GNU C Library. |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
5 Bugs can be reported to bug-glibc@prep.ai.mit.edu. |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
6 |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
7 This program is free software; you can redistribute it and/or modify it |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
8 under the terms of the GNU General Public License as published by the |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
9 Free Software Foundation; either version 2, or (at your option) any |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
10 later version. |
311 | 11 |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
12 This program is distributed in the hope that it will be useful, |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
13 but WITHOUT ANY WARRANTY; without even the implied warranty of |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
15 GNU General Public License for more details. |
9 | 16 |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
17 You should have received a copy of the GNU General Public License |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
18 along with this program; if not, write to the Free Software |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
19 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
20 |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
21 #include <errno.h> |
9 | 22 |
311 | 23 #ifdef HAVE_CONFIG_H |
24 #include <config.h> | |
25 #endif | |
26 | |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
27 #if defined (__GNU_LIBRARY__) || defined (HAVE_STDLIB_H) |
9 | 28 #include <stdlib.h> |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
29 #endif |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
30 #if defined (__GNU_LIBRARY__) || defined (HAVE_STRING_H) |
311 | 31 #include <string.h> |
32 #endif | |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
33 #if defined (__GNU_LIBRARY__) || defined (HAVE_UNISTD_H) |
311 | 34 #include <unistd.h> |
35 #endif | |
36 | |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
37 #if !defined (__GNU_LIBRARY__) && !defined (HAVE_STRCHR) |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
38 #define strchr index |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
39 #endif |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
40 #if !defined (__GNU_LIBRARY__) && !defined (HAVE_MEMCPY) |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
41 #define memcpy(d,s,n) bcopy ((s), (d), (n)) |
311 | 42 #endif |
43 | |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
44 #if HAVE_GNU_LD |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
45 #define environ __environ |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
46 #else |
311 | 47 extern char **environ; |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
48 #endif |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
49 |
311 | 50 |
9 | 51 /* Put STRING, which is of the form "NAME=VALUE", in the environment. */ |
52 int | |
311 | 53 putenv (string) |
54 const char *string; | |
9 | 55 { |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
56 const char *const name_end = strchr (string, '='); |
9 | 57 register size_t size; |
58 register char **ep; | |
59 | |
60 if (name_end == NULL) | |
61 { | |
62 /* Remove the variable from the environment. */ | |
311 | 63 size = strlen (string); |
64 for (ep = environ; *ep != NULL; ++ep) | |
65 if (!strncmp (*ep, string, size) && (*ep)[size] == '=') | |
9 | 66 { |
67 while (ep[1] != NULL) | |
68 { | |
69 ep[0] = ep[1]; | |
70 ++ep; | |
71 } | |
72 *ep = NULL; | |
73 return 0; | |
74 } | |
75 } | |
76 | |
77 size = 0; | |
311 | 78 for (ep = environ; *ep != NULL; ++ep) |
79 if (!strncmp (*ep, string, name_end - string) && | |
9 | 80 (*ep)[name_end - string] == '=') |
81 break; | |
82 else | |
83 ++size; | |
84 | |
85 if (*ep == NULL) | |
86 { | |
87 static char **last_environ = NULL; | |
311 | 88 char **new_environ = (char **) malloc ((size + 2) * sizeof (char *)); |
9 | 89 if (new_environ == NULL) |
90 return -1; | |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
91 (void) memcpy ((void *) new_environ, (void *) environ, |
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
92 size * sizeof (char *)); |
9 | 93 new_environ[size] = (char *) string; |
94 new_environ[size + 1] = NULL; | |
95 if (last_environ != NULL) | |
363
ec4b36233380
Get putenv.c from /copies (derived from glibc).
Jim Meyering <jim@meyering.net>
parents:
311
diff
changeset
|
96 free ((void *) last_environ); |
9 | 97 last_environ = new_environ; |
311 | 98 environ = new_environ; |
9 | 99 } |
100 else | |
101 *ep = (char *) string; | |
102 | |
103 return 0; | |
104 } |