mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Updated from ../gpl2lgpl.sed /home/gd/gnu/lib/error.c
This commit is contained in:
10
Makeconfig
10
Makeconfig
@ -281,7 +281,7 @@ ifndef +link
|
|||||||
+link = $(CC) -nostdlib -nostartfiles -o $@ \
|
+link = $(CC) -nostdlib -nostartfiles -o $@ \
|
||||||
$(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) \
|
$(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) \
|
||||||
$(addprefix $(csu-objpfx),start.o $(+preinit)) \
|
$(addprefix $(csu-objpfx),start.o $(+preinit)) \
|
||||||
$(^:$(common-objpfx)libc.a=$(link-libc)) \
|
$(^:$(common-objpfx)libc%=$(link-libc)) \
|
||||||
$(addprefix $(csu-objpfx),$(+postinit))
|
$(addprefix $(csu-objpfx),$(+postinit))
|
||||||
endif
|
endif
|
||||||
ifndef config-LDFLAGS
|
ifndef config-LDFLAGS
|
||||||
@ -292,7 +292,7 @@ endif
|
|||||||
ifndef link-libc
|
ifndef link-libc
|
||||||
ifeq (yes,$(build-shared))
|
ifeq (yes,$(build-shared))
|
||||||
link-libc = -Wl,-rpath-link=$(common-objdir) -Wl,-rpath=$(default-rpath) \
|
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
|
# Choose the default search path for the dynamic linker based on
|
||||||
# where we will install libraries.
|
# where we will install libraries.
|
||||||
ifneq ($(libdir),$(slibdir))
|
ifneq ($(libdir),$(slibdir))
|
||||||
@ -331,10 +331,10 @@ built-program-file = $(dir $(word 2,$^))$(notdir $(word 2,$^))
|
|||||||
ifneq (yes,$(build-shared))
|
ifneq (yes,$(build-shared))
|
||||||
built-program-cmd = $(built-program-file)
|
built-program-cmd = $(built-program-file)
|
||||||
else
|
else
|
||||||
, = ,
|
comma = ,
|
||||||
define built-program-cmd
|
define built-program-cmd
|
||||||
LD_LIBRARY_PATH=$(common-objdir)$(patsubst -Wl$,-rpath-link=%,:%,\
|
LD_LIBRARY_PATH=$(common-objdir)$(patsubst -Wl$(comma)-rpath-link=%,:%,\
|
||||||
$(filter -Wl$,-rpath-link=%,\
|
$(filter -Wl$(comma)-rpath-link=%,\
|
||||||
$(sysdep-LDFLAGS))) \
|
$(sysdep-LDFLAGS))) \
|
||||||
$(elf-objpfx)ld.so $(built-program-file)
|
$(elf-objpfx)ld.so $(built-program-file)
|
||||||
endef
|
endef
|
||||||
|
@ -575,6 +575,12 @@ $(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
|
|||||||
$(common-objpfx)libc_pic.a \
|
$(common-objpfx)libc_pic.a \
|
||||||
$(elfobjdir)/sofini.so
|
$(elfobjdir)/sofini.so
|
||||||
$(build-shlib)
|
$(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
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
19
Rules
19
Rules
@ -80,21 +80,22 @@ tests: $(tests:%=$(objpfx)%.out)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq "$(strip $(others) $(tests))" ""
|
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)
|
$(+link)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq "$(strip $(tests))" ""
|
ifneq "$(strip $(tests))" ""
|
||||||
# These are the implicit rules for making test outputs
|
# These are the implicit rules for making test outputs
|
||||||
# from the test programs and whatever input files are present.
|
# from the test programs and whatever input files are present.
|
||||||
$(objpfx)%.out: $(objpfx)% %.args %.input
|
$(objpfx)%.out: %.args $(objpfx)% %.input
|
||||||
$(dir $<)$(notdir $<) `cat $(word 2,$^)` < $(word 3,$^) > $@
|
$(built-program-cmd) `cat $(word 1,$^)` < $(word 3,$^) > $@
|
||||||
$(objpfx)%.out: $(objpfx)% %.args
|
$(objpfx)%.out: %.args $(objpfx)%
|
||||||
$(dir $<)$(notdir $<) `cat $(word 2,$^)` > $@
|
$(built-program-cmd) `cat $(word 1,$^)` > $@
|
||||||
$(objpfx)%.out: $(objpfx)% %.input
|
$(objpfx)%.out: %.input $(objpfx)%
|
||||||
$(dir $<)$(notdir $<) < $(word 2,$^) > $@
|
$(built-program-cmd) < $(word 1,$^) > $@
|
||||||
$(objpfx)%.out: $(objpfx)%
|
$(objpfx)%.out: /dev/null $(objpfx)% # Make it 2nd arg for canned sequence.
|
||||||
$(dir $<)$(notdir $<) > $@
|
$(built-program-cmd) > $@
|
||||||
endif # tests
|
endif # tests
|
||||||
|
|
||||||
.PHONY: distclean realclean subdir_distclean subdir_realclean \
|
.PHONY: distclean realclean subdir_distclean subdir_realclean \
|
||||||
|
224
libio/iopopen.c
Normal file
224
libio/iopopen.c
Normal 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
16
libio/pclose.c
Normal 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);
|
||||||
|
}
|
@ -25,7 +25,8 @@ subdir := misc
|
|||||||
headers := sys/uio.h sys/ioctl.h sys/ptrace.h ioctls.h sys/file.h \
|
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 \
|
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 \
|
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 \
|
routines := brk sbrk sstk ioctl \
|
||||||
readv writev \
|
readv writev \
|
||||||
@ -50,12 +51,14 @@ routines := brk sbrk sstk ioctl \
|
|||||||
syslog syscall daemon \
|
syslog syscall daemon \
|
||||||
mmap munmap mprotect msync madvise \
|
mmap munmap mprotect msync madvise \
|
||||||
efgcvt efgcvt_r \
|
efgcvt efgcvt_r \
|
||||||
hsearch hsearch_r tsearch
|
hsearch hsearch_r tsearch \
|
||||||
|
err error
|
||||||
aux := progname init-misc
|
aux := progname init-misc
|
||||||
distribute := bsd-compat.c
|
distribute := bsd-compat.c
|
||||||
extra-objs := bsd-compat.o
|
extra-objs := bsd-compat.o
|
||||||
install-lib := libbsd-compat.a libg.a
|
install-lib := libbsd-compat.a libg.a
|
||||||
non-lib.a := libbsd-compat.a
|
non-lib.a := libbsd-compat.a
|
||||||
|
gpl2lgpl := error.c error.h
|
||||||
|
|
||||||
# Build the -lutil library with these extra functions.
|
# Build the -lutil library with these extra functions.
|
||||||
extra-libs := libutil
|
extra-libs := libutil
|
||||||
|
87
misc/err.c
Normal file
87
misc/err.c
Normal 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
56
misc/err.h
Normal 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
134
misc/error.c
Normal 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
48
misc/error.h
Normal 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_ */
|
@ -640,6 +640,22 @@ extern char *mktemp __P ((char *__template));
|
|||||||
extern int mkstemp __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.
|
/* Invoke `system call' number SYSNO, passing it the remaining arguments.
|
||||||
This is completely system-dependent, and not often useful.
|
This is completely system-dependent, and not often useful.
|
||||||
|
|
||||||
|
4085
stdio-common/tfformat.c
Normal file
4085
stdio-common/tfformat.c
Normal file
File diff suppressed because it is too large
Load Diff
5055
stdio-common/tiformat.c
Normal file
5055
stdio-common/tiformat.c
Normal file
File diff suppressed because it is too large
Load Diff
40
stdio-common/tstdiomisc.c
Normal file
40
stdio-common/tstdiomisc.c
Normal 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;
|
||||||
|
}
|
@ -337,6 +337,9 @@ extern int putenv __P ((__const char *__string));
|
|||||||
If REPLACE is nonzero, overwrite an existing value. */
|
If REPLACE is nonzero, overwrite an existing value. */
|
||||||
extern int setenv __P ((__const char *__name, __const char *__value,
|
extern int setenv __P ((__const char *__name, __const char *__value,
|
||||||
int __replace));
|
int __replace));
|
||||||
|
|
||||||
|
/* Remove the variable NAME from the environment. */
|
||||||
|
extern void unsetenv __P ((__const char *__name));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Execute the given line as a shell command. */
|
/* Execute the given line as a shell command. */
|
||||||
|
@ -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.
|
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,
|
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||||
Cambridge, MA 02139, USA. */
|
Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#include <errno.h>
|
#if defined (_AIX) && !defined (__GNUC__)
|
||||||
|
#pragma alloca
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (__GNU_LIBRARY__) || defined (HAVE_STDLIB_H)
|
#if _LIBC || HAVE_STDLIB_H
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
#if defined (__GNU_LIBRARY__) || defined (HAVE_STRING_H)
|
#if _LIBC || HAVE_STRING_H
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#endif
|
#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
|
#define strchr index
|
||||||
#endif
|
#endif
|
||||||
#if !defined (__GNU_LIBRARY__) && !defined (HAVE_MEMCPY)
|
|
||||||
#define memcpy(d,s,n) bcopy ((s), (d), (n))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_GNU_LD
|
#ifndef _LIBC
|
||||||
#define __environ environ
|
#ifdef HAVE_ALLOCA_H
|
||||||
#endif
|
#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. */
|
/* Put STRING, which is of the form "NAME=VALUE", in the environment. */
|
||||||
@ -51,51 +55,15 @@ putenv (string)
|
|||||||
const char *string;
|
const char *string;
|
||||||
{
|
{
|
||||||
const char *const name_end = strchr (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. */
|
char *name = alloca (name_end - string + 1);
|
||||||
size = strlen (string);
|
memcpy (name, string, name_end - string);
|
||||||
for (ep = __environ; *ep != NULL; ++ep)
|
name[name_end - string] = '\0';
|
||||||
if (!strncmp (*ep, string, size) && (*ep)[size] == '=')
|
return setenv (name, string + 1, 1);
|
||||||
{
|
|
||||||
while (ep[1] != NULL)
|
|
||||||
{
|
|
||||||
ep[0] = ep[1];
|
|
||||||
++ep;
|
|
||||||
}
|
|
||||||
*ep = NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size = 0;
|
unsetenv (string);
|
||||||
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;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -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,
|
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||||
Cambridge, MA 02139, USA. */
|
Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#include <ansidecl.h>
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <stdlib.h>
|
#include <config.h>
|
||||||
#include <string.h>
|
#endif
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
#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
|
#ifndef HAVE_GNU_LD
|
||||||
#define __environ environ
|
#define __environ environ
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
DEFUN(setenv, (name, value, replace),
|
setenv (name, value, replace)
|
||||||
CONST char *name AND CONST char *value AND int replace)
|
const char *name;
|
||||||
|
const char *value;
|
||||||
|
int replace;
|
||||||
{
|
{
|
||||||
register char **ep;
|
register char **ep;
|
||||||
register size_t size;
|
register size_t size;
|
||||||
CONST size_t namelen = strlen (name);
|
const size_t namelen = strlen (name);
|
||||||
CONST size_t vallen = strlen (value);
|
const size_t vallen = strlen (value) + 1;
|
||||||
|
|
||||||
size = 0;
|
size = 0;
|
||||||
for (ep = __environ; *ep != NULL; ++ep)
|
for (ep = __environ; *ep != NULL; ++ep)
|
||||||
@ -44,35 +56,44 @@ DEFUN(setenv, (name, value, replace),
|
|||||||
|
|
||||||
if (*ep == NULL)
|
if (*ep == NULL)
|
||||||
{
|
{
|
||||||
static char **last_environ = NULL;
|
static char **last_environ;
|
||||||
char **new_environ = (char **) malloc((size + 2) * sizeof(char *));
|
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)
|
if (new_environ == NULL)
|
||||||
return -1;
|
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)
|
if (new_environ[size] == NULL)
|
||||||
{
|
{
|
||||||
free (new_environ);
|
free ((char *) new_environ);
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (__environ != last_environ)
|
||||||
|
memcpy ((char *) new_environ, (char *) __environ,
|
||||||
|
size * sizeof (char *));
|
||||||
|
|
||||||
memcpy (new_environ[size], name, namelen);
|
memcpy (new_environ[size], name, namelen);
|
||||||
new_environ[size][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;
|
new_environ[size + 1] = NULL;
|
||||||
|
|
||||||
if (last_environ != NULL)
|
last_environ = __environ = new_environ;
|
||||||
free ((PTR) last_environ);
|
|
||||||
last_environ = new_environ;
|
|
||||||
__environ = new_environ;
|
|
||||||
}
|
}
|
||||||
else if (replace)
|
else if (replace)
|
||||||
{
|
{
|
||||||
size_t len = strlen (*ep);
|
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);
|
char *new = malloc (namelen + 1 + vallen);
|
||||||
if (new == NULL)
|
if (new == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
@ -80,8 +101,26 @@ DEFUN(setenv, (name, value, replace),
|
|||||||
}
|
}
|
||||||
memcpy (*ep, name, namelen);
|
memcpy (*ep, name, namelen);
|
||||||
(*ep)[namelen] = '=';
|
(*ep)[namelen] = '=';
|
||||||
memcpy (&(*ep)[namelen + 1], value, vallen + 1);
|
memcpy (&(*ep)[namelen + 1], value, vallen);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
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. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -175,8 +175,8 @@ DEFUN(__ioctl, (fd, request),
|
|||||||
{
|
{
|
||||||
/* The RPC takes a single integer_t argument.
|
/* The RPC takes a single integer_t argument.
|
||||||
Rather than pointing to the value, ARG is the value itself. */
|
Rather than pointing to the value, ARG is the value itself. */
|
||||||
*t++ = io2mach_type (_IOTS (integer_t));
|
*t++ = io2mach_type (1, _IOTS (int));
|
||||||
*((integer_t *) t)++ = (integer_t) arg;
|
*((int *) t)++ = (int) arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute the expected size of the reply. There is a standard header
|
/* Compute the expected size of the reply. There is a standard header
|
||||||
|
Reference in New Issue
Block a user