2011-01-07 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / environ.c
CommitLineData
c906108c 1/* environ.c -- library for manipulating environments for GNU.
69517000 2
197e01b6 3 Copyright (C) 1986, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 2000, 2005
7b6bb8da 4 2003, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
c906108c 5
c5aa993b
JM
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
a9762ec7 8 the Free Software Foundation; either version 3 of the License, or
c5aa993b 9 (at your option) any later version.
c906108c 10
c5aa993b
JM
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
c906108c 15
c5aa993b 16 You should have received a copy of the GNU General Public License
a9762ec7 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
18
19#define min(a, b) ((a) < (b) ? (a) : (b))
20#define max(a, b) ((a) > (b) ? (a) : (b))
21
22#include "defs.h"
23#include "environ.h"
24#include "gdb_string.h"
c906108c 25\f
c5aa993b 26
c906108c
SS
27/* Return a new environment object. */
28
1bf1958d 29struct gdb_environ *
fba45db2 30make_environ (void)
c906108c 31{
1bf1958d 32 struct gdb_environ *e;
c906108c 33
1bf1958d 34 e = (struct gdb_environ *) xmalloc (sizeof (struct gdb_environ));
c906108c
SS
35
36 e->allocated = 10;
37 e->vector = (char **) xmalloc ((e->allocated + 1) * sizeof (char *));
38 e->vector[0] = 0;
39 return e;
40}
41
42/* Free an environment and all the strings in it. */
43
44void
1bf1958d 45free_environ (struct gdb_environ *e)
c906108c 46{
52f0bd74 47 char **vector = e->vector;
c906108c
SS
48
49 while (*vector)
b8c9b27d 50 xfree (*vector++);
c906108c 51
9a61c7a6 52 xfree (e->vector);
b8c9b27d 53 xfree (e);
c906108c
SS
54}
55
56/* Copy the environment given to this process into E.
57 Also copies all the strings in it, so we can be sure
58 that all strings in these environments are safe to free. */
59
60void
1bf1958d 61init_environ (struct gdb_environ *e)
c906108c
SS
62{
63 extern char **environ;
52f0bd74 64 int i;
c906108c
SS
65
66 if (environ == NULL)
67 return;
68
c5aa993b 69 for (i = 0; environ[i]; i++) /*EMPTY */ ;
c906108c
SS
70
71 if (e->allocated < i)
72 {
73 e->allocated = max (i, e->allocated + 10);
c5aa993b 74 e->vector = (char **) xrealloc ((char *) e->vector,
c906108c
SS
75 (e->allocated + 1) * sizeof (char *));
76 }
77
78 memcpy (e->vector, environ, (i + 1) * sizeof (char *));
79
80 while (--i >= 0)
81 {
aa1ee363
AC
82 int len = strlen (e->vector[i]);
83 char *new = (char *) xmalloc (len + 1);
d7f9d729 84
c906108c
SS
85 memcpy (new, e->vector[i], len + 1);
86 e->vector[i] = new;
87 }
88}
89
90/* Return the vector of environment E.
91 This is used to get something to pass to execve. */
92
93char **
1bf1958d 94environ_vector (struct gdb_environ *e)
c906108c
SS
95{
96 return e->vector;
97}
98\f
99/* Return the value in environment E of variable VAR. */
100
101char *
1bf1958d 102get_in_environ (const struct gdb_environ *e, const char *var)
c906108c 103{
52f0bd74
AC
104 int len = strlen (var);
105 char **vector = e->vector;
106 char *s;
c906108c
SS
107
108 for (; (s = *vector) != NULL; vector++)
bf896cb0 109 if (strncmp (s, var, len) == 0 && s[len] == '=')
c906108c
SS
110 return &s[len + 1];
111
112 return 0;
113}
114
115/* Store the value in E of VAR as VALUE. */
116
117void
1bf1958d 118set_in_environ (struct gdb_environ *e, const char *var, const char *value)
c906108c 119{
52f0bd74
AC
120 int i;
121 int len = strlen (var);
122 char **vector = e->vector;
123 char *s;
c906108c
SS
124
125 for (i = 0; (s = vector[i]) != NULL; i++)
bf896cb0 126 if (strncmp (s, var, len) == 0 && s[len] == '=')
c906108c
SS
127 break;
128
129 if (s == 0)
130 {
131 if (i == e->allocated)
132 {
133 e->allocated += 10;
c5aa993b 134 vector = (char **) xrealloc ((char *) vector,
c906108c
SS
135 (e->allocated + 1) * sizeof (char *));
136 e->vector = vector;
137 }
138 vector[i + 1] = 0;
139 }
140 else
b8c9b27d 141 xfree (s);
c906108c
SS
142
143 s = (char *) xmalloc (len + strlen (value) + 2);
144 strcpy (s, var);
145 strcat (s, "=");
146 strcat (s, value);
147 vector[i] = s;
148
149 /* This used to handle setting the PATH and GNUTARGET variables
150 specially. The latter has been replaced by "set gnutarget"
151 (which has worked since GDB 4.11). The former affects searching
152 the PATH to find SHELL, and searching the PATH to find the
153 argument of "symbol-file" or "exec-file". Maybe we should have
154 some kind of "set exec-path" for that. But in any event, having
155 "set env" affect anything besides the inferior is a bad idea.
156 What if we want to change the environment we pass to the program
157 without afecting GDB's behavior? */
158
159 return;
160}
161
162/* Remove the setting for variable VAR from environment E. */
163
164void
1bf1958d 165unset_in_environ (struct gdb_environ *e, char *var)
c906108c 166{
52f0bd74
AC
167 int len = strlen (var);
168 char **vector = e->vector;
169 char *s;
c906108c
SS
170
171 for (; (s = *vector) != NULL; vector++)
172 {
591e78ff 173 if (strncmp (s, var, len) == 0 && s[len] == '=')
c906108c 174 {
b8c9b27d 175 xfree (s);
c906108c
SS
176 /* Walk through the vector, shuffling args down by one, including
177 the NULL terminator. Can't use memcpy() here since the regions
0963b4bd 178 overlap, and memmove() might not be available. */
c906108c
SS
179 while ((vector[0] = vector[1]) != NULL)
180 {
181 vector++;
182 }
183 break;
184 }
185 }
186}
This page took 0.800427 seconds and 4 git commands to generate.