aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-12-06 00:14:32 +0000
committerRoland McGrath <roland@gnu.org>1995-12-06 00:14:32 +0000
commit196980f5117c8d38f10d64bf67eeb0924651675f (patch)
tree4e2a731a1f766ee63e1038d7f38bee3db8c78a2c
parent77a58cad3fa0a286bd2581187a2463a762d711ba (diff)
downloadglibc-196980f5117c8d38f10d64bf67eeb0924651675f.tar.xz
glibc-196980f5117c8d38f10d64bf67eeb0924651675f.zip
Updated from ../gpl2lgpl.sed /home/gd/gnu/lib/error.c
-rw-r--r--Makeconfig10
-rw-r--r--Makerules6
-rw-r--r--Rules19
-rw-r--r--libio/iopopen.c224
-rw-r--r--libio/pclose.c16
-rw-r--r--misc/Makefile7
-rw-r--r--misc/err.c87
-rw-r--r--misc/err.h56
-rw-r--r--misc/error.c134
-rw-r--r--misc/error.h48
-rw-r--r--posix/unistd.h16
-rw-r--r--stdio-common/tfformat.c4085
-rw-r--r--stdio-common/tiformat.c5055
-rw-r--r--stdio-common/tstdiomisc.c40
-rw-r--r--stdlib/stdlib.h3
-rw-r--r--sysdeps/generic/putenv.c80
-rw-r--r--sysdeps/generic/setenv.c77
-rw-r--r--sysdeps/mach/hurd/ioctl.c4
18 files changed, 9874 insertions, 93 deletions
diff --git a/Makeconfig b/Makeconfig
index 6b403a1694..03df0d56dd 100644
--- a/Makeconfig
+++ b/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
diff --git a/Makerules b/Makerules
index 1f678d588e..32dacce4f0 100644
--- a/Makerules
+++ b/Makerules
@@ -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
diff --git a/Rules b/Rules
index 05148ec70d..2bab3bfdfb 100644
--- a/Rules
+++ b/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 \
diff --git a/libio/iopopen.c b/libio/iopopen.c
new file mode 100644
index 0000000000..349a4cc8d6
--- /dev/null
+++ b/libio/iopopen.c
@@ -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)
+};
diff --git a/libio/pclose.c b/libio/pclose.c
new file mode 100644
index 0000000000..e5d7c0c9c9
--- /dev/null
+++ b/libio/pclose.c
@@ -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);
+}
diff --git a/misc/Makefile b/misc/Makefile
index 173413c9ed..102fdd343f 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -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
diff --git a/misc/err.c b/misc/err.c
new file mode 100644
index 0000000000..82719a8756
--- /dev/null
+++ b/misc/err.c
@@ -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))
+}
diff --git a/misc/err.h b/misc/err.h
new file mode 100644
index 0000000000..c81de1b396
--- /dev/null
+++ b/misc/err.h
@@ -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 */
diff --git a/misc/error.c b/misc/error.c
new file mode 100644
index 0000000000..da3c6ee1b2
--- /dev/null
+++ b/misc/error.c
@@ -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 */