Updated from ../gpl2lgpl.sed /home/gd/gnu/lib/error.c

This commit is contained in:
Roland McGrath 1995-12-06 00:14:32 +00:00
parent 77a58cad3f
commit 196980f511
18 changed files with 9876 additions and 95 deletions

View File

@ -281,7 +281,7 @@ ifndef +link
+link = $(CC) -nostdlib -nostartfiles -o $@ \
$(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) \
$(addprefix $(csu-objpfx),start.o $(+preinit)) \
$(^:$(common-objpfx)libc.a=$(link-libc)) \
$(^:$(common-objpfx)libc%=$(link-libc)) \
$(addprefix $(csu-objpfx),$(+postinit))
endif
ifndef config-LDFLAGS
@ -292,7 +292,7 @@ endif
ifndef link-libc
ifeq (yes,$(build-shared))
link-libc = -Wl,-rpath-link=$(common-objdir) -Wl,-rpath=$(default-rpath) \
$(common-objpfx)libc.so $(gnulib)
$(common-objpfx)libc.so$(libc.so-version) $(gnulib)
# Choose the default search path for the dynamic linker based on
# where we will install libraries.
ifneq ($(libdir),$(slibdir))
@ -331,10 +331,10 @@ built-program-file = $(dir $(word 2,$^))$(notdir $(word 2,$^))
ifneq (yes,$(build-shared))
built-program-cmd = $(built-program-file)
else
, = ,
comma = ,
define built-program-cmd
LD_LIBRARY_PATH=$(common-objdir)$(patsubst -Wl$,-rpath-link=%,:%,\
$(filter -Wl$,-rpath-link=%,\
LD_LIBRARY_PATH=$(common-objdir)$(patsubst -Wl$(comma)-rpath-link=%,:%,\
$(filter -Wl$(comma)-rpath-link=%,\
$(sysdep-LDFLAGS))) \
$(elf-objpfx)ld.so $(built-program-file)
endef

View File

@ -575,6 +575,12 @@ $(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
$(common-objpfx)libc_pic.a \
$(elfobjdir)/sofini.so
$(build-shlib)
ifdef libc.so-version
$(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so
rm -f $@
ln -s $(<F) $@ || ln $< $@
endif
endif

19
Rules
View File

@ -80,21 +80,22 @@ tests: $(tests:%=$(objpfx)%.out)
endif
ifneq "$(strip $(others) $(tests))" ""
$(addprefix $(objpfx),$(others) $(tests)): %: %.o $(common-objpfx)libc.a
$(addprefix $(objpfx),$(others) $(tests)): %: %.o \
$(sort $(filter $(common-objpfx)libc%,$(link-libc)))
$(+link)
endif
ifneq "$(strip $(tests))" ""
# These are the implicit rules for making test outputs
# from the test programs and whatever input files are present.
$(objpfx)%.out: $(objpfx)% %.args %.input
$(dir $<)$(notdir $<) `cat $(word 2,$^)` < $(word 3,$^) > $@
$(objpfx)%.out: $(objpfx)% %.args
$(dir $<)$(notdir $<) `cat $(word 2,$^)` > $@
$(objpfx)%.out: $(objpfx)% %.input
$(dir $<)$(notdir $<) < $(word 2,$^) > $@
$(objpfx)%.out: $(objpfx)%
$(dir $<)$(notdir $<) > $@
$(objpfx)%.out: %.args $(objpfx)% %.input
$(built-program-cmd) `cat $(word 1,$^)` < $(word 3,$^) > $@
$(objpfx)%.out: %.args $(objpfx)%
$(built-program-cmd) `cat $(word 1,$^)` > $@
$(objpfx)%.out: %.input $(objpfx)%
$(built-program-cmd) < $(word 1,$^) > $@
$(objpfx)%.out: /dev/null $(objpfx)% # Make it 2nd arg for canned sequence.
$(built-program-cmd) > $@
endif # tests
.PHONY: distclean realclean subdir_distclean subdir_realclean \

224
libio/iopopen.c Normal file
View File

@ -0,0 +1,224 @@
/*
Copyright (C) 1993 Free Software Foundation
This file is part of the GNU IO Library. This library is free
software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option)
any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this library; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
As a special exception, if you link this library with files
compiled with a GNU compiler to produce an executable, this does not cause
the resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License. */
/* written by Per Bothner (bothner@cygnus.com) */
#define _POSIX_SOURCE
#include "libioP.h"
#if _IO_HAVE_SYS_WAIT
#include <signal.h>
#include <unistd.h>
#ifdef __STDC__
#include <stdlib.h>
#endif
#include <sys/types.h>
#include <sys/wait.h>
#ifndef _IO_fork
#define _IO_fork vfork /* defined in libiberty, if needed */
_IO_pid_t _IO_fork();
#endif
#endif /* _IO_HAVE_SYS_WAIT */
#ifndef _IO_pipe
#define _IO_pipe pipe
extern int _IO_pipe();
#endif
#ifndef _IO_dup2
#define _IO_dup2 dup2
extern int _IO_dup2();
#endif
#ifndef _IO_waitpid
#define _IO_waitpid waitpid
#endif
#ifndef _IO_execl
#define _IO_execl execl
#endif
#ifndef _IO__exit
#define _IO__exit _exit
#endif
struct _IO_proc_file
{
struct _IO_FILE_plus file;
/* Following fields must match those in class procbuf (procbuf.h) */
_IO_pid_t pid;
struct _IO_proc_file *next;
};
typedef struct _IO_proc_file _IO_proc_file;
static struct _IO_proc_file *proc_file_chain = NULL;
_IO_FILE *
DEFUN(_IO_proc_open, (fp, command, mode),
_IO_FILE* fp AND const char *command AND const char *mode)
{
#if _IO_HAVE_SYS_WAIT
int read_or_write;
int pipe_fds[2];
int parent_end, child_end;
_IO_pid_t child_pid;
if (_IO_file_is_open(fp))
return NULL;
if (_IO_pipe(pipe_fds) < 0)
return NULL;
if (mode[0] == 'r')
{
parent_end = pipe_fds[0];
child_end = pipe_fds[1];
read_or_write = _IO_NO_WRITES;
}
else
{
parent_end = pipe_fds[1];
child_end = pipe_fds[0];
read_or_write = _IO_NO_READS;
}
((_IO_proc_file*)fp)->pid = child_pid = _IO_fork();
if (child_pid == 0)
{
int child_std_end = mode[0] == 'r' ? 1 : 0;
_IO_close(parent_end);
if (child_end != child_std_end)
{
_IO_dup2(child_end, child_std_end);
_IO_close(child_end);
}
/* Posix.2: "popen() shall ensure that any streams from previous
popen() calls that remain open in the parent process are closed
in the new child process." */
while (proc_file_chain)
{
_IO_close (_IO_fileno ((_IO_FILE *) proc_file_chain));
proc_file_chain = proc_file_chain->next;
}
_IO_execl("/bin/sh", "sh", "-c", command, NULL);
_IO__exit(127);
}
_IO_close(child_end);
if (child_pid < 0)
{
_IO_close(parent_end);
return NULL;
}
_IO_fileno(fp) = parent_end;
/* Link into proc_file_chain. */
((_IO_proc_file*)fp)->next = proc_file_chain;
proc_file_chain = (_IO_proc_file*)fp;
_IO_mask_flags (fp, read_or_write, _IO_NO_READS|_IO_NO_WRITES);
return fp;
#else /* !_IO_HAVE_SYS_WAIT */
return NULL;
#endif
}
_IO_FILE *
DEFUN(_IO_popen, (command, mode),
const char *command AND const char *mode)
{
_IO_proc_file *fpx = (_IO_proc_file*)malloc(sizeof(_IO_proc_file));
_IO_FILE *fp = (_IO_FILE*)fpx;
if (fp == NULL)
return NULL;
_IO_init(fp, 0);
_IO_JUMPS(fp) = &_IO_proc_jumps;
_IO_file_init(fp);
#if !_IO_UNIFIED_JUMPTABLES
((struct _IO_FILE_plus*)fp)->vtable = NULL;
#endif
if (_IO_proc_open (fp, command, mode) != NULL)
return fp;
free (fpx);
return NULL;
}
strong_alias (_IO_popen, popen);
int
DEFUN(_IO_proc_close, (fp),
_IO_FILE *fp)
{
/* This is not name-space clean. FIXME! */
#if _IO_HAVE_SYS_WAIT
int wstatus;
_IO_proc_file **ptr = &proc_file_chain;
_IO_pid_t wait_pid;
int status = -1;
/* Unlink from proc_file_chain. */
for ( ; *ptr != NULL; ptr = &(*ptr)->next)
{
if (*ptr == (_IO_proc_file*)fp)
{
*ptr = (*ptr)->next;
status = 0;
break;
}
}
if (status < 0 || _IO_close(_IO_fileno(fp)) < 0)
return -1;
/* POSIX.2 Rationale: "Some historical implementations either block
or ignore the signals SIGINT, SIGQUIT, and SIGHUP while waiting
for the child process to terminate. Since this behavior is not
described in POSIX.2, such implementations are not conforming." */
do
{
wait_pid = _IO_waitpid (((_IO_proc_file*)fp)->pid, &wstatus, 0);
} while (wait_pid == -1 && errno == EINTR);
if (wait_pid == -1)
return -1;
return wstatus;
#else /* !_IO_HAVE_SYS_WAIT */
return -1;
#endif
}
struct _IO_jump_t _IO_proc_jumps = {
JUMP_INIT_DUMMY,
JUMP_INIT(finish, _IO_file_finish),
JUMP_INIT(overflow, _IO_file_overflow),
JUMP_INIT(underflow, _IO_file_underflow),
JUMP_INIT(uflow, _IO_default_uflow),
JUMP_INIT(pbackfail, _IO_default_pbackfail),
JUMP_INIT(xsputn, _IO_file_xsputn),
JUMP_INIT(xsgetn, _IO_default_xsgetn),
JUMP_INIT(seekoff, _IO_file_seekoff),
JUMP_INIT(seekpos, _IO_default_seekpos),
JUMP_INIT(setbuf, _IO_file_setbuf),
JUMP_INIT(sync, _IO_file_sync),
JUMP_INIT(doallocate, _IO_file_doallocate),
JUMP_INIT(read, _IO_file_read),
JUMP_INIT(write, _IO_file_write),
JUMP_INIT(seek, _IO_file_seek),
JUMP_INIT(close, _IO_proc_close),
JUMP_INIT(stat, _IO_file_stat)
};

16
libio/pclose.c Normal file
View File

@ -0,0 +1,16 @@
#include "libioP.h"
#include "stdio.h"
#include <errno.h>
int
pclose(fp)
FILE *fp;
{
#if 0
/* Does not actually test that stream was created by popen(). Instead,
it depends on the filebuf::sys_close() virtual to Do The Right Thing. */
if (fp is not a proc_file)
return -1;
#endif
return _IO_fclose(fp);
}

View File

@ -25,7 +25,8 @@ subdir := misc
headers := sys/uio.h sys/ioctl.h sys/ptrace.h ioctls.h sys/file.h \
a.out.h nlist.h stab.h stab.def sgtty.h sys/dir.h sys/cdefs.h \
ttyent.h syscall.h syslog.h sys/syslog.h paths.h sys/reboot.h \
sys/mman.h sys/param.h fstab.h mntent.h search.h utmp.h
sys/mman.h sys/param.h fstab.h mntent.h search.h utmp.h \
err.h error.h
routines := brk sbrk sstk ioctl \
readv writev \
@ -50,12 +51,14 @@ routines := brk sbrk sstk ioctl \
syslog syscall daemon \
mmap munmap mprotect msync madvise \
efgcvt efgcvt_r \
hsearch hsearch_r tsearch
hsearch hsearch_r tsearch \
err error
aux := progname init-misc
distribute := bsd-compat.c
extra-objs := bsd-compat.o
install-lib := libbsd-compat.a libg.a
non-lib.a := libbsd-compat.a
gpl2lgpl := error.c error.h
# Build the -lutil library with these extra functions.
extra-libs := libutil

87
misc/err.c Normal file
View File

@ -0,0 +1,87 @@
/* err.c --- 4.4BSD utility functions for error messages.
Copyright (C) 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <stdarg.h>
#include <err.h>
#include <stdlib.h>
#include <stdio.h>
extern char *__progname;
#define VA(call) \
{ \
va_list ap; \
va_start (ap, format); \
call; \
va_end (ap); \
}
void
vwarn (const char *format, __gnuc_va_list ap)
{
fprintf (stderr, format, ap);
}
void
vwarnx (const char *format, __gnuc_va_list ap)
{
if (__progname)
fprintf (stderr, "%s: ", __progname);
fprintf (stderr, format, ap);
putc ('\n', stderr);
}
void
warn (const char *format, ...)
{
VA (vwarn (format, ap))
}
void
warnx (const char *format, ...)
{
VA (vwarnx (format, ap))
}
void
verr (int status, const char *format, __gnuc_va_list ap)
{
vwarn (format, ap);
exit (status);
}
void
verrx (int status, const char *format, __gnuc_va_list ap)
{
vwarnx (format, ap);
exit (status);
}
void
err (int status, const char *format, ...)
{
VA (verr (status, format, ap))
}
void
errx (int status, const char *format, ...)
{
VA (verrx (status, format, ap))
}

56
misc/err.h Normal file
View File

@ -0,0 +1,56 @@
/* err.h --- 4.4BSD utility functions for error messages.
Copyright (C) 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#ifndef _ERR_H_
#define _ERR_H_ 1
#include <features.h>
#define __need___va_list
#include <stdarg.h>
#ifndef __GNUC_VA_LIST
#define __gnuc_va_list __ptr_t
#endif
__BEGIN_DECLS
/* Print FORMAT on stderr. */
extern void warn __P ((const char *__format, ...))
__attribute__ ((format (printf, 1, 2)));
extern void vwarn __P ((const char *__format, __gnuc_va_list))
__attribute__ ((format (printf, 1, 0)));
/* Print "program: ", and FORMAT, and a newline, on stderr. */
extern void warnx __P ((const char *__format, ...))
__attribute__ ((format (printf, 1, 2)));
extern void vwarnx __P ((const char *__format, __gnuc_va_list))
__attribute__ ((format (printf, 1, 0)));
/* Likewise, and then exit with STATUS. */
extern void err __P ((int __status, const char *__format, ...))
__attribute__ ((noreturn, format (printf, 2, 3)));
extern void verr __P ((int __status, const char *__format, __gnuc_va_list))
__attribute__ ((noreturn, format (printf, 2, 0)));
extern void errx __P ((int __status, const char *__format, ...))
__attribute__ ((noreturn, format (printf, 2, 3)));
extern void verrx __P ((int __status, const char *, __gnuc_va_list))
__attribute__ ((noreturn, format (printf, 2, 0)));
__END_DECLS
#endif /* err.h */

134
misc/error.c Normal file
View File

@ -0,0 +1,134 @@
/* error.c -- error handler for noninteractive utilities
Copyright (C) 1990, 91, 92, 93, 94, 95 Free Software Foundation, Inc.
This file is part of the GNU C Library. Its master source is NOT part of
the C library, however. The master source lives in /gd/gnu/lib.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#if HAVE_VPRINTF || HAVE_DOPRNT || _LIBC
# if __STDC__
# include <stdarg.h>
# define VA_START(args, lastarg) va_start(args, lastarg)
# else
# include <varargs.h>
# define VA_START(args, lastarg) va_start(args)
# endif
#else
# define va_alist a1, a2, a3, a4, a5, a6, a7, a8
# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
#endif
#if STDC_HEADERS || _LIBC
# include <stdlib.h>
# include <string.h>
#else
void exit ();
#endif
/* This variable is incremented each time `error' is called. */
unsigned int error_message_count;
/* If NULL, error will flush stdout, then print on stderr the program
name, a colon and a space. Otherwise, error will call this
function without parameters instead. */
void (*error_print_progname) () = NULL;
#ifdef _LIBC
#define program_name program_invocation_name
#endif
/* The calling program should define program_name and set it to the
name of the executing program. */
extern char *program_name;
#if HAVE_STRERROR || _LIBC
# ifndef strerror /* On some systems, strerror is a macro */
char *strerror ();
# endif
#else
static char *
private_strerror (errnum)
int errnum;
{
extern char *sys_errlist[];
extern int sys_nerr;
if (errnum > 0 && errnum <= sys_nerr)
return sys_errlist[errnum];
return "Unknown system error";
}
#define strerror private_strerror
#endif
/* Print the program name and error message MESSAGE, which is a printf-style
format string with optional args.
If ERRNUM is nonzero, print its corresponding system error message.
Exit with status STATUS if it is nonzero. */
/* VARARGS */
void
#if defined(VA_START) && __STDC__
error (int status, int errnum, const char *message, ...)
#else
error (status, errnum, message, va_alist)
int status;
int errnum;
char *message;
va_dcl
#endif
{
#ifdef VA_START
va_list args;
#endif
if (error_print_progname)
(*error_print_progname) ();
else
{
fflush (stdout);
fprintf (stderr, "%s: ", program_name);
}
#ifdef VA_START
VA_START (args, message);
# if HAVE_VPRINTF || _LIBC
vfprintf (stderr, message, args);
# else
_doprnt (message, args, stderr);
# endif
va_end (args);
#else
fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
#endif
++error_message_count;
if (errnum)
fprintf (stderr, ": %s", strerror (errnum));
putc ('\n', stderr);
fflush (stderr);
if (status)
exit (status);
}

48
misc/error.h Normal file
View File

@ -0,0 +1,48 @@
/* error.h -- declaration for error-reporting function
Copyright (C) 1995 Software Foundation, Inc.
This file is part of the GNU C Library. Its master source is NOT part of
the C library, however. The master source lives in /gd/gnu/lib.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#ifndef _error_h_
#define _error_h_
#ifndef __attribute__
/* This feature is available in gcc versions 2.5 and later. */
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
# define __attribute__(Spec) /* empty */
# endif
/* The __-protected variants of `format' and `printf' attributes
are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
# define __format__ format
# define __printf__ printf
# endif
#endif
#if __STDC__
void error (int, int, const char *, ...) \
__attribute__ ((__format__ (__printf__, 3, 4)));
#else
void error ();
#endif
/* This variable is incremented each time `error' is called. */
extern unsigned int error_message_count;
#endif /* _error_h_ */

View File

@ -640,6 +640,22 @@ extern char *mktemp __P ((char *__template));
extern int mkstemp __P ((char *__template));
/* Set the end of accessible data space (aka "the break") to ADDR.
Returns zero on success and -1 for errors (with errno set). */
extern int __brk __P ((__ptr_t __addr));
extern int brk __P ((__ptr_t __addr));
#define __need_ptrdiff_t
#include <stddef.h>
/* Increase or decrease the end of accessible data space by DELTA bytes.
If successful, returns the address the previous end of data space
(i.e. the beginning of the new space, if DELTA > 0);
returns (void *) -1 for errors (with errno set). */
extern __ptr_t __sbrk __P ((ptrdiff_t __delta));
extern __ptr_t sbrk __P ((ptrdiff_t __delta));
/* Invoke `system call' number SYSNO, passing it the remaining arguments.
This is completely system-dependent, and not often useful.

4085
stdio-common/tfformat.c Normal file

File diff suppressed because it is too large Load Diff

5055
stdio-common/tiformat.c Normal file

File diff suppressed because it is too large Load Diff

40
stdio-common/tstdiomisc.c Normal file
View File

@ -0,0 +1,40 @@
#include <stdio.h>
void
t1 ()
{
int n = -1;
sscanf ("abc ", "abc %n", &n);
printf ("t1: count=%d\n", n);
}
void
t2 ()
{
int n;
long N;
int retval;
#define SCAN(INPUT, FORMAT, VAR) \
VAR = -1; \
retval = sscanf (INPUT, FORMAT, &VAR); \
printf ("sscanf (\"%s\", \"%s\", &x) => %d, x = %ld\n", \
INPUT, FORMAT, retval, VAR);
SCAN ("12345", "%ld", N);
SCAN ("12345", "%llllld", N);
SCAN ("12345", "%LLLLLd", N);
SCAN ("test ", "%*s%n", n);
SCAN ("test ", "%2*s%n", n);
SCAN ("12 ", "%l2d", n);
SCAN ("12 ", "%2ld", N);
}
int
main ()
{
t1 ();
t2 ();
fflush (stdout);
return 0;
}

View File

@ -337,6 +337,9 @@ extern int putenv __P ((__const char *__string));
If REPLACE is nonzero, overwrite an existing value. */
extern int setenv __P ((__const char *__name, __const char *__value,
int __replace));
/* Remove the variable NAME from the environment. */
extern void unsetenv __P ((__const char *__name));
#endif
/* Execute the given line as a shell command. */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1994 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1994, 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@ -17,32 +17,36 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <errno.h>
#if defined (_AIX) && !defined (__GNUC__)
#pragma alloca
#endif
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#if defined (__GNU_LIBRARY__) || defined (HAVE_STDLIB_H)
#if _LIBC || HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if defined (__GNU_LIBRARY__) || defined (HAVE_STRING_H)
#if _LIBC || HAVE_STRING_H
#include <string.h>
#endif
#if defined (__GNU_LIBRARY__) || defined (HAVE_UNISTD_H)
#include <unistd.h>
#endif
#if !defined (__GNU_LIBRARY__) && !defined (HAVE_STRCHR)
#if !__GNU_LIBRARY__ && !HAVE_STRCHR
#define strchr index
#endif
#if !defined (__GNU_LIBRARY__) && !defined (HAVE_MEMCPY)
#define memcpy(d,s,n) bcopy ((s), (d), (n))
#endif
#ifndef HAVE_GNU_LD
#define __environ environ
#endif
#ifndef _LIBC
#ifdef HAVE_ALLOCA_H
#include <alloca.h>
#else
#ifdef __GNUC__
#define alloca __builtin_alloca
#else
extern char *alloca ();
#endif /* __GNUC__ */
#endif /* HAVE_ALLOCA_H */
#endif /* _LIBC */
/* Put STRING, which is of the form "NAME=VALUE", in the environment. */
@ -51,51 +55,15 @@ putenv (string)
const char *string;
{
const char *const name_end = strchr (string, '=');
register size_t size;
register char **ep;
if (name_end == NULL)
if (name_end)
{
/* Remove the variable from the environment. */
size = strlen (string);
for (ep = __environ; *ep != NULL; ++ep)
if (!strncmp (*ep, string, size) && (*ep)[size] == '=')
{
while (ep[1] != NULL)
{
ep[0] = ep[1];
++ep;
}
*ep = NULL;
return 0;
}
char *name = alloca (name_end - string + 1);
memcpy (name, string, name_end - string);
name[name_end - string] = '\0';
return setenv (name, string + 1, 1);
}
size = 0;
for (ep = __environ; *ep != NULL; ++ep)
if (!strncmp (*ep, string, name_end - string) &&
(*ep)[name_end - string] == '=')
break;
else
++size;
if (*ep == NULL)
{
static char **last_environ = NULL;
char **new_environ = (char **) malloc ((size + 2) * sizeof (char *));
if (new_environ == NULL)
return -1;
(void) memcpy ((void *) new_environ, (void *) __environ,
size * sizeof (char *));
new_environ[size] = (char *) string;
new_environ[size + 1] = NULL;
if (last_environ != NULL)
free ((void *) last_environ);
last_environ = new_environ;
__environ = new_environ;
}
else
*ep = (char *) string;
unsetenv (string);
return 0;
}

View File

@ -16,24 +16,36 @@ License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <errno.h>
#if _LIBC || HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if _LIBC || HAVE_STRING_H
#include <string.h>
#endif
#if _LIBC || HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifndef HAVE_GNU_LD
#define __environ environ
#endif
int
DEFUN(setenv, (name, value, replace),
CONST char *name AND CONST char *value AND int replace)
setenv (name, value, replace)
const char *name;
const char *value;
int replace;
{
register char **ep;
register size_t size;
CONST size_t namelen = strlen (name);
CONST size_t vallen = strlen (value);
const size_t namelen = strlen (name);
const size_t vallen = strlen (value) + 1;
size = 0;
for (ep = __environ; *ep != NULL; ++ep)
@ -41,38 +53,47 @@ DEFUN(setenv, (name, value, replace),
break;
else
++size;
if (*ep == NULL)
{
static char **last_environ = NULL;
char **new_environ = (char **) malloc((size + 2) * sizeof(char *));
static char **last_environ;
char **new_environ;
if (__environ == last_environ)
/* We allocated this space; we can extend it. */
new_environ = (char **) realloc (last_environ,
(size + 2) * sizeof (char *));
else
new_environ = (char **) malloc ((size + 2) * sizeof (char *));
if (new_environ == NULL)
return -1;
(void) memcpy((PTR) new_environ, (PTR) __environ, size * sizeof(char *));
new_environ[size] = malloc (namelen + 1 + vallen + 1);
new_environ[size] = malloc (namelen + 1 + vallen);
if (new_environ[size] == NULL)
{
free (new_environ);
free ((char *) new_environ);
errno = ENOMEM;
return -1;
}
if (__environ != last_environ)
memcpy ((char *) new_environ, (char *) __environ,
size * sizeof (char *));
memcpy (new_environ[size], name, namelen);
new_environ[size][namelen] = '=';
memcpy (&new_environ[size][namelen + 1], value, vallen + 1);
memcpy (&new_environ[size][namelen + 1], value, vallen);
new_environ[size + 1] = NULL;
if (last_environ != NULL)
free ((PTR) last_environ);
last_environ = new_environ;
__environ = new_environ;
last_environ = __environ = new_environ;
}
else if (replace)
{
size_t len = strlen (*ep);
if (len < namelen + 1 + vallen)
if (len + 1 < namelen + 1 + vallen)
{
/* The existing string is too short; malloc a new one. */
char *new = malloc (namelen + 1 + vallen);
if (new == NULL)
return -1;
@ -80,8 +101,26 @@ DEFUN(setenv, (name, value, replace),
}
memcpy (*ep, name, namelen);
(*ep)[namelen] = '=';
memcpy (&(*ep)[namelen + 1], value, vallen + 1);
memcpy (&(*ep)[namelen + 1], value, vallen);
}
return 0;
}
void
unsetenv (const char *name)
{
const size_t len = strlen (name);
char **ep;
for (ep = __environ; *ep; ++ep)
if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
{
/* Found it. Remove this pointer by moving later ones back. */
char **dp = ep;
do
dp[0] = dp[1];
while (*dp++);
/* Continue the loop in case NAME appears again. */
}
}

View File

@ -175,8 +175,8 @@ DEFUN(__ioctl, (fd, request),
{
/* The RPC takes a single integer_t argument.
Rather than pointing to the value, ARG is the value itself. */
*t++ = io2mach_type (_IOTS (integer_t));
*((integer_t *) t)++ = (integer_t) arg;
*t++ = io2mach_type (1, _IOTS (int));
*((int *) t)++ = (int) arg;
}
/* Compute the expected size of the reply. There is a standard header