diff options
38 files changed, 1313 insertions, 104 deletions
@@ -1,3 +1,114 @@ +Mon Oct 21 01:32:36 1996 Ulrich Drepper <drepper@cygnus.com> + + * elf/rtld.c (dl_main): Move initialization of `_dl_starting_up' + to beginning of function. So libc functions can use this flag. + * sysdeps/generic/_strerror.c: Don't use dgettext for message + translation while `_dl_starting_up' is nonzero. + + * elf/dl-deps.c (_dl_map_object_deps): Add new parameter + TRACE_MODE. + Pass parameter value to _dl_map_object. + * elf/dl-load (_dl_map_object): Add new parameter TRACE_MODE. + If TRACE_MODE is nonzero don#t signal error when shared lib + is not found. Instead create fake entry for link map. + * dl-open.c (dl-open): Pass 0 for new argument to _dl_map_object. + * dl-runtime.c (_dl_object_relocation_scope): Pass 0 for new + argument to _dl_map_object_deps. + * elf/link.h: Add new parameter TRACE_MODE for prototypes of + _dl_map_object and _dl_map_object_deps. + * elf/rtld.c (dl_main): Pass 0 for new argument to _dl_map_object + and _dl_map_object_deps. + When mode == trace test for l_opencount == 0 before printing + link information since this means the lib is not found. + +Sun Oct 20 22:19:58 1996 Ulrich Drepper <drepper@cygnus.com> + + * rpm/template: Add INSTALL to %doc line to follow copyright + restrictions which demand the distribution of the copyright + messages in INSTALL even for binary distributions. + + * features.h: Rename to... + * features.h.in: ...this. Change value of __GNU_LIBRARY__ to 2 + (for major version numberof package) and add __GNU_LIBRARY_MINOR__ + and __GNU_LIBRARY_INTERFACE__. + * Makefile ($(objpfx)features.h): New rule to generate features.h + from template features.h.in. + + * sysdeps/unix/sysv/linux/getsysstats.c: Include <paths.h>. + +Sun Oct 20 00:00:13 1996 Richard Henderson <rth@tamu.edu> + + * locale/programs/linereader.c (lr_open): Cast away const before free. + (lr_close): Likewise. + + * misc/mntent.h: Move _PATH_MNTTAB & _PATH_MOUNTED to paths.h. + * misc/paths.h: Move to ... + * sysdeps/generic/paths.h: ... here. + * paths.h: Remove. + * sysdeps/unix/sysv/linux/paths.h: New file. Correct _PATH_STDPATH, + _PATH_MAILDIR, _PATH_MOUNTED, _PATH_UNIX to comply with the fsstd. + + * nss/nss_db/db-netgrp.h: Include <string.h>. + + * stdio-common/psignal.c: De-ansidecl-ify. Allow NULL entries in + _sys_siglist, which result in the "Unknown signal" message. + * string/strsignal.c: Likewise. + * sysdeps/generic/Makefile [stdio-common]: If $(inhibit-siglist), + don't auto-generate siglist.c. + * sysdeps/unix/sysv/linux/Makefile [stdio-common]: Set inhibit-siglist. + * sysdeps/unix/sysv/linux/siglist.c: New file. Not needing to + autogenerate makes bootstrapping and cross-compiling much easier. + * sysdeps/unix/sysv/linux/siglist.h: New file. + + * stdlib/longlong.h: Prototype __udiv_qrnnd. + + * sysdeps/unix/sysv/linux/alpha/Makefile (sysdep_headers): Remove + sys/io.h. It is already added in .../linux/Makefile. + + * sysdeps/unix/sysv/linux/alpha/sigaction.h: New file. + * sysdeps/unix/sysv/linux/alpha/signum.h: New file. + * sysdeps/unix/sysv/linux/alpha/statbuf.h: New file. + +Sun Oct 20 17:17:12 1996 Ulrich Drepper <drepper@cygnus.com> + + Add implementation of POSIX.1g function getaddrinfo. + * posix/Makefile (routines): Add getaddrinfo. + * sysdeps/posix/getaddrinfo.c.: New file. Add implementation by + Craig Metz. + * sysdeps/stub/getaddrinfo.c: New file. Stub implementation. + * resolv/netdb.h [__USE_POSIX]: Add getaddrinfo prototypes and + related constants and structures. + +Sun Oct 20 13:02:34 1996 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/stub/lockfile.c: Rename functions to __internal_*. + Make all old names weak alises so that they can be replaced + by libpthread. + + * stdio-common/vfprintf.c: Only declare __flockfile and __funlockfile + for !USE_IN_LIBIO. + [USE_IN_LIBIO]: Call _IO_flockfile and _IO_funlockfile instead of + __flockfile and __funlockfile. + Reported by NIIBE Yutaka. + + * crypt/md5.c: Change form of copyright message according to GNITS + rules. + Add warning for requirement on RESBUF parameter for `md5_finish_ctx' + and `md5_read_ctx' function. + * crypt/md5.h: Likewise. + + * grp/testgrp.c: Don't use perror for error cases since getgr* and + getpw* functions do not return usable error codes. + +Sun Oct 19 23:05:32 1996 Jim Meyering <meyering@asic.sc.ti.com> + + * crypt/md5.c (md5_process_bytes): Used casting for pointer + arithmetic. + +Sun Oct 20 03:53:23 1996 Ulrich Drepper <drepper@cygnus.com> + + * sunrpc/Makefile (others): Remove portmap here, too. + Sat Oct 19 17:42:24 1996 Ulrich Drepper <drepper@cygnus.com> * intl/locale.alias: Language for entry `czech' is `cs'. @@ -773,9 +773,10 @@ parts of the library were contributed or worked on by other people. platforms was written by Per Bothner and modified by Ulrich Drepper. - * The Internet-related code (most of the `inet' subdirectory) and - several other miscellaneous functions and header files have been - included from 4.4 BSD with little or no modification. + * Some of the Internet-related code (most of the `inet' + subdirectory) and several other miscellaneous functions and + header files have been included from 4.4 BSD with little or no + modification. All code incorporated from 4.4 BSD is under the following copyright: @@ -916,3 +917,56 @@ parts of the library were contributed or worked on by other people. or `Software.Distribution@CS.CMU.EDU' any improvements or extensions that they make and grant Carnegie Mellon the rights to redistribute these changes. + + * The `getaddrinfo' function is written by Craig Metz and it has the + following copyright: + + The Inner Net License, Version 2.00 + =================================== + + The author(s) grant permission for redistribution and use in source and + binary forms, with or without modification, of the software + and documentation provided that the following conditions are met: + + 0. If you receive a version of the software that is + specifically labelled as not being for redistribution + (check the version message and/or README), you are not + permitted to redistribute that version of the software in + any way or form. + 1. All terms of the all other applicable copyrights and + licenses must be followed. + 2. Redistributions of source code must retain the authors' + copyright notice(s), this list of conditions, and the + following disclaimer. + 3. Redistributions in binary form must reproduce the authors' + copyright notice(s), this list of conditions, and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + 4. All advertising materials mentioning features or use of + this software must display the following acknowledgement + with the name(s) of the authors as specified in the + copyright notice(s) substituted where indicated: + + This product includes software developed by <name(s)>, The Inner + Net, and other contributors. + + 5. Neither the name(s) of the author(s) nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY ITS AUTHORS AND CONTRIBUTORS ``AS + IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + OF SUCH DAMAGE. + + If these license terms cause you a real problem, contact the author. @@ -84,7 +84,7 @@ subdirs := $(filter mach,$(subdirs)) $(filter hurd,$(subdirs)) \ headers := errno.h sys/errno.h errnos.h limits.h values.h \ features.h gnu-versions.h libc-lock.h aux = sysdep $(libc-init) version -before-compile = $(objpfx)version-info.h +before-compile = $(objpfx)version-info.h $(objpfx)features.h echo-headers: subdir_echo-headers @@ -151,6 +151,23 @@ $(objpfx)version-info.h: $(+sysdir_pfx)config.make $(all-Banner-files) version.c-objects := $(addprefix $(objpfx)version,$(object-suffixes)) $(version.c-objects): $(objpfx)version-info.h +$(objpfx)features.h: features.h.in Makefile $(common-objpfx)soversions.mk + nr="$(libc.so-version)"; \ + if test -n $$nr; then \ + nr=`echo $$nr | sed 's/^[.]//'`; \ + tmpfile=$${TMPDIR:-/tmp}/sedtmp.$$$$; \ + rm -f $$tmpfile; \ + (echo '/^INTERFACENUMBER/ { i\'; \ + echo '/* Interface number of the shared library. */\'; \ + echo "#define __GNU_LIBRARY_INTERFACE__ $$nr"; \ + echo ' s/^INTERFACENUMBER//'; \ + echo '}') > $$tmpfile; \ + sed -f $$tmpfile < $< > $@; \ + rm -f $$tmpfile; \ + else \ + sed -e '/^INTERFACENUMBER/d' < $< > $@; \ + fi + # Makerules creates a file `stub-$(subdir)' for each subdirectory, which # contains `#define __stub_FUNCTION' for each function which is a stub. # Here we paste all of these together into <stubs.h>. diff --git a/elf/dl-deps.c b/elf/dl-deps.c index 8521c50..c310a5b 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -24,7 +24,8 @@ Cambridge, MA 02139, USA. */ void _dl_map_object_deps (struct link_map *map, - struct link_map **preloads, unsigned int npreloads) + struct link_map **preloads, unsigned int npreloads, + int trace_mode) { struct list { @@ -75,7 +76,7 @@ _dl_map_object_deps (struct link_map *map, struct link_map *dep = _dl_map_object (l, strtab + d->d_un.d_val, l->l_type == lt_executable ? lt_library : - l->l_type); + l->l_type, trace_mode); if (dep->l_reserved) /* This object is already in the search list we are diff --git a/elf/dl-load.c b/elf/dl-load.c index 9dfc961..1a86ccc 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -477,7 +477,8 @@ open_path (const char *name, size_t namelen, /* Map in the shared object file NAME. */ struct link_map * -_dl_map_object (struct link_map *loader, const char *name, int type) +_dl_map_object (struct link_map *loader, const char *name, int type, + int trace_mode) { int fd; char *realname; @@ -582,7 +583,26 @@ _dl_map_object (struct link_map *loader, const char *name, int type) } if (fd == -1) - _dl_signal_error (errno, name, "cannot open shared object file"); + { + if (trace_mode) + { + /* We haven't found an appropriate library. But since we + are only interested in the list of libraries this isn't + so severe. Fake an entry with all the information we + have (in fact only the name). */ + + /* Enter the new object in the list of loaded objects. */ + if ((name_copy = local_strdup (name)) == NULL + || (l = _dl_new_object (name_copy, name, type)) == NULL) + _dl_signal_error (ENOMEM, name, + "cannot create shared object descriptor"); + /* We use an opencount of 0 as a sign for the faked entry. */ + l->l_opencount = 0; + l->l_reserved = 0; + } + else + _dl_signal_error (errno, name, "cannot open shared object file"); + } return _dl_map_object_from_fd (name_copy, fd, realname, loader, type); } diff --git a/elf/dl-open.c b/elf/dl-open.c index 25f2ba6..8f4f9f50 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -46,13 +46,13 @@ _dl_open (const char *file, int mode) struct r_debug *r; /* Load the named object. */ - new = _dl_map_object (NULL, file, lt_loaded); + new = _dl_map_object (NULL, file, lt_loaded, 0); if (new->l_searchlist) /* It was already open. */ return new; /* Load that object's dependencies. */ - _dl_map_object_deps (new, NULL, 0); + _dl_map_object_deps (new, NULL, 0, 0); /* Relocate the objects loaded. We do this in reverse order so that copy diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c index 4e7b529..2a186f2 100644 --- a/elf/dl-runtime.c +++ b/elf/dl-runtime.c @@ -41,7 +41,7 @@ _dl_object_relocation_scope (struct link_map *l) if (! l->l_searchlist) /* We must construct the searchlist for this object. */ - _dl_map_object_deps (l, NULL, 0); + _dl_map_object_deps (l, NULL, 0, 0); /* The primary scope is this object itself and its dependencies. */ @@ -195,7 +195,8 @@ extern int _dlerror_run (void (*operate) (void)); LOADER's DT_RPATH is used in searching for NAME. If the object is already opened, returns its existing map. */ extern struct link_map *_dl_map_object (struct link_map *loader, - const char *name, int type); + const char *name, int type, + int trace_mode); /* Call _dl_map_object on the dependencies of MAP, and set up MAP->l_searchlist. PRELOADS points to a vector of NPRELOADS previously @@ -203,7 +204,7 @@ extern struct link_map *_dl_map_object (struct link_map *loader, but before its dependencies. */ extern void _dl_map_object_deps (struct link_map *map, struct link_map **preloads, - unsigned int npreloads); + unsigned int npreloads, int trace_mode); /* Cache the locations of MAP's hash table. */ extern void _dl_setup_hash (struct link_map *map); @@ -149,6 +149,9 @@ dl_main (const ElfW(Phdr) *phdr, mode = getenv ("LD_TRACE_LOADED_OBJECTS") != NULL ? trace : normal; + /* Set up a flag which tells we are just starting. */ + _dl_starting_up = 1; + if (*user_entry == (ElfW(Addr)) &_start) { /* Ho ho. We are not the program interpreter! We are the program @@ -210,7 +213,7 @@ of this helper program; chances are you did not intend to run this program.\n", { void doit (void) { - l = _dl_map_object (NULL, _dl_argv[0], lt_library); + l = _dl_map_object (NULL, _dl_argv[0], lt_library, 0); } char *err_str = NULL; const char *obj_name __attribute__ ((unused)); @@ -223,7 +226,7 @@ of this helper program; chances are you did not intend to run this program.\n", } } else - l = _dl_map_object (NULL, _dl_argv[0], lt_library); + l = _dl_map_object (NULL, _dl_argv[0], lt_library, 0); phdr = l->l_phdr; phent = l->l_phnum; @@ -322,7 +325,7 @@ of this helper program; chances are you did not intend to run this program.\n", char *p; while ((p = strsep (&list, ":")) != NULL) { - (void) _dl_map_object (NULL, p, lt_library); + (void) _dl_map_object (NULL, p, lt_library, 0); ++npreloads; } } @@ -378,7 +381,7 @@ of this helper program; chances are you did not intend to run this program.\n", runp = file; while ((p = strsep (&runp, ": \t\n")) != NULL) { - (void) _dl_map_object (NULL, p, lt_library); + (void) _dl_map_object (NULL, p, lt_library, 0); ++npreloads; } } @@ -386,7 +389,7 @@ of this helper program; chances are you did not intend to run this program.\n", if (problem != NULL) { char *p = strndupa (problem, file_size - (problem - file)); - (void) _dl_map_object (NULL, p, lt_library); + (void) _dl_map_object (NULL, p, lt_library, 0); } /* We don't need the file anymore. */ @@ -412,7 +415,7 @@ of this helper program; chances are you did not intend to run this program.\n", /* Load all the libraries specified by DT_NEEDED entries. If LD_PRELOAD specified some libraries to load, these are inserted before the actual dependencies in the executable's searchlist for symbol resolution. */ - _dl_map_object_deps (l, preloads, npreloads); + _dl_map_object_deps (l, preloads, npreloads, mode == trace); #ifndef MAP_ANON /* We are done mapping things, so close the zero-fill descriptor. */ @@ -459,15 +462,20 @@ of this helper program; chances are you did not intend to run this program.\n", _dl_sysdep_message ("\t", "statically linked\n", NULL); else for (l = _dl_loaded->l_next; l; l = l->l_next) - { - char buf[20], *bp; - buf[sizeof buf - 1] = '\0'; - bp = _itoa (l->l_addr, &buf[sizeof buf - 1], 16, 0); - while ((size_t) (&buf[sizeof buf - 1] - bp) < sizeof l->l_addr * 2) - *--bp = '0'; - _dl_sysdep_message ("\t", l->l_libname, " => ", l->l_name, - " (0x", bp, ")\n", NULL); - } + if (l->l_opencount == 0) + /* The library was not found. */ + _dl_sysdep_message ("\t", l->l_libname, " => not found\n", NULL); + else + { + char buf[20], *bp; + buf[sizeof buf - 1] = '\0'; + bp = _itoa (l->l_addr, &buf[sizeof buf - 1], 16, 0); + while ((size_t) (&buf[sizeof buf - 1] - bp) + < sizeof l->l_addr * 2) + *--bp = '0'; + _dl_sysdep_message ("\t", l->l_libname, " => ", l->l_name, + " (0x", bp, ")\n", NULL); + } if (mode != trace) for (i = 1; i < _dl_argc; ++i) @@ -563,9 +571,6 @@ of this helper program; chances are you did not intend to run this program.\n", _dl_debug_state (); } - /* We finished the intialization and will start up. */ - _dl_starting_up = 1; - /* Once we return, _dl_sysdep_start will invoke the DT_INIT functions and then *USER_ENTRY. */ } diff --git a/grp/testgrp.c b/grp/testgrp.c index 109d1a4..3fac6b9 100644 --- a/grp/testgrp.c +++ b/grp/testgrp.c @@ -1,4 +1,3 @@ -#include <ansidecl.h> #include <grp.h> #include <pwd.h> #include <sys/types.h> @@ -7,7 +6,7 @@ #include <stdio.h> int -DEFUN_VOID(main) +main (int argc, char *argv[]) { uid_t me; struct passwd *my_passwd; @@ -17,7 +16,7 @@ DEFUN_VOID(main) me = getuid (); my_passwd = getpwuid (me); if (my_passwd == NULL) - perror ("getpwuid"); + printf ("Cannot find user entry for UID %d\n", me); else { printf ("My login name is %s.\n", my_passwd->pw_name); @@ -27,7 +26,7 @@ DEFUN_VOID(main) my_group = getgrgid (my_passwd->pw_gid); if (my_group == NULL) - perror ("getgrgid"); + printf ("No data for group %d found\n", my_passwd->pw_gid); else { printf ("My default group is %s (%d).\n", @@ -40,6 +39,3 @@ DEFUN_VOID(main) exit (my_passwd && my_group ? EXIT_SUCCESS : EXIT_FAILURE); } - - - diff --git a/locale/programs/linereader.c b/locale/programs/linereader.c index 68508df..14496c0 100644 --- a/locale/programs/linereader.c +++ b/locale/programs/linereader.c @@ -80,7 +80,7 @@ lr_open (const char *fname, kw_hash_fct_t hf) { int save = errno; fclose (result->fp); - free (result->fname); + free ((char *) result->fname); free (result); errno = save; return NULL; @@ -108,7 +108,7 @@ void lr_close (struct linereader *lr) { fclose (lr->fp); - free (lr->fname); + free ((char *) lr->fname); free (lr->buf); free (lr); } diff --git a/misc/mntent.h b/misc/mntent.h index 150ad6d..fc9c824 100644 --- a/misc/mntent.h +++ b/misc/mntent.h @@ -26,11 +26,9 @@ Cambridge, MA 02139, USA. */ /* File listing canonical interesting mount points. */ -#define _PATH_MNTTAB "/etc/fstab" #define MNTTAB _PATH_MNTTAB /* Deprecated alias. */ /* File listing currently active mount points. */ -#define _PATH_MOUNTED "/var/run/mtab" #define MOUNTED _PATH_MOUNTED /* Deprecated alias. */ diff --git a/nss/nss_db/db-netgrp.c b/nss/nss_db/db-netgrp.c index 441a0bd..3afede5 100644 --- a/nss/nss_db/db-netgrp.c +++ b/nss/nss_db/db-netgrp.c @@ -21,6 +21,7 @@ Boston, MA 02111-1307, USA. */ #include <db.h> #include <errno.h> #include <fcntl.h> +#include <string.h> #include <libc-lock.h> #include <paths.h> #include "nsswitch.h" diff --git a/paths.h b/paths.h deleted file mode 100644 index 5e4af7c..0000000 --- a/paths.h +++ /dev/null @@ -1 +0,0 @@ -#include <misc/paths.h> diff --git a/posix/Makefile b/posix/Makefile index dd68ce2..b9cd739 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -45,7 +45,8 @@ routines := \ confstr \ getopt getopt1 \ sched_setp sched_getp sched_sets sched_gets sched_yield sched_primax \ - sched_primin sched_rr_gi + sched_primin sched_rr_gi \ + getaddrinfo aux := init-posix environ tests := tstgetopt testfnm @@ -57,6 +58,7 @@ gpl2lgpl := getopt.c getopt1.c getopt.h regex.c regex.h include ../Rules CFLAGS-regex.c = -Wno-unused -Wno-strict-prototypes +CFLAGS-getaddrinfo.c = -DRESOLVER $(objpfx)libposix.a: $(dep-dummy-lib); $(make-dummy-lib) lib: $(objpfx)libposix.a diff --git a/resolv/netdb.h b/resolv/netdb.h index 954085f..38622e8 100644 --- a/resolv/netdb.h +++ b/resolv/netdb.h @@ -357,6 +357,50 @@ extern int getnetgrent_r __P ((char **__hostp, char **__userp, char *__buffer, int __buflen)); #endif + +/* Extension from POSIX.1g. */ +#ifdef __USE_POSIX +/* Structure to contain information about address of a service provider. */ +struct addrinfo +{ + int ai_flags; /* Input flags. */ + int ai_family; /* Protocol family for socket. */ + int ai_socktype; /* Socket type. */ + int ai_protocol; /* Protocol for socket. */ + int ai_addrlen; /* Length of socket address. */ + struct sockaddr *ai_addr; /* Socket address for socket. */ + char *ai_canonname; /* Canonical name for service location. */ + struct addrinfo *ai_next; /* Pointer to next in list. */ +}; + +/* Possible values for `ai_flags' field in `addrinfo' structure. */ +#define AI_PASSIVE 1 /* Socket address is intended for `bind'. */ +#define AI_CANONNAME 2 /* Request for canonical name. */ + +/* Error values for `getaddrinfo' function. */ +#define EAI_BADFLAGS -1 /* Invalid value for `ai_flags' field. */ +#define EAI_NONAME -2 /* NAME or SERVICE is unknown. */ +#define EAI_AGAIN -3 /* Temporary failure in name resolution. */ +#define EAI_FAIL -4 /* Non-recoverable failure in name res. */ +#define EAI_NODATA -5 /* No address associated with NAME. */ +#define EAI_FAMILY -6 /* `ai_family' not supported. */ +#define EAI_SOCKTYPE -7 /* `ai_socktype' not supported. */ +#define EAI_SERVICE -8 /* SERVICE not supported for `ai_socktype'. */ +#define EAI_ADDRFAMILY -9 /* Address family for NAME not supported. */ +#define EAI_MEMORY -10 /* Memory allocation failure. */ +#define EAI_SYSTEM -11 /* System error returned in `errno'. */ + + +/* Translate name of a service location and/or a service name to set of + socket addresses. */ +extern int getaddrinfo __P ((__const char *__name, __const char *__service, + __const struct addrinfo *__req, + struct addrinfo **__pai)); + +/* Free `addrinfo' structure AI including associated storage. */ +extern void freeaddrinfo __P ((struct addrinfo *__ai)); +#endif /* POSIX */ + __END_DECLS #endif /* netdb.h */ diff --git a/rpm/template b/rpm/template index 7b24ac1..319f62c 100644 --- a/rpm/template +++ b/rpm/template @@ -23,4 +23,4 @@ make make install %files -%doc FAQ NEWS NOTES README +%doc FAQ NEWS NOTES README INSTALL diff --git a/stdio-common/psignal.c b/stdio-common/psignal.c index f82bed6..fc50041 100644 --- a/stdio-common/psignal.c +++ b/stdio-common/psignal.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1992, 1995, 1996 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 @@ -16,7 +16,6 @@ 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 <stdio.h> #include <signal.h> @@ -26,24 +25,24 @@ Cambridge, MA 02139, USA. */ #endif /* Defined in sys_siglist.c. */ -extern CONST char *CONST _sys_siglist[]; +extern const char *const _sys_siglist[]; /* Print out on stderr a line consisting of the test in S, a colon, a space, a message describing the meaning of the signal number SIG and a newline. If S is NULL or "", the colon and space are omitted. */ void -DEFUN(psignal, (sig, s), int sig AND register CONST char *s) +psignal (int sig, const char *s) { - CONST char *colon; + const char *colon, *desc; if (s == NULL || s == '\0') s = colon = ""; else colon = ": "; - if (sig >= 0 && sig < NSIG) - (void) fprintf (stderr, "%s%s%s\n", s, colon, _(_sys_siglist[sig])); + if (sig >= 0 && sig < NSIG && (desc = _sys_siglist[sig]) != NULL) + (void) fprintf (stderr, "%s%s%s\n", s, colon, _(desc)); else (void) fprintf (stderr, _("%s%sUnknown signal %d\n"), s, colon, sig); } diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 44072a4..82b0e06 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -23,7 +23,6 @@ Boston, MA 02111-1307, USA. */ #include <stdlib.h> #include <errno.h> #include <wchar.h> -#include <libc-lock.h> #include "_itoa.h" #include "../locale/localeinfo.h" @@ -124,6 +123,11 @@ ssize_t __wprintf_pad __P ((FILE *, wchar_t pad, size_t n)); } \ while (0) # define UNBUFFERED_P(s) ((s)->__buffer == NULL) + +/* XXX These declarations should go as soon as the stdio header files + have these prototypes. */ +extern void __flockfile (FILE *); +extern void __funlockfile (FILE *); #endif /* USE_IN_LIBIO */ @@ -152,8 +156,6 @@ ssize_t __wprintf_pad __P ((FILE *, wchar_t pad, size_t n)); # define is_longlong is_long_double #endif -extern void __flockfile (FILE *); -extern void __funlockfile (FILE *); /* Global variables. */ static const char null[] = "(null)"; @@ -848,8 +850,13 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap) f = lead_str_end = find_spec (format, &mbstate); /* Lock stream. */ +#ifdef USE_IN_LIBIO + __libc_cleanup_region_start ((void (*) (void *)) &_IO_funlockfile, s); + _IO_flockfile (s); +#else __libc_cleanup_region_start ((void (*) (void *)) &__funlockfile, s); __flockfile (s); +#endif /* Write the literal text before the first format. */ outstring ((const UCHAR_T *) format, diff --git a/stdlib/longlong.h b/stdlib/longlong.h index 89414f2..6d4f237 100644 --- a/stdlib/longlong.h +++ b/stdlib/longlong.h @@ -166,7 +166,7 @@ MA 02111-1307, USA. */ (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \ (r) = __r; \ } while (0) -extern UDItype __udiv_qrnnd (); +extern UDItype __udiv_qrnnd __P ((UDItype *, UDItype, UDItype, UDItype)); #define UDIV_TIME 220 #endif /* LONGLONG_STANDALONE */ #endif /* __alpha */ @@ -477,7 +477,7 @@ extern USItype __udiv_qrnnd (); : "=d" (__w) \ : "%dI" ((USItype)(u)), \ "dI" ((USItype)(v))); \ - __w; }) + __w; }) #define udiv_qrnnd(q, r, nh, nl, d) \ do { \ union {UDItype __ll; \ diff --git a/string/stratcliff.c b/string/stratcliff.c new file mode 100644 index 0000000..5f6a467 --- /dev/null +++ b/string/stratcliff.c @@ -0,0 +1,152 @@ +#define _GNU_SOURCE 1 +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/mman.h> +#include <sys/param.h> + +#ifndef MAX +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#endif + +int +main (int argc, char *argv[]) +{ + size_t size = sysconf (_SC_PAGESIZE); + char *adr; + int result = 0; + + adr = (char *) mmap (NULL, size, PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + if (adr == NULL) + { + if (errno == ENOSYS) + puts ("No test, mmap not available."); + else + { + printf ("mmaping failed: %m"); + result = 1; + } + } + else + { + char dest[size]; + int inner, middle, outer; + + memset (adr, 'T', size); + + /* strlen test */ + for (outer = size - 1; outer >= MAX (0, size - 128); --outer) + { + for (inner = MAX (outer, size - 64); inner < size; ++inner) + { + adr[inner] = '\0'; + + if (strlen (&adr[outer]) != inner - outer) + { + printf ("strlen flunked for outer = %d, inner = %d\n", + outer, inner); + result = 1; + } + + adr[inner] = 'T'; + } + } + + /* strchr test */ + for (outer = size - 1; outer >= MAX (0, size - 128); --outer) + { + for (middle = MAX (outer, size - 64); middle < size; ++middle) + { + for (inner = middle; inner < size; ++inner) + { + char *cp; + adr[middle] = 'V'; + adr[inner] = '\0'; + + cp = strchr (&adr[outer], 'V'); + + if ((inner == middle && cp != NULL) + || (inner != middle + && (cp - &adr[outer]) != middle - outer)) + { + printf ("strchr flunked for outer = %d, middle = %d, " + "inner = %d\n", outer, middle, inner); + result = 1; + } + + adr[inner] = 'T'; + adr[middle] = 'T'; + } + } + } + + /* strrchr test */ + for (outer = size - 1; outer >= MAX (0, size - 128); --outer) + { + for (middle = MAX (outer, size - 64); middle < size; ++middle) + { + for (inner = middle; inner < size; ++inner) + { + char *cp; + adr[middle] = 'V'; + adr[inner] = '\0'; + + cp = strrchr (&adr[outer], 'V'); + + if ((inner == middle && cp != NULL) + || (inner != middle + && (cp - &adr[outer]) != middle - outer)) + { + printf ("strrchr flunked for outer = %d, middle = %d, " + "inner = %d\n", outer, middle, inner); + result = 1; + } + + adr[inner] = 'T'; + adr[middle] = 'T'; + } + } + } + + /* strcpy test */ + for (outer = size - 1; outer >= MAX (0, size - 128); --outer) + { + for (inner = MAX (outer, size - 64); inner < size; ++inner) + { + adr[inner] = '\0'; + + if (strcpy (dest, &adr[outer]) != dest + || strlen (dest) != inner - outer) + { + printf ("strcpy flunked for outer = %d, inner = %d\n", + outer, inner); + result = 1; + } + + adr[inner] = 'T'; + } + } + + /* stpcpy test */ + for (outer = size - 1; outer >= MAX (0, size - 128); --outer) + { + for (inner = MAX (outer, size - 64); inner < size; ++inner) + { + adr[inner] = '\0'; + + if ((stpcpy (dest, &adr[outer]) - dest) != inner - outer) + { + printf ("stpcpy flunked for outer = %d, inner = %d\n", + outer, inner); + result = 1; + } + + adr[inner] = 'T'; + } + } + } + + return result; +} diff --git a/string/strsignal.c b/string/strsignal.c index 3a0c6b2..a700a9f 100644 --- a/string/strsignal.c +++ b/string/strsignal.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1994, 1995 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1994, 1995, 1996 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 @@ -16,7 +16,6 @@ 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 <signal.h> #include <stdio.h> #include <string.h> @@ -27,14 +26,16 @@ Cambridge, MA 02139, USA. */ #endif /* Defined in siglist.c. */ -extern CONST char *CONST _sys_siglist[]; +extern const char *const _sys_siglist[]; /* Return a string describing the meaning of the signal number SIGNUM. */ char * -DEFUN(strsignal, (signum), int signum) +strsignal (int signum) { - if (signum < 0 || signum > NSIG) + const char *desc; + + if (signum < 0 || signum > NSIG || (desc = _sys_siglist[signum]) == NULL) { static char buf[512]; int len = __snprintf (buf, sizeof buf, _("Unknown signal %d"), signum); @@ -44,5 +45,5 @@ DEFUN(strsignal, (signum), int signum) return buf; } - return (char *) _(_sys_siglist[signum]); + return (char *) _(desc); } diff --git a/sunrpc/Makefile b/sunrpc/Makefile index 943f247..6d457a0 100644 --- a/sunrpc/Makefile +++ b/sunrpc/Makefile @@ -66,7 +66,7 @@ routines := auth_none auth_unix authuxprot bindrsvprt \ svc_tcp svc_udp xdr xdr_array xdr_float xdr_mem \ xdr_rec xdr_ref xdr_stdio -others := portmap rpcinfo +others := rpcinfo install-bin := rpcgen install-sbin := rpcinfo rpcgen-objs = rpc_main.o rpc_hout.o rpc_cout.o rpc_parse.o \ diff --git a/sysdeps/generic/Makefile b/sysdeps/generic/Makefile index f160dc8..5e0f03a 100644 --- a/sysdeps/generic/Makefile +++ b/sysdeps/generic/Makefile @@ -32,8 +32,8 @@ common-generated := $(common-generated) bytesex.h det_endian endif ifeq ($(subdir),stdio-common) - -ifeq "$(filter $(objpfx)siglist.c,$(before-compile))" "" +ifneq ($(inhibit-siglist),yes) +ifeq "$(filter %siglist.c,$(before-compile))" "" before-compile := $(before-compile) $(objpfx)siglist.c $(objpfx)siglist.c: $(objpfx)make_siglist @rm -f $@ @@ -49,5 +49,5 @@ $(objpfx)make_siglist: $(sysdep_dir)/generic/make_siglist.c generated := $(generated) make_siglist siglist.c endif - +endif endif diff --git a/sysdeps/generic/_strerror.c b/sysdeps/generic/_strerror.c index 8067f3f..45fc8ca 100644 --- a/sysdeps/generic/_strerror.c +++ b/sysdeps/generic/_strerror.c @@ -16,6 +16,7 @@ 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 <libintl.h> #include <stdio.h> #include <string.h> #include "../stdio-common/_itoa.h" @@ -25,6 +26,9 @@ Cambridge, MA 02139, USA. */ #define _sys_nerr sys_nerr #endif +/* Set if startup process finished. */ +extern int _dl_starting_up; + /* Return a string describing the errno code in ERRNUM. */ char * _strerror_internal (int errnum, @@ -33,7 +37,8 @@ _strerror_internal (int errnum, { if (errnum < 0 || errnum >= _sys_nerr) { - const char *unk = _("Unknown error "); + static const char unk_orig[] = N_("Unknown error "); + const char *unk = _dl_starting_up ? unk_orig : _(unk_orig); const size_t unklen = strlen (unk); char *p = buf + buflen; *--p = '\0'; @@ -41,5 +46,6 @@ _strerror_internal (int errnum, return memcpy (p - unklen, unk, unklen); } - return (char *) _(_sys_errlist[errnum]); + return (char *) (_dl_starting_up ? _sys_errlist[errnum] + : _(_sys_errlist[errnum])); } diff --git a/misc/paths.h b/sysdeps/generic/paths.h index 00a546f..760ae7c 100644 --- a/misc/paths.h +++ b/sysdeps/generic/paths.h @@ -52,6 +52,8 @@ #define _PATH_MAILDIR "/var/mail" #define _PATH_MAN "/usr/man" #define _PATH_MEM "/dev/mem" +#define _PATH_MNTTAB "/etc/fstab" +#define _PATH_MOUNTED "/var/run/mtab" #define _PATH_NOLOGIN "/etc/nologin" #define _PATH_SENDMAIL "/usr/sbin/sendmail" #define _PATH_SHELLS "/etc/shells" diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c new file mode 100644 index 0000000..823335d --- /dev/null +++ b/sysdeps/posix/getaddrinfo.c @@ -0,0 +1,487 @@ +/* The Inner Net License, Version 2.00 + + The author(s) grant permission for redistribution and use in source and +binary forms, with or without modification, of the software and documentation +provided that the following conditions are met: + +0. If you receive a version of the software that is specifically labelled + as not being for redistribution (check the version message and/or README), + you are not permitted to redistribute that version of the software in any + way or form. +1. All terms of the all other applicable copyrights and licenses must be + followed. +2. Redistributions of source code must retain the authors' copyright + notice(s), this list of conditions, and the following disclaimer. +3. Redistributions in binary form must reproduce the authors' copyright + notice(s), this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. +4. All advertising materials mentioning features or use of this software + must display the following acknowledgement with the name(s) of the + authors as specified in the copyright notice(s) substituted where + indicated: + + This product includes software developed by <name(s)>, The Inner + Net, and other contributors. + +5. Neither the name(s) of the author(s) nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY ITS AUTHORS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + If these license terms cause you a real problem, contact the author. */ + +/* This software is Copyright 1996 by Craig Metz, All Rights Reserved. */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <stdlib.h> +#include <netinet/in.h> +#ifdef INET6 +#include <netinet6/in6.h> +#endif /* INET6 */ +#include <netdb.h> + + +#define GAIH_OKIFUNSPEC 0x0100 +#define GAIH_EAI ~(GAIH_OKIFUNSPEC) + +#ifdef HOSTTABLE +struct hostent *_hostname2addr_hosts(const char *name, int); +struct hostent *_addr2hostname_hosts(const char *name, int, int); +#endif /* HOSTTABLE */ + +static struct addrinfo nullreq = +{ 0, PF_UNSPEC, 0, 0, 0, NULL, NULL, NULL }; + +struct gaih_service { + char *name; + unsigned long num; +}; + +struct gaih_servtuple { + struct gaih_servtuple *next; + int socktype; + int protocol; + int port; +}; + +static struct gaih_servtuple nullserv = { + NULL, 0, 0, 0 +}; + +struct gaih_addrtuple { + struct gaih_addrtuple *next; + int family; + char addr[16]; +}; + +static struct gaih_addrtuple nulladdr; + +struct gaih_typeproto { + int socktype; + int protocol; + char *name; +}; + +static struct gaih_typeproto gaih_inet_typeproto[] = { + { 0, 0, NULL }, + { SOCK_STREAM, IPPROTO_TCP, "tcp" }, + { SOCK_DGRAM, IPPROTO_UDP, "udp" }, + { 0, 0, NULL } +}; + +static int gaih_inet_serv(char *servicename, struct gaih_typeproto *tp, struct gaih_servtuple **st) +{ + struct servent *s; + + if (!(s = getservbyname(servicename, tp->name))) + return (GAIH_OKIFUNSPEC | -EAI_SERVICE); + + if (!(*st = malloc(sizeof(struct gaih_servtuple)))) + return -EAI_MEMORY; + + (*st)->next = NULL; + (*st)->socktype = tp->socktype; + (*st)->protocol = tp->protocol; + (*st)->port = s->s_port; + + return 0; +} + +static int gaih_inet(const char *name, const struct gaih_service *service, + const struct addrinfo *req, struct addrinfo **pai) +{ + struct hostent *h = NULL; + struct gaih_typeproto *tp = gaih_inet_typeproto; + struct gaih_servtuple *st = &nullserv; + struct gaih_addrtuple *at = &nulladdr; + int i; + + if (req->ai_protocol || req->ai_socktype) { + for (tp++; tp->name && + ((req->ai_socktype != tp->socktype) || !req->ai_socktype) && + ((req->ai_protocol != tp->protocol) || !req->ai_protocol); tp++); + if (!tp->name) + if (req->ai_socktype) + return (GAIH_OKIFUNSPEC | -EAI_SOCKTYPE); + else + return (GAIH_OKIFUNSPEC | -EAI_SERVICE); + } + + if (service) { + if (service->name) { + if (tp->name) { + if (i = gaih_inet_serv(service->name, tp, &st)) + return i; + } else { + struct gaih_servtuple **pst = &st; + for (tp++; tp->name; tp++) { + if (i = gaih_inet_serv(service->name, tp, pst)) { + if (i & GAIH_OKIFUNSPEC) + continue; + goto ret; + } + pst = &((*pst)->next); + } + if (st == &nullserv) { + i = (GAIH_OKIFUNSPEC | -EAI_SERVICE); + goto ret; + } + } + } else { + if (!(st = malloc(sizeof(struct gaih_servtuple)))) + return -EAI_MEMORY; + + st->next = NULL; + st->socktype = tp->socktype; + st->protocol = tp->protocol; + st->port = htons(service->num); + } + } + + if (name) { + if (!(at = malloc(sizeof(struct gaih_addrtuple)))) { + i = -EAI_MEMORY; + goto ret; + } + + at->family = 0; + at->next = NULL; + + if (!at->family || !req->ai_family || (req->ai_family == AF_INET)) + if (inet_pton(AF_INET, name, at->addr) > 0) + at->family = AF_INET; + +#ifdef INET6 + if (!at->family && (!req->ai_family || (req->ai_family == AF_INET6))) + if (inet_pton(AF_INET6, name, at->addr) > 0) + at->family = AF_INET6; +#endif /* INET6 */ + +#ifdef HOSTTABLE + if (!at->family) { + struct hostent *h; + struct gaih_addrtuple **pat = &at; + +#ifdef INET6 + if (!req->ai_family || (req->ai_family == AF_INET6)) + if (h = _hostname2addr_hosts(name, AF_INET6)) { + for (i = 0; h->h_addr_list[i]; i++) { + if (!*pat) { + if (!(*pat = malloc(sizeof(struct gaih_addrtuple)))) { + i = -EAI_MEMORY; + goto ret; + } + } + (*pat)->next = NULL; + (*pat)->family = AF_INET6; + memcpy((*pat)->addr, h->h_addr_list[i], sizeof(struct in6_addr)); + pat = &((*pat)->next); + } + } +#endif /* INET6 */ + + if (!req->ai_family || (req->ai_family == AF_INET)) + if (h = _hostname2addr_hosts(name, AF_INET)) { + for (i = 0; h->h_addr_list[i]; i++) { + if (!*pat) { + if (!(*pat = malloc(sizeof(struct gaih_addrtuple)))) { + i = -EAI_MEMORY; + goto ret; + } + } + (*pat)->next = NULL; + (*pat)->family = AF_INET; + memcpy((*pat)->addr, h->h_addr_list[i], sizeof(struct in_addr)); + pat = &((*pat)->next); + } + } + } +#endif /* HOSTTABLE */ + +#ifdef RESOLVER + if (!at->family) { + struct hostent *h; + struct gaih_addrtuple **pat = &at; + +#ifdef INET6 + if (!req->ai_family || (req->ai_family == AF_INET6)) + if (h = gethostbyname2(name, AF_INET6)) { + for (i = 0; h->h_addr_list[i]; i++) { + if (!*pat) { + if (!(*pat = malloc(sizeof(struct gaih_addrtuple)))) { + i = -EAI_MEMORY; + goto ret; + } + } + (*pat)->next = NULL; + (*pat)->family = AF_INET6; + memcpy((*pat)->addr, h->h_addr_list[i], sizeof(struct in6_addr)); + pat = &((*pat)->next); + } + } +#endif /* INET6 */ + + if (!req->ai_family || (req->ai_family == AF_INET)) + if (h = gethostbyname2(name, AF_INET)) { + for (i = 0; h->h_addr_list[i]; i++) { + if (!*pat) { + if (!(*pat = malloc(sizeof(struct gaih_addrtuple)))) { + i = -EAI_MEMORY; + goto ret; + } + } + (*pat)->next = NULL; + (*pat)->family = AF_INET; + memcpy((*pat)->addr, h->h_addr_list[i], sizeof(struct in_addr)); + pat = &((*pat)->next); + } + } + } +#endif /* RESOLVER */ + + if (!at->family) + return (GAIH_OKIFUNSPEC | -EAI_NONAME); + } else { + memset(&nulladdr, 0, sizeof(nulladdr)); +#ifdef INET6 + if (!req->ai_family || (req->ai_family == AF_INET6)) + nulladdr.family = AF_INET6; + else +#endif /* INET6 */ + nulladdr.family = AF_INET; + } + + { + const char *c = NULL; + struct gaih_servtuple *st2; + struct gaih_addrtuple *at2 = at; + int j; + + while(at2) { + if (req->ai_flags & AI_CANONNAME) { + struct hostent *h = NULL; + +#ifdef RESOLVER + h = gethostbyaddr(at2->addr, +#ifdef INET6 + (at2->family == AF_INET6) ? sizeof(struct in6_addr) : +#endif /* INET6 */ + sizeof(struct in_addr), at2->family); +#endif /* RESOLVER */ +#ifdef HOSTTABLE + if (!h) + h = _addr2hostname_hosts(at2->addr, +#ifdef INET6 + (at2->family == AF_INET6) ? sizeof(struct in6_addr) : +#endif /* INET6 */ + sizeof(struct in_addr), at2->family); +#endif /* HOSTTABLE */ + + if (!h) { + c = inet_ntop(at2->family, at2->addr, NULL, 0); + } else + c = h->h_name; + + if (!c) { + i = (GAIH_OKIFUNSPEC | -EAI_NONAME); + goto ret; + } + + j = strlen(c) + 1; + } else + j = 0; + +#ifdef INET6 + if (at2->family == AF_INET6) + i = sizeof(struct sockaddr_in6); + else +#endif /* INET6 */ + i = sizeof(struct sockaddr_in); + + st2 = st; + while(st2) { + if (!(*pai = malloc(sizeof(struct addrinfo) + i + j))) { + i = -EAI_MEMORY; + goto ret; + } + (*pai)->ai_flags = req->ai_flags; + (*pai)->ai_family = at2->family; + (*pai)->ai_socktype = st2->socktype; + (*pai)->ai_protocol = st2->protocol; + (*pai)->ai_addrlen = i; + (*pai)->ai_addr = (void *)(*pai) + sizeof(struct addrinfo); +#if SALEN + ((struct sockaddr_in *)(*pai)->ai_addr)->sin_len = i; +#endif /* SALEN */ + ((struct sockaddr_in *)(*pai)->ai_addr)->sin_family = at2->family; + ((struct sockaddr_in *)(*pai)->ai_addr)->sin_port = st2->port; + +#ifdef INET6 + if (at2->family == AF_INET6) { + ((struct sockaddr_in6 *)(*pai)->ai_addr)->sin6_flowinfo = 0; + memcpy(&((struct sockaddr_in6 *)(*pai)->ai_addr)->sin6_addr, at2->addr, sizeof(struct in6_addr)); + } else +#endif /* INET6 */ + { + memcpy(&((struct sockaddr_in *)(*pai)->ai_addr)->sin_addr, at2->addr, sizeof(struct in_addr)); + memset(((struct sockaddr_in *)(*pai)->ai_addr)->sin_zero, 0, sizeof(((struct sockaddr_in *)(*pai)->ai_addr)->sin_zero)); + } + + if (c) { + (*pai)->ai_canonname = (void *)(*pai) + sizeof(struct addrinfo) + i; + strcpy((*pai)->ai_canonname, c); + } else + (*pai)->ai_canonname = NULL; + (*pai)->ai_next = NULL; + + pai = &((*pai)->ai_next); + + st2 = st2->next; + } + at2 = at2->next; + } + } + + i = 0; + +ret: + if (st != &nullserv) { + struct gaih_servtuple *st2 = st; + while(st) { + st2 = st->next; + free(st); + st = st2; + } + } + if (at != &nulladdr) { + struct gaih_addrtuple *at2 = at; + while(at) { + at2 = at->next; + free(at); + at = at2; + } + } + return i; +} + +struct gaih { + int family; + int (*gaih)(const char *name, const struct gaih_service *service, + const struct addrinfo *req, struct addrinfo **pai); +}; + +static struct gaih gaih[] = { +#ifdef INET6 + { PF_INET6, gaih_inet }, +#endif /* INET6 */ + { PF_INET, gaih_inet }, + { PF_UNSPEC, NULL } +}; + +int getaddrinfo(const char *name, const char *service, + const struct addrinfo *req, struct addrinfo **pai) +{ + int i, j = 0; + struct addrinfo *p = NULL, **end = &p; + struct gaih *g = gaih, *pg = NULL; + struct gaih_service gaih_service, *pservice; + + if (!name && !service) + return EAI_NONAME; + + if (!req) + req = &nullreq; + + if (req->ai_flags & ~3) + return EAI_BADFLAGS; + + if ((req->ai_flags & AI_CANONNAME) && !name) + return EAI_BADFLAGS; + + if (service && *service) { + char *c; + gaih_service.num = strtoul(gaih_service.name = (void *)service, &c, 10); + if (!*c) { + if (!req->ai_socktype) + return EAI_SERVICE; + gaih_service.name = NULL; + } + pservice = &gaih_service; + } else + pservice = NULL; + + while(g->gaih) { + if ((req->ai_family == g->family) || !req->ai_family) { + j++; + if (!((pg && (pg->gaih == g->gaih)))) { + pg = g; + if (i = g->gaih(name, pservice, req, end)) { + if (!req->ai_family && (i & GAIH_OKIFUNSPEC)) + continue; + goto gaih_err; + } + while(*end) end = &((*end)->ai_next); + } + } + g++; + } + + if (!j) + return EAI_FAMILY; + + if (p) { + *pai = p; + return 0; + } + +gaih_err: + if (p) + freeaddrinfo(p); + + if (i) + return -(i & GAIH_EAI); + + return EAI_NONAME; +} + +void freeaddrinfo(struct addrinfo *ai) +{ + struct addrinfo *p; + + while(ai) { + p = ai; + ai = ai->ai_next; + free((void *)p); + } +} diff --git a/sysdeps/stub/getaddrinfo.c b/sysdeps/stub/getaddrinfo.c new file mode 100644 index 0000000..5b8bb0e --- /dev/null +++ b/sysdeps/stub/getaddrinfo.c @@ -0,0 +1,38 @@ +/* Stub version of getaddrinfo function. + Copyright (C) 1996 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <netdb.h> + +int +getaddrinfo (const char *name, const char *service, const struct addrinfo *req, + struct addrinfo **pai) +{ + __set_errno (ENOSYS); + return EAI_SYSTEM; +} +stub_warning (getaddrinfo) + + +void +freeaddrinfo (struct addrinfo *ai) +{ + /* Nothing. */ +} +stub_warning (freeaddrinfo) diff --git a/sysdeps/stub/lockfile.c b/sysdeps/stub/lockfile.c index 61d03a7..112a7ad 100644 --- a/sysdeps/stub/lockfile.c +++ b/sysdeps/stub/lockfile.c @@ -21,34 +21,40 @@ typedef FILE; void -__flockfile (FILE *stream) +__internal_flockfile (FILE *stream) { /* Do nothing. Using this version does not do any locking. */ } #ifdef USE_IN_LIBIO -strong_alias (__flockfile, _IO_flockfile) +weak_alias (__internal_flockfile, _IO_flockfile) +#else +weak_alias (__internal_flockfile, __flockfile) #endif -weak_alias (__flockfile, flockfile); +weak_alias (__internal_flockfile, flockfile); void -__funlockfile (FILE *stream) +__internal_funlockfile (FILE *stream) { /* Do nothing. Using this version does not do any locking. */ } #ifdef USE_IN_LIBIO -strong_alias (__funlockfile, _IO_funlockfile) +weak_alias (__internal_funlockfile, _IO_funlockfile) +#else +weak_alias (__internal_funlockfile, __internal_funlockfile) #endif -weak_alias (__funlockfile, funlockfile); +weak_alias (__internal_funlockfile, funlockfile); int -__ftrylockfile (FILE *stream) +__internal_ftrylockfile (FILE *stream) { /* Do nothing. Using this version does not do any locking. */ return 1; } #ifdef USE_IN_LIBIO -strong_alias (__ftrylockfile, _IO_ftrylockfile) +weak_alias (__internal_ftrylockfile, __ftrylockfile) +#else +weak_alias (__internal_ftrylockfile, _IO_ftrylockfile) #endif -weak_alias (__ftrylockfile, ftrylockfile); +weak_alias (__internal_ftrylockfile, ftrylockfile); diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 0f563f0..0e87d09 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -43,5 +43,10 @@ ifeq ($(subdir), termios) sysdep_headers += termio.h endif +ifeq ($(subdir), stdio-common) +# Just disable the auto generation in sysdeps/generic +inhibit-siglist := yes +endif + # Don't compile the ctype glue code, since there is no old non-GNU C library. inhibit-glue = yes diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile index fa433e9..3908b57 100644 --- a/sysdeps/unix/sysv/linux/alpha/Makefile +++ b/sysdeps/unix/sysv/linux/alpha/Makefile @@ -1,5 +1,5 @@ ifeq ($(subdir), misc) -sysdep_headers += alpha/ptrace.h alpha/regdef.h sys/io.h +sysdep_headers += alpha/ptrace.h alpha/regdef.h sysdep_routines += ieee_get_fp_control ieee_set_fp_control \ sethae ioperm osf_sigprocmask fstatfs statfs llseek diff --git a/sysdeps/unix/sysv/linux/alpha/sigaction.h b/sysdeps/unix/sysv/linux/alpha/sigaction.h new file mode 100644 index 0000000..57ce5e6 --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/sigaction.h @@ -0,0 +1,51 @@ +/* The proper definitions for Linux/Alpha sigaction. +Copyright (C) 1996 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., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +/* Structure describing the action to be taken when a signal arrives. */ +struct sigaction + { + /* Signal handler. */ + __sighandler_t sa_handler; + + /* Additional set of signals to be blocked. */ + __sigset_t sa_mask; + + /* Special flags. */ + unsigned int sa_flags; + }; + +/* Bits in `sa_flags'. */ +#define SA_NOCLDSTOP 0x00000004 /* Don't send SIGCHLD when children stop. */ +#ifdef __USE_MISC +#define SA_STACK 0x00000001 /* Use signal stack by using `sa_restorer'. */ +#define SA_RESTART 0x00000002 /* Don't restart syscall on signal return. */ +#define SA_INTERRUPT 0x20000000 /* Historical no-op. */ +#define SA_NOMASK 0x00000008 /* Don't automatically block the signal when + its handler is being executed. */ +#define SA_ONESHOT 0x00000010 /* Reset to SIG_DFL on entry to handler. */ + +/* Some aliases for the SA_ constants. */ +#define SA_NODEFER SA_NOMASK +#define SA_RESETHAND SA_ONESHOT +#endif + +/* Values for the HOW argument to `sigprocmask'. */ +#define SIG_BLOCK 1 /* Block signals. */ +#define SIG_UNBLOCK 2 /* Unblock signals. */ +#define SIG_SETMASK 3 /* Set the set of blocked signals. */ diff --git a/sysdeps/unix/sysv/linux/alpha/signum.h b/sysdeps/unix/sysv/linux/alpha/signum.h new file mode 100644 index 0000000..be6132d --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/signum.h @@ -0,0 +1,69 @@ +/* Signal number definitions. Linux/Alpha version. +Copyright (C) 1996 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. */ + +#ifdef _SIGNAL_H + +/* Fake signal functions. */ +#define SIG_ERR ((__sighandler_t) -1) /* Error return. */ +#define SIG_DFL ((__sighandler_t) 0) /* Default action. */ +#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */ + +/* + * Linux/AXP has different signal numbers that Linux/i386: I'm trying + * to make it OSF/1 binary compatible, at least for normal binaries. + */ +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGEMT 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGBUS 10 +#define SIGSEGV 11 +#define SIGSYS 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGURG 16 +#define SIGSTOP 17 +#define SIGTSTP 18 +#define SIGCONT 19 +#define SIGCHLD 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGIO 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGINFO 29 +#define SIGUSR1 30 +#define SIGUSR2 31 + +#define SIGPOLL SIGIO +#define SIGPWR SIGINFO +#define SIGIOT SIGABRT + +#define _NSIG 32 /* Biggest signal number + 1. */ + +#endif /* <signal.h> included. */ diff --git a/sysdeps/unix/sysv/linux/alpha/statbuf.h b/sysdeps/unix/sysv/linux/alpha/statbuf.h index e0e7a8a..5b59155 100644 --- a/sysdeps/unix/sysv/linux/alpha/statbuf.h +++ b/sysdeps/unix/sysv/linux/alpha/statbuf.h @@ -1,5 +1,5 @@ -/* Copyright (C) 1993 Free Software Foundation, Inc. - Contributed by Brendan Kehoe (brendan@zen.org). +/* Copyright (C) 1996 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 @@ -19,32 +19,30 @@ Cambridge, MA 02139, USA. */ #ifndef _STATBUF_H #define _STATBUF_H -#include <gnu/types.h> +/* The Alpha has no additional syscall versions. */ -/* Structure describing file characteristics. */ -struct stat - { - int st_dev; /* Device. */ - unsigned int st_ino; /* File serial number. */ - unsigned int st_mode; /* File mode. */ - unsigned int st_nlink; /* Link count. */ - unsigned int st_uid; /* User ID of the file's owner. */ - unsigned int st_gid; /* Group ID of the file's group.*/ - int st_rdev; /* Device number, if device. */ - - long st_size; /* Size of file, in bytes. */ +/* Versions of the `struct stat' data structure. */ +#define _STAT_VER 0 - int st_atime; /* Time of last access. */ - int st_atime_usec; - int st_mtime; /* Time of last modification. */ - int st_mtime_usec; - int st_ctime; /* Time of last status change. */ - int st_ctime_usec; +/* Versions of the `xmknod' interface. */ +#define _MKNOD_VER_LINUX 0 - unsigned int st_blksize; /* Optimal block size for I/O. */ -#define _STATBUF_ST_BLKSIZE /* Tell code we have this member. */ - - int st_blocks; /* Number of 512-byte blocks allocated. */ +struct stat + { + unsigned int st_dev; /* Device. */ + unsigned int st_ino; /* File serial number. */ + unsigned int st_mode; /* File mode. */ + unsigned int st_nlink; /* Link count. */ + unsigned int st_uid; /* User ID of the file's owner. */ + unsigned int st_gid; /* Group ID of the file's group.*/ + unsigned int st_rdev; /* Device number, if device. */ + long int st_size; /* Size of file, in bytes. */ + unsigned long int st_atime; /* Time of last access. */ + unsigned long int st_mtime; /* Time of last modification. */ + unsigned long int st_ctime; /* Time of last status change. */ + unsigned int st_blksize; /* Optimal block size for I/O. */ +#define _STATBUF_ST_BLKSIZE /* Tell code we have this member. */ + int st_blocks; /* Nr. of 512-byte blocks allocated. */ unsigned int st_flags; unsigned int st_gen; }; @@ -60,6 +58,7 @@ struct stat #define __S_IFREG 0100000 /* Regular file. */ #define __S_IFIFO 0010000 /* FIFO. */ +/* These don't actually exist on System V, but having them doesn't hurt. */ #define __S_IFLNK 0120000 /* Symbolic link. */ #define __S_IFSOCK 0140000 /* Socket. */ diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c index 349da98..d37ca8c 100644 --- a/sysdeps/unix/sysv/linux/getsysstats.c +++ b/sysdeps/unix/sysv/linux/getsysstats.c @@ -20,6 +20,7 @@ Boston, MA 02111-1307, USA. */ #include <errno.h> #include <mntent.h> +#include <paths.h> #include <stdio.h> #include <string.h> #include <unistd.h> diff --git a/sysdeps/unix/sysv/linux/paths.h b/sysdeps/unix/sysv/linux/paths.h new file mode 100644 index 0000000..80b6362 --- /dev/null +++ b/sysdeps/unix/sysv/linux/paths.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)paths.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _PATHS_H_ +#define _PATHS_H_ + +/* Default search path. */ +#define _PATH_DEFPATH "/usr/bin:/bin" +/* All standard utilities path. */ +#define _PATH_STDPATH \ + "/usr/bin:/bin:/usr/sbin:/sbin" + +#define _PATH_BSHELL "/bin/sh" +#define _PATH_CONSOLE "/dev/console" +#define _PATH_CSHELL "/bin/csh" +#define _PATH_DEVDB "/var/run/dev.db" +#define _PATH_DEVNULL "/dev/null" +#define _PATH_DRUM "/dev/drum" +#define _PATH_KMEM "/dev/kmem" +#define _PATH_MAILDIR "/var/spool/mail" +#define _PATH_MAN "/usr/man" +#define _PATH_MEM "/dev/mem" +#define _PATH_MNTTAB "/etc/fstab" +#define _PATH_MOUNTED "/etc/mtab" +#define _PATH_NOLOGIN "/etc/nologin" +#define _PATH_SENDMAIL "/usr/sbin/sendmail" +#define _PATH_SHELLS "/etc/shells" +#define _PATH_TTY "/dev/tty" +#define _PATH_UNIX "/vmlinux" +#define _PATH_VI "/usr/bin/vi" + +/* Provide trailing slash, since mostly used for building pathnames. */ +#define _PATH_DEV "/dev/" +#define _PATH_TMP "/tmp/" +#define _PATH_VARDB "/var/db/" +#define _PATH_VARRUN "/var/run/" +#define _PATH_VARTMP "/var/tmp/" + +#endif /* !_PATHS_H_ */ diff --git a/sysdeps/unix/sysv/linux/siglist.c b/sysdeps/unix/sysv/linux/siglist.c new file mode 100644 index 0000000..c054e81 --- /dev/null +++ b/sysdeps/unix/sysv/linux/siglist.c @@ -0,0 +1,19 @@ +#include <stddef.h> +#include <signal.h> + +const char * const _sys_siglist[NSIG] = +{ +#define init_sig(sig, abbrev, desc) [sig] desc, +#include "siglist.h" +#undef init_sig +}; + +const char * const _sys_sigabbrev[NSIG] = +{ +#define init_sig(sig, abbrev, desc) [sig] abbrev, +#include "siglist.h" +#undef init_sig +}; + +weak_alias(_sys_siglist, sys_siglist) +weak_alias(_sys_sigabbrev, sys_sigabbrev) diff --git a/sysdeps/unix/sysv/linux/siglist.h b/sysdeps/unix/sysv/linux/siglist.h new file mode 100644 index 0000000..44aa4d9 --- /dev/null +++ b/sysdeps/unix/sysv/linux/siglist.h @@ -0,0 +1,47 @@ +/* This file is included multiple times. */ + +/* Standard signals */ + init_sig (SIGHUP, "HUP", "Hangup") + init_sig (SIGINT, "INT", "Interrupt") + init_sig (SIGQUIT, "QUIT", "Quit") + init_sig (SIGILL, "ILL", "Illegal Instruction") + init_sig (SIGTRAP, "TRAP", "Trace/breakpoint trap") + init_sig (SIGABRT, "ABRT", "Aborted") + init_sig (SIGFPE, "FPE", "Floating point exception") + init_sig (SIGKILL, "KILL", "Killed") + init_sig (SIGBUS, "BUS", "Bus error") + init_sig (SIGSEGV, "SEGV", "Segmentation fault") + init_sig (SIGPIPE, "PIPE", "Broken pipe") + init_sig (SIGALRM, "ALRM", "Alarm clock") + init_sig (SIGTERM, "TERM", "Terminated") + init_sig (SIGURG, "URG", "Urgent I/O condition") + init_sig (SIGSTOP, "STOP", "Stopped (signal)") + init_sig (SIGTSTP, "TSTP", "Stopped") + init_sig (SIGCONT, "CONT", "Continued") + init_sig (SIGCHLD, "CHLD", "Child exited") + init_sig (SIGTTIN, "TTIN", "Stopped (tty input)") + init_sig (SIGTTOU, "TTOU", "Stopped (tty output)") + init_sig (SIGIO, "IO", "I/O possible") + init_sig (SIGXCPU, "XCPU", "CPU time limit exceeded") + init_sig (SIGXFSZ, "XFSZ", "File size limit exceeded") + init_sig (SIGVTALRM, "VTALRM", "Virtual timer expired") + init_sig (SIGPROF, "PROF", "Profiling timer expired") + init_sig (SIGWINCH, "WINCH", "Window changed") + init_sig (SIGUSR1, "USR1", "User defined signal 1") + init_sig (SIGUSR2, "USR2", "User defined signal 2") + +/* Variations */ +#ifdef SIGEMT + init_sig (SIGEMT, "EMT", "EMT trap") +#endif +#ifdef SIGSYS + init_sig (SIGSYS, "SYS", "Bad system call") +#endif +#ifdef SIGSTKFLT + init_sig (SIGSTKFLT, "STKFLT", "Stack fault") +#endif +#ifdef SIGINFO + init_sig (SIGINFO, "INFO", "Information request") +#elif defined(SIGPWR) + init_sig (SIGPWR, "PWR", "Power failure") +#endif |