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