mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 03:33:33 +08:00
Updated from ../gpl2lgpl.sed /home/gd/gnu/lib/error.c
This commit is contained in:
parent
77a58cad3f
commit
196980f511
10
Makeconfig
10
Makeconfig
@ -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
|
||||
|
@ -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
19
Rules
@ -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
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 \
|
||||
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
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));
|
||||
|
||||
|
||||
/* 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
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. */
|
||||
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. */
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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. */
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user