old-cross-binutils/gdb/putenv.c
John Gilmore c55e616795 Handle debug symbols in dynamically loaded (relocated) code:
* dbxread.c (read_ofile_symtab):  Fix up N_CATCH better.  Pass
offset to process_one_symbol.
(process_one_symbol):  Take new offset parameter.  Add it into
appropriate symbol types to relocate symbols to loaded addresses.
Handle all possible symbol types, and complain() about types that
we don't expect to see.
* mipsread.c (psymtab_to_symtab_1):  Pass offset of zero to
process_one_symbol (FIXME, should pass real offset).

Misc bugfixes:

* breakpoint.c (resolve_sal_pc):  Split out code to resolve a
sal's PC value.
(set_breakpoint, break_command_1, until_break_command,
catch_command_1, breakpoint_re_set_one):  Use it.
(breakpoint_re_set_one):  Disable bkpts that don't re-set cleanly.
(breakpoint_re_set):  Mention breakpoint number in error messages.
* symtab.h (resolve_sal_pc):  Declare.
* infcmd.c (jump_command):  Use resolve_sal_pc.

* source.c (find_source_lines):  Avoid "Source file is more
recent than executable" when bfd_get_mtime gives 0.
(list_command):  Shorten "FILE, line N" to "FILE:N".

* putenv.c (putenv):  Avoid unportably casting pointers to unsigneds.
1992-01-28 02:57:37 +00:00

111 lines
2.8 KiB
C

/****************************************************************/
/* */
/* putenv(3) */
/* */
/* Change or add an environment entry */
/* */
/****************************************************************/
/* origination 1987-Oct-7 T. Holm */
/****************************************************************/
/*
Path: hoptoad!pacbell!ames!ll-xn!mit-eddie!uw-beaver!ssc-vax!uvicctr!tholm
From: tholm@uvicctr.UUCP (Terrence W. Holm)
Newsgroups: comp.os.minix
Subject: putenv(3)
Message-ID: <395@uvicctr.UUCP>
Date: 5 May 88 06:40:52 GMT
Organization: University of Victoria, Victoria B.C. Canada
EFTH Minix report #2 - May 1988 - putenv(3)
This is an implementation of putenv(3) that we
wrote for Minix. Please consider this a public
domain program.
*/
#include <stdio.h>
#define PSIZE sizeof(char *)
extern char **environ;
char *index();
char *malloc();
/****************************************************************/
/* */
/* int */
/* putenv( entry ) */
/* */
/* The "entry" should follow the form */
/* "NAME=VALUE". This routine will search the */
/* user environment for "NAME" and replace its */
/* value with "VALUE". */
/* */
/* Note that "entry" is not copied, it is used */
/* as the environment entry. This means that it */
/* must not be unallocated or otherwise modifed */
/* by the caller, unless it is replaced by a */
/* subsequent putenv(). */
/* */
/* If the name is not found in the environment, */
/* then a new vector of pointers is allocated, */
/* "entry" is put at the end and the global */
/* variable "environ" is updated. */
/* */
/* This function normally returns NULL, but -1 */
/* is returned if it can not allocate enough */
/* space using malloc(3), or "entry" does not */
/* contain a '='. */
/* */
/****************************************************************/
int
putenv( entry )
char *entry;
{
unsigned length;
unsigned size;
char *temp;
char **p;
char **new_environ;
/* Find the length of the "NAME=" */
temp = index(entry,'=');
if ( temp == 0 )
return( -1 );
length = (unsigned) (temp - entry + 1);
/* Scan through the environment looking for "NAME=" */
for ( p=environ; *p != 0 ; p++ )
if ( strncmp( entry, *p, length ) == 0 )
{
*p = entry;
return( 0 );
}
/* The name was not found, build a bigger environment */
size = p - environ;
new_environ = (char **) malloc( (size+2)*PSIZE );
if ( new_environ == (char **) NULL )
return( -1 );
bcopy( (char *) environ, (char *) new_environ, size*PSIZE );
new_environ[size] = entry;
new_environ[size+1] = NULL;
environ = new_environ;
return(0);
}