#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))
#include "defs.h"
#include "environ.h"
#include "gdb_string.h"
struct gdb_environ *
make_environ (void)
{
struct gdb_environ *e;
e = (struct gdb_environ *) xmalloc (sizeof (struct gdb_environ));
e->allocated = 10;
e->vector = (char **) xmalloc ((e->allocated + 1) * sizeof (char *));
e->vector[0] = 0;
return e;
}
void
free_environ (struct gdb_environ *e)
{
char **vector = e->vector;
while (*vector)
xfree (*vector++);
xfree (e);
}
void
init_environ (struct gdb_environ *e)
{
extern char **environ;
int i;
if (environ == NULL)
return;
for (i = 0; environ[i]; i++) ;
if (e->allocated < i)
{
e->allocated = max (i, e->allocated + 10);
e->vector = (char **) xrealloc ((char *) e->vector,
(e->allocated + 1) * sizeof (char *));
}
memcpy (e->vector, environ, (i + 1) * sizeof (char *));
while (--i >= 0)
{
int len = strlen (e->vector[i]);
char *new = (char *) xmalloc (len + 1);
memcpy (new, e->vector[i], len + 1);
e->vector[i] = new;
}
}
struct dyld_smuggle_pairs {
const char *real_name;
const char *smuggled_name;
};
void
smuggle_dyld_settings (struct gdb_environ *e)
{
struct dyld_smuggle_pairs env_names[] = {
{"DYLD_FRAMEWORK_PATH", "GDB_DYLD_FRAMEWORK_PATH"},
{"DYLD_FALLBACK_FRAMEWORK_PATH", "GDB_DYLD_FALLBACK_FRAMEWORK_PATH"},
{"DYLD_LIBRARY_PATH", "GDB_DYLD_LIBRARY_PATH"},
{"DYLD_FALLBACK_LIBRARY_PATH", "GDB_DYLD_FALLBACK_LIBRARY_PATH"},
{"DYLD_ROOT_PATH", "GDB_DYLD_ROOT_PATH"},
{"DYLD_PATHS_ROOT", "GDB_DYLD_PATHS_ROOT"},
{"DYLD_IMAGE_SUFFIX", "GDB_DYLD_IMAGE_SUFFIX"},
{"DYLD_INSERT_LIBRARIES", "GDB_DYLD_INSERT_LIBRARIES"},
{ NULL, NULL } };
int i;
for (i = 0; env_names[i].real_name != NULL; i++)
{
const char *real_val = get_in_environ (e, env_names[i].real_name);
const char *smuggled_val = get_in_environ (e, env_names[i].smuggled_name);
if (real_val == NULL || smuggled_val == NULL)
continue;
if (real_val[0] != '\0')
continue;
set_in_environ (e, env_names[i].real_name, smuggled_val);
}
}
char **
environ_vector (struct gdb_environ *e)
{
return e->vector;
}
char *
get_in_environ (const struct gdb_environ *e, const char *var)
{
int len = strlen (var);
char **vector = e->vector;
char *s;
for (; (s = *vector) != NULL; vector++)
if (strncmp (s, var, len) == 0 && s[len] == '=')
return &s[len + 1];
return 0;
}
void
set_in_environ (struct gdb_environ *e, const char *var, const char *value)
{
int i;
int len = strlen (var);
char **vector = e->vector;
char *s;
for (i = 0; (s = vector[i]) != NULL; i++)
if (strncmp (s, var, len) == 0 && s[len] == '=')
break;
if (s == 0)
{
if (i == e->allocated)
{
e->allocated += 10;
vector = (char **) xrealloc ((char *) vector,
(e->allocated + 1) * sizeof (char *));
e->vector = vector;
}
vector[i + 1] = 0;
}
else
xfree (s);
s = (char *) xmalloc (len + strlen (value) + 2);
strcpy (s, var);
strcat (s, "=");
strcat (s, value);
vector[i] = s;
return;
}
void
unset_in_environ (struct gdb_environ *e, char *var)
{
int len = strlen (var);
char **vector = e->vector;
char *s;
for (; (s = *vector) != NULL; vector++)
{
if (DEPRECATED_STREQN (s, var, len) && s[len] == '=')
{
xfree (s);
while ((vector[0] = vector[1]) != NULL)
{
vector++;
}
break;
}
}
}