linuxthreads
localedata
secure_rpc
+
+aio
List of known bugs (certainly very incomplete)
----------------------------------------------
-Time-stamp: <1997-03-22T04:31:41+0100 drepper>
+Time-stamp: <1997-05-12T02:39:19+0200 drepper>
This following list contains those bugs which I'm aware of. Please
make sure that bugs you report are not listed here. If you can fix one
[ **] There are problems with signal handling when using LinuxThreads.
-[ **] The `cbrtl' function is inaccurate. The algorithm used for `double'
- and `float' is not usable for `long double'.
+[ **] The `cbrtl' function for ix86 does not work in the moment.
[ **] Not really a bug, but it could lead to such:
The RPC code is ugly ugly ugly. It's more or less verbatim taken
+1997-05-21 02:49 Ulrich Drepper <drepper@cygnus.com>
+
+ * gnu-versions.h (_GNU_OBSTACK_INTERFACE_VERSION): Set to 2 since
+ interface was changed with addition of _obstack_memory_used.
+ Suggested by Ian Taylor <ian@cygnus.com>.
+
+ * malloc/obstack.c: Include <config.h>. Include <stdlib.h> only
+ if __GNU_LIBRARY__ or HAVE_STDLIB_H is defined.
+ Reported by Ian Taylor <ian@cygnus.com>.
+
+ * dirent/Makefile (routines): Add versionsort.
+ * dirent/dirent.h: Add prototype for versionsort.
+ * dirent/versionsort.c: New file.
+ * manual/filesys.texi: Add documentation for versionsort.
+ * manual/string.texi: Add documentation for strverscmp.
+ * string/Makefile (routines): Add strverscmp.
+ (tests): Add tst-svc.
+ * string/string.h: Add prototype for strverscmp.
+ * string/strverscmp.c: New file.
+ * string/tst-svc.c: New file. Test for strverscmp.
+ * string/tst-svc.input: New file. Input data for tst-svc.
+ * string/tst-svc.expect: New file. Expected out from tst-svc.
+
+ * math/Makefile (calls): Add s_signbit.
+
+ * po/sv.po: Update.
+
+ * resolv/nss_dns/dns-host.c: Add casts to prevent warnings.
+ * sunrpc/pmap_rmt.c: Likewise.
+
+ * string/basename.c: Don't use ISO C definition style.
+ Include <config.h> is HAVE_CONFIG_H is defined.
+
+ * sunrpc/proto.h: Add `const' wherever possible.
+ * sunrpc/rpc_cout.c: Likewise.
+ * sunrpc/rpc_svcout.c: Likewise.
+ * sunrpc/xdr_mem.c: Likewise.
+ * sunrpc/xdr_rec.c: Likewise.
+ * sunrpc/xdr_stdio.c: Likewise.
+ * sunrpc/rpc_parse.c: Delete comma from end of enum definition.
+ * sunrpc/xdr.c: Little code cleanups.
+ * sunrpc/xdr_flaot.c: Likewise.
+ Patches by Matthew Wilcox <matthew.wilcox@chbs.mhs.ciba.com>.
+
+ * sysdeps/i386/fpu/__math.h (__finite): Fix typo.
+
+ * sysdeps/unix/sysv/linux/shmdt.c: Add cast to prevent warning.
+
+ * time/europe: Update from tzdata1997f.
+ * time/zic.c: Update from tzcode1997e.
+
+1997-05-20 19:20 Miguel de Icaza <miguel@athena.nuclecu.unam.mx>
+
+ * sysdeps/sparc/setjmp.S: Flush windows.
+ Bug found by Richard Henderson.
+
+1997-05-19 12:54 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * misc/efgcvt_r.c (fcvt_r, ecvt_r): Rewritten as to fit the specs.
+
+1997-05-19 18:41 Thorsten Kukuk <kukuk@uni-paderborn.de>
+
+ * nis/nss_nisplus/nisplus-spwd.c (_nss_nisplus_parse_spent): Use
+ atol instead of atoi.
+
+1997-05-18 00:22 Philip Blundell <pjb27@cam.ac.uk>
+
+ * inet/Makefile (routines): Add if_index.
+ * sysdeps/unix/sysv/linux/if_index.c: New file.
+ * sysdeps/stub/if_index.c: New file.
+ * sysdeps/unix/sysv/linux/net/if.h: Add prototypes for routines in
+ if_index.c (required by IPv6 basic API).
+ * sysdeps/unix/sysv/linux/netinet/in.h: Add struct ipv6_pktinfo.
+
+1997-05-17 23:29 Philip Blundell <pjb27@cam.ac.uk>
+
+ * sysdeps/unix/sysv/linux/netinet/in.h: Update IPv6 definitions
+ for new advanced API draft.
+
+1997-05-13 21:33 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * stdio-common/printf_fp.c: Only use the field width for deciding
+ on padding when printing special values.
+ * stdio-common/printf_fphex.c: Likewise.
+
+1997-05-15 13:14 Miles Bader <miles@gnu.ai.mit.edu>
+
+ Changes by Thomas Bushnell <thomas@gnu.ai.mit.edu>:
+ * hurd/hurdauth.c (_S_msg_add_auth): Implement correctly.
+
+1997-05-12 14:50 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
+
+ * hurd/hurdsig.c (_hurdsig_init): Double size of sigthread stack;
+ msg_add_auth was overflowing it.
+
+1997-05-12 21:20 Richard Henderson <rth@tamu.edu>
+
+ * elf/dl-lookup.c (_dl_lookup_symbol_skip): Call _dl_signal_error
+ when we can't find the symbol.
+
+1997-05-12 16:54 Ulrich Drepper <drepper@cygnus.com>
+
+ * posix/regex.c: Fix handling of 32-bit Windog environments.
+ Patch by Arnold Robbins <arnold@skeeve.atl.ga.us>.
+
+1997-05-10 23:26 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * sysdeps/unix/sysv/linux/m68k/syscalls.list: Add cacheflush.
+
+1997-05-10 11:40 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * elf/ldd.bash.in: Remove spurious quote character from version
+ message.
+
+1997-05-10 08:49 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * locale/programs/locale.c (write_charmaps): Don't get stuck in a
+ loop if the file ends in a long line without newline.
+ * locale/programs/charmap.c (charmap_read): Likewise.
+
+1997-05-12 03:47 Ulrich Drepper <drepper@cygnus.com>
+
+ * sunrpc/rpc/xdr.h: Include more headers to be self-contained.
+ * sunrpc/rpc/svc_auth.h: Likewise.
+ * sunrpc/rpc/svc.h: Likewise.
+ * sunrpc/rpc/rpc_msg.h: Likewise.
+ * sunrpc/rpc/pmap_rmt.h: Likewise.
+ * sunrpc/rpc/pmap_clnt.h: Likewise.
+ * sunrpc/rpc/clnt.h: Likewise.
+ * sunrpc/rpc/auth_unix.h: Likewise.
+ * sysdeps/generic/rpc/auth.h: Likewise.
+ Patches by Michael Deutschmann <ldeutsch@mail.netshop.net>.
+
+1997-05-11 15:29 Philip Blundell <pjb27@cam.ac.uk>
+
+ * sysdeps/stub/sigaction.c (__sigaction): Correct typo.
+ * sysdeps/standalone/arm/errnos.h: New file.
+ * sysdeps/stub/sys/param.h: Add dummy definition of MAXSYMLINKS.
+ * sysdeps/unix/arm/fork.S: New file.
+ * sysdeps/unix/sysv/linux/arm/sysdep.h: New file.
+ * sysdeps/stub/tempname.c (__stdio_gen_tempname): Add missing
+ `streamptr' argument.
+ * sysdeps/stub/vdprintf.c: Remove second copy of file (!), include
+ <stdarg.h> to get va_list defined, return 0 not NULL.
+ * sysdeps/unix/sysv/linux/statfsbuf.h: Include <gnu/types.h>.
+ * sysdeps/unix/sysv/linux/arm/syscall.S: New file.
+ * sysdeps/stub/direntry.h (struct dirent): Add missing ';'.
+ * sysdeps/stub/seekdir.c (seekdir): Likewise.
+ * sysdeps/stub/dirfd.c (dirfd): Argument dirp is DIR*, not FILE*.
+ * sysdeps/standalone/dirstream.h: Define struct __dirstream
+ not DIR; <dirent.h> provides typedef.
+ * sysdeps/unix/sysv/linux/arm/clone.S: New file.
+ * sysdeps/unix/sysv/linux/arm/socket.S: New file.
+ * sysdeps/stub/sysconf.c (__sysconf): Fix typos.
+
+1997-05-01 06:35 Geoff Keating <geoffk@ozemail.com.au>
+
+ * sysdeps/powerpc/Dist: New file.
+ * sysdeps/powerpc/Makefile: New file.
+ * sysdeps/powerpc/fclrexcpt.c: New file.
+ * sysdeps/powerpc/fegetenv.c: New file.
+ * sysdeps/powerpc/fegetround.c: New file.
+ * sysdeps/powerpc/feholdexcpt.c: New file.
+ * sysdeps/powerpc/fenvbits.h: New file.
+ * sysdeps/powerpc/fenv_const.c: New file.
+ * sysdeps/powerpc/fenv_libc.h: New file.
+ * sysdeps/powerpc/fesetenv.c: New file.
+ * sysdeps/powerpc/fesetround.c: New file.
+ * sysdeps/powerpc/feupdateenv.c: New file.
+ * sysdeps/powerpc/fgetexcptflg.c: New file.
+ * sysdeps/powerpc/fraiseexcpt.c: New file.
+ * sysdeps/powerpc/fsetexcptflg.c: New file.
+ * sysdeps/powerpc/ftestexcept.c: New file.
+ * sysdeps/powerpc/mathbits.h: New file.
+
+ * sysdeps/powerpc/dl-machine.h: Wrap in #ifndef dl_machine_h;
+ define elf_machine_lookup_noexec_p, elf_machine_lookup_noplt_p,
+ ELF_MACHINE_RELOC_NOPLT; consequent changes to elf_machine_rela.
+
+ * sysdeps/powerpc/__math.h: Remove definition for hypot and __sgn.
+
+ * sysdep/powerpc/fpu_control.h: Correct IEEE default mode.
+
+ * sysdeps/unix/sysv/linux/powerpc/sysdep.h: Don't use .text, but
+ instead .section ".text".
+
+1997-04-25 05:06 Geoff Keating <geoffk@ozemail.com.au>
+
+ * sysdeps/powerpc/__longjmp.S: Use symbolic register numbering.
+ * sysdeps/powerpc/bsd-_setjmp.S: Likewise.
+ * sysdeps/powerpc/bsd-setjmp.S: Likewise.
+ * sysdeps/powerpc/setjmp.S: Likewise.
+
+ * sysdeps/unix/sysv/linux/clone.S: Likewise.
+ * sysdeps/unix/sysv/linux/socket.S: Likewise.
+ * sysdeps/unix/sysv/linux/syscall.S: Likewise.
+
+1997-04-20 04:37 Geoff Keating <geoffk@ozemail.com.au>
+
+ * sysdeps/powerpc/strchr.s: New file.
+ * sysdeps/powerpc/strcmp.s: New (ugly) file.
+ * sysdeps/powerpc/memset.s: New file.
+ * string/tester.c: Include prototype and _GNU_SOURCE to make
+ standalone compilation possible. Give strcmp a better
+ test. Give memset a better test.
+
+1997-04-05 06:34 Geoff Keating <geoffk@ozemail.com.au>
+
+ * sysdeps/powerpc/strlen.s: Fixed bugs (how did it ever pass its
+ tests before?). Changed to symbolic register numbering as an
+ experiment.
+ * sysdeps/powerpc/ffs.c: Don't include bstring.h, it doesn't
+ exist.
+ * sysdeps/rs6000/ffs.c: Likewise.
+
+1997-05-12 02:28 Ulrich Drepper <drepper@cygnus.com>
+
+ * time/sys/time.h: Make second argument of setitimer const.
+ Patch by Michael Deutschmann <ldeutsch@mail.netshop.net>.
+ * sysdeps/stub/setitimer.c: Likewise.
+ * sysdeps/mach/hurd/setitimer.c: Likewise.
+
1997-05-10 11:46 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* nis/rpcsvc/nis_callback.x: New, from tirpcsrc-2.3.
slow.
* plenty of time (approx 1h for i?86-linux on i586@133 or 2.5h on
- i486@66 or 4.5h on i486@33). For Hurd systems times are much higher.
+ i486@66 or 4.5h on i486@33), both for shared and static only).
+ For Hurd systems times are much higher.
+
+ For Atari Falcon (Motorola 68030 @ 16 Mhz, 14 Mb memory) James Troup
+ <J.J.Troup@comp.brad.ac.uk> reports for a full build (shared, static,
+ and profiled) a compile time of 45h34m.
If you have some more measurements let me know.
GROUP ( libc.so.6 ld.so.1 libc.a )
+or in ix86/Linux and alpha/Linux:
+
+GROUP ( libc.so.6 ld-linux.so.2 libc.a )
+
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
[Q18] ``The prototypes for `connect', `accept', `getsockopt',
{DMT} David Mosberger-Tang, <davidm@AZStarNet.com>
{RM} Roland McGrath, <roland@gnu.ai.mit.edu>
{HJL} H.J. Lu, <hjl@gnu.ai.mit.edu>
-{AJ} Andreas Jaeger, <aj@arthur.pfalz.de>
+{AJ} Andreas Jaeger, <aj@arthur.rhein-neckar.de>
{EY} Eric Youngdale, <eric@andante.jic.com>
\f
Local Variables:
headers := dirent.h direntry.h
routines := opendir closedir readdir readdir_r rewinddir \
- seekdir telldir scandir alphasort \
+ seekdir telldir scandir alphasort versionsort \
getdents dirfd
distribute := dirstream.h
/* Function to compare two `struct dirent's alphabetically. */
extern int alphasort __P ((__const __ptr_t, __const __ptr_t));
+# ifdef __USE_GNU
+/* Function to compare two `struct dirent's by name & version. */
+extern int versionsort __P ((__const __ptr_t, __const __ptr_t));
+#endif
/* Read directory entries from FD into BUF, reading at most NBYTES.
Reading starts at offset *BASEP, and *BASEP is updated with the new
--- /dev/null
+/* Copyright (C) 1992, 1997 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 <dirent.h>
+#include <string.h>
+
+int
+versionsort (const void *a, const void *b)
+{
+ return strverscmp ((*(const struct dirent **) a)->d_name,
+ (*(const struct dirent **) b)->d_name);
+}
reference_name, version, skip_map, 0))
break;
+ if (current_value.s == NULL &&
+ (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK))
+ {
+ /* We could find no value for a strong reference. */
+ static const char msg[] = "undefined symbol: ";
+ const size_t len = strlen (undef_name);
+ char buf[sizeof msg + len];
+ memcpy (buf, msg, sizeof msg - 1);
+ memcpy (&buf[sizeof msg - 1], undef_name, len + 1);
+ _dl_signal_error (0, reference_name, buf);
+ }
+
*ref = current_value.s;
return current_value.a;
}
while test $# -gt 0; do
case "$1" in
--v | --ve | --ver | --vers | --versi | --versio | --version)
- echo '"ldd (GNU libc) @VERSION@'
+ echo 'ldd (GNU libc) @VERSION@'
echo $"Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
remember, if any of these versions change, the libc.so major version
number must change too (so avoid it)! */
-#define _GNU_OBSTACK_INTERFACE_VERSION 1 /* vs malloc/obstack.c */
+#define _GNU_OBSTACK_INTERFACE_VERSION 2 /* vs malloc/obstack.c */
#define _GNU_REGEX_INTERFACE_VERSION 1 /* vs posix/regex.c */
#define _GNU_GLOB_INTERFACE_VERSION 1 /* vs posix/glob.c */
#define _GNU_GETOPT_INTERFACE_VERSION 2 /* vs posix/getopt.c and
{
error_t err;
auth_t newauth;
+ uid_t *genuids, *gengids, *auxuids, *auxgids;
+ mach_msg_type_number_t ngenuids, ngengids, nauxuids, nauxgids;
+ uid_t *newgenuids, *newgengids, *newauxuids, *newauxgids;
+ mach_msg_type_number_t nnewgenuids, nnewgengids, nnewauxuids, nnewauxgids;
+
+ /* Create a list of ids and store it in NEWLISTP, length NEWLISTLEN.
+ Keep all the ids in EXIST (len NEXIST), adding in those from NEW
+ (len NNEW) which are not already there. */
+ error_t make_list (uid_t **newlistp, mach_msg_type_number_t *newlistlen,
+ uid_t *exist, mach_msg_type_number_t nexist,
+ uid_t *new, mach_msg_type_number_t nnew)
+ {
+ error_t urp;
+ int i, j, k;
+ vm_size_t offset;
+
+ urp = vm_allocate (mach_task_self (), (vm_address_t *) newlistp,
+ nexist + nnew * sizeof (uid_t), 1);
+ if (urp)
+ return urp;
+
+ j = 0;
+ for (i = 0; i < nexist; i++)
+ (*newlistp)[j++] = exist[i];
+
+ for (i = 0; i < nnew; i++)
+ {
+ for (k = 0; k < nexist; k++)
+ if (exist[k] == new[i])
+ break;
+ if (k < nexist)
+ continue;
+
+ (*newlistp)[j++] = new[i];
+ }
+
+ offset = (round_page (nexist + nnew * sizeof (uid_t))
+ - round_page (j * sizeof (uid_t)));
+ if (offset)
+ vm_deallocate (mach_task_self (),
+ (vm_address_t) (*newlistp
+ + (nexist + nnew * sizeof (uid_t))),
+ offset);
+ *newlistlen = j;
+ return 0;
+ }
+
+ /* Find out what ids ADDAUTH refers to */
- if (err = __USEPORT (AUTH,
- __auth_makeauth (port,
- &addauth, MACH_MSG_TYPE_MOVE_SEND, 1,
- NULL, 0,
- NULL, 0,
- NULL, 0,
- NULL, 0,
- &newauth)))
+ genuids = gengids = auxuids = auxgids = 0;
+ ngenuids = ngengids = nauxuids = nauxgids = 0;
+ err = __auth_getids (addauth,
+ &genuids, &ngenuids,
+ &auxuids, &nauxuids,
+ &gengids, &ngengids,
+ &auxgids, &nauxgids);
+ if (err)
return err;
+ /* OR in these ids to what we already have, creating a new list. */
+
+ HURD_CRITICAL_BEGIN;
+ __mutex_lock (&_hurd_id.lock);
+ _hurd_check_ids ();
+
+#define MAKE(genaux,uidgid) \
+ make_list (&new ## genaux ## uidgid ## s, \
+ &nnew ## genaux ## uidgid ## s, \
+ _hurd_id.genaux.uidgid ## s, \
+ _hurd_id.genaux.n ## uidgid ## s, \
+ genaux ## uidgid ## s, \
+ n ## genaux ## uidgid ## s)
+
+ err = MAKE (gen, uid);
+ if (!err)
+ MAKE (aux, uid);
+ if (!err)
+ MAKE (gen, gid);
+ if (!err)
+ MAKE (aux, gid);
+#undef MAKE
+
+ __mutex_unlock (&_hurd_id.lock);
+ HURD_CRITICAL_END;
+
+
+ /* Create the new auth port */
+
+ if (!err)
+ err = __USEPORT (AUTH,
+ __auth_makeauth (port,
+ &addauth, MACH_MSG_TYPE_MOVE_SEND, 1,
+ newgenuids, nnewgenuids,
+ newauxuids, nnewauxuids,
+ newgengids, nnewgengids,
+ newauxgids, nnewauxgids,
+ &newauth));
+
+#define freeup(array, len) \
+ if (array) \
+ vm_deallocate (mach_task_self (), (vm_address_t) array, \
+ len * sizeof (uid_t));
+
+ freeup (genuids, ngenuids);
+ freeup (auxuids, nauxuids);
+ freeup (gengids, ngengids);
+ freeup (auxgids, nauxgids);
+ freeup (newgenuids, nnewgenuids);
+ freeup (newauxuids, nnewauxuids);
+ freeup (newgengids, nnewgengids);
+ freeup (newauxgids, nnewauxgids);
+#undef freeup
+
+ if (err)
+ return err;
+
+ /* And install it. */
+
err = __setauth (newauth);
__mach_port_deallocate (__mach_task_self (), newauth);
if (err)
err = __thread_create (__mach_task_self (), &_hurd_msgport_thread);
assert_perror (err);
- stacksize = __vm_page_size * 4; /* Small stack for signal thread. */
+ stacksize = __vm_page_size * 8; /* Small stack for signal thread. */
err = __mach_setup_thread (__mach_task_self (), _hurd_msgport_thread,
_hurd_msgport_receive,
(vm_address_t *) &__hurd_sigthread_stack_base,
rcmd rexec ruserpass \
getnetgrent_r getnetgrent \
getaliasent_r getaliasent getaliasname getaliasname_r \
- in6_addr getnameinfo
+ in6_addr getnameinfo if_index
# No warnings about losing BSD code.
CFLAGS-rcmd.c = -w
if (fscanf (fp, " <code_set_name> %as", &name) == 1)
break;
- do
- fgets (junk, sizeof junk, fp);
- while (strchr (junk, '\n') == NULL);
+ while (fgets (junk, sizeof junk, fp) != NULL
+ && strchr (junk, '\n') == NULL)
+ continue;
}
fclose (fp);
if (fscanf (fp, " <code_set_name> %as", &name) == 1)
break;
- do
- fgets (junk, sizeof junk, fp);
- while (strchr (junk, '\n') == NULL);
+ while (fgets (junk, sizeof junk, fp) != NULL
+ && strchr (junk, '\n') == NULL)
+ continue;
}
fclose (fp);
/* obstack.c - subroutines used implicitly by object stack macros
- Copyright (C) 1988,89,90,91,92,93,94,96 Free Software Foundation, Inc.
+ Copyright (C) 1988,89,90,91,92,93,94,96,97 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.
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include "obstack.h"
/* NOTE BEFORE MODIFYING THIS FILE: This version number must be
#endif
/* Exit value used when `print_and_abort' is used. */
-#if defined (__STDC__) && __STDC__
+#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifndef EXIT_FAILURE
Finally the entries in the @var{namelist} are sorted using the user
supplied function @var{cmp}. The arguments of the @var{cmp} function
are of type @code{struct dirent **}. I.e., one cannot directly use the
-@code{strcmp} or @code{strcoll} function; see the function
-@code{alphasort} below.
+@code{strcmp} or @code{strcoll} function; see the functions
+@code{alphasort} and @code{versionsort} below.
The return value of the function gives the number of entries placed in
@var{namelist}. If it is @code{-1} an error occurred and the global
As said above the fourth argument to the @code{scandir} function must be
a pointer to a sorting function. For the convenience of the programmer
-the GNU C library contains an implementation of a function which is very
+the GNU C library contains implementations of functions which are very
helpful for this purpose.
@deftypefun int alphasort (const void *@var{a}, const void *@var{b})
on the order of the two entries @var{a} and @var{b}.
@end deftypefun
+@deftypefun int versionsort (const void *@var{a}, const void *@var{b})
+The @code{versionsort} function is like @code{alphasort}, excepted that it
+uses the @code{strverscmp} function internally.
+@end deftypefun
+
@node Simple Directory Lister Mark II
@subsection Simple Program to List a Directory, Mark II
@result{} 0 /* @r{The initial 5 characters are the same.} */
@end smallexample
+@comment string.h
+@comment GNU
+@deftypefun int strverscmp (const char *@var{s1}, const char *@var{s2})
+The @code{strverscmp} function compares the string @var{s1} against
+@var{s2}, considering them as holding indices/version numbers. Return
+value follows the same conventions as found in the @code{strverscmp}
+function. In fact, if @var{s1} and @var{s2} contain no digits,
+@code{strverscmp} behaves like @code{strcmp}.
+
+Basically, we compare strings normaly (character by character), until
+we find a digit in each string - then we enter a special comparison
+mode, where each sequence of digit is taken as a whole. If we reach the
+end of these two parts without noticing a difference, we return to the
+standard comparison mode. There are two types of numeric parts:
+"integral" and "fractionnal" (these laters begins with a '0'). The types
+of the numeric parts affect the way we sort them:
+
+@itemize @bullet
+@item
+integral/integral: we compare values as you would expect.
+
+@item
+fractionnal/integral: the fractionnal part is less than the integral one.
+Again, no surprise.
+
+@item
+fractionnal/fractionnal: the things become a bit more complex.
+if the common prefix contains only leading zeroes, the longest part is less
+than the other one; else the comparison behaves normaly.
+@end itemize
+
+@smallexample
+strverscmp ("no digit", "no digit")
+ @result{} 0 /* @r{same behaviour as strverscmp.} */
+strverscmp ("item#99", "item#100")
+ @result{} <0 /* @r{same prefix, but 99 < 100.} */
+strverscmp ("alpha1", "alpha001")
+ @result{} >0 /* @r{fractionnal part inferior to integral one.} */
+strverscmp ("part1_f012", "part1_f01")
+ @result{} >0 /* @r{two fractionnal parts.} */
+strverscmp ("foo.009", "foo.0")
+ @result{} <0 /* @r{idem, but with leading zeroes only.} */
+@end smallexample
+
+This function is especially usefull when dealing with filename sorting,
+because filenames frequently hold indices/version numbers.
+
+@code{strverscmp} is a GNU extension.
+@end deftypefun
+
@comment string.h
@comment BSD
@deftypefun int bcmp (const void *@var{a1}, const void *@var{a2}, size_t @var{size})
%% TeX macros to handle Texinfo files.
-%% $Id: texinfo.tex,v 2.198 1997/05/07 15:16:03 drepper Exp $
+%% $Id: texinfo.tex,v 2.199 1997/05/20 11:11:48 drepper Exp $
% Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
% 94, 95, 96, 97 Free Software Foundation, Inc.
% This automatically updates the version number based on RCS.
\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
-\deftexinfoversion$Revision: 2.198 $
+\deftexinfoversion$Revision: 2.199 $
\message{Loading texinfo package [Version \texinfoversion]:}
% If in a .fmt file, print the version number
\def\ctrl #1{{\tt \rawbackslash \hat}#1}
\let\file=\samp
-\let\url=\samp % perhaps include a hypertex \special eventually
-\def\email#1{$\langle${\tt #1}$\rangle$}
% @code is a modification of @t,
% which makes spaces the same size as normal in the surrounding text.
\def\realdash{-}
\def\codedash{-\discretionary{}{}{}}
-\def\codeunder{\normalunderscore\discretionary{}{}{}}
+\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}}
\def\codex #1{\tclose{#1}\endgroup}
%\let\exp=\tclose %Was temporary
\else{\tclose{\ttsl\look}}\fi
\else{\tclose{\ttsl\look}}\fi}
+% @url, @email. Quotes do not seem necessary.
+\let\url=\code % perhaps include a hypertex \special eventually
+% rms does not like the angle brackets --karl, 17may97.
+%\def\email#1{$\langle${\tt #1}$\rangle$}
+\let\email=\code
+
% Check if we are currently using a typewriter font. Since all the
% Computer Modern typewriter fonts have zero interword stretch (and
% shrink), and it is reasonable to expect all typewriter fonts to have
\let\.=\ptexdot
\let\*=\ptexstar
\let\dots=\ptexdots
-\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}
-\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}
+\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
\def\@{@}%
\let\bullet=\ptexbullet
\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext
# These functions are in libc instead of libm because __printf_fp
# calls them, so any program using printf will need them linked in,
# and we don't want to have to link every program with -lm.
-calls = s_isinf s_isnan s_finite s_copysign s_modf s_scalbn s_frexp s_ldexp
+calls = s_isinf s_isnan s_finite s_copysign s_modf s_scalbn s_frexp s_ldexp \
+ s_signbit
routines = $(calls) $(calls:=f) $(long-c-$(long-double-fcts))
long-c-yes = $(calls:=l)
distribute += $(long-c-yes:=.c)
/* Raise the supported exceptions represented by EXCEPTS. */
extern void feraiseexcept __P ((int __excepts));
-/* Set complete status for exceptions inidicated by EXCEPTS according to
+/* Set complete status for exceptions indicated by EXCEPTS according to
the representation in the object pointed to by FLAGP. */
extern void fesetexceptflag __P ((__const fexcept_t *__flagp, int __excepts));
#define FLOOR APPEND(floor, FLOAT_NAME_EXT)
#define FABS APPEND(fabs, FLOAT_NAME_EXT)
#define LOG10 APPEND(log10, FLOAT_NAME_EXT)
+#define EXP APPEND(exp, FLOAT_NAME_EXT)
int
return -1;
}
- *sign = value < 0.0;
- if (*sign)
- value = - value;
+ if (isfinite (value))
+ {
+ *sign = signbit (value) != 0;
+ if (*sign)
+ value = -value;
+ }
n = snprintf (buf, len, "%.*" FLOAT_FMT_FLAG "f", ndigit, value);
if (n < 0)
while (i < n && isdigit (buf[i]))
++i;
*decpt = i;
- do
- ++i;
- while (! isdigit (buf[i]));
- memmove (&buf[i - *decpt], buf, n - (i - *decpt));
+
+ if (i == 0)
+ {
+ /* Value is Inf or NaN. */
+ *sign = 0;
+ return 0;
+ }
+
+ if (i < n)
+ {
+ do
+ ++i;
+ while (i < n && !isdigit (buf[i]));
+ memmove (&buf[*decpt], &buf[i], n - i);
+ buf[n - (i - *decpt)] = 0;
+ }
return 0;
}
#define weak_extern2(name) weak_extern (name)
weak_extern2 (FLOOR) weak_extern2 (LOG10) weak_extern2 (FABS)
+weak_extern2 (EXP)
int
APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len)
char *buf;
size_t len;
{
- FLOAT_TYPE (*log10_function) (FLOAT_TYPE) = &LOG10;
+ int exponent = 0;
- if (log10_function)
- {
- /* Use the reasonable code if -lm is included. */
- ndigit -= (int) FLOOR (LOG10 (FABS (value)));
- if (ndigit < 0)
- ndigit = 0;
- }
- else
+ if (isfinite (value) && value != 0.0)
{
- /* Slow code that doesn't require -lm functions. */
- FLOAT_TYPE d;
- for (d = value < 0.0 ? - value : value;
- ndigit > 0 && d >= 10.0;
- d *= 0.1)
- --ndigit;
+ FLOAT_TYPE (*log10_function) (FLOAT_TYPE) = &LOG10;
+
+ if (log10_function)
+ {
+ /* Use the reasonable code if -lm is included. */
+ FLOAT_TYPE dexponent;
+ dexponent = FLOOR (LOG10 (FABS (value)));
+ value *= EXP (dexponent * -M_LN10);
+ exponent = (int) dexponent;
+ }
+ else
+ {
+ /* Slow code that doesn't require -lm functions. */
+ FLOAT_TYPE d;
+ if (value < 0.0)
+ d = -value;
+ else
+ d = value;
+ if (d < 1.0)
+ {
+ do
+ {
+ d *= 10.0;
+ exponent--;
+ }
+ while (d < 1.0);
+ }
+ else if (d >= 10.0)
+ {
+ do
+ {
+ d *= 0.1;
+ exponent++;
+ }
+ while (d >= 10.0);
+ }
+ if (value < 0.0)
+ value = -d;
+ else
+ value = d;
+ }
}
- return APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, buf, len);
+ if (APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit - 1, decpt, sign, buf, len))
+ return -1;
+ *decpt += exponent;
+ return 0;
}
if (cp == NULL)
return 0;
*cp++ = '\0';
- sp->sp_lstchg = atoi (line);
+ sp->sp_lstchg = atol (line);
line = cp;
cp = strchr (line, ':');
if (cp == NULL)
return 0;
*cp++ = '\0';
- sp->sp_min = atoi(line);
+ sp->sp_min = atol(line);
line = cp;
cp = strchr (line, ':');
if (cp == NULL)
return 0;
*cp++ = '\0';
- sp->sp_max = atoi(line);
+ sp->sp_max = atol(line);
line = cp;
cp = strchr (line, ':');
if (cp == NULL)
return 0;
*cp++ = '\0';
- sp->sp_warn = atoi(line);
+ sp->sp_warn = atol(line);
line = cp;
cp = strchr (line, ':');
if (cp == NULL)
return 0;
*cp++ = '\0';
- sp->sp_inact = atoi(line);
+ sp->sp_inact = atol(line);
line = cp;
cp = strchr (line, ':');
if (cp == NULL)
return 0;
*cp++ = '\0';
- sp->sp_expire = atoi(line);
+ sp->sp_expire = atol(line);
line = cp;
if (line == NULL)
return 0;
- sp->sp_flag = atoi(line);
+ sp->sp_flag = atol(line);
return 1;
}
# GNU libc message catalog for swedish
-# Copyright (C) 1996 Free Software Foundation, Inc.
+# Copyright © 1996 Free Software Foundation, Inc.
# Jan Djärv <Jan.Djarv@mbox200.swipnet.se>, 1996.
# $Revision$
#
msgid ""
msgstr ""
-"Project-Id-Version: libc 1.99\n"
-"POT-Creation-Date: 1996-12-03 13:50+0100\n"
+"Project-Id-Version: libc 2.0.3\n"
+"POT-Creation-Date: 1997-03-30 19:08+0200\n"
"PO-Revision-Date: $Date$\n"
"Last-Translator: Jan Djärv <Jan.Djarv@mbox200.swipnet.se>\n"
"Language-Team: Swedish <sv@li.org>\n"
msgid " program vers proto port\n"
msgstr " program vers proto port\n"
-#: time/zic.c:424
+#: time/zic.c:419
#, c-format
msgid " (rule from \"%s\", line %d)"
msgstr " (regel från \"%s\", rad %d)"
-#: locale/programs/ld-collate.c:360 locale/programs/ld-ctype.c:1234
+#: locale/programs/ld-collate.c:363 locale/programs/ld-ctype.c:1242
msgid " done\n"
msgstr " klar\n"
-#: time/zic.c:421
+#: time/zic.c:416
#, c-format
msgid "\"%s\", line %d: %s"
msgstr "\"%s\", rad %d: %s"
-#: time/zic.c:945
+#: time/zic.c:943
#, c-format
msgid "\"Zone %s\" line and -l option are mutually exclusive"
msgstr "\"Zone %s\"-rad och flaggan -l är ömsesidigt uteslutande"
-#: time/zic.c:953
+#: time/zic.c:951
#, c-format
msgid "\"Zone %s\" line and -p option are mutually exclusive"
msgstr "\"Zone %s\"-rad och flaggan -p är ömsesidigt uteslutande"
-#: time/zic.c:758
+#: time/zic.c:754
#, c-format
msgid "%s in ruleless zone"
msgstr "%s i zon utan regel"
msgid "%s%sUnknown signal %d\n"
msgstr "%s%sOkänd signal %d\n"
-#: time/zic.c:2139
+#: time/zic.c:2172
#, c-format
msgid "%s: %d did not sign extend correctly\n"
msgstr "%s: %d teckenexpanderades inte korrekt\n"
msgid "%s: <mb_cur_max> must be greater than <mb_cur_min>\n"
msgstr "%s: <mb_cur_max> måste vara större än <mb_cur_min>\n"
-#: time/zic.c:1430
+#: time/zic.c:1443
#, c-format
msgid "%s: Can't create %s: %s\n"
msgstr "%s: Kan inte skapa %s: %s\n"
-#: time/zic.c:2118
+#: time/zic.c:2150
#, c-format
msgid "%s: Can't create directory %s: %s\n"
msgstr "%s: Kan inte skapa katalog %s: %s\n"
-#: time/zic.c:612
+#: time/zic.c:608
#, c-format
msgid "%s: Can't link from %s to %s: %s\n"
msgstr "%s: Kan inte länka från %s till %s: %s\n"
-#: time/zic.c:783
+#: time/zic.c:780
#, c-format
msgid "%s: Can't open %s: %s\n"
msgstr "%s: Kan inte öppna %s: %s\n"
-#: time/zic.c:851
+#: time/zic.c:1433
+#, c-format
+msgid "%s: Can't remove %s: %s\n"
+msgstr "%s: Kan inte ta bort %s: %s\n"
+
+#: time/zic.c:849
#, c-format
msgid "%s: Error closing %s: %s\n"
msgstr "%s: Fel vid stängning av %s: %s\n"
-#: time/zic.c:845
+#: time/zic.c:842
#, c-format
msgid "%s: Error reading %s\n"
msgstr "%s: Fel vid läsning från %s\n"
-#: time/zic.c:1494
+#: time/zic.c:1507
#, c-format
msgid "%s: Error writing %s\n"
msgstr "%s: Fel vid skrivning till %s\n"
-#: time/zdump.c:258
+#: time/zdump.c:266
#, c-format
msgid "%s: Error writing standard output "
msgstr "%s: Fel vid skrivning till standard ut "
-#: time/zic.c:830
+#: time/zic.c:827
#, c-format
msgid "%s: Leap line in non leap seconds file %s\n"
msgstr "%s: \"Leap\"-rad i fil %s som inte är skottsekundsfil\n"
-#: time/zic.c:362
+#: time/zic.c:357
#, c-format
msgid "%s: Memory exhausted: %s\n"
msgstr "%s: Minnet slut: %s\n"
-#: time/zic.c:527
+#: time/zic.c:522
#, c-format
msgid "%s: More than one -L option specified\n"
msgstr "%s: Flaggan -L given mer än en gång\n"
-#: time/zic.c:487
+#: time/zic.c:482
#, c-format
msgid "%s: More than one -d option specified\n"
-msgstr "%s: Flagga -d given mer än en gång\n"
+msgstr "%s: Flaggan -d given mer än en gång\n"
-#: time/zic.c:497
+#: time/zic.c:492
#, c-format
msgid "%s: More than one -l option specified\n"
msgstr "%s: Flaggan -l given mer än en gång\n"
-#: time/zic.c:507
+#: time/zic.c:502
#, c-format
msgid "%s: More than one -p option specified\n"
msgstr "%s: Flaggan -p given mer än en gång\n"
-#: time/zic.c:517
+#: time/zic.c:512
#, c-format
msgid "%s: More than one -y option specified\n"
msgstr "%s: Flaggan -y given mer än en gång\n"
-#: time/zic.c:1845
+#: time/zic.c:1872
#, c-format
msgid "%s: command was '%s', result was %d\n"
msgstr "%s: kommandot var \"%s\", resultatet blev %d\n"
-#: locale/programs/charmap.c:593 locale/programs/locfile.c:878
+#: locale/programs/charmap.c:593 locale/programs/locfile.c:900
#, c-format
msgid "%s: error in state machine"
msgstr "%s: fel i tillståndsmaskin"
-#: posix/getopt.c:687
+#: posix/getopt.c:783
#, c-format
msgid "%s: illegal option -- %c\n"
msgstr "%s: otillåten flagga -- %c\n"
-#: posix/getopt.c:690
+#: posix/getopt.c:786
#, c-format
msgid "%s: invalid option -- %c\n"
msgstr "%s: ogiltig flagga -- %c\n"
-#: posix/getopt.c:611
+#: posix/getopt.c:707
#, c-format
msgid "%s: option `%c%s' doesn't allow an argument\n"
msgstr "%s: flaggan \"%c%s\" tar inget argument\n"
-#: posix/getopt.c:582
+#: posix/getopt.c:678
#, c-format
msgid "%s: option `%s' is ambiguous\n"
msgstr "%s: flaggan \"%s\" är tvetydig\n"
-#: posix/getopt.c:628 posix/getopt.c:801
+#: posix/getopt.c:724 posix/getopt.c:897
#, c-format
msgid "%s: option `%s' requires an argument\n"
msgstr "%s: flaggan \"%s\" behöver ett argument\n"
-#: posix/getopt.c:606
+#: posix/getopt.c:702
#, c-format
msgid "%s: option `--%s' doesn't allow an argument\n"
msgstr "%s: flaggan \"--%s\" tar inget argument\n"
-#: posix/getopt.c:786
+#: posix/getopt.c:881
#, c-format
msgid "%s: option `-W %s' doesn't allow an argument\n"
msgstr "%s: flaggan \"-W %s\" tar inget argument\n"
-#: posix/getopt.c:767
+#: posix/getopt.c:863
#, c-format
msgid "%s: option `-W %s' is ambiguous\n"
msgstr "%s: flaggan \"-W %s\" är tvetydig\n"
-#: posix/getopt.c:721 posix/getopt.c:850
+#: posix/getopt.c:816 posix/getopt.c:946
#, c-format
msgid "%s: option requires an argument -- %c\n"
msgstr "%s: flaggan behöver ett argument -- %c\n"
-#: time/zic.c:837 time/zic.c:1248 time/zic.c:1268
+#: time/zic.c:834 time/zic.c:1246 time/zic.c:1266
#, c-format
msgid "%s: panic: Invalid l_value %d\n"
msgstr "%s: panik: ogiltigt l_value %d\n"
msgid "%s: premature end of file"
msgstr "%s: för tidigt filslut"
-#: posix/getopt.c:661
+#: posix/getopt.c:757
#, c-format
msgid "%s: unrecognized option `%c%s'\n"
msgstr "%s: okänd flagga \"%c%s\"\n"
-#: posix/getopt.c:657
+#: posix/getopt.c:753
#, c-format
msgid "%s: unrecognized option `--%s'\n"
msgstr "%s: okänd flagga \"--%s\"\n"
-#: time/zic.c:446
+#: time/zic.c:441
#, c-format
msgid ""
"%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d "
"katalog ]\n"
"\t[ -L skottsekunder ] [ -y årkontrollprogram ] [ filnamn ... ]\n"
-#: time/zdump.c:165
+#: time/zdump.c:174
#, c-format
msgid "%s: usage is %s [ -v ] [ -c cutoff ] zonename ...\n"
msgstr "%s: användning är %s [ -v ] [ -c gräns ] zonnamn ...\n"
msgid "(unknown)"
msgstr "(okänt)"
-#: catgets/gencat.c:253
+#: catgets/gencat.c:254
msgid "*standard input*"
msgstr "*standard in*"
msgid ".lib section in a.out corrupted"
msgstr ".lib-sektion i a.out korrupt"
-#: inet/rcmd.c:358
+#: inet/rcmd.c:363
msgid ".rhosts fstat failed"
msgstr "misslyckades ta status (fstat) på .rhosts"
-#: inet/rcmd.c:354
+#: inet/rcmd.c:359
msgid ".rhosts lstat failed"
msgstr "misslyckades ta status (lstat) på .rhosts"
-#: inet/rcmd.c:356
+#: inet/rcmd.c:361
msgid ".rhosts not regular file"
msgstr ".rhosts är inte en normal fil"
-#: inet/rcmd.c:362
+#: inet/rcmd.c:367
msgid ".rhosts writeable by other than owner"
-msgstr ".rhosts kan skrivas av andra än ägaren"
+msgstr ".rhosts är skrivbar för andra än ägaren"
#: sunrpc/clnt_perr.c:112 sunrpc/clnt_perr.c:133
#, c-format
msgid "; why = "
msgstr "; varför = "
-#: locale/programs/ld-ctype.c:326
+#: locale/programs/ld-ctype.c:331
#, c-format
msgid "<SP> character must not be in class `%s'"
msgstr "<SP>-tecknet får inte vara i klass \"%s\""
-#: locale/programs/ld-ctype.c:317
+#: locale/programs/ld-ctype.c:321
#, c-format
msgid "<SP> character not in class `%s'"
msgstr "<SP>-tecknet är inte i klass \"%s\""
msgid "?"
msgstr "?"
+#: sysdeps/unix/sysv/linux/siglist.h:27
+msgid "Aborted"
+msgstr "Avbruten (SIGABRT)"
+
#: stdio-common/../sysdeps/gnu/errlist.c:762
msgid "Accessing a corrupted shared library"
msgstr "Öppnar ett korrupt delat bibliotek"
#. TRANS The requested socket address is already in use. @xref{Socket Addresses}.
#: stdio-common/../sysdeps/gnu/errlist.c:354
msgid "Address already in use"
-msgstr "Adressen används redan"
+msgstr "Adressen upptagen"
#. TRANS The address family specified for a socket is not supported; it is
#. TRANS inconsistent with the protocol being used on the socket. @xref{Sockets}.
msgid "Advertise error"
msgstr "Annonseringsfel"
+#: stdio-common/../sysdeps/unix/siglist.c:43
+#: sysdeps/unix/sysv/linux/siglist.h:33
msgid "Alarm clock"
msgstr "Alarmklocka"
msgid "Bad message"
msgstr "Felaktigt meddelande"
+#: stdio-common/../sysdeps/unix/siglist.c:41
+#: sysdeps/unix/sysv/linux/siglist.h:56
+msgid "Bad system call"
+msgstr "Felaktigt systemanrop"
+
#. TRANS A file that isn't a block special file was given in a situation that
#. TRANS requires one. For example, trying to mount an ordinary file as a file
#. TRANS system in Unix gives this error.
msgid "Block device required"
msgstr "Blockspecialfil krävs"
-#: sunrpc/pmap_rmt.c:337
+#: sunrpc/pmap_rmt.c:338
msgid "Broadcast select problem"
msgstr "Problem med \"select\" i utsändning"
#. TRANS or blocked. Thus, your program will never actually see @code{EPIPE}
#. TRANS unless it has handled or blocked @code{SIGPIPE}.
#: stdio-common/../sysdeps/gnu/errlist.c:222
+#: stdio-common/../sysdeps/unix/siglist.c:42
+#: sysdeps/unix/sysv/linux/siglist.h:32
msgid "Broken pipe"
msgstr "Brutet rör"
+#: stdio-common/../sysdeps/unix/siglist.c:39
+#: sysdeps/unix/sysv/linux/siglist.h:30
msgid "Bus error"
msgstr "Bussfel"
+#: sysdeps/unix/sysv/linux/siglist.h:43
msgid "CPU time limit exceeded"
-msgstr "begränsning av CPU-tid överskriden"
+msgstr "Begränsning av CPU-tid överskriden"
#: stdio-common/../sysdeps/gnu/errlist.c:758
msgid "Can not access a needed shared library"
msgstr "Kan inte komma åt ett nödvändigt delat bibliotek"
-#: nis/ypclnt.c:637
+#: nis/ypclnt.c:695
msgid "Can't bind to server which serves this domain"
msgstr "Kan inte ansluta till betjänt som betjänar denna domän"
-#: nis/ypclnt.c:649
+#: nis/ypclnt.c:707
msgid "Can't communicate with portmapper"
msgstr "Kan inte kommunicera med portmapper"
-#: nis/ypclnt.c:651
+#: nis/ypclnt.c:709
msgid "Can't communicate with ypbind"
msgstr "Kan inte kommunicera med ypbind"
-#: nis/ypclnt.c:653
+#: nis/ypclnt.c:711
msgid "Can't communicate with ypserv"
msgstr "Kan inte kommunicera med ypserv"
msgid "Cannot exec a shared library directly"
msgstr "Kan inte köra ett delat bibliotek direkt"
-#: sunrpc/pmap_rmt.c:349
+#: sunrpc/pmap_rmt.c:350
msgid "Cannot receive reply to broadcast"
msgstr "Kan inte ta emot svar på utsändning"
#: sunrpc/pmap_rmt.c:261
msgid "Cannot set socket option SO_BROADCAST"
-msgstr "Kan inte sätta uttagsflaggan (socket) SO_BROADCAST"
+msgstr "Kan inte sätta uttagsflaggan (socket option) SO_BROADCAST"
#: stdio-common/../sysdeps/gnu/errlist.c:658
msgid "Channel number out of range"
msgstr "Kanalnummer utanför giltigt intervall"
+#: stdio-common/../sysdeps/unix/siglist.c:49
+#: sysdeps/unix/sysv/linux/siglist.h:39
msgid "Child exited"
-msgstr "Barnet avslutade"
+msgstr "Barnstatus ändrad"
#: sunrpc/clnt_perr.c:286
msgid "Client credential too weak"
msgid "Computer bought the farm"
msgstr "Datorn packade ihop"
-#: locale/programs/ld-ctype.c:1197
+#: locale/programs/ld-ctype.c:1204
msgid "Computing table size for character classes might take a while..."
msgstr "Att beräkna tabellstorlek för teckenklasser kan ta ett tag..."
-#: locale/programs/ld-collate.c:327
+#: locale/programs/ld-collate.c:329
msgid "Computing table size for collation information might take a while..."
msgstr ""
"Att beräkna tabellstorlek för kollationeringsinformation kan ta ett tag..."
msgid "Connection timed out"
msgstr "Förbindelsens tid tog slut"
+#: stdio-common/../sysdeps/unix/siglist.c:48
+#: sysdeps/unix/sysv/linux/siglist.h:38
msgid "Continued"
-msgstr "Fortsätter"
+msgstr "Ã…terupptagen"
#: catgets/gencat.c:169 db/makedb.c:120 locale/programs/locale.c:187
-#: locale/programs/localedef.c:177
+#: locale/programs/localedef.c:180
#, c-format
msgid ""
"Copyright (C) %s Free Software Foundation, Inc.\n"
"This is free software; see the source for copying conditions. There is NO\n"
"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
msgstr ""
-"Copyright (C) %s Free Software Foundation, Inc.\n"
+"Copyright © %s Free Software Foundation, Inc.\n"
"Detta är fri programvara; se källkoden för kopieringsvillkor. Det finns\n"
"INGEN garanti; inte ens för SÄLJBARHET eller LÄMPLIGHET FÖR NÅGOT SPECIELLT\n"
"ÄNDAMÅL.\n"
-#: nis/ypclnt.c:663
+#: stdio-common/../sysdeps/unix/siglist.c:53
+msgid "Cputime limit exceeded"
+msgstr "Begränsning av CPU-tid överskriden"
+
+#: nis/ypclnt.c:721
msgid "Database is busy"
msgstr "Databasen är upptagen"
msgid "Disc quota exceeded"
msgstr "Diskkvot överskriden"
-#: nis/ypclnt.c:709
+#: nis/ypclnt.c:767
msgid "Domain not bound"
msgstr "Domän inte bunden"
+#: stdio-common/../sysdeps/unix/siglist.c:36
+#: sysdeps/unix/sysv/linux/siglist.h:53
+msgid "EMT trap"
+msgstr "Emulatorfälla"
+
#: sunrpc/clnt_perr.c:254
#, c-format
msgid "Error %d"
msgid "Exec format error"
msgstr "Formatfel på körbar fil"
-#: locale/programs/localedef.c:213
+#: locale/programs/localedef.c:216
msgid "FATAL: system does not define `_POSIX2_LOCALEDEF'"
msgstr "FATALT: systemet definierar inte \"_POSIX2_LOCALEDEF\""
msgid "File name too long"
msgstr "Filnamn för långt"
+#: sysdeps/unix/sysv/linux/siglist.h:44
msgid "File size limit exceeded"
msgstr "Begränsning av filstorlek överskriden"
msgid "File too large"
msgstr "Fil för stor"
+#: stdio-common/../sysdeps/unix/siglist.c:54
+msgid "Filesize limit exceeded"
+msgstr "Begränsning av filstorlek överskriden"
+
+#: stdio-common/../sysdeps/unix/siglist.c:37
+#: sysdeps/unix/sysv/linux/siglist.h:28
msgid "Floating point exception"
-msgstr "Flyttalsberäkningsfel"
+msgstr "Aritmetiskt fel"
#. TRANS Function not implemented. Some functions have commands or options defined
#. TRANS that might not be supported in all implementations, and this is the kind
msgid "Gratuitous error"
msgstr "Omotiverat fel"
+#: stdio-common/../sysdeps/unix/siglist.c:30
+#: sysdeps/unix/sysv/linux/siglist.h:22
msgid "Hangup"
-msgstr "Lägg på"
+msgstr "Avringd"
#. TRANS The remote host for a requested network connection is down.
#: stdio-common/../sysdeps/gnu/errlist.c:457
msgid "Host name lookup failure"
msgstr "Uppslagning av värdnamn misslyckades"
+#: stdio-common/../sysdeps/unix/siglist.c:52
+#: sysdeps/unix/sysv/linux/siglist.h:42
msgid "I/O possible"
msgstr "I/O möjligt"
+#: stdio-common/../sysdeps/unix/siglist.c:35
msgid "IOT trap"
-msgstr "IOT fälla"
+msgstr "IOT-fälla"
#: stdio-common/../sysdeps/gnu/errlist.c:614
msgid "Identifier removed"
msgstr "Identifierare borttagen"
+#: sysdeps/unix/sysv/linux/siglist.h:25
msgid "Illegal Instruction"
msgstr "Otillåten instruktion"
+#: stdio-common/../sysdeps/unix/siglist.c:33
+msgid "Illegal instruction"
+msgstr "Otillåten instruktion"
+
#. TRANS Invalid seek operation (such as on a pipe).
#: stdio-common/../sysdeps/gnu/errlist.c:201
msgid "Illegal seek"
msgid "Inappropriate operation for background process"
msgstr "Operation för bakgrundsprocess olämplig"
+#: sysdeps/unix/sysv/linux/siglist.h:62
+msgid "Information request"
+msgstr "Informationsbegäran"
+
#. TRANS Input/output error; usually used for physical read or write errors.
#: stdio-common/../sysdeps/gnu/errlist.c:40
msgid "Input/output error"
msgstr "In/ut-fel"
-#: nis/ypclnt.c:643
+#: nis/ypclnt.c:701
msgid "Internal NIS error"
msgstr "Internt NIS-fel"
-#: nis/ypclnt.c:707
+#: nis/ypclnt.c:765
msgid "Internal ypbind error"
msgstr "Internt ypbind-fel"
+#: stdio-common/../sysdeps/unix/siglist.c:31
+#: sysdeps/unix/sysv/linux/siglist.h:23
msgid "Interrupt"
-msgstr "Avbrutet"
+msgstr "Avbruten (SIGINT)"
-#. TRANS Interrupted function call; an asynchronous signal occured and prevented
+#. TRANS Interrupted function call; an asynchronous signal occurred and prevented
#. TRANS completion of the call. When this happens, you should try the call
#. TRANS again.
#. TRANS
msgid "Invalid argument"
msgstr "Ogiltigt argument"
-#: posix/regex.c:946
+#: posix/regex.c:960
msgid "Invalid back reference"
msgstr "Ogiltig bakåtreferens"
-#: posix/regex.c:944
+#: posix/regex.c:958
msgid "Invalid character class name"
msgstr "Ogiltigt teckenklassnamn"
msgid "Invalid client verifier"
msgstr "Ogiltig klientverifierare"
-#: posix/regex.c:943
+#: posix/regex.c:957
msgid "Invalid collation character"
msgstr "Ogiltigt kollationeringstecken"
-#: posix/regex.c:950
+#: posix/regex.c:964
msgid "Invalid content of \\{\\}"
-msgstr "Ogiltig användning av \\{\\}"
+msgstr "Ogiltigt innehåll i \\{\\}"
#. TRANS An attempt to make an improper link across file systems was detected.
#. TRANS This happens not only when you use @code{link} (@pxref{Hard Links}) but
#. TRANS or an incomplete sequence of bytes or the given wide character is invalid.
#: stdio-common/../sysdeps/gnu/errlist.c:567
msgid "Invalid or incomplete multibyte or wide character"
-msgstr "Ogiltig eller inte komplett flerbyte eller brett tecken"
+msgstr "Ogiltig eller inte komplett flerbyte- eller brett tecken"
-#: posix/regex.c:953
+#: posix/regex.c:967
msgid "Invalid preceding regular expression"
msgstr "Ogiltigt föregående reguljärt uttryck"
-#: posix/regex.c:951
+#: posix/regex.c:965
msgid "Invalid range end"
msgstr "Ogiltigt intervallslut"
-#: posix/regex.c:942
+#: posix/regex.c:956
msgid "Invalid regular expression"
msgstr "Ogiltigt reguljärt uttryck"
msgid "Is a named type file"
msgstr "Är en namngiven filtyp"
+#: stdio-common/../sysdeps/unix/siglist.c:38
+#: sysdeps/unix/sysv/linux/siglist.h:29
msgid "Killed"
msgstr "Dödad"
#: stdio-common/../sysdeps/gnu/errlist.c:674
msgid "Link number out of range"
-msgstr "Länktal utanför giltigt område"
+msgstr "Länkantal utanför giltigt område"
-#: nis/ypclnt.c:655
+#: nis/ypclnt.c:713
msgid "Local domain name not set"
msgstr "Lokalt domännamn inte satt"
-#: nis/ypclnt.c:645
+#: nis/ypclnt.c:703
msgid "Local resource allocation failure"
msgstr "Allokeringsfel för lokal resurs"
msgid "Machine is not on the network"
msgstr "Maskinen finns inte på nätverket"
-#: posix/regex.c:952
+#: posix/regex.c:966
msgid "Memory exhausted"
msgstr "Minnet slut"
msgid "Multihop attempted"
msgstr "Flerhopp försöktes"
-#: nis/ypclnt.c:659
+#: nis/ypclnt.c:717
msgid "NIS client/server version mismatch - can't supply service"
-msgstr "NIS klient/betjänt versionsskillnad - kan inte betjäna"
+msgstr "NIS versionsskillnad klient/betjänt - kan inte betjäna"
-#: nis/ypclnt.c:657
+#: nis/ypclnt.c:715
msgid "NIS map data base is bad"
msgstr "NIS tabelldatabas är felaktig"
#: stdio-common/../sysdeps/gnu/errlist.c:622
msgid "No data available"
-msgstr "Data otillgängligt"
+msgstr "Inga data tillgängliga"
#. TRANS No locks available. This is used by the file locking facilities; see
#. TRANS @ref{File Locks}. This error is never generated by the GNU system, but
msgid "No locks available"
msgstr "Inga lås tillgängliga"
-#: posix/regex.c:941
+#: posix/regex.c:955
msgid "No match"
msgstr "Ingen träff"
msgid "No message of desired type"
msgstr "Inget meddelande av önskad typ"
-#: nis/ypclnt.c:647
+#: nis/ypclnt.c:705
msgid "No more records in map database"
msgstr "Inga fler poster i tabelldatabasen"
-#: posix/regex.c:5204
+#: posix/regex.c:5324
msgid "No previous regular expression"
msgstr "Inget föregående reguljärt uttryck"
msgid "No such file or directory"
msgstr "Filen eller katalogen finns inte"
-#: nis/ypclnt.c:641
+#: nis/ypclnt.c:699
msgid "No such key in map"
msgstr "Ingen sådan nyckel i tabellen"
-#: nis/ypclnt.c:639
+#: nis/ypclnt.c:697
msgid "No such map in server's domain"
msgstr "Ingen sådan tabell i betjäntens domän"
msgid "Object is remote"
msgstr "Är ett fjärrobjekt"
-#: time/zic.c:1939
+#: time/zic.c:1966
msgid "Odd number of quotation marks"
msgstr "Ojämnt antal citationstecken"
msgstr "Paketet är inte installerat"
#. TRANS Permission denied; the file permissions do not allow the attempted operation.
-#: nis/ypclnt.c:661 stdio-common/../sysdeps/gnu/errlist.c:96
+#: nis/ypclnt.c:719 stdio-common/../sysdeps/gnu/errlist.c:96
msgid "Permission denied"
msgstr "Ã…tkomst nekas"
+#: sysdeps/unix/sysv/linux/siglist.h:64
msgid "Power failure"
-msgstr "Spänningsfall"
+msgstr "Strömavbrott"
-#: posix/regex.c:954
+#: posix/regex.c:968
msgid "Premature end of regular expression"
msgstr "För tidigt slut på reguljärt uttryck"
+#: stdio-common/../sysdeps/unix/siglist.c:56
+#: sysdeps/unix/sysv/linux/siglist.h:46
msgid "Profiling timer expired"
-msgstr "Profileringstiden tog slut"
+msgstr "Profileringsklocka"
#: stdio-common/../sysdeps/gnu/errlist.c:678
msgid "Protocol driver not attached"
msgid "Protocol wrong type for socket"
msgstr "Fel protokolltyp för uttag (socket)"
+#: stdio-common/../sysdeps/unix/siglist.c:32
+#: sysdeps/unix/sysv/linux/siglist.h:24
msgid "Quit"
-msgstr "Sluta"
+msgstr "Lämnad"
#: stdio-common/../sysdeps/gnu/errlist.c:742
msgid "RFS specific error"
msgid "RPC bad procedure for program"
msgstr "RPC dålig procedur för program"
-#: nis/ypclnt.c:635
+#: nis/ypclnt.c:693
msgid "RPC failure on NIS operation"
msgstr "RPC-fel vid NIS-operation"
#: sunrpc/clnt_perr.c:183
msgid "RPC: Program/version mismatch"
-msgstr "RPC: Program/version-inkompabilitet"
+msgstr "RPC: Program/version-inkompatibilitet"
#: sunrpc/clnt_perr.c:189
msgid "RPC: Remote system error"
msgid "Read-only file system"
msgstr "Filsystemet endast läsbart"
-#: posix/regex.c:955
+#: posix/regex.c:969
msgid "Regular expression too big"
msgstr "Reguljärt uttryck för stort"
msgstr "Ta bort lösenord eller gör filen oläsbar för andra"
#: catgets/gencat.c:224 db/makedb.c:227 locale/programs/locale.c:257
-#: locale/programs/localedef.c:408
-msgid "Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"
-msgstr "Rapportera fel till <bug-glibc@prep.ai.mit.edu>.\n"
+#: locale/programs/localedef.c:412
+msgid "Report bugs using the `glibcbug' script to <bugs@gnu.ai.mit.edu>.\n"
+msgstr ""
+"Rapportera fel med programmet \"glibcbug\" till <bug-glibc@prep.ai.mit.edu>.\n"
+"Rapportera fel på översättningen till <sv@li.org>.\n"
-#: nis/ypclnt.c:633
+#: nis/ypclnt.c:691
msgid "Request arguments bad"
msgstr "Argument för förfrågan felaktiga"
#: resolv/herror.c:117
msgid "Resolver internal error"
-msgstr "Internt fel i namnlösare"
+msgstr "Internt fel i namnlösare (resolver)"
#. TRANS Deadlock avoided; allocating a system resource would have resulted in a
#. TRANS deadlock situation. The system does not guarantee that it will notice
msgid "Resource deadlock avoided"
msgstr "Resursdödläge undveks"
+#: stdio-common/../sysdeps/unix/siglist.c:58
+msgid "Resource lost"
+msgstr "Förlorad resurs"
+
#. TRANS Resource temporarily unavailable; the call might work if you try again
#. TRANS later. The macro @code{EWOULDBLOCK} is another name for @code{EAGAIN};
#. TRANS they are always the same in the GNU C library.
msgid "Resource temporarily unavailable"
msgstr "Resursen tillfälligt otillgänglig"
+#: stdio-common/../sysdeps/unix/siglist.c:40
+#: sysdeps/unix/sysv/linux/siglist.h:31
msgid "Segmentation fault"
-msgstr "Minnessegmentsfel"
+msgstr "Segmenteringsfel"
#: sunrpc/clnt_perr.c:280
msgid "Server rejected credential"
msgid "Server rejected verifier"
msgstr "Betjänt förkastade verifierare"
+#: stdio-common/../sysdeps/unix/siglist.c:29
+msgid "Signal 0"
+msgstr "Signal 0"
+
#. TRANS A file that isn't a socket was specified when a socket is required.
#: stdio-common/../sysdeps/gnu/errlist.c:299
msgid "Socket operation on non-socket"
msgid "Srmount error"
msgstr "Srmount-fel"
+#: sysdeps/unix/sysv/linux/siglist.h:59
+msgid "Stack fault"
+msgstr "Stackfel"
+
#. TRANS Stale NFS file handle. This indicates an internal confusion in the NFS
#. TRANS system which is due to file system rearrangements on the server host.
#. TRANS Repairing this condition usually requires unmounting and remounting
msgid "Stale NFS file handle"
msgstr "Förlegad NFS-filhandtag"
+#: stdio-common/../sysdeps/unix/siglist.c:47
+#: sysdeps/unix/sysv/linux/siglist.h:37
msgid "Stopped"
msgstr "Stoppad"
+#: stdio-common/../sysdeps/unix/siglist.c:46
+#: sysdeps/unix/sysv/linux/siglist.h:36
msgid "Stopped (signal)"
msgstr "Stoppad (signal)"
+#: stdio-common/../sysdeps/unix/siglist.c:50
+#: sysdeps/unix/sysv/linux/siglist.h:40
msgid "Stopped (tty input)"
-msgstr "Stoppad (tty-läsning)"
+msgstr "Stoppad (terminalläsning)"
+#: stdio-common/../sysdeps/unix/siglist.c:51
+#: sysdeps/unix/sysv/linux/siglist.h:41
msgid "Stopped (tty output)"
-msgstr "Stoppad (tty-skrivning)"
+msgstr "Stoppad (terminalskrivning)"
#: stdio-common/../sysdeps/gnu/errlist.c:778
msgid "Streams pipe error"
msgid "Structure needs cleaning"
msgstr "Strukturen behöver städas"
-#: nis/ypclnt.c:631 nis/ypclnt.c:705 posix/regex.c:940
+#: nis/ypclnt.c:689 nis/ypclnt.c:763 posix/regex.c:954
#: stdio-common/../sysdeps/gnu/errlist.c:7
msgid "Success"
msgstr "Lyckat"
-#: nis/ypclnt.c:711
+#: nis/ypclnt.c:769
msgid "System resource allocation failure"
msgstr "Allokeringsfel för systemresurs"
+#: stdio-common/../sysdeps/unix/siglist.c:44
+#: sysdeps/unix/sysv/linux/siglist.h:34
msgid "Terminated"
-msgstr "Terminerad"
+msgstr "Avslutad"
#. TRANS An attempt to execute a file that is currently open for writing, or
#. TRANS write to a file that is currently being executed. Often using a
#: stdio-common/../sysdeps/gnu/errlist.c:650
msgid "Timer expired"
-msgstr "Tidtagning avslutad"
+msgstr "Klockan ringde"
#. TRANS Too many levels of symbolic links were encountered in looking up a file name.
#. TRANS This often indicates a cycle of symbolic links.
msgid "Too many users"
msgstr "För många användare"
+#: stdio-common/../sysdeps/unix/siglist.c:34
+msgid "Trace/BPT trap"
+msgstr "Spårning/BPT-fälla"
+
+#: sysdeps/unix/sysv/linux/siglist.h:26
msgid "Trace/breakpoint trap"
-msgstr "Spårning/brytpunktsfälla"
+msgstr "Spårningsfälla"
-#: posix/regex.c:945
+#: posix/regex.c:959
msgid "Trailing backslash"
-msgstr "Felplacerat omvänt snedstreck"
+msgstr "Avslutande omvänt snedstreck"
#. TRANS In the GNU system, opening a file returns this error when the file is
#. TRANS translated by a program and the translator program dies while starting
msgstr "Transportslutpunkten är inte förbunden"
#: catgets/gencat.c:208 db/makedb.c:209 locale/programs/locale.c:241
-#: locale/programs/localedef.c:389
+#: locale/programs/localedef.c:393
#, c-format
msgid "Try `%s --help' for more information.\n"
msgstr "Försök med \"%s --help\" för mer information\n"
-#: inet/rcmd.c:136
+#: inet/rcmd.c:137
#, c-format
msgid "Trying %s...\n"
msgstr "Provar %s...\n"
msgid "Unknown .netrc keyword %s"
msgstr "Okänt .netrc-nyckelord %s"
-#: nis/ypclnt.c:665
+#: nis/ypclnt.c:723
msgid "Unknown NIS error code"
msgstr "Okänd NIS-felkod"
#: resolv/herror.c:120
msgid "Unknown resolver error"
-msgstr "Okänt fel hos namnlösare"
+msgstr "Okänt fel hos namnlösare (resolver)"
#: resolv/herror.c:76
msgid "Unknown server error"
-msgstr "Okänt fel hos tjänsteställe"
+msgstr "Okänt fel hos betjänt"
#: string/strsignal.c:41
#, c-format
msgid "Unknown signal %d"
msgstr "Okänd signal %d"
-#: misc/error.c:95
+#: misc/error.c:100
msgid "Unknown system error"
msgstr "Okänt systemfel"
-#: nis/ypclnt.c:713
+#: nis/ypclnt.c:771
msgid "Unknown ypbind error"
msgstr "Okänt ypbind-fel"
-#: posix/regex.c:948
+#: posix/regex.c:962
msgid "Unmatched ( or \\("
msgstr "Obalanserade ( eller \\("
-#: posix/regex.c:956
+#: posix/regex.c:970
msgid "Unmatched ) or \\)"
msgstr "Obalanserade ) eller \\)"
-#: posix/regex.c:947
+#: posix/regex.c:961
msgid "Unmatched [ or [^"
msgstr "Obalanserade [ eller [^"
-#: posix/regex.c:949
+#: posix/regex.c:963
msgid "Unmatched \\{"
msgstr "Obalanserad \\{"
msgid "Unrecognized variable `%s'"
msgstr "Okänd variabel \"%s\""
+#: stdio-common/../sysdeps/unix/siglist.c:45
+#: sysdeps/unix/sysv/linux/siglist.h:35
msgid "Urgent I/O condition"
msgstr "Viktigt I/O-tillstånd"
" -V, --version visa versionsinformation och avsluta\n"
"Om INFIL är -, läs indata från standard in\n"
-#: locale/programs/localedef.c:393
+#: locale/programs/localedef.c:397
#, c-format
msgid ""
"Usage: %s [OPTION]... name\n"
" locale files : %s\n"
msgstr ""
"Användning: %s [FLAGGA]... namn\n"
-"Obligatoriska argument till långa flaggor är obligatoriska även för de "
-"korta.\n"
+"Obligatoriska argument till långa flaggor är obligatoriska även för de korta.\n"
" -c, --force skapa resultatfil även om varningar gavs\n"
" -h, --help visa denna hjälptext och avsluta\n"
" -f, --charmap=FIL symboliska teckennamn definieras i FIL\n"
" --posix följ POSIX strikt\n"
"\n"
"Systemets katalog för teckenuppsättningar: %s\n"
-" meddelandekataloger: %s\n"
+" lokalfiler: %s\n"
#: locale/programs/locale.c:245
#, c-format
msgid "Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]\n"
msgstr "Användning: rpcinfo [ -n portnr ] -u värd prognr [ versnr ]\n"
+#: stdio-common/../sysdeps/unix/siglist.c:59
+#: sysdeps/unix/sysv/linux/siglist.h:48
msgid "User defined signal 1"
msgstr "Användarsignal 1"
+#: stdio-common/../sysdeps/unix/siglist.c:60
+#: sysdeps/unix/sysv/linux/siglist.h:49
msgid "User defined signal 2"
msgstr "Användarsignal 2"
msgid "Value too large for defined data type"
msgstr "Värdet för stort för definierad datatyp"
+#: stdio-common/../sysdeps/unix/siglist.c:55
+#: sysdeps/unix/sysv/linux/siglist.h:45
msgid "Virtual timer expired"
-msgstr "Virtuell tidtagare löpte ut"
+msgstr "Alarmklocka - virtuell tid"
-#: time/zic.c:1844
+#: time/zic.c:1871
msgid "Wild result from command execution"
msgstr "Vilt resultat från kommandokörning"
+#: stdio-common/../sysdeps/unix/siglist.c:57
+#: sysdeps/unix/sysv/linux/siglist.h:47
msgid "Window changed"
-msgstr "Fönstret ändrades"
+msgstr "Ändrat fönster"
#: catgets/gencat.c:174 db/makedb.c:125 locale/programs/locale.c:192
-#: locale/programs/localedef.c:182
+#: locale/programs/localedef.c:185
#, c-format
msgid "Written by %s.\n"
msgstr "Skriven av %s.\n"
-#: nis/ypclnt.c:146
+#: nis/ypclnt.c:142
msgid "YPBINDPROC_DOMAIN: Internal error\n"
msgstr "YPBINDPROC_DOMAIN: Internt fel\n"
-#: nis/ypclnt.c:150
+#: nis/ypclnt.c:146
#, c-format
msgid "YPBINDPROC_DOMAIN: No server for domain %s\n"
msgstr "YPBINDPROC_DOMAIN: Ingen betjänt för domän %s\n"
-#: nis/ypclnt.c:154
+#: nis/ypclnt.c:150
msgid "YPBINDPROC_DOMAIN: Resource allocation failure\n"
-msgstr "YPBINDPROC_DOMAIN: Allokeringsfel för resurs\n"
+msgstr "YPBINDPROC_DOMAIN: Resursallokeringsfel\n"
-#: nis/ypclnt.c:158
+#: nis/ypclnt.c:154
msgid "YPBINDPROC_DOMAIN: Unknown error\n"
msgstr "YPBINDPROC_DOMAIN: Okänt fel\n"
msgid "You really blew it this time"
msgstr "Du strulade till det den här gången"
-#: time/zic.c:1050
+#: time/zic.c:1048
msgid "Zone continuation line end time is not after end time of previous line"
msgstr ""
"Zon-fortsättningsradens sluttid är inte efter sluttiden på föregående rad"
-#: locale/programs/charmap.c:397 locale/programs/locfile.c:341
+#: locale/programs/charmap.c:397 locale/programs/locfile.c:363
#, c-format
msgid "`%1$s' definition does not end with `END %1$s'"
msgstr "\"%1$s\" definition slutar ej med \"END %1$s\""
-#: locale/programs/ld-monetary.c:358 locale/programs/ld-numeric.c:190
+#: locale/programs/ld-monetary.c:359 locale/programs/ld-numeric.c:190
#, c-format
msgid "`-1' must be last entry in `%s' field in `%s' category"
msgstr "\"-1\" måste vara sista post i fält \"%s\" i kategori \"%s\""
-#: locale/programs/ld-collate.c:1652
+#: locale/programs/ld-collate.c:1655
msgid "`...' must only be used in `...' and `UNDEFINED' entries"
msgstr "\"...\" får endast användas för post \"...\" och post \"UNDEFINED\""
-#: locale/programs/locfile.c:538
+#: locale/programs/locfile.c:560
msgid "`from' expected after first argument to `collating-element'"
msgstr ""
"\"from\" förväntades efter första argumentet till \"collating-element\""
-#: locale/programs/ld-collate.c:1109
+#: locale/programs/ld-collate.c:1112
msgid ""
"`from' string in collation element declaration contains unknown character"
msgstr ""
msgid "argument to <%s> must be a single character"
msgstr "argumentet till <%s> måste vara ett enskilt tecken"
-#: locale/programs/locfile.c:215
+#: locale/programs/locfile.c:237
#, c-format
msgid "argument to `%s' must be a single character"
msgstr "argumentet till \"%s\" måste vara ett enskilt tecken"
-#: sunrpc/auth_unix.c:322
+#: sunrpc/auth_unix.c:323
msgid "auth_none.c - Fatal marshalling problem"
msgstr "auth_none.c - Fatalt kodningsproblem"
-#: inet/rcmd.c:360
+#: inet/rcmd.c:365
msgid "bad .rhosts owner"
-msgstr "dålig .rhosts-ägare"
+msgstr "olämplig ägare av .rhosts"
-#: locale/programs/charmap.c:212 locale/programs/locfile.c:209
+#: locale/programs/charmap.c:212 locale/programs/locfile.c:231
msgid "bad argument"
msgstr "dåligt argument"
-#: time/zic.c:1172
+#: time/zic.c:1170
msgid "blank FROM field on Link line"
msgstr "tomt \"FROM\"-fält på \"Link\"-rad"
-#: time/zic.c:1176
+#: time/zic.c:1174
msgid "blank TO field on Link line"
msgstr "tomt \"TO\"-fält på \"Link\"-rad"
-#: malloc/mcheck.c:189
+#: malloc/mcheck.c:191
msgid "block freed twice"
msgstr "block avallokerat två gånger"
-#: malloc/mcheck.c:192
+#: malloc/mcheck.c:194
msgid "bogus mcheck_status, library is buggy"
msgstr "felaktig mcheck_status, biblioteket är felaktigt"
msgid "cache_set: victim not found"
msgstr "cache_set: offer hittades ej"
-#: time/zic.c:1685
-msgid "can't determine time zone abbrevation to use just after until time"
+#: time/zic.c:1698
+msgid "can't determine time zone abbreviation to use just after until time"
msgstr ""
"kan inte avgöra tidszonsförkortning att använda just efter \"until\"-tid"
#: sunrpc/svc_simple.c:64
#, c-format
msgid "can't reassign procedure number %d\n"
-msgstr "kan inte återtilldela procedurnummer %d\n"
+msgstr "kan inte ändra procedurnummer %d\n"
-#: locale/programs/localedef.c:287
+#: locale/programs/localedef.c:291
#, c-format
msgid "cannot `stat' locale file `%s'"
msgstr "kan inte ta status på lokalfil \"%s\""
-#: locale/programs/ld-collate.c:1314
+#: locale/programs/ld-collate.c:1317
#, c-format
msgid "cannot insert collation element `%.*s'"
msgstr "kan inte sätta in kollationselement \"%.*s\""
-#: locale/programs/ld-collate.c:1493 locale/programs/ld-collate.c:1498
+#: locale/programs/ld-collate.c:1496 locale/programs/ld-collate.c:1501
msgid "cannot insert into result table"
msgstr "kan inte sätta in i resultattabell"
-#: locale/programs/ld-collate.c:1166 locale/programs/ld-collate.c:1208
+#: locale/programs/ld-collate.c:1169 locale/programs/ld-collate.c:1211
#, c-format
msgid "cannot insert new collating symbol definition: %s"
msgstr "kan inte sätta in ny kollationssymbolsdefinition: %s"
msgid "cannot open database file `%s': %s"
msgstr "kan inte öppna databasfil \"%s\": %s"
-#: catgets/gencat.c:259 db/makedb.c:180
+#: catgets/gencat.c:260 db/makedb.c:180
#, c-format
msgid "cannot open input file `%s'"
msgstr "kan inte öppna infil \"%s\""
-#: locale/programs/localedef.c:221
+#: locale/programs/localedef.c:224
#, c-format
msgid "cannot open locale definition file `%s'"
msgstr "kan inte öppna lokaldefinitionsfil \"%s\""
-#: catgets/gencat.c:764 catgets/gencat.c:805 db/makedb.c:189
+#: catgets/gencat.c:765 catgets/gencat.c:806 db/makedb.c:189
#, c-format
msgid "cannot open output file `%s'"
msgstr "kan inte öppna utfil \"%s\""
-#: locale/programs/locfile.c:986
+#: locale/programs/locfile.c:1008
#, c-format
msgid "cannot open output file `%s' for category `%s'"
msgstr "kan inte öppna utfil \"%s\" för kategori \"%s\""
-#: locale/programs/ld-collate.c:1360
+#: locale/programs/ld-collate.c:1363
msgid "cannot process order specification"
msgstr "kan inte bearbeta sorteringsspecifikation"
-#: locale/programs/locale.c:303
+#: locale/programs/locale.c:304
#, c-format
msgid "cannot read character map directory `%s'"
msgstr "kan inte läsa teckenuppsättningskatalog \"%s\""
-#: locale/programs/locale.c:278
+#: locale/programs/locale.c:279
#, c-format
msgid "cannot read locale directory `%s'"
msgstr "kan inte läsa lokalkatalog \"%s\""
-#: locale/programs/localedef.c:309
+#: locale/programs/localedef.c:313
#, c-format
msgid "cannot read locale file `%s'"
msgstr "kan inte läsa lokalfil \"%s\""
-#: locale/programs/localedef.c:334
+#: locale/programs/localedef.c:338
#, c-format
msgid "cannot write output files to `%s'"
msgstr "kan inte skriva utfiler till \"%s\""
-#: locale/programs/localedef.c:377
+#: locale/programs/localedef.c:381
msgid "category data requested more than once: should not happen"
msgstr "kategoridata begärd mer än en gång: borde inte inträffa"
-#: locale/programs/ld-ctype.c:265
+#: locale/programs/ld-ctype.c:266
#, c-format
msgid "character %s'%s' in class `%s' must be in class `%s'"
msgstr "tecknet %s\"%s\" i klass \"%s\" måste vara i klass \"%s\""
-#: locale/programs/ld-ctype.c:289
+#: locale/programs/ld-ctype.c:291
#, c-format
msgid "character %s'%s' in class `%s' must not be in class `%s'"
msgstr "tecknet %s\"%s\" i klass \"%s\" kan inte vara i klass \"%s\""
-#: locale/programs/ld-ctype.c:310
+#: locale/programs/ld-ctype.c:313
msgid "character <SP> not defined in character map"
msgstr "tecknet <SP> inte definierat i teckenuppsättning"
-#: locale/programs/ld-ctype.c:939 locale/programs/ld-ctype.c:1002
-#: locale/programs/ld-ctype.c:1010 locale/programs/ld-ctype.c:1018
-#: locale/programs/ld-ctype.c:1026 locale/programs/ld-ctype.c:1034
-#: locale/programs/ld-ctype.c:1042 locale/programs/ld-ctype.c:1068
-#: locale/programs/ld-ctype.c:1076 locale/programs/ld-ctype.c:1114
-#: locale/programs/ld-ctype.c:1141 locale/programs/ld-ctype.c:1152
+#: locale/programs/ld-ctype.c:944 locale/programs/ld-ctype.c:1007
+#: locale/programs/ld-ctype.c:1015 locale/programs/ld-ctype.c:1023
+#: locale/programs/ld-ctype.c:1031 locale/programs/ld-ctype.c:1039
+#: locale/programs/ld-ctype.c:1047 locale/programs/ld-ctype.c:1073
+#: locale/programs/ld-ctype.c:1081 locale/programs/ld-ctype.c:1119
+#: locale/programs/ld-ctype.c:1146 locale/programs/ld-ctype.c:1157
#, c-format
msgid "character `%s' not defined while needed as default value"
msgstr "tecknet \"%s\" inte definierat men behövs som standardvärde"
-#: locale/programs/ld-ctype.c:801
+#: locale/programs/ld-ctype.c:806
#, c-format
msgid "character class `%s' already defined"
msgstr "teckenklass \"%s\" redan definierad"
-#: locale/programs/ld-ctype.c:833
+#: locale/programs/ld-ctype.c:838
#, c-format
msgid "character map `%s' already defined"
msgstr "teckenuppsättning \"%s\" redan definierad"
#: locale/programs/charmap.c:76
#, c-format
msgid "character map file `%s' not found"
-msgstr "teckenuppsättningsfil \"%s\" inte funnen"
+msgstr "teckenuppsättningsfil \"%s\" finns inte"
#: sunrpc/clnt_raw.c:106
msgid "clnt_raw.c - Fatal header serialization error."
-msgstr "clnt_raw.c - Fatalt fel vid serialisation."
+msgstr "clnt_raw.c - Fatalt fel vid serialisering"
-#: locale/programs/ld-collate.c:1329
+#: locale/programs/ld-collate.c:1332
#, c-format
msgid "collation element `%.*s' appears more than once: ignore line"
msgstr "kollationselement \"%.*s\" finns mer än en gång: rad ignorerad"
-#: locale/programs/ld-collate.c:1347
+#: locale/programs/ld-collate.c:1350
#, c-format
msgid "collation symbol `%.*s' appears more than once: ignore line"
msgstr "kollationssymbol \"%.*s\" finns mer än en gång: rad ignorerad"
-#: locale/programs/locfile.c:522
+#: locale/programs/locfile.c:544
#, c-format
msgid "collation symbol expected after `%s'"
msgstr "kollationssymbol förväntades efter \"%s\""
-#: inet/rcmd.c:129
+#: inet/rcmd.c:130
#, c-format
msgid "connect to address %s: "
msgstr "koppla till adress %s: "
msgid ""
"direction flag in string %d in `era' field in category `%s' is not '+' nor "
"'-'"
-msgstr ""
-"riktningsflagga i sträng %d i \"era\"-fält i kategori \"%s\" är inte \"+\" "
-"eller \"-\""
+msgstr "riktningsflagga i sträng %d i \"era\"-fält i kategori \"%s\" är varken \"+\" eller \"-\""
#: locale/programs/ld-time.c:164
#, c-format
msgid "duplicate character name `%s'"
msgstr "duplicerat teckennamn \"%s\""
-#: locale/programs/ld-collate.c:1141
+#: locale/programs/ld-collate.c:1144
msgid "duplicate collating element definition"
msgstr "dubbla definitioner av kollationselement"
-#: locale/programs/ld-collate.c:1287
+#: locale/programs/ld-collate.c:1290
#, c-format
msgid "duplicate definition for character `%.*s'"
msgstr "dubbla definitioner för tecken \"%.*s\""
-#: db/makedb.c:310
+#: db/makedb.c:311
msgid "duplicate key"
msgstr "duplicerad nyckel"
-#: catgets/gencat.c:378
+#: catgets/gencat.c:379
msgid "duplicate set definition"
-msgstr "duplicerad definition av uppsättning"
+msgstr "duplicerad definition av mängd"
-#: time/zic.c:965
+#: time/zic.c:963
#, c-format
msgid "duplicate zone name %s (file \"%s\", line %d)"
msgstr "duplicerat zonnamn %s (fil \"%s\", rad %d)"
-#: catgets/gencat.c:541
+#: catgets/gencat.c:542
msgid "duplicated message identifier"
msgstr "duplicerad meddelandeidentifierare"
-#: catgets/gencat.c:514
+#: catgets/gencat.c:515
msgid "duplicated message number"
msgstr "duplicerat meddelandenummer"
-#: locale/programs/ld-collate.c:1696
+#: locale/programs/ld-collate.c:1699
msgid "empty weight name: line ignored"
msgstr "tomt viktnamn: rad ignorerad"
msgid "enablecache: could not allocate cache fifo"
msgstr "enablecache: kunde inte allokera cache-fifo"
-#: locale/programs/ld-collate.c:1419
+#: locale/programs/ld-collate.c:1422
msgid "end point of ellipsis range is bigger then start"
msgstr "slutpunkt för ... är större än startvärdet"
-#: locale/programs/ld-collate.c:1149
+#: locale/programs/ld-collate.c:1152
msgid "error while inserting collation element into hash table"
msgstr "fel vid insättning av kollationselement i hashtabellen"
-#: locale/programs/ld-collate.c:1161
+#: locale/programs/ld-collate.c:1164
msgid "error while inserting to hash table"
-msgstr "fel vis insättning till hashtabellen"
+msgstr "fel vid insättning i hashtabellen"
-#: locale/programs/locfile.c:465
+#: locale/programs/locfile.c:487
msgid "expect string argument for `copy'"
msgstr "förväntar strängargument för \"copy\""
-#: time/zic.c:856
+#: time/zic.c:854
msgid "expected continuation line not found"
msgstr "förväntad fortsättningsrad ej funnen"
-#: locale/programs/locfile.c:1010
+#: locale/programs/locfile.c:1032
#, c-format
msgid "failure while writing data for category `%s'"
msgstr "misslyckades skriva data för kategori \"%s\""
-#: locale/programs/ld-monetary.c:154 locale/programs/ld-numeric.c:95
+#: nis/ypclnt.c:187
+msgid "fcntl: F_SETFD"
+msgstr "fcntl_ F_SETFD"
+
+#: locale/programs/ld-monetary.c:155 locale/programs/ld-numeric.c:95
#, c-format
msgid "field `%s' in category `%s' not defined"
-msgstr "fält \"%s\" i kategori \"%s\" inte definierad"
+msgstr "fält \"%s\" i kategori \"%s\" inte definierat"
#: locale/programs/ld-messages.c:81 locale/programs/ld-messages.c:102
#, c-format
msgid "field `%s' in category `%s' undefined"
-msgstr "fält \"%s\" i kategori \"%s\" odefinierad"
+msgstr "fält \"%s\" i kategori \"%s\" odefinierat"
-#: locale/programs/locfile.c:547
+#: locale/programs/locfile.c:569
msgid "from-value of `collating-element' must be a string"
msgstr "frånvärde för \"collating-element\" måste vara en sträng"
msgstr "skräp i slutet av teckenkodsspecifikation"
#: locale/programs/linereader.c:214
-msgid "garbage at end of digit"
+msgid "garbage at end of number"
msgstr "skräp i slutet av nummer"
#: locale/programs/ld-time.c:183
msgstr ""
"skräp i slutet av startdatum i sträng %d i \"era\"-fält i kategori \"%s\""
-#: locale/programs/ld-time.c:310
+#: locale/programs/ld-time.c:311
#, c-format
msgid ""
"garbage at end of stopping date in string %d in `era' field in category `%s'"
msgid "get_myaddress: ioctl (get interface configuration)"
msgstr "get_myaddress: ioctl (hämta gränssnittskonfiguration)"
-#: time/zic.c:1149
+#: time/zic.c:1147
msgid "illegal CORRECTION field on Leap line"
msgstr "otillåtet \"CORRECTION\"-fält på \"Leap\"-rad"
-#: time/zic.c:1153
+#: time/zic.c:1151
msgid "illegal Rolling/Stationary field on Leap line"
msgstr "otillåtet \"Rolling/Stationary\"-fält på \"Leap\"-rad"
-#: locale/programs/ld-collate.c:1767
+#: locale/programs/ld-collate.c:1770
msgid "illegal character constant in string"
msgstr "otillåten teckenkonstant i sträng"
-#: locale/programs/ld-collate.c:1116
+#: locale/programs/ld-collate.c:1119
msgid "illegal collation element"
msgstr "otillåtet kollationselement"
#: locale/programs/charset.c:101
msgid "illegal names for character range"
-msgstr "otillåtna namn för teckenomfång"
+msgstr "otillåtna namn för teckenintervall"
#: locale/programs/ld-time.c:176
#, c-format
msgstr ""
"otillåtet tal för tilläggsvärde i sträng %d i \"era\"-fält i kategori \"%s\""
-#: catgets/gencat.c:351 catgets/gencat.c:428
+#: catgets/gencat.c:352 catgets/gencat.c:429
msgid "illegal set number"
-msgstr "otillåtet tal för uppsättning"
+msgstr "otillåtet tal för mängd"
#: locale/programs/ld-time.c:230
#, c-format
msgid "illegal starting date in string %d in `era' field in category `%s'"
msgstr "otillåtet startdatum i sträng %d i \"era\"-fält i kategori \"%s\""
-#: locale/programs/ld-time.c:302
+#: locale/programs/ld-time.c:303
#, c-format
msgid "illegal stopping date in string %d in `era' field in category `%s'"
msgstr "otillåtet slutdatum i sträng %d i \"era\"-fält i kategori \"%s\""
-#: locale/programs/ld-ctype.c:807
+#: locale/programs/ld-ctype.c:812
#, c-format
msgid "implementation limit: no more than %d character classes allowed"
-msgstr "implementationsbegränsning: inte fler än %d teckenklasser tillåtet"
+msgstr "implementationsbegränsning: inte fler än %d teckenklasser tillåtna"
-#: locale/programs/ld-ctype.c:839
+#: locale/programs/ld-ctype.c:844
#, c-format
msgid "implementation limit: no more than %d character maps allowed"
msgstr ""
msgid "incorrectly formatted file"
msgstr "felaktigt formaterad rad"
-#: time/zic.c:814
+#: time/zic.c:811
msgid "input line of unknown type"
msgstr "inrad av okänd typ"
-#: time/zic.c:1733
+#: time/zic.c:1760
msgid "internal error - addtype called with bad isdst"
msgstr "internt fel - addtype anropad med felaktig isdst"
-#: time/zic.c:1741
+#: time/zic.c:1768
msgid "internal error - addtype called with bad ttisgmt"
msgstr "internt fel - addtype anropad med felaktig ttisgmt"
-#: time/zic.c:1737
+#: time/zic.c:1764
msgid "internal error - addtype called with bad ttisstd"
msgstr "internt fel - addtype anropad med felaktig ttisstd"
-#: locale/programs/ld-ctype.c:301
+#: locale/programs/ld-ctype.c:304
#, c-format
msgid "internal error in %s, line %u"
msgstr "internt fel i %s, rad %u"
-#: time/zic.c:1021
+#: time/zic.c:1019
msgid "invalid GMT offset"
-msgstr "ogiltigt tilläggsvärde till GMT"
+msgstr "ogiltigt GMT-tillägg"
-#: time/zic.c:1024
+#: time/zic.c:1022
msgid "invalid abbreviation format"
msgstr "ogiltigt förkortningsformat"
-#: time/zic.c:1114 time/zic.c:1313 time/zic.c:1327
+#: time/zic.c:1112 time/zic.c:1313 time/zic.c:1327
msgid "invalid day of month"
msgstr "ogiltig dag i månaden"
-#: time/zic.c:1272
+#: time/zic.c:1270
msgid "invalid ending year"
msgstr "ogiltigt slutår"
-#: time/zic.c:1086
+#: time/zic.c:1084
msgid "invalid leaping year"
msgstr "ogiltigt skottår"
-#: time/zic.c:1101 time/zic.c:1204
+#: time/zic.c:1099 time/zic.c:1202
msgid "invalid month name"
msgstr "ogiltigt månadsnamn"
-#: time/zic.c:920
+#: time/zic.c:918
msgid "invalid saved time"
msgstr "ogiltigt sparad tid"
-#: time/zic.c:1252
+#: time/zic.c:1250
msgid "invalid starting year"
msgstr "ogiltigt startår"
-#: time/zic.c:1130 time/zic.c:1232
+#: time/zic.c:1128 time/zic.c:1230
msgid "invalid time of day"
msgstr "ogiltig tid på dagen"
msgid "invalid weekday name"
msgstr "ogiltigt veckodagsnamn"
-#: locale/programs/ld-collate.c:1412
+#: locale/programs/ld-collate.c:1415
msgid "line after ellipsis must contain character definition"
msgstr "rad efter ... måste innehålla teckendefinition"
-#: locale/programs/ld-collate.c:1391
+#: locale/programs/ld-collate.c:1394
msgid "line before ellipsis does not contain definition for character constant"
msgstr "rad före ... innehåller inte definition för teckenkonstant"
-#: time/zic.c:794
+#: time/zic.c:791
msgid "line too long"
-msgstr "rad för lång"
+msgstr "för lång rad"
-#: locale/programs/localedef.c:281
+#: locale/programs/localedef.c:285
#, c-format
msgid "locale file `%s', used in `copy' statement, not found"
msgstr "lokalfil \"%s\", använd i \"copy\", inte funnen"
-#: catgets/gencat.c:609
+#: catgets/gencat.c:610
msgid "malformed line ignored"
msgstr "felaktig rad ignorerad"
-#: malloc/mcheck.c:183
+#: malloc/mcheck.c:185
msgid "memory clobbered before allocated block"
msgstr "minnet förstört före allokerat block"
-#: malloc/mcheck.c:186
+#: malloc/mcheck.c:188
msgid "memory clobbered past end of allocated block"
msgstr "minnet förstört efter slutet på allokerat block"
#: locale/programs/ld-collate.c:167 locale/programs/ld-collate.c:173
-#: locale/programs/ld-collate.c:177 locale/programs/ld-collate.c:1439
-#: locale/programs/ld-collate.c:1468 locale/programs/locfile.c:940
+#: locale/programs/ld-collate.c:177 locale/programs/ld-collate.c:1442
+#: locale/programs/ld-collate.c:1471 locale/programs/locfile.c:962
#: locale/programs/xmalloc.c:68 posix/getconf.c:250
msgid "memory exhausted"
msgstr "minne slut"
-#: malloc/obstack.c:425
+#: malloc/obstack.c:462
msgid "memory exhausted\n"
msgstr "minnet slut\n"
-#: malloc/mcheck.c:180
+#: malloc/mcheck.c:182
msgid "memory is consistent, library is buggy"
msgstr "minnet är konsistent, biblioteket är felaktigt"
-#: locale/programs/ld-time.c:348
+#: locale/programs/ld-time.c:350
#, c-format
msgid "missing era format in string %d in `era' field in category `%s'"
msgstr "eraformat i sträng %d i \"era\"-fält i kategori \"%s\" saknas"
-#: locale/programs/ld-time.c:337
+#: locale/programs/ld-time.c:339
#, c-format
-msgid "missing era name in string %d in `era' fieldin category `%s'"
+msgid "missing era name in string %d in `era' field in category `%s'"
msgstr "eranamn i sträng %d i \"era\"-fält i kategori \"%s\" saknas"
-#: time/zic.c:915
+#: time/zic.c:913
msgid "nameless rule"
msgstr "namnlös regel"
msgid "no correct regular expression for field `%s' in category `%s': %s"
msgstr "felaktigt reguljärt uttryck för fält \"%s\" i kategori \"%s\": %s"
-#: time/zic.c:2059
+#: time/zic.c:2086
msgid "no day in month matches rule"
msgstr "ingen dag i månaden matchar regeln"
-#: locale/programs/ld-collate.c:259
+#: locale/programs/ld-collate.c:260
msgid "no definition of `UNDEFINED'"
msgstr "ingen definition av \"UNDEFINED\""
-#: locale/programs/locfile.c:479
+#: locale/programs/locfile.c:501
msgid "no other keyword shall be specified when `copy' is used"
msgstr "inget annat nyckelord ska anges när \"copy\" används"
-#: locale/programs/localedef.c:340
+#: locale/programs/localedef.c:344
msgid "no output file produced because warning were issued"
msgstr "ingen utfil skapad på grund av varningar"
msgid "only WIDTH definitions are allowed to follow the CHARMAP definition"
msgstr "endast definition av \"WIDTH\" får följa definitionen av \"CHARMAP\""
-#: db/makedb.c:326
+#: db/makedb.c:327
#, c-format
msgid "problems while reading `%s'"
msgstr "problem läsa \"%s\""
#: sunrpc/rpcinfo.c:466
#, c-format
msgid "program %lu version %lu ready and waiting\n"
-msgstr "program %lu version %lu klar och väntar\n"
+msgstr "program %lu version %lu berett och väntar\n"
-#: inet/rcmd.c:171
+#: inet/rcmd.c:172
#, c-format
msgid "rcmd: select (setting up stderr): %m\n"
-msgstr "rcmd: select (sätter upp standard error): %m\n"
+msgstr "rcmd: select (sätter upp standard fel): %m\n"
-#: inet/rcmd.c:103
+#: inet/rcmd.c:104
msgid "rcmd: socket: All ports in use\n"
msgstr "rcmd: uttag (socket): Alla portar används\n"
-#: inet/rcmd.c:159
+#: inet/rcmd.c:160
#, c-format
msgid "rcmd: write (setting up stderr): %m\n"
-msgstr "rcmd: write: (sätter upp standard error): %m\n"
+msgstr "rcmd: write: (sätter upp standard fel): %m\n"
#: sunrpc/svc_simple.c:83
msgid "registerrpc: out of memory\n"
msgstr "registerrpc: minnet slut\n"
-#: time/zic.c:1794
+#: time/zic.c:1821
msgid "repeated leap second moment"
msgstr "upprepat skottsekundstillfälle"
msgid "rpcinfo: can't contact portmapper: "
msgstr "rpcinfo: kan inte kontakta portmapper: "
-#: time/zic.c:708 time/zic.c:710
+#: time/zic.c:704 time/zic.c:706
msgid "same rule name in multiple files"
msgstr "samma regel i flera filer"
-#: inet/rcmd.c:174
+#: inet/rcmd.c:175
msgid "select: protocol failure in circuit setup\n"
msgstr "select: protokollfel i förbindelseuppsättning\n"
-#: inet/rcmd.c:192
+#: inet/rcmd.c:193
msgid "socket: protocol failure in circuit setup\n"
msgstr "uttag (socket): protokollfel i förbindelseuppsättning\n"
-#: locale/programs/locfile.c:600
+#: locale/programs/locfile.c:622
msgid "sorting order `forward' and `backward' are mutually exclusive"
msgstr ""
"sorteringsordning \"forward\" och \"backward\" är ömsesidigt uteslutande"
-#: locale/programs/ld-collate.c:1568 locale/programs/ld-collate.c:1614
+#: locale/programs/ld-collate.c:1571 locale/programs/ld-collate.c:1617
msgid ""
"specification of sorting weight for collation symbol does not make sense"
msgstr ""
"specifikation av sorteringsvikter för kollationssymbol verkar inte vettig"
-#: time/zic.c:779
+#: time/zic.c:775
msgid "standard input"
msgstr "standard in"
-#: time/zdump.c:260
+#: time/zdump.c:268
msgid "standard output"
msgstr "standard ut"
-#: locale/programs/ld-time.c:256
+#: locale/programs/ld-time.c:257
#, c-format
msgid "starting date is illegal in string %d in `era' field in category `%s'"
msgstr "startdatum är otillåtet i sträng %d i \"era\"-fält i kategori \"%s\""
-#: time/zic.c:1276
+#: time/zic.c:1274
msgid "starting year greater than ending year"
msgstr "startår är större än slutår"
-#: locale/programs/ld-time.c:328
+#: locale/programs/ld-time.c:330
#, c-format
msgid "stopping date is illegal in string %d in `era' field in category `%s'"
msgstr "slutdatum är otillåtet i sträng %d i \"era\"-fält i kategori \"%s\""
msgid "svcudp_create: socket creation problem"
msgstr "svcudp_create: problem att skapa uttag (socket)"
-#: locale/programs/ld-collate.c:1191
+#: locale/programs/ld-collate.c:1194
#, c-format
msgid ""
"symbol for multicharacter collating element `%.*s' duplicates element "
msgstr ""
"symbol för flerteckenskollationselement \"%.*s\" duplicerar elementdefinition"
-#: locale/programs/ld-collate.c:1064
+#: locale/programs/ld-collate.c:1067
#, c-format
msgid ""
"symbol for multicharacter collating element `%.*s' duplicates other element "
"symbol för flerteckenskollationselement \"%.*s\" duplicerar annan\n"
"elementdefinition"
-#: locale/programs/ld-collate.c:1200
+#: locale/programs/ld-collate.c:1203
#, c-format
msgid ""
"symbol for multicharacter collating element `%.*s' duplicates other symbol "
"symbol för flerteckenskollationselement \"%.*s\" duplicerar annan\n"
"symboldefinition"
-#: locale/programs/ld-collate.c:1073
+#: locale/programs/ld-collate.c:1076
#, c-format
msgid ""
"symbol for multicharacter collating element `%.*s' duplicates symbol "
msgstr ""
"symbol för flerteckenskollationselement \"%.*s\" duplicerar symboldefinition"
-#: locale/programs/ld-collate.c:1055 locale/programs/ld-collate.c:1182
+#: locale/programs/ld-collate.c:1058 locale/programs/ld-collate.c:1185
#, c-format
msgid ""
"symbol for multicharacter collating element `%.*s' duplicates symbolic name "
msgid "syntax error in %s definition: %s"
msgstr "syntaxfel i definition av %s: %s"
-#: locale/programs/locfile.c:620
+#: locale/programs/locfile.c:642
msgid "syntax error in `order_start' directive"
msgstr "syntaxfel i direktivet \"order_start\""
-#: locale/programs/locfile.c:362
+#: locale/programs/locfile.c:384
msgid "syntax error in character class definition"
msgstr "syntaxfel i teckenklassdefinition"
-#: locale/programs/locfile.c:420
+#: locale/programs/locfile.c:442
msgid "syntax error in character conversion definition"
msgstr "syntaxfel i teckenkonverteringsdefinition"
-#: locale/programs/locfile.c:662
+#: locale/programs/locfile.c:684
msgid "syntax error in collating order definition"
msgstr "syntaxfel i kollationssorteringsdefinition"
-#: locale/programs/locfile.c:512
+#: locale/programs/locfile.c:534
msgid "syntax error in collation definition"
msgstr "syntaxfel i kollationsdefinition"
-#: locale/programs/locfile.c:335
+#: locale/programs/locfile.c:357
msgid "syntax error in definition of LC_CTYPE category"
msgstr "syntaxfel i definition av kategorin LC_CTYPE"
-#: locale/programs/locfile.c:278
+#: locale/programs/locfile.c:300
msgid "syntax error in definition of new character class"
msgstr "syntaxfel i definition av ny teckenklass"
-#: locale/programs/locfile.c:288
+#: locale/programs/locfile.c:310
msgid "syntax error in definition of new character map"
msgstr "syntaxfel i definition av ny teckenuppsättning"
-#: locale/programs/locfile.c:873
+#: locale/programs/locfile.c:895
msgid "syntax error in message locale definition"
msgstr "syntaxfel i definition av meddelandelokal"
-#: locale/programs/locfile.c:784
+#: locale/programs/locfile.c:806
msgid "syntax error in monetary locale definition"
msgstr "syntaxfel i definition av monetärlokal"
-#: locale/programs/locfile.c:811
+#: locale/programs/locfile.c:833
msgid "syntax error in numeric locale definition"
msgstr "syntaxfel i definition av numerisk lokal"
-#: locale/programs/locfile.c:722
+#: locale/programs/locfile.c:744
msgid "syntax error in order specification"
msgstr "syntaxfel i sorteringsspecifikation"
msgid "syntax error in prolog: %s"
msgstr "syntaxfel i prolog: %s"
-#: locale/programs/locfile.c:849
+#: locale/programs/locfile.c:871
msgid "syntax error in time locale definition"
msgstr "syntaxfel i definition av tidslokal"
-#: locale/programs/locfile.c:255
+#: locale/programs/locfile.c:277
msgid "syntax error: not inside a locale definition section"
msgstr "syntaxfel: inte inne i en lokaldefinition"
-#: catgets/gencat.c:380 catgets/gencat.c:516 catgets/gencat.c:543
+#: catgets/gencat.c:381 catgets/gencat.c:517 catgets/gencat.c:544
msgid "this is the first definition"
msgstr "detta är den första definitionen"
-#: time/zic.c:1119
+#: time/zic.c:1117
msgid "time before zero"
msgstr "tid före noll"
-#: time/zic.c:1127 time/zic.c:1959 time/zic.c:1978
+#: time/zic.c:1125 time/zic.c:1986 time/zic.c:2005
msgid "time overflow"
msgstr "för stort tidsvärde"
msgid "too many character classes defined"
msgstr "för många teckenklasser definierade"
-#: time/zic.c:1788
+#: time/zic.c:1815
msgid "too many leap seconds"
msgstr "för många skottsekunder"
-#: time/zic.c:1760
+#: time/zic.c:1787
msgid "too many local time types"
msgstr "för många lokala tidstyper"
-#: time/zic.c:1714
+#: time/zic.c:1741
msgid "too many transitions?!"
msgstr "för många övergångar?!"
-#: locale/programs/ld-collate.c:1623
+#: locale/programs/ld-collate.c:1626
msgid "too many weights"
msgstr "för många vikter"
-#: time/zic.c:2082
+#: time/zic.c:2109
msgid "too many, or too long, time zone abbreviations"
msgstr "för många eller för långa tidszonförkortningar"
msgid "trouble replying to prog %d\n"
msgstr "problem att svara till prog %d\n"
-#: locale/programs/ld-collate.c:1383
+#: locale/programs/ld-collate.c:1386
msgid "two lines in a row containing `...' are not allowed"
msgstr "två rader efter varann som har \"...\" är inte tillåtet"
-#: time/zic.c:1283
+#: time/zic.c:1281
msgid "typed single year"
msgstr "satte typ på endast ett år"
#: locale/programs/ld-messages.c:193 locale/programs/ld-messages.c:204
#: locale/programs/ld-messages.c:215 locale/programs/ld-messages.c:226
-#: locale/programs/ld-time.c:696
+#: locale/programs/ld-time.c:698
#, c-format
msgid "unknown character in field `%s' of category `%s'"
msgstr "okänt tecken i fält \"%s\" i kategori \"%s\""
-#: locale/programs/locfile.c:585
+#: locale/programs/locfile.c:607
msgid "unknown collation directive"
msgstr "okänt kollationsdirektiv"
-#: catgets/gencat.c:477
+#: catgets/gencat.c:478
#, c-format
msgid "unknown directive `%s': line ignored"
msgstr "okänt direktiv \"%s\": rad ignorerad"
-#: catgets/gencat.c:456
+#: catgets/gencat.c:457
#, c-format
msgid "unknown set `%s'"
-msgstr "okänd uppsättning \"%s\""
-
-msgid "unknown signal"
-msgstr "okänd signal"
+msgstr "okänd mängd \"%s\""
-#: locale/programs/ld-collate.c:1367 locale/programs/ld-collate.c:1558
-#: locale/programs/ld-collate.c:1732
+#: locale/programs/ld-collate.c:1370 locale/programs/ld-collate.c:1561
+#: locale/programs/ld-collate.c:1735
#, c-format
msgid "unknown symbol `%.*s': line ignored"
msgstr "okänd symbol \"%.*s\": rad ignorerad"
-#: time/zic.c:751
+#: time/zic.c:747
msgid "unruly zone"
msgstr "besvärlig zon"
-#: catgets/gencat.c:961
+#: catgets/gencat.c:962
msgid "unterminated message"
msgstr "oavslutat meddelande"
msgid "unterminated symbolic name"
msgstr "oavslutat symboliskt namn"
-#: locale/programs/ld-collate.c:1685
+#: locale/programs/ld-collate.c:1688
msgid "unterminated weight name"
msgstr "oavslutat viktnamn"
#: locale/programs/charset.c:119
msgid "upper limit in range is not smaller then lower limit"
-msgstr "övre gräns i område är inte mindre än undre gräns"
+msgstr "övre gräns i intervall är inte mindre än undre gräns"
-#: time/zic.c:2025
+#: time/zic.c:2052
msgid "use of 2/29 in non leap-year"
msgstr "använder 29/2 i icke-skottår"
msgid "value for <%s> must lie between 1 and 4"
msgstr "värde på <%s> måste vara mellan 1 och 4"
-#: locale/programs/ld-monetary.c:148 locale/programs/ld-numeric.c:89
+#: locale/programs/ld-monetary.c:149 locale/programs/ld-numeric.c:89
#, c-format
msgid "value for field `%s' in category `%s' must not be the empty string"
msgstr "värde på fält \"%s\" i kategori \"%s\" får inte vara tom sträng"
msgid "value of <mb_cur_max> must be greater than the value of <mb_cur_min>"
msgstr "värdet på <mb_cur_max> måste vara större än värdet på <mb_cur_min>"
-#: locale/programs/ld-monetary.c:138
+#: locale/programs/ld-monetary.c:139
msgid ""
"value of field `int_curr_symbol' in category `LC_MONETARY' does not "
"correspond to a valid name in ISO 4217"
msgstr ""
"värdet på fältet \"int_curr_symbol\" i kategorin LC_MONETARY har fel längd"
-#: locale/programs/ld-monetary.c:370 locale/programs/ld-numeric.c:199
+#: locale/programs/ld-monetary.c:371 locale/programs/ld-numeric.c:199
#, c-format
msgid "values for field `%s' in category `%s' must be smaller than 127"
msgstr "värden på fält \"%s\" i kategorin \"%s\" måste vara mindre än 127"
-#: locale/programs/ld-monetary.c:366
+#: locale/programs/ld-monetary.c:367
#, c-format
msgid "values for field `%s' in category `%s' must not be zero"
msgstr "värden på fält \"%s\" i kategorin \"%s\" får inte vara noll"
msgid "while opening UTMP file"
msgstr "när UTMP-filen öppnades"
-#: catgets/gencat.c:988
+#: catgets/gencat.c:989
msgid "while opening old catalog file"
msgstr "när gammal katalogfil öppnades"
-#: db/makedb.c:353
+#: db/makedb.c:354
msgid "while reading database"
msgstr "när databasen lästes"
-#: db/makedb.c:315
+#: db/makedb.c:316
msgid "while writing data base file"
msgstr "när databasen skrevs"
msgid "wrong number of arguments"
msgstr "fel antal argument"
-#: time/zic.c:1077
+#: time/zic.c:1075
msgid "wrong number of fields on Leap line"
msgstr "fel antal fält på \"Leap\"-rad"
-#: time/zic.c:1168
+#: time/zic.c:1166
msgid "wrong number of fields on Link line"
msgstr "fel antal fält på \"Link\"-rad"
-#: time/zic.c:911
+#: time/zic.c:909
msgid "wrong number of fields on Rule line"
msgstr "fel antal fält på \"Rule\"-rad"
-#: time/zic.c:981
+#: time/zic.c:979
msgid "wrong number of fields on Zone continuation line"
msgstr "fel antal fält på \"Zone\"-fortsättningsrad"
-#: time/zic.c:939
+#: time/zic.c:937
msgid "wrong number of fields on Zone line"
msgstr "fel antal fält på \"Zone\"-rad"
-#: nis/ypclnt.c:570
-msgid "yp_all: clnttcp_create failed"
-msgstr "yp_all: clnttcp_create misslyckades"
-
-#: nis/ypclnt.c:772
+#: nis/ypclnt.c:811
msgid "yp_update: cannot convert host to netname\n"
msgstr "yp_update: kan inte omvandla värd till nätnamn\n"
-#: nis/ypclnt.c:784
+#: nis/ypclnt.c:823
msgid "yp_update: cannot get server address\n"
msgstr "yp_update: kan inte hämta betjäntadress\n"
MSC and drop MAX_BUF_SIZE a bit. Otherwise you may end up
reallocating to 0 bytes. Such thing is not going to work too well.
You have been warned!! */
-#ifdef _MSC_VER
+#if defined(_MSC_VER) && !defined(WIN32)
/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes.
The REALLOC define eliminates a flurry of conversion warnings,
but is not required. */
linebuflen -= n;
/* Get canonical name. */
n = strlen (tbuf) + 1; /* For the \0. */
- if (n > buflen)
+ if ((size_t) n > buflen)
{
++had_error;
continue;
cp += n;
/* Get canonical name. */
n = strlen (tbuf) + 1; /* For the \0. */
- if (n > buflen)
+ if ((size_t) n > buflen)
{
++had_error;
continue;
if (special)
{
- int width = info->prec > info->width ? info->prec : info->width;
+ int width = info->width;
if (is_neg || info->showsign || info->space)
--width;
if (special)
{
- int width = info->prec > info->width ? info->prec : info->width;
+ int width = info->width;
if (negative || info->showsign || info->space)
--width;
headers := string.h strings.h memory.h endian.h bytesex.h \
argz.h envz.h
-routines := strcat strchr strcmp strcoll strcpy strcspn \
+routines := strcat strchr strcmp strcoll strcpy strcspn strverscmp \
strdup strndup \
strerror _strerror strerror_r strlen strnlen \
strncat strncmp strncpy \
envz basename \
strcoll_l strxfrm_l
-tests := tester testcopy test-ffs tst-strlen stratcliff
+tests := tester testcopy test-ffs tst-strlen stratcliff \
+ tst-svc
distribute := memcopy.h pagecopy.h
CFLAGS-tester.c = -fno-builtin
CFLAGS-tst-strlen.c = -fno-builtin
CFLAGS-stratcliff.c = -fno-builtin
+
+tests: $(objpfx)tst-svc.out
+ cmp tst-svc.expect $(objpfx)tst-svc.out
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
#include <string.h>
char *
-basename (const char *filename)
+basename (filename)
+ const char *filename;
{
char *p = strrchr (filename, '/');
return p ? p + 1 : (char *) filename;
#endif
#ifdef __USE_GNU
+/* Compare S1 and S2 as strings holding name & indices/version numbers. */
+extern int strverscmp __P ((__const char *__s1, __const char *__s2));
+
/* Return a string describing the meaning of the signal number in SIG. */
extern char *strsignal __P ((int __sig));
--- /dev/null
+/* Compare strings while treating digits characters numerically.
+ Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.
+
+ 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 <string.h>
+#include <ctype.h>
+
+/* states: S_N: normal, S_I: comparing integral part, S_F: comparing
+ Fractionnal parts, S_Z: idem but with leading Zeroes only */
+#define S_N 0x0
+#define S_I 0x4
+#define S_F 0x8
+#define S_Z 0xC
+
+/* result_type: CMP: return diff; LEN: compare using len_diff/diff */
+#define CMP 2
+#define LEN 3
+
+
+/* Compare S1 and S2 as strings holding indices/version numbers,
+ returning less than, equal to or greater than zero if S1 is less than,
+ equal to or greater than S2 (for more info, see the texinfo doc).
+*/
+
+int
+strverscmp (s1, s2)
+ const char *s1;
+ const char *s2;
+{
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+ int state;
+ int diff;
+
+ /* Symbol(s) 0 [1-9] others (padding)
+ Transition (10) 0 (01) d (00) x (11) - */
+ static const unsigned int next_state[] =
+ {
+ /* state x d 0 - */
+ /* S_N */ S_N, S_I, S_Z, S_N,
+ /* S_I */ S_N, S_I, S_I, S_I,
+ /* S_F */ S_N, S_F, S_F, S_F,
+ /* S_Z */ S_N, S_F, S_Z, S_Z
+ };
+
+ static const int result_type[] =
+ {
+ /* state x/x x/d x/0 x/- d/x d/d d/0 d/-
+ 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */
+
+ /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
+ CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
+ /* S_I */ CMP, -1, -1, CMP, +1, LEN, LEN, CMP,
+ +1, LEN, LEN, CMP, CMP, CMP, CMP, CMP,
+ /* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
+ CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
+ /* S_Z */ CMP, +1, +1, CMP, -1, CMP, CMP, CMP,
+ -1, CMP, CMP, CMP
+ };
+
+ if (p1 == p2)
+ return 0;
+
+ c1 = *p1++;
+ c2 = *p2++;
+ /* Hint: '0' is a digit too. */
+ state = S_N | (c1 == '0') + (isdigit (c1) != 0);
+
+ while ((diff = c1 - c2) == 0 && c1 != '\0')
+ {
+ state = next_state[state];
+ c1 = *p1++;
+ c2 = *p2++;
+ state |= (c1 == '0') + (isdigit (c1) != 0);
+ }
+
+ state = result_type[state << 2 | ((c2 == '0') + (isdigit (c2) != 0))];
+
+ switch (state)
+ {
+ case CMP:
+ return diff;
+
+ case LEN:
+ while (isdigit (*p1++))
+ if (!isdigit (*p2++))
+ return 1;
+
+ return isdigit (*p2) ? -1 : diff;
+
+ default:
+ return state;
+ }
+}
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
#include <ansidecl.h>
#include <errno.h>
#include <stdio.h>
}
/* Complain if first two args don't strcmp as equal. */
+void equal(CONST char *a, CONST char *b, int number);
void
DEFUN(equal, (a, b, number), CONST char *a AND CONST char *b AND int number)
{
check(strcmp("a\203", "a") > 0, 8); /* Tricky if char signed. */
check(strcmp("a\203", "a\003") > 0, 9);
+ {
+ char buf1[0x40], buf2[0x40];
+ int i, j;
+ for (i=0; i < 0x10; i++)
+ for (j = 0; j < 0x10; j++)
+ {
+ int k;
+ for (k = 0; k < 0x3f; k++)
+ {
+ buf1[j] = '0' ^ (k & 4);
+ buf2[j] = '4' ^ (k & 4);
+ }
+ buf1[i] = buf1[0x3f] = 0;
+ buf2[j] = buf2[0x3f] = 0;
+ for (k = 0; k < 0xf; k++)
+ {
+ int cnum = 0x10+0x10*k+0x100*j+0x1000*i;
+ check(strcmp(buf1+i,buf2+j) == 0, cnum);
+ buf1[i+k] = 'A' + i + k;
+ buf1[i+k+1] = 0;
+ check(strcmp(buf1+i,buf2+j) > 0, cnum+1);
+ check(strcmp(buf2+j,buf1+i) < 0, cnum+2);
+ buf2[j+k] = 'B' + i + k;
+ buf2[j+k+1] = 0;
+ check(strcmp(buf1+i,buf2+j) < 0, cnum+3);
+ check(strcmp(buf2+j,buf1+i) > 0, cnum+4);
+ buf2[j+k] = 'A' + i + k;
+ buf1[i] = 'A' + i + 0x80;
+ check(strcmp(buf1+i,buf2+j) > 0, cnum+5);
+ check(strcmp(buf2+j,buf1+i) < 0, cnum+6);
+ buf1[i] = 'A' + i;
+ }
+ }
+ }
+
/* Test strcpy next because we need it to set up other tests. */
it = "strcpy";
check(strcpy(one, "abcd") == one, 1); /* Returned value. */
(void) memset(one+2, 010045, 1);
equal(one, "ax\045xe", 6); /* Unsigned char convert. */
+ /* Test for more complex versions of memset, for all alignments and
+ lengths up to 256. This test takes a little while, perhaps it should
+ be made weaker? */
+ {
+ char data[512];
+ int i;
+ int j;
+ int k;
+ int c;
+
+ for (i = 0; i < 512; i++)
+ data[i] = 'x';
+ for (c = 0; c <= 'y'; c += 'y') /* check for memset(,0,) and
+ memset(,'y',) */
+ for (j = 0; j < 256; j++)
+ for (i = 0; i < 256; i++)
+ {
+ memset(data+i,c,j);
+ for (k = 0; k < i; k++)
+ if (data[k] != 'x')
+ goto fail;
+ for (k = i; k < i+j; k++)
+ {
+ if (data[k] != c)
+ goto fail;
+ data[k] = 'x';
+ }
+ for (k = i+j; k < 512; k++)
+ if (data[k] != 'x')
+ goto fail;
+ continue;
+
+ fail:
+ check(0,7+i+j*256+(c != 0)*256*256);
+ }
+ }
+
/* bcopy - much like memcpy.
Berklix manual is silent about overlap, so don't test it. */
it = "bcopy";
return 1;
}
}
- }
+ }
}
return 0;
}
--- /dev/null
+/* Test for strverscmp() */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define MAX_STRINGS 256
+#define MAX_LINE_SIZE 32
+
+int
+compare (const void *p1, const void *p2)
+{
+ return strverscmp (*((char **) p1), *((char **) p2));
+}
+
+int
+main (int argc, char *argv[])
+{
+ char line[MAX_LINE_SIZE + 1];
+ char *str[MAX_STRINGS];
+ int count = 0;
+ int i, n;
+
+ while (count < MAX_STRINGS && fgets (line, MAX_LINE_SIZE, stdin) != NULL)
+ {
+ n = strlen (line) - 1;
+
+ if (line[n] == '\n')
+ line[n] = '\0';
+
+ str[count] = strdup (line);
+
+ if (str[count] == NULL)
+ exit (EXIT_FAILURE);
+
+ ++count;
+ }
+
+ qsort (str, count, sizeof (char *), compare);
+
+ for (i = 0; i < count; ++i)
+ puts (str[i]);
+
+ exit (EXIT_SUCCESS);
+}
--- /dev/null
+000
+001
+00
+00a
+01
+01a
+0
+0a
+20
+21
+22
+212
+foo
+foo-0.4
+foo-0.4a
+foo-0.4b
+foo-0.5
+foo-0.10.5
+foo-3.01
+foo-3.0
+foo-3.0.0
+foo-3.0.1
+foo-3.2
+foo-3.10
+foo00
+foo0
--- /dev/null
+0a
+00
+0
+01
+001
+01a
+00a
+000
+20
+212
+21
+22
+foo0
+foo00
+foo-0.4
+foo-3.0
+foo
+foo-3.0.0
+foo-3.0.1
+foo-0.5
+foo-0.4b
+foo-3.10
+foo-3.2
+foo-3.01
+foo-0.4a
+foo-0.10.5
/*
* XDR for unix authentication parameters.
+ * Unfortunately, none of these can be declared const.
*/
bool_t
xdr_authunix_parms (XDR * xdrs, struct authunix_parms *p)
stat = RPC_CANTRECV;
goto done_broad;
}
- if (inlen < sizeof (u_long))
+ if ((size_t) inlen < sizeof (u_long))
goto recv_again;
/*
* see if reply transaction id matches sent id.
/****** rpc_clntout.c ******/
void write_stubs(void);
-void printarglist(proc_list *proc,
+void printarglist(proc_list *proc,
const char *addargname, const char *addargtype);
/****** rpc_cout.c ******/
void print_datadef(definition *def);
void print_funcdef(definition *def);
void pxdrfuncdecl(const char *name, int pointerp);
-void pprocdef(proc_list *proc, version_list *vp,
+void pprocdef(proc_list *proc, version_list *vp,
const char *addargtype, int server_p, int mode);
-void pdeclaration(const char *name, declaration *dec, int tab,
+void pdeclaration(const char *name, declaration *dec, int tab,
const char *separator);
/****** rpc_main.c ******/
/* see rpc_scan.h */
/****** rpc_svcout.c ******/
-int nullproc(proc_list *proc);
+int nullproc(const proc_list *proc);
void write_svc_aux(int nomain);
void write_msg_out(void);
#define _RPC_AUTH_UNIX_H 1
#include <features.h>
+#include <sys/types.h>
+#include <rpc/types.h>
+#include <rpc/auth.h>
+#include <rpc/xdr.h>
__BEGIN_DECLS
#define _RPC_CLNT_H 1
#include <features.h>
+#include <sys/types.h>
+#include <rpc/types.h>
+#include <rpc/auth.h>
__BEGIN_DECLS
AUTH *cl_auth; /* authenticator */
struct clnt_ops {
enum clnt_stat (*cl_call) __P ((CLIENT *, u_long, xdrproc_t,
- caddr_t, xdrproc_t,
- caddr_t, struct timeval));
+ caddr_t, xdrproc_t,
+ caddr_t, struct timeval));
/* call remote procedure */
void (*cl_abort) __P ((void)); /* abort a call */
- void (*cl_geterr) __P ((CLIENT *, struct rpc_err *));
+ void (*cl_geterr) __P ((CLIENT *, struct rpc_err *));
/* get specific error code */
- bool_t (*cl_freeres) __P ((CLIENT *, xdrproc_t, caddr_t));
+ bool_t (*cl_freeres) __P ((CLIENT *, xdrproc_t, caddr_t));
/* frees results */
void (*cl_destroy) __P ((CLIENT *)); /* destroy this structure */
bool_t (*cl_control) __P ((CLIENT *, int, char *));
* u_long prog;
* u_long vers;
*/
-extern CLIENT *clntraw_create __P ((__const u_long __prog,
+extern CLIENT *clntraw_create __P ((__const u_long __prog,
__const u_long __vers));
* u_ong vers; -- version number
* char *prot; -- protocol
*/
-extern CLIENT *clnt_create __P ((__const char *__host, __const u_long __prog,
+extern CLIENT *clnt_create __P ((__const char *__host, __const u_long __prog,
__const u_long __vers, __const char *__prot));
int *__sockp, u_int __sendsz,
u_int __recvsz));
-extern int callrpc __P ((__const char *__host, __const u_long __prognum,
+extern int callrpc __P ((__const char *__host, __const u_long __prognum,
__const u_long __versnum, __const u_long __procnum,
__const xdrproc_t __inproc, __const char *__in,
__const xdrproc_t __outproc, char *__out));
/*
* Print an English error message, given the client error code
*/
-extern void clnt_perror __P ((CLIENT *__clnt, __const char *__msg));
+extern void clnt_perror __P ((CLIENT *__clnt, __const char *__msg));
/* stderr */
-extern char *clnt_sperror __P ((CLIENT *__clnt, __const char *__msg));
+extern char *clnt_sperror __P ((CLIENT *__clnt, __const char *__msg));
/* string */
/*
#ifndef _RPC_PMAP_CLNT_H
#define _RPC_PMAP_CLNT_H 1
#include <features.h>
+#include <rpc/types.h>
+#include <rpc/xdr.h>
__BEGIN_DECLS
extern bool_t pmap_unset __P ((__const u_long __program, __const u_long __vers));
extern struct pmaplist *pmap_getmaps __P ((struct sockaddr_in *__address));
extern enum clnt_stat pmap_rmtcall __P ((struct sockaddr_in *__addr,
- __const u_long __prog,
+ __const u_long __prog,
__const u_long __vers,
- __const u_long __proc,
+ __const u_long __proc,
xdrproc_t __xdrargs,
caddr_t __argsp, xdrproc_t __xdrres,
caddr_t __resp, struct timeval __tout,
u_long *__port_ptr));
-extern enum clnt_stat clnt_broadcast __P ((__const u_long __prog,
+extern enum clnt_stat clnt_broadcast __P ((__const u_long __prog,
__const u_long __vers,
- __const u_long __proc,
+ __const u_long __proc,
xdrproc_t __xargs,
caddr_t __argsp,
xdrproc_t __xresults,
caddr_t __resultsp,
resultproc_t __eachresult));
extern u_short pmap_getport __P ((struct sockaddr_in *__address,
- __const u_long __program,
+ __const u_long __program,
__const u_long __version,
u_int __protocol));
#define _RPC_PMAP_RMT_H 1
#include <features.h>
-
+#include <sys/types.h>
+#include <rpc/types.h>
+#include <rpc/xdr.h>
__BEGIN_DECLS
#define _RPC_MSG_H 1
#include <sys/cdefs.h>
+#include <rpc/xdr.h>
#include <rpc/clnt.h>
/*
#define __XDR_HEADER__
#include <features.h>
+#include <sys/types.h>
+#include <rpc/types.h>
/* We need FILE. */
#include <stdio.h>
* This is the number of bytes per unit of external data.
*/
#define BYTES_PER_XDR_UNIT (4)
+/*
+ * This only works if the above is a power of 2. But it's defined to be
+ * 4 by the appropriate RFCs. So it will work. And it's normally quicker
+ * than the old routine.
+ */
+#if 1
+#define RNDUP(x) (((x) + BYTES_PER_XDR_UNIT - 1) & ~(BYTES_PER_XDR_UNIT - 1))
+#else /* this is the old routine */
#define RNDUP(x) ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \
* BYTES_PER_XDR_UNIT)
+#endif
/*
* The XDR handle.
{
bool_t (*x_getlong) __P ((XDR * __xdrs, long *__lp));
/* get a long from underlying stream */
- bool_t (*x_putlong) __P ((XDR * __xdrs, long *__lp));
+ bool_t (*x_putlong) __P ((XDR * __xdrs, __const long *__lp));
/* put a long to " */
bool_t (*x_getbytes) __P ((XDR * __xdrs, caddr_t __addr, u_int __len));
/* get some bytes from " */
/*
* These are the "generic" xdr routines.
+ * None of these can have const applied because it's not possible to
+ * know whether the call is a read or a write to the passed parameter
+ * also, the XDR structure is always updated by some of these calls.
*/
extern bool_t xdr_void __P ((void));
extern bool_t xdr_int __P ((XDR * __xdrs, int *__ip));
*/
/* XDR using memory buffers */
-extern void xdrmem_create __P ((XDR * __xdrs, caddr_t __addr, u_int __size,
- enum xdr_op __op));
+extern void xdrmem_create __P ((XDR * __xdrs, __const caddr_t __addr,
+ u_int __size, enum xdr_op __op));
/* XDR using stdio library */
extern void xdrstdio_create __P ((XDR * __xdrs, FILE * __file,
#include "proto.h"
static void emit_enum(definition *def);
-static void emit_program(definition *def);
-static void emit_union(definition *def);
+static void emit_program(const definition *def);
+static void emit_union(const definition *def);
static void emit_struct(definition *def);
-static void emit_typedef(definition *def);
+static void emit_typedef(const definition *def);
static int findtype(const definition *def, const char *type);
static int undefined(const char *type);
static void print_generic_header(const char *procname, int pointerp);
static void print_ifstat(int indent, const char *prefix, const char *type,
relation rel, const char *amax,
const char *objname, const char *name);
-static void print_stat(int indent, declaration *dec);
-static void print_header(definition *def);
+static void print_stat(int indent, const declaration *dec);
+static void print_header(const definition *def);
static void print_trailer(void);
static char *upcase(const char *str);
emit_program(def);
return;
}
- if(def->def_kind == DEF_TYPEDEF)
+ if (def->def_kind == DEF_TYPEDEF)
{
/* now we need to handle declarations like
- struct typedef foo foo;
- since we don't want this to be expanded into 2 calls to xdr_foo */
+ struct typedef foo foo;
+ since we don't want this to be expanded
+ into 2 calls to xdr_foo */
- if(strcmp(def->def.ty.old_type,def->def_name)==0)
- return;
- };
+ if (strcmp(def->def.ty.old_type,def->def_name)==0)
+ return;
+ };
print_header(def);
switch (def->def_kind) {
emit_typedef(def);
break;
default:
- /* can't happen */
+ /* can't happen */
+ break;
}
print_trailer();
}
static int
findtype(const definition *def, const char *type)
{
-
if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {
return (0);
} else {
undefined(const char *type)
{
definition *def;
-
def = (definition *) FINDVAL(defined, type, findtype);
-
-
return (def == NULL);
}
}
static void
-print_header(definition *def)
+print_header(const definition *def)
{
+ print_generic_header(def->def_name,
+ def->def_kind != DEF_TYPEDEF ||
+ !isvectordef(def->def.ty.old_type,
+ def->def.ty.rel));
-/*
- decl_list *dl;
- bas_type *ptr;
- int i;
- */
-
- print_generic_header( def->def_name,
- def->def_kind != DEF_TYPEDEF ||
- !isvectordef(def->def.ty.old_type, def->def.ty.rel));
-
- /* Now add Inline support */
-
-
- if(inlineflag == 0 )
- return;
- /*May cause lint to complain. but ... */
-f_print(fout, "\t register long *buf;\n\n");
+ /* Now add Inline support */
+ if(inlineflag == 0 )
+ return;
+ /*May cause lint to complain. but ... */
+ f_print(fout, "\t register long *buf;\n\n");
}
static void
-print_prog_header(proc_list *plist)
+print_prog_header(const proc_list *plist)
{
- print_generic_header( plist->args.argname, 1 );
+ print_generic_header(plist->args.argname, 1 );
}
static void
}
static void
-emit_program(definition *def)
+emit_program(const definition *def)
{
decl_list *dl;
version_list *vlist;
}
static void
-emit_union(definition *def)
+emit_union(const definition *def)
{
declaration *dflt;
case_list *cl;
f_print(fout, "\t}\n");
}
+/* this may be const. i haven't traced this one through yet. */
+
static void
emit_struct(definition *def)
{
return;
};
-
-
-
flag=PUT;
for(j=0; j<2; j++){
static void
-emit_typedef(definition *def)
+emit_typedef(const definition *def)
{
const char *prefix = def->def.ty.old_prefix;
const char *type = def->def.ty.old_type;
}
static void
-print_stat(int indent, declaration *dec)
+print_stat(int indent, const declaration *dec)
{
const char *prefix = dec->prefix;
const char *type = dec->type;
/* @(#)rpc_parse.h 1.3 90/08/29 (C) 1987 SMI */
/*
- * rpc_parse.h, Definitions for the RPCL parser
+ * rpc_parse.h, Definitions for the RPCL parser
*/
enum defkind {
REL_VECTOR, /* fixed length array */
REL_ARRAY, /* variable length array */
REL_POINTER, /* pointer */
- REL_ALIAS, /* simple */
+ REL_ALIAS /* simple */
};
typedef enum relation relation;
const char *argname; /* name of struct for arg*/
decl_list *decls;
};
-
+
typedef struct arg_list arg_list;
struct proc_list {
char _errbuf[256]; /* For all messages */
-static void internal_proctype (proc_list * plist);
+static void internal_proctype (const proc_list * plist);
static void p_xdrfunc (const char *rname, const char *typename);
-static void write_real_program (definition * def);
-static void write_program (definition * def, const char *storage);
+static void write_real_program (const definition * def);
+static void write_program (const definition * def, const char *storage);
static void printerr (const char *err, const char *transp);
static void printif (const char *proc, const char *transp,
const char *prefix, const char *arg);
}
void
-internal_proctype (proc_list * plist)
+internal_proctype (const proc_list * plist)
{
f_print (fout, "static ");
ptype (plist->res_prefix, plist->res_type, 1);
Unpacks single user argument of printmsg_1 to call-by-value format
expected by printmsg_1. */
static void
-write_real_program (definition * def)
+write_real_program (const definition * def)
{
version_list *vp;
proc_list *proc;
}
static void
-write_program (definition * def, const char *storage)
+write_program (const definition * def, const char *storage)
{
version_list *vp;
proc_list *proc;
}
int
-nullproc (proc_list * proc)
+nullproc (const proc_list * proc)
{
for (; proc != NULL; proc = proc->next)
{
int *ip;
{
-#ifdef lint
- (void) (xdr_short (xdrs, (short *) ip));
- return (xdr_long (xdrs, (long *) ip));
-#else
#if INT_MAX < LONG_MAX
long l;
#else
#error unexpected integer sizes in_xdr_int()
#endif
-#endif
}
/*
XDR *xdrs;
u_int *up;
{
-#ifdef lint
- (void) (xdr_short (xdrs, (short *) up));
- return (xdr_u_long (xdrs, (u_long *) up));
-#else
#if UINT_MAX < ULONG_MAX
u_long l;
#else
#error unexpected integer sizes in_xdr_u_int()
#endif
-#endif
}
/*
XDR *xdrs;
enum_t *ep;
{
-#ifndef lint
enum sizecheck
{
SIZEVAL
{
return FALSE;
}
-#else /* lint */
- (void) (xdr_short (xdrs, (short *) ep));
- return xdr_long (xdrs, (long *) ep);
-#endif /* lint */
}
/*
bool_t
xdr_float(xdrs, fp)
- register XDR *xdrs;
- register float *fp;
+ XDR *xdrs;
+ float *fp;
{
#ifdef vax
struct ieee_single is;
bool_t
xdr_double(xdrs, dp)
- register XDR *xdrs;
- double *dp;
+ XDR *xdrs;
+ double *dp;
{
#ifdef vax
struct ieee_double id;
#include <rpc/rpc.h>
static bool_t xdrmem_getlong (XDR *, long *);
-static bool_t xdrmem_putlong (XDR *, long *);
+static bool_t xdrmem_putlong (XDR *, const long *);
static bool_t xdrmem_getbytes (XDR *, caddr_t, u_int);
-static bool_t xdrmem_putbytes (XDR *, caddr_t, u_int);
-static u_int xdrmem_getpos (XDR *);
+static bool_t xdrmem_putbytes (XDR *, const caddr_t, u_int);
+static u_int xdrmem_getpos (const XDR *);
static bool_t xdrmem_setpos (XDR *, u_int);
static long *xdrmem_inline (XDR *, int);
-static void xdrmem_destroy (XDR *);
+static void xdrmem_destroy (const XDR *);
static const struct xdr_ops xdrmem_ops =
{
void
xdrmem_create (xdrs, addr, size, op)
XDR *xdrs;
- caddr_t addr;
+ const caddr_t addr;
u_int size;
enum xdr_op op;
{
xdrs->x_handy = size;
}
+/*
+ * Nothing needs to be done for the memory case. The argument is clearly
+ * const.
+ */
+
static void
-xdrmem_destroy (XDR *xdrs)
+xdrmem_destroy (const XDR *xdrs)
{
}
+/*
+ * Gets the next word from the memory referenced by xdrs and places it
+ * in the long pointed to by lp. It then increments the private word to
+ * point at the next element. Neither object pointed to is const
+ */
static bool_t
xdrmem_getlong (xdrs, lp)
XDR *xdrs;
return TRUE;
}
+/*
+ * Puts the long pointed to by lp in the memory referenced by xdrs. It
+ * then increments the private word to point at the next element. The
+ * long pointed at is const
+ */
static bool_t
xdrmem_putlong (xdrs, lp)
XDR *xdrs;
- long *lp;
+ const long *lp;
{
if ((xdrs->x_handy -= 4) < 0)
return TRUE;
}
+/*
+ * Gets an unaligned number of bytes from the xdrs structure and writes them
+ * to the address passed in addr. Be very careful when calling this routine
+ * as it could leave the xdrs pointing to an unaligned structure which is not
+ * a good idea. None of the things pointed to are const.
+ */
static bool_t
xdrmem_getbytes (xdrs, addr, len)
XDR *xdrs;
return TRUE;
}
+/*
+ * The complementary function to the above. The same warnings apply about
+ * unaligned data. The source address is const.
+ */
static bool_t
xdrmem_putbytes (xdrs, addr, len)
XDR *xdrs;
- caddr_t addr;
+ const caddr_t addr;
u_int len;
{
return TRUE;
}
+/*
+ * Not sure what this one does. But it clearly doesn't modify the contents
+ * of xdrs. **FIXME** does this not assume u_int == u_long?
+ */
static u_int
xdrmem_getpos (xdrs)
- XDR *xdrs;
+ const XDR *xdrs;
{
return (u_long) xdrs->x_private - (u_long) xdrs->x_base;
}
+/*
+ * xdrs modified
+ */
static bool_t
xdrmem_setpos (xdrs, pos)
XDR *xdrs;
return TRUE;
}
+/*
+ * xdrs modified
+ */
static long *
xdrmem_inline (xdrs, len)
XDR *xdrs;
#include <rpc/rpc.h>
static bool_t xdrrec_getlong (XDR *, long *);
-static bool_t xdrrec_putlong (XDR *, long *);
+static bool_t xdrrec_putlong (XDR *, const long *);
static bool_t xdrrec_getbytes (XDR *, caddr_t, u_int);
-static bool_t xdrrec_putbytes (XDR *, caddr_t, u_int);
+static bool_t xdrrec_putbytes (XDR *, const caddr_t, u_int);
static u_int xdrrec_getpos (XDR *);
static bool_t xdrrec_setpos (XDR *, u_int);
static long *xdrrec_inline (XDR *, int);
static bool_t
xdrrec_putlong (xdrs, lp)
XDR *xdrs;
- long *lp;
+ const long *lp;
{
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
int32_t *dest_lp = (int32_t *) rstrm->out_finger;
static bool_t
xdrrec_putbytes (xdrs, addr, len)
XDR *xdrs;
- caddr_t addr;
+ const caddr_t addr;
u_int len;
{
RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private;
#include <rpc/xdr.h>
static bool_t xdrstdio_getlong (XDR *, long *);
-static bool_t xdrstdio_putlong (XDR *, long *);
+static bool_t xdrstdio_putlong (XDR *, const long *);
static bool_t xdrstdio_getbytes (XDR *, caddr_t, u_int);
-static bool_t xdrstdio_putbytes (XDR *, caddr_t, u_int);
+static bool_t xdrstdio_putbytes (XDR *, const caddr_t, u_int);
static u_int xdrstdio_getpos (XDR *);
static bool_t xdrstdio_setpos (XDR *, u_int);
static long *xdrstdio_inline (XDR *, int);
}
static bool_t
-xdrstdio_putlong (XDR *xdrs, long *lp)
+xdrstdio_putlong (XDR *xdrs, const long *lp)
{
long mycopy = htonl (*lp);
static bool_t
xdrstdio_getbytes (xdrs, addr, len)
XDR *xdrs;
- caddr_t addr;
+ const caddr_t addr;
u_int len;
{
}
static bool_t
-xdrstdio_putbytes (XDR *xdrs, caddr_t addr, u_int len)
+xdrstdio_putbytes (XDR *xdrs, const caddr_t addr, u_int len)
{
if ((len != 0) && (fwrite (addr, (int) len, 1, (FILE *) xdrs->x_private) != 1))
return FALSE;
#define _RPC_AUTH_H 1
#include <features.h>
+#include <sys/types.h>
+#include <rpc/types.h>
#include <rpc/xdr.h>
__BEGIN_DECLS
struct auth_ops {
void (*ah_nextverf) __P ((AUTH *));
int (*ah_marshal) __P ((AUTH *, XDR *)); /* nextverf & serialize */
- int (*ah_validate) __P ((AUTH *, struct opaque_auth *));
+ int (*ah_validate) __P ((AUTH *, struct opaque_auth *));
/* validate verifier */
int (*ah_refresh) __P ((AUTH *)); /* refresh credentials */
void (*ah_destroy) __P ((AUTH *)); /* destroy this structure */
__gid_t *__aup_gids));
extern AUTH *authunix_create_default __P ((void));
extern AUTH *authnone_create __P ((void));
-extern AUTH *authdes_create __P ((char *__servername, u_int __window,
+extern AUTH *authdes_create __P ((char *__servername, u_int __window,
struct sockaddr *__syncaddr,
des_block *__ckey));
{
register int __result;
__asm__ __volatile__
- ("orl $x0x800fffff, %0\n\t"
+ ("orl $0x800fffff, %0\n\t"
"incl %0\n\t"
"shrl $31, %0"
: "=q" (__result) : "0" (((int *) &__x)[1]));
-/* Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1994, 1995, 1996, 1997 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
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#include <ansidecl.h>
#include <stddef.h>
#include <errno.h>
#include <sys/time.h>
set *OLD to the old value of timer WHICH.
Returns 0 on success, -1 on errors. */
int
-DEFUN(__setitimer, (which, new, old),
- enum __itimer_which which AND
- struct itimerval *new AND struct itimerval *old)
+__setitimer (enum __itimer_which which, const struct itimerval *new,
+ struct itimerval *old)
{
void *crit;
--- /dev/null
+fenv_libc.h
--- /dev/null
+ifeq ($(subdir),math)
+libm-support += fenv_const
+endif
#include <jmp_buf.h>
ENTRY (__longjmp)
- lwz 1,(JB_GPR1*4)(3)
- lwz 2,(JB_GPR2*4)(3)
- lwz 0,(JB_LR*4)(3)
- lwz 14,((JB_GPRS+0)*4)(3)
- lfd 14,((JB_FPRS+0*2)*4)(3)
- lwz 15,((JB_GPRS+1)*4)(3)
- lfd 15,((JB_FPRS+1*2)*4)(3)
- lwz 16,((JB_GPRS+2)*4)(3)
- lfd 16,((JB_FPRS+2*2)*4)(3)
- lwz 17,((JB_GPRS+3)*4)(3)
- lfd 17,((JB_FPRS+3*2)*4)(3)
- lwz 18,((JB_GPRS+4)*4)(3)
- lfd 18,((JB_FPRS+4*2)*4)(3)
- lwz 19,((JB_GPRS+5)*4)(3)
- lfd 19,((JB_FPRS+5*2)*4)(3)
- lwz 20,((JB_GPRS+6)*4)(3)
- lfd 20,((JB_FPRS+6*2)*4)(3)
- mtlr 0
- lwz 21,((JB_GPRS+7)*4)(3)
- lfd 21,((JB_FPRS+7*2)*4)(3)
- lwz 22,((JB_GPRS+8)*4)(3)
- lfd 22,((JB_FPRS+8*2)*4)(3)
- lwz 23,((JB_GPRS+9)*4)(3)
- lfd 23,((JB_FPRS+9*2)*4)(3)
- lwz 24,((JB_GPRS+10)*4)(3)
- lfd 24,((JB_FPRS+10*2)*4)(3)
- lwz 25,((JB_GPRS+11)*4)(3)
- lfd 25,((JB_FPRS+11*2)*4)(3)
- lwz 26,((JB_GPRS+12)*4)(3)
- lfd 26,((JB_FPRS+12*2)*4)(3)
- lwz 27,((JB_GPRS+13)*4)(3)
- lfd 27,((JB_FPRS+13*2)*4)(3)
- lwz 28,((JB_GPRS+14)*4)(3)
- lfd 28,((JB_FPRS+14*2)*4)(3)
- lwz 29,((JB_GPRS+15)*4)(3)
- lfd 29,((JB_FPRS+15*2)*4)(3)
- lwz 30,((JB_GPRS+16)*4)(3)
- lfd 30,((JB_FPRS+16*2)*4)(3)
- lwz 31,((JB_GPRS+17)*4)(3)
- lfd 31,((JB_FPRS+17*2)*4)(3)
- mr 3,4
+ lwz %r1,(JB_GPR1*4)(%r3)
+ lwz %r2,(JB_GPR2*4)(%r3)
+ lwz %r0,(JB_LR*4)(%r3)
+ lwz %r14,((JB_GPRS+0)*4)(%r3)
+ lfd %f14,((JB_FPRS+0*2)*4)(%r3)
+ lwz %r15,((JB_GPRS+1)*4)(%r3)
+ lfd %f15,((JB_FPRS+1*2)*4)(%r3)
+ lwz %r16,((JB_GPRS+2)*4)(%r3)
+ lfd %f16,((JB_FPRS+2*2)*4)(%r3)
+ lwz %r17,((JB_GPRS+3)*4)(%r3)
+ lfd %f17,((JB_FPRS+3*2)*4)(%r3)
+ lwz %r18,((JB_GPRS+4)*4)(%r3)
+ lfd %f18,((JB_FPRS+4*2)*4)(%r3)
+ lwz %r19,((JB_GPRS+5)*4)(%r3)
+ lfd %f19,((JB_FPRS+5*2)*4)(%r3)
+ lwz %r20,((JB_GPRS+6)*4)(%r3)
+ lfd %f20,((JB_FPRS+6*2)*4)(%r3)
+ mtlr %r0
+ lwz %r21,((JB_GPRS+7)*4)(%r3)
+ lfd %f21,((JB_FPRS+7*2)*4)(%r3)
+ lwz %r22,((JB_GPRS+8)*4)(%r3)
+ lfd %f22,((JB_FPRS+8*2)*4)(%r3)
+ lwz %r23,((JB_GPRS+9)*4)(%r3)
+ lfd %f23,((JB_FPRS+9*2)*4)(%r3)
+ lwz %r24,((JB_GPRS+10)*4)(%r3)
+ lfd %f24,((JB_FPRS+10*2)*4)(%r3)
+ lwz %r25,((JB_GPRS+11)*4)(%r3)
+ lfd %f25,((JB_FPRS+11*2)*4)(%r3)
+ lwz %r26,((JB_GPRS+12)*4)(%r3)
+ lfd %f26,((JB_FPRS+12*2)*4)(%r3)
+ lwz %r27,((JB_GPRS+13)*4)(%r3)
+ lfd %f27,((JB_FPRS+13*2)*4)(%r3)
+ lwz %r28,((JB_GPRS+14)*4)(%r3)
+ lfd %f28,((JB_FPRS+14*2)*4)(%r3)
+ lwz %r29,((JB_GPRS+15)*4)(%r3)
+ lfd %f29,((JB_FPRS+15*2)*4)(%r3)
+ lwz %r30,((JB_GPRS+16)*4)(%r3)
+ lfd %f30,((JB_FPRS+16*2)*4)(%r3)
+ lwz %r31,((JB_GPRS+17)*4)(%r3)
+ lfd %f31,((JB_FPRS+17*2)*4)(%r3)
+ mr %r3,%r4
blr
END (__longjmp)
return __value;
}
-/* Optimized versions for some non-standardized functions. */
-#ifdef __USE_MISC
-
-__MATH_INLINE double hypot (double __x, double __y);
-__MATH_INLINE double
-hypot (double __x, double __y)
-{
- return sqrt (__x * __x + __y * __y);
-}
-
-__MATH_INLINE double __sgn (double __x);
-__MATH_INLINE double
-sgn (double __x)
-{
- return (__x == 0.0 ? 0.0 : (__x > 0.0 ? 1.0 : -1.0));
-}
-
-#endif /* __USE_MISC */
-
#endif /* __NO_MATH_INLINES */
#endif /* __GNUC__ */
#include <sysdep.h>
ENTRY (_setjmp)
- li 4,0 /* Set second argument to 0. */
+ li %r4,0 /* Set second argument to 0. */
#ifdef PIC
b __sigsetjmp@plt
#else
#include <sysdep.h>
ENTRY (__setjmp)
- li 4,1 /* Set second argument to 1. */
+ li %r4,1 /* Set second argument to 1. */
#ifdef PIC
b __sigsetjmp@plt
#else
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#ifndef dl_machine_h
+#define dl_machine_h
+
#define ELF_MACHINE_NAME "powerpc"
#include <assert.h>
/* So now work out the difference between where the branch actually points,
and the offset of that location in memory from the start of the file. */
- return (Elf32_Addr)branchaddr - *got +
- (*branchaddr & 0x3fffffc |
- (int)(*branchaddr << 6 & 0x80000000) >> 6);
+ return ((Elf32_Addr)branchaddr - *got
+ + (*branchaddr & 0x3fffffc
+ | (int)(*branchaddr << 6 & 0x80000000) >> 6));
}
#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info) /* nothing */
-/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
- LOADADDR is the load address of the object; INFO is an array indexed
- by DT_* of the .dynamic section info. */
+/* The PLT uses Elf32_Rela relocs. */
+#define elf_machine_relplt elf_machine_rela
-#ifdef RESOLVE
+ /* This code is used in dl-runtime.c to call the `fixup' function
+ and then redirect to the address it returns. It is called
+ from code built in the PLT by elf_machine_runtime_setup. */
+#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+ .section \".text\"
+ .align 2
+ .globl _dl_runtime_resolve
+ .type _dl_runtime_resolve,@function
+_dl_runtime_resolve:
+ # We need to save the registers used to pass parameters.
+ # We build a stack frame to put them in.
+ stwu 1,-48(1)
+ mflr 0
+ stw 3,16(1)
+ stw 4,20(1)
+ stw 0,52(1)
+ stw 5,24(1)
+ # We also need to save some of the condition register fields.
+ mfcr 0
+ stw 6,28(1)
+ stw 7,32(1)
+ stw 8,36(1)
+ stw 9,40(1)
+ stw 10,44(1)
+ stw 0,12(1)
+ # The code that calls this has put parameters for `fixup' in r12 and r11.
+ mr 3,12
+ mr 4,11
+ bl fixup@local
+ # 'fixup' returns the address we want to branch to.
+ mtctr 3
+ # Put the registers back...
+ lwz 0,52(1)
+ lwz 10,44(1)
+ lwz 9,40(1)
+ mtlr 0
+ lwz 0,12(1)
+ lwz 8,36(1)
+ lwz 7,32(1)
+ lwz 6,28(1)
+ mtcrf 0xFF,0
+ lwz 5,24(1)
+ lwz 4,20(1)
+ lwz 3,16(1)
+ # ...unwind the stack frame, and jump to the PLT entry we updated.
+ addi 1,1,48
+ bctr
+0:
+ .size _dl_runtime_resolve,0b-_dl_runtime_resolve
+ # undo '.section text'.
+ .previous
+");
-static inline void
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
- const Elf32_Sym *sym, const struct r_found_version *version)
-{
- const Elf32_Sym *const refsym = sym;
- Elf32_Addr *const reloc_addr = (Elf32_Addr *)(map->l_addr + reloc->r_offset);
- Elf32_Word loadbase, finaladdr;
- const int rinfo = ELF32_R_TYPE (reloc->r_info);
+/* Initial entry point code for the dynamic linker.
+ The C function `_dl_start' is the real entry point;
+ its return value is the user program's entry point. */
+#define RTLD_START \
+static ElfW(Addr) _dl_start (void *arg) __attribute__((unused)); \
+asm ("\
+ .section \".text\"
+ .align 2
+ .globl _start
+ .type _start,@function
+_start:
+ # We start with the following on the stack, from top:
+ # argc (4 bytes)
+ # arguments for program (terminated by NULL)
+ # environment variables (terminated by NULL)
+ # arguments for the program loader
+ # FIXME: perhaps this should do the same trick as elf/start.c?
- if (rinfo == R_PPC_NONE)
- return;
+ # Call _dl_start with one parameter pointing at argc
+ mr 3,1
+ # (we have to frob the stack pointer a bit to allow room for
+ # _dl_start to save the link register)
+ li 4,0
+ addi 1,1,-16
+ stw 4,0(1)
+ bl _dl_start@local
- assert (sym != NULL);
- if (ELF32_ST_TYPE (sym->st_info) == STT_SECTION ||
- rinfo == R_PPC_RELATIVE)
- {
- /* Has already been relocated. */
- loadbase = map->l_addr;
- finaladdr = loadbase + reloc->r_addend;
- }
- else
- {
- int flags;
-
- /* We never want to use a PLT entry as the destination of a
- reloc, when what is being relocated is a branch. This is
- partly for efficiency, but mostly so we avoid loops. */
- if (rinfo == R_PPC_REL24 ||
- rinfo == R_PPC_ADDR24 ||
- rinfo == R_PPC_JMP_SLOT)
- flags = DL_LOOKUP_NOPLT;
- else if (rinfo == R_PPC_COPY)
- flags = DL_LOOKUP_NOEXEC;
- else
- flags = 0;
+ # Now, we do our main work of calling initialisation procedures.
+ # The ELF ABI doesn't say anything about parameters for these,
+ # so we just pass argc, argv, and the environment.
+ # Changing these is strongly discouraged (not least because argc is
+ # passed by value!).
- loadbase = (Elf32_Word) (char *) (RESOLVE (&sym, version, flags));
- if (sym == NULL)
- {
- /* Weak symbol that wasn't actually defined anywhere. */
- assert(loadbase == 0);
- finaladdr = reloc->r_addend;
- }
- else
- finaladdr = (loadbase + (Elf32_Word) (char *) sym->st_value
- + reloc->r_addend);
- }
+ # put our GOT pointer in r31
+ bl _GLOBAL_OFFSET_TABLE_-4@local
+ mflr 31
+ # the address of _start in r30
+ mr 30,3
+ # &_dl_argc in 29, &_dl_argv in 27, and _dl_default_scope in 28
+ lwz 28,_dl_default_scope@got(31)
+ lwz 29,_dl_argc@got(31)
+ lwz 27,_dl_argv@got(31)
+0:
+ # call initfunc = _dl_init_next(_dl_default_scope[2])
+ lwz 3,8(28)
+ bl _dl_init_next@plt
+ # if initfunc is NULL, we exit the loop
+ mr. 0,3
+ beq 1f
+ # call initfunc(_dl_argc, _dl_argv, _dl_argv+_dl_argc+1)
+ mtlr 0
+ lwz 3,0(29)
+ lwz 4,0(27)
+ slwi 5,3,2
+ add 5,4,5
+ addi 5,5,4
+ blrl
+ # and loop.
+ b 0b
+1:
+ # Now, to conform to the ELF ABI, we have to:
+ # pass argv (actually _dl_argv) in r4
+ lwz 4,0(27)
+ # pass argc (actually _dl_argc) in r3
+ lwz 3,0(29)
+ # pass envp (actually _dl_argv+_dl_argc+1) in r5
+ slwi 5,3,2
+ add 5,4,5
+ addi 5,5,4
+ # pass the auxilary vector in r6. This is passed just after _envp.
+ addi 6,5,-4
+2: lwzu 0,4(6)
+ cmpwi 1,0,0
+ bne 2b
+ addi 6,6,4
+ # pass a termination function pointer (in this case _dl_fini) in r7
+ lwz 7,_dl_fini@got(31)
+ # now, call the start function in r30...
+ mtctr 30
+ # pass the stack pointer in r1 (so far so good), pointing to a NULL value
+ # (this lets our startup code distinguish between a program linked statically,
+ # which linux will call with argc on top of the stack which will hopefully
+ # never be zero, and a dynamically linked program which will always have
+ # a NULL on the top of the stack).
+ # Take the opportunity to clear LR, so anyone who accidentally returns
+ # from _start gets SEGV.
+ li 0,0
+ stw 0,0(1)
+ mtlr 0
+ # and also clear _dl_starting_up
+ lwz 26,_dl_starting_up@got(31)
+ stw 0,0(26)
+ # go do it!
+ bctr
+0:
+ .size _start,0b-_start
+ # undo '.section text'.
+ .previous
+");
- /* This is an if/else if chain because GCC 2.7.2.[012] turns case
- statements into non-PIC table lookups. When a later version
- comes out that fixes this, this should be changed. */
- if (rinfo == R_PPC_UADDR32 ||
- rinfo == R_PPC_GLOB_DAT ||
- rinfo == R_PPC_ADDR32 ||
- rinfo == R_PPC_RELATIVE)
- {
- *reloc_addr = finaladdr;
- }
- else if (rinfo == R_PPC_ADDR16_LO)
- {
- *(Elf32_Half*) reloc_addr = finaladdr;
- }
- else if (rinfo == R_PPC_ADDR16_HI)
- {
- *(Elf32_Half*) reloc_addr = finaladdr >> 16;
- }
- else if (rinfo == R_PPC_ADDR16_HA)
- {
- *(Elf32_Half*) reloc_addr = (finaladdr + 0x8000) >> 16;
- }
-#ifndef RTLD_BOOTSTRAP
- else if (rinfo == R_PPC_REL24)
- {
- Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
- if (delta << 6 >> 6 != delta)
- _dl_signal_error (0, map->l_name,
- "R_PPC_REL24 relocation out of range");
- *reloc_addr = *reloc_addr & 0xfc000003 | delta & 0x3fffffc;
- }
- else if (rinfo == R_PPC_ADDR24)
- {
- if (finaladdr << 6 >> 6 != finaladdr)
- _dl_signal_error (0, map->l_name,
- "R_PPC_ADDR24 relocation out of range");
- *reloc_addr = *reloc_addr & 0xfc000003 | finaladdr & 0x3fffffc;
- }
- else if (rinfo == R_PPC_COPY)
- {
- if (sym->st_size != refsym->st_size)
- {
- const char *strtab;
+/* The idea here is that to conform to the ABI, we are supposed to try
+ to load dynamic objects between 0x10000 (we actually use 0x40000 as
+ the lower bound, to increase the chance of a memory reference from
+ a null pointer giving a segfault) and the program's load address.
+ Regrettably, in this code we can't find the program's load address,
+ so we punt and choose 0x01800000, which is below the ABI's
+ recommended default, and what GNU ld currently chooses. We only use
+ the address as a preference for mmap, so if we get it wrong the
+ worst that happens is that it gets mapped somewhere else.
- strtab = ((void *) map->l_addr
- + map->l_info[DT_STRTAB]->d_un.d_ptr);
- _dl_sysdep_error ("Symbol `", strtab + refsym->st_name,
- "' has different size in shared object, "
- "consider re-linking\n", NULL);
- }
- memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
- refsym->st_size));
- }
-#endif
- else if (rinfo == R_PPC_REL32)
- {
- *reloc_addr = finaladdr - (Elf32_Word) (char *) reloc_addr;
- }
- else if (rinfo == R_PPC_JMP_SLOT)
- {
- Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
- if (delta << 6 >> 6 == delta)
- *reloc_addr = OPCODE_B (delta);
- else if (finaladdr <= 0x01fffffc || finaladdr >= 0xfe000000)
- *reloc_addr = OPCODE_BA (finaladdr);
- else
- {
- Elf32_Word *plt;
- Elf32_Word index;
+ FIXME: Unfortunately, 'somewhere else' is probably right after the
+ program's break, which causes malloc to fail. We really need more
+ information here about the way memory is mapped. */
- plt = (Elf32_Word *)((char *)map->l_addr
- + map->l_info[DT_PLTGOT]->d_un.d_val);
- index = (reloc_addr - plt - PLT_INITIAL_ENTRY_WORDS)/2;
+#define ELF_PREFERRED_ADDRESS_DATA \
+static ElfW(Addr) _dl_preferred_address = 1
- if (index >= PLT_DOUBLE_SIZE)
- {
- /* Slots greater than or equal to 2^13 have 4 words available
- instead of two. */
- reloc_addr[0] = OPCODE_LI (11, finaladdr);
- reloc_addr[1] = OPCODE_ADDIS (11, 11, finaladdr + 0x8000 >> 16);
- reloc_addr[2] = OPCODE_MTCTR (11);
- reloc_addr[3] = OPCODE_BCTR ();
- }
- else
- {
- Elf32_Word num_plt_entries;
+#define ELF_PREFERRED_ADDRESS(loader, maplength, mapstartpref) \
+( { \
+ ElfW(Addr) prefd; \
+ if (mapstartpref != 0 && _dl_preferred_address == 1) \
+ _dl_preferred_address = mapstartpref; \
+ if (mapstartpref != 0) \
+ prefd = mapstartpref; \
+ else if (_dl_preferred_address == 1) \
+ prefd = _dl_preferred_address = \
+ (0x01800000 - maplength - 0x10000) & \
+ ~(_dl_pagesize - 1); \
+ else if (_dl_preferred_address < maplength + 0x50000) \
+ prefd = 0; \
+ else \
+ prefd = _dl_preferred_address = \
+ ((_dl_preferred_address - maplength - 0x10000) \
+ & ~(_dl_pagesize - 1)); \
+ prefd; \
+} )
- num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
- / sizeof(Elf32_Rela));
+#define ELF_FIXED_ADDRESS(loader, mapstart) \
+( { \
+ if (mapstart != 0 && _dl_preferred_address == 1) \
+ _dl_preferred_address = mapstart; \
+} )
- reloc_addr[0] = OPCODE_LI (11, index*4);
- reloc_addr[1] =
- OPCODE_B (-(4*(index*2
- + 1
- - PLT_LONGBRANCH_ENTRY_WORDS
- + PLT_INITIAL_ENTRY_WORDS)));
- plt[index+PLT_DATA_START_WORDS (num_plt_entries)] = finaladdr;
- }
- }
- MODIFIED_CODE (reloc_addr);
- }
- else
- assert (! "unexpected dynamic reloc type");
+/* We require the address of the PLT entry returned from fixup, not
+ the first word of the PLT entry. */
+#define ELF_FIXUP_RETURNS_ADDRESS 1
- if (rinfo == R_PPC_ADDR16_LO ||
- rinfo == R_PPC_ADDR16_HI ||
- rinfo == R_PPC_ADDR16_HA ||
- rinfo == R_PPC_REL24 ||
- rinfo == R_PPC_ADDR24)
- MODIFIED_CODE_NOQUEUE (reloc_addr);
-}
+/* Nonzero iff TYPE should not be allowed to resolve to one of
+ the main executable's symbols, as for a COPY reloc. */
+#define elf_machine_lookup_noexec_p(type) ((type) == R_PPC_COPY)
-#define ELF_MACHINE_NO_REL 1
+/* Nonzero iff TYPE describes relocation of a PLT entry, so
+ PLT entries should not be allowed to define the value. */
+/* We never want to use a PLT entry as the destination of a
+ reloc, when what is being relocated is a branch. This is
+ partly for efficiency, but mostly so we avoid loops. */
+#define elf_machine_lookup_noplt_p(type) ((type) == R_PPC_REL24 || \
+ (type) == R_PPC_ADDR24 || \
+ (type) == R_PPC_JMP_SLOT)
-#endif
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
+#define ELF_MACHINE_RELOC_NOPLT R_PPC_JMP_SLOT
/* Nonzero iff TYPE describes relocation of a PLT entry, so
PLT entries should not be allowed to define the value. */
/* elf_machine_runtime_setup handles this. */
}
-/* The PLT uses Elf32_Rela relocs. */
-#define elf_machine_relplt elf_machine_rela
+#endif /* dl_machine_h */
- /* This code is used in dl-runtime.c to call the `fixup' function
- and then redirect to the address it returns. It is called
- from code built in the PLT by elf_machine_runtime_setup. */
-#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
- .section \".text\"
- .align 2
- .globl _dl_runtime_resolve
- .type _dl_runtime_resolve,@function
-_dl_runtime_resolve:
- # We need to save the registers used to pass parameters.
- # We build a stack frame to put them in.
- stwu 1,-48(1)
- mflr 0
- stw 3,16(1)
- stw 4,20(1)
- stw 0,52(1)
- stw 5,24(1)
- # We also need to save some of the condition register fields.
- mfcr 0
- stw 6,28(1)
- stw 7,32(1)
- stw 8,36(1)
- stw 9,40(1)
- stw 10,44(1)
- stw 0,12(1)
- # The code that calls this has put parameters for `fixup' in r12 and r11.
- mr 3,12
- mr 4,11
- bl fixup@local
- # 'fixup' returns the address we want to branch to.
- mtctr 3
- # Put the registers back...
- lwz 0,52(1)
- lwz 10,44(1)
- lwz 9,40(1)
- mtlr 0
- lwz 0,12(1)
- lwz 8,36(1)
- lwz 7,32(1)
- lwz 6,28(1)
- mtcrf 0xFF,0
- lwz 5,24(1)
- lwz 4,20(1)
- lwz 3,16(1)
- # ...unwind the stack frame, and jump to the PLT entry we updated.
- addi 1,1,48
- bctr
-0:
- .size _dl_runtime_resolve,0b-_dl_runtime_resolve
- # undo '.section text'.
- .previous
-");
+#ifdef RESOLVE
-/* Initial entry point code for the dynamic linker.
- The C function `_dl_start' is the real entry point;
- its return value is the user program's entry point. */
-#define RTLD_START \
-static ElfW(Addr) _dl_start (void *arg) __attribute__((unused)); \
-asm ("\
- .section \".text\"
- .align 2
- .globl _start
- .type _start,@function
-_start:
- # We start with the following on the stack, from top:
- # argc (4 bytes)
- # arguments for program (terminated by NULL)
- # environment variables (terminated by NULL)
- # arguments for the program loader
- # FIXME: perhaps this should do the same trick as elf/start.c?
+/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+ LOADADDR is the load address of the object; INFO is an array indexed
+ by DT_* of the .dynamic section info. */
- # Call _dl_start with one parameter pointing at argc
- mr 3,1
- # (we have to frob the stack pointer a bit to allow room for
- # _dl_start to save the link register)
- li 4,0
- addi 1,1,-16
- stw 4,0(1)
- bl _dl_start@local
+static inline void
+elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
+ const Elf32_Sym *sym, const struct r_found_version *version)
+{
+ const Elf32_Sym *const refsym = sym;
+ Elf32_Addr *const reloc_addr = (Elf32_Addr *)(map->l_addr + reloc->r_offset);
+ Elf32_Word loadbase, finaladdr;
+ const int rinfo = ELF32_R_TYPE (reloc->r_info);
- # Now, we do our main work of calling initialisation procedures.
- # The ELF ABI doesn't say anything about parameters for these,
- # so we just pass argc, argv, and the environment.
- # Changing these is strongly discouraged (not least because argc is
- # passed by value!).
+ if (rinfo == R_PPC_NONE)
+ return;
- # put our GOT pointer in r31
- bl _GLOBAL_OFFSET_TABLE_-4@local
- mflr 31
- # the address of _start in r30
- mr 30,3
- # &_dl_argc in 29, &_dl_argv in 27, and _dl_default_scope in 28
- lwz 28,_dl_default_scope@got(31)
- lwz 29,_dl_argc@got(31)
- lwz 27,_dl_argv@got(31)
-0:
- # call initfunc = _dl_init_next(_dl_default_scope[2])
- lwz 3,8(28)
- bl _dl_init_next@plt
- # if initfunc is NULL, we exit the loop
- mr. 0,3
- beq 1f
- # call initfunc(_dl_argc, _dl_argv, _dl_argv+_dl_argc+1)
- mtlr 0
- lwz 3,0(29)
- lwz 4,0(27)
- slwi 5,3,2
- add 5,4,5
- addi 5,5,4
- blrl
- # and loop.
- b 0b
-1:
- # Now, to conform to the ELF ABI, we have to:
- # pass argv (actually _dl_argv) in r4
- lwz 4,0(27)
- # pass argc (actually _dl_argc) in r3
- lwz 3,0(29)
- # pass envp (actually _dl_argv+_dl_argc+1) in r5
- slwi 5,3,2
- add 5,4,5
- addi 5,5,4
- # pass the auxilary vector in r6. This is passed just after _envp.
- addi 6,5,-4
-2: lwzu 0,4(6)
- cmpwi 1,0,0
- bne 2b
- addi 6,6,4
- # pass a termination function pointer (in this case _dl_fini) in r7
- lwz 7,_dl_fini@got(31)
- # now, call the start function in r30...
- mtctr 30
- # pass the stack pointer in r1 (so far so good), pointing to a NULL value
- # (this lets our startup code distinguish between a program linked statically,
- # which linux will call with argc on top of the stack which will hopefully
- # never be zero, and a dynamically linked program which will always have
- # a NULL on the top of the stack).
- # Take the opportunity to clear LR, so anyone who accidentally returns
- # from _start gets SEGV.
- li 0,0
- stw 0,0(1)
- mtlr 0
- # and also clear _dl_starting_up
- lwz 26,_dl_starting_up@got(31)
- stw 0,0(26)
- # go do it!
- bctr
-0:
- .size _start,0b-_start
- # undo '.section text'.
- .previous
-");
+ assert (sym != NULL);
+ /* The condition on the next two lines is a hack around a bug in Solaris
+ tools on Sparc. It's not clear whether it should really be here at all,
+ but if not the binutils need to be changed. */
+ if ((sym->st_shndx != SHN_UNDEF
+ && ELF32_ST_BIND (sym->st_info) == STB_LOCAL)
+ || rinfo == R_PPC_RELATIVE)
+ {
+ /* Has already been relocated. */
+ loadbase = map->l_addr;
+ finaladdr = loadbase + reloc->r_addend;
+ }
+ else
+ {
+ loadbase = (Elf32_Word) (char *) (RESOLVE (&sym, version,
+ ELF32_R_TYPE(reloc->r_info)));
+ if (sym == NULL)
+ {
+ /* Weak symbol that wasn't actually defined anywhere. */
+ assert(loadbase == 0);
+ finaladdr = reloc->r_addend;
+ }
+ else
+ finaladdr = (loadbase + (Elf32_Word) (char *) sym->st_value
+ + reloc->r_addend);
+ }
-/* The idea here is that to conform to the ABI, we are supposed to try
- to load dynamic objects between 0x10000 (we actually use 0x40000 as
- the lower bound, to increase the chance of a memory reference from
- a null pointer giving a segfault) and the program's load address.
- Regrettably, in this code we can't find the program's load address,
- so we punt and choose 0x01800000, which is below the ABI's
- recommended default, and what GNU ld currently chooses. We only use
- the address as a preference for mmap, so if we get it wrong the
- worst that happens is that it gets mapped somewhere else.
+ /* This is an if/else if chain because GCC 2.7.2.[012] turns case
+ statements into non-PIC table lookups. When a later version
+ comes out that fixes this, this should be changed. */
+ if (rinfo == R_PPC_UADDR32 ||
+ rinfo == R_PPC_GLOB_DAT ||
+ rinfo == R_PPC_ADDR32 ||
+ rinfo == R_PPC_RELATIVE)
+ {
+ *reloc_addr = finaladdr;
+ }
+ else if (rinfo == R_PPC_ADDR16_LO)
+ {
+ *(Elf32_Half*) reloc_addr = finaladdr;
+ }
+ else if (rinfo == R_PPC_ADDR16_HI)
+ {
+ *(Elf32_Half*) reloc_addr = finaladdr >> 16;
+ }
+ else if (rinfo == R_PPC_ADDR16_HA)
+ {
+ *(Elf32_Half*) reloc_addr = (finaladdr + 0x8000) >> 16;
+ }
+#ifndef RTLD_BOOTSTRAP
+ else if (rinfo == R_PPC_REL24)
+ {
+ Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
+ if (delta << 6 >> 6 != delta)
+ {
+ _dl_signal_error(0, map->l_name,
+ "R_PPC_REL24 relocation out of range");
+ }
+ *reloc_addr = *reloc_addr & 0xfc000003 | delta & 0x3fffffc;
+ }
+ else if (rinfo == R_PPC_ADDR24)
+ {
+ if (finaladdr << 6 >> 6 != finaladdr)
+ {
+ _dl_signal_error(0, map->l_name,
+ "R_PPC_ADDR24 relocation out of range");
+ }
+ *reloc_addr = *reloc_addr & 0xfc000003 | finaladdr & 0x3fffffc;
+ }
+ else if (rinfo == R_PPC_COPY)
+ {
+ if (sym->st_size != refsym->st_size)
+ {
+ const char *strtab;
- FIXME: Unfortunately, 'somewhere else' is probably right after the
- program's break, which causes malloc to fail. We really need more
- information here about the way memory is mapped. */
+ strtab = ((void *) map->l_addr
+ + map->l_info[DT_STRTAB]->d_un.d_ptr);
+ _dl_sysdep_error ("Symbol `", strtab + refsym->st_name,
+ "' has different size in shared object, "
+ "consider re-linking\n", NULL);
+ }
+ memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
+ refsym->st_size));
+ }
+#endif
+ else if (rinfo == R_PPC_REL32)
+ {
+ *reloc_addr = finaladdr - (Elf32_Word) (char *) reloc_addr;
+ }
+ else if (rinfo == R_PPC_JMP_SLOT)
+ {
+ Elf32_Sword delta = finaladdr - (Elf32_Word) (char *) reloc_addr;
+ if (delta << 6 >> 6 == delta)
+ *reloc_addr = OPCODE_B (delta);
+ else if (finaladdr <= 0x01fffffc || finaladdr >= 0xfe000000)
+ *reloc_addr = OPCODE_BA (finaladdr);
+ else
+ {
+ Elf32_Word *plt;
+ Elf32_Word index;
-#define ELF_PREFERRED_ADDRESS_DATA \
-static ElfW(Addr) _dl_preferred_address = 1;
+ plt = (Elf32_Word *)((char *)map->l_addr
+ + map->l_info[DT_PLTGOT]->d_un.d_val);
+ index = (reloc_addr - plt - PLT_INITIAL_ENTRY_WORDS)/2;
-#define ELF_PREFERRED_ADDRESS(loader, maplength, mapstartpref) \
-( { \
- ElfW(Addr) prefd; \
- if (mapstartpref != 0 && _dl_preferred_address == 1) \
- _dl_preferred_address = mapstartpref; \
- if (mapstartpref != 0) \
- prefd = mapstartpref; \
- else if (_dl_preferred_address == 1) \
- prefd = _dl_preferred_address = \
- (0x01800000 - maplength - 0x10000) & \
- ~(_dl_pagesize - 1); \
- else if (_dl_preferred_address < maplength + 0x50000) \
- prefd = 0; \
- else \
- prefd = _dl_preferred_address = \
- ((_dl_preferred_address - maplength - 0x10000) \
- & ~(_dl_pagesize - 1)); \
- prefd; \
-} )
+ if (index >= PLT_DOUBLE_SIZE)
+ {
+ /* Slots greater than or equal to 2^13 have 4 words available
+ instead of two. */
+ reloc_addr[0] = OPCODE_LI (11, finaladdr);
+ reloc_addr[1] = OPCODE_ADDIS (11, 11, finaladdr + 0x8000 >> 16);
+ reloc_addr[2] = OPCODE_MTCTR (11);
+ reloc_addr[3] = OPCODE_BCTR ();
+ }
+ else
+ {
+ Elf32_Word num_plt_entries;
+
+ num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
+ / sizeof(Elf32_Rela));
+
+ reloc_addr[0] = OPCODE_LI (11, index*4);
+ reloc_addr[1] =
+ OPCODE_B (-(4*(index*2
+ + 1
+ - PLT_LONGBRANCH_ENTRY_WORDS
+ + PLT_INITIAL_ENTRY_WORDS)));
+ plt[index+PLT_DATA_START_WORDS (num_plt_entries)] = finaladdr;
+ }
+ }
+ MODIFIED_CODE (reloc_addr);
+ }
+ else
+ assert (! "unexpected dynamic reloc type");
+
+ if (rinfo == R_PPC_ADDR16_LO ||
+ rinfo == R_PPC_ADDR16_HI ||
+ rinfo == R_PPC_ADDR16_HA ||
+ rinfo == R_PPC_REL24 ||
+ rinfo == R_PPC_ADDR24)
+ MODIFIED_CODE_NOQUEUE (reloc_addr);
+}
+
+#define ELF_MACHINE_NO_REL 1
+
+#endif
-#define ELF_FIXED_ADDRESS(loader, mapstart) \
-( { \
- if (mapstart != 0 && _dl_preferred_address == 1) \
- _dl_preferred_address = mapstart; \
-} )
-#define ELF_FIXUP_RETURNS_ADDRESS 1
--- /dev/null
+/* Clear given exceptions in current floating-point environment.
+ Copyright (C) 1997 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 <fenv_libc.h>
+
+void
+feclearexcept (int excepts)
+{
+ fenv_union_t u;
+
+ /* Get the current state. */
+ u.fenv = fegetenv_register ();
+
+ /* Clear the relevant bits. */
+ u.l[1] = u.l[1] & ~FE_to_sticky (excepts);
+
+ /* Put the new state in effect. */
+ fesetenv_register (u.fenv);
+}
--- /dev/null
+/* Store current floating-point environment.
+ Copyright (C) 1997 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 <fenv_libc.h>
+
+void
+fegetenv (fenv_t *envp)
+{
+ *envp = fegetenv_register ();
+}
--- /dev/null
+/* Return current rounding direction.
+ Copyright (C) 1997 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 <fenv_libc.h>
+
+int
+fegetround (void)
+{
+ fenv_union_t u;
+
+ u.fenv = fegetenv_register ();
+
+ /* The rounding mode is bits 30 and 31 of the FPSCR. */
+ return u.l[1] & 3;
+}
--- /dev/null
+/* Store current floating-point environment and clear exceptions.
+ Copyright (C) 1997 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 <fenv_libc.h>
+
+int
+feholdexcept (fenv_t *envp)
+{
+ fenv_union_t u;
+
+ /* Get the current state. */
+ u.fenv = *envp = fegetenv_register ();
+
+ /* Clear everything except for the rounding mode and non-IEEE arithmetic
+ flag. */
+ u.l[1] = u.l[1] & 7;
+
+ /* Put the new state in effect. */
+ fesetenv_register (u.fenv);
+
+ return 1;
+}
--- /dev/null
+/* Constants for fenv_bits.h.
+ Copyright (C) 1997 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. */
+
+/* We want to specify the bit pattern of the __fe_*_env constants, so
+ pretend they're really `long long' instead of `double'. */
+
+/* If the default argument is used we use this value. */
+const unsigned long long __fe_dfl_env __attribute__ ((aligned (8))) =
+0xfff8000000000000ULL;
+
+/* Floating-point environment where none of the exceptions are masked. */
+const unsigned long long __fe_nomask_env __attribute__ ((aligned (8))) =
+0xfff80000000000f8ULL;
--- /dev/null
+/* Internal libc stuff for floating point environment routines.
+ Copyright (C) 1997 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. */
+
+#ifndef _FENV_LIBC_H
+#define _FENV_LIBC_H 1
+
+#include <fenv.h>
+
+/* Transform a logical or of the FE_* bits to a bit pattern for the
+ appropriate sticky bits in the FPSCR. */
+#define FE_to_sticky(excepts) \
+ (-(excepts & FE_INVALID) & FE_ALL_INVALID \
+ | (excepts) & (FE_ALL_EXCEPT & ~FE_INVALID | FE_ALL_INVALID))
+
+/* The sticky bits in the FPSCR indicating exceptions have occurred. */
+#define FPSCR_STICKY_BITS ((FE_ALL_EXCEPT | FE_ALL_INVALID) & ~FE_INVALID)
+
+/* Equivalent to fegetenv, but returns a fenv_t instead of taking a
+ pointer. */
+#define fegetenv_register() \
+ ({ fenv_t env; asm ("mffs %0" : "=f" (env)); env; })
+
+/* Equivalent to fesetenv, but takes a fenv_t instead of a pointer. */
+#define fesetenv_register(env) \
+ ({ double d = (env); asm ("mtfsf 0xff,%0" : : "f" (d)); })
+
+/* This very handy macro:
+ - Sets the rounding mode to 'round to nearest';
+ - Sets the processor into IEEE mode; and
+ - Prevents exceptions from being raised for inexact results.
+ These things happen to be exactly what you need for typical elementary
+ functions. */
+#define relax_fenv_state() asm ("mtfsfi 7,0")
+
+typedef union
+{
+ fenv_t fenv;
+ unsigned int l[2];
+} fenv_union_t;
+
+#endif /* fenv_libc.h */
--- /dev/null
+/* Copyright (C) 1997 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. */
+
+/* This file should never be included directly. */
+
+#ifndef _FENVBITS_H
+#define _FENVBITS_H 1
+
+/* Define bits representing the exception. We use the bit positions of
+ the appropriate bits in the FPSCR... */
+enum
+ {
+ FE_INEXACT = 1 << 31-6,
+#define FE_INEXACT FE_INEXACT
+ FE_DIVBYZERO = 1 << 31-5,
+#define FE_DIVBYZERO FE_DIVBYZERO
+ FE_UNDERFLOW = 1 << 31-4,
+#define FE_UNDERFLOW FE_UNDERFLOW
+ FE_OVERFLOW = 1 << 31-3,
+#define FE_OVERFLOW FE_OVERFLOW
+
+ /* ... except for FE_INVALID, for which we use bit 31. FE_INVALID
+ actually corresponds to bits 7 through 12 and 21 through 23
+ in the FPSCR, but we can't use that because the current draft
+ says that it must be a power of 2. Instead we use bit 24 which
+ is the enable bit for all the FE_INVALID exceptions. */
+ FE_INVALID = 1 << 31-24,
+#define FE_INVALID FE_INVALID
+
+#ifdef __USE_GNU
+ /* Breakdown of the FE_INVALID bits. Setting FE_INVALID on an
+ input to a routine is equivalent to setting all of these bits;
+ FE_INVALID will be set on output from a routine iff one of
+ these bits is set. Note, though, that you can't disable or
+ enable these exceptions individually. */
+
+ /* Operation with SNaN. */
+ FE_INVALID_SNAN = 1 << 31-7,
+#define FE_INVALID_SNAN FE_INVALID_SNAN
+
+ /* Inf - Inf */
+ FE_INVALID_ISI = 1 << 31-8,
+#define FE_INVALID_ISI FE_INVALID_ISI
+
+ /* Inf / Inf */
+ FE_INVALID_IDI = 1 << 31-9,
+#define FE_INVALID_IDI FE_INVALID_IDI
+
+ /* 0 / 0 */
+ FE_INVALID_ZDZ = 1 << 31-10,
+#define FE_INVALID_ZDZ FE_INVALID_ZDZ
+
+ /* Inf * 0 */
+ FE_INVALID_IMZ = 1 << 31-11,
+#define FE_INVALID_IMZ FE_INVALID_IMZ
+
+ /* Comparison with NaN or SNaN. */
+ FE_INVALID_COMPARE = 1 << 31-12,
+#define FE_INVALID_COMPARE FE_INVALID_COMPARE
+
+ /* Invalid operation flag for software (not set by hardware). */
+ FE_INVALID_SOFTWARE = 1 << 31-21,
+#define FE_INVALID_SOFTWARE FE_INVALID_SOFTWARE
+
+ /* Square root of negative number (including -Inf). */
+ FE_INVALID_SQRT = 1 << 31-22,
+#define FE_INVALID_SQRT FE_INVALID_SQRT
+
+ /* Conversion-to-integer of a NaN or a number too large or too small. */
+ FE_INVALID_INTEGER_CONVERSION = 1 << 31-23,
+#define FE_INVALID_INTEGER_CONVERSION FE_INVALID_INTEGER_CONVERSION
+
+#define __FE_ALL_INVALID \
+ (FE_INVALID_SNAN | FE_INVALID_ISI | FE_INVALID_IDI | FE_INVALID_ZDZ \
+ | FE_INVALID_IMZ | FE_INVALID_COMPARE | FE_INVALID_SOFTWARE \
+ | FE_INVALID_SQRT | FE_INVALID_INTEGER_CONVERSION)
+#endif
+ };
+
+#define FE_ALL_EXCEPT \
+ (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
+
+/* PowerPC chips support all of the four defined rounding modes. We
+ use the bit pattern in the FPSCR as the values for the
+ appropriate macros. */
+enum
+ {
+ FE_TONEAREST = 0,
+#define FE_TONEAREST FE_TONEAREST
+ FE_TOWARDSZERO = 1,
+#define FE_TOWARDSZERO FE_TOWARDSZERO
+ FE_UPWARD = 2,
+#define FE_UPWARD FE_UPWARD
+ FE_DOWNWARD = 3,
+#define FE_DOWNWARD FE_DOWNWARD
+ };
+
+/* Type representing exception flags. */
+typedef unsigned int fexcept_t;
+
+/* Type representing floating-point environment. We leave it as 'double'
+ for efficiency reasons (rather than writing it to a 32-bit integer). */
+typedef double fenv_t;
+
+/* If the default argument is used we use this value. */
+extern const fenv_t __fe_dfl_env;
+#define FE_DFL_ENV (&__fe_dfl_env);
+
+#ifdef __USE_GNU
+/* Floating-point environment where none of the exceptions are masked. */
+extern const fenv_t __fe_nomask_env;
+# define FE_NOMASK_ENV (&__fe_nomask_env);
+#endif
+
+#endif /* fenvbits.h */
--- /dev/null
+/* Install given floating-point environment.
+ Copyright (C) 1997 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 <fenv_libc.h>
+
+void
+fesetenv (const fenv_t *envp)
+{
+ fesetenv_register (*envp);
+}
--- /dev/null
+/* Set current rounding direction.
+ Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ 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 <fenv_libc.h>
+
+int
+fesetround (int round)
+{
+ fenv_union_t u;
+
+ if ((unsigned int) round > 3)
+ return 0;
+
+ /* Get the current state. */
+ u.fenv = fegetenv_register ();
+
+ /* Set the relevant bits. */
+ u.l[1] = u.l[1] & ~3 | round & 3;
+
+ /* Put the new state in effect. */
+ fesetenv_register (u.fenv);
+
+ return 1;
+}
--- /dev/null
+/* Install given floating-point environment and raise exceptions.
+ Copyright (C) 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ 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 <fenv_libc.h>
+
+void
+feupdateenv (const fenv_t *envp)
+{
+ fenv_union_t old, new;
+
+ /* Save the currently set exceptions. */
+ new.fenv = *envp;
+ old.fenv = fegetenv_register ();
+
+ /* Copy the set exceptions from `old' to `new'. */
+ new.l[1] = new.l[1] & 0xE00000FF | old.l[1] & 0x1FFFFF00;
+
+ /* Atomically enable and raise (if appropriate) exceptions set in `new'. */
+ fesetenv_register (new.fenv);
+}
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#include <bstring.h>
-
-#undef ffs
-
-#ifdef __GNUC__
+#include <string.h>
int
ffs (int x)
asm ("cntlzw %0,%1" : "=r" (cnt) : "r" (x & -x));
return 32 - cnt;
}
-
-#else
-#include <sysdeps/generic/ffs.c>
-#endif
--- /dev/null
+/* Store current representation for exceptions.
+ Copyright (C) 1997 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 <fenv_libc.h>
+
+void
+fegetexceptflag (fexcept_t *flagp, int excepts)
+{
+ fenv_union_t u;
+ unsigned int flag;
+
+ /* Get the current state. */
+ u.fenv = fegetenv_register ();
+
+ /* Return that portion that corresponds to the requested exceptions. */
+ *flagp = flag = u.l[1] & FPSCR_STICKY_BITS & FE_to_sticky (excepts);
+}
#define _FPU_MASK_UM 0x20 /* underflow */
#define _FPU_MASK_XM 0x08 /* inexact */
#define _FPU_MASK_IM 0x80 /* invalid operation */
-#define _FPU_MASK_VXCVI 0x100 /* invalid operation for integer convert */
-#define _FPU_MASK_VXSQRT 0x200 /* invalid operation for square root */
-#define _FPU_MASK_VXSOFT 0x400 /* invalid operation raised by software */
-#define _FPU_RESERVED 0xfffff800 /* These bits are reserved are not changed. */
+#define _FPU_RESERVED 0xffffff00 /* These bits are reserved are not changed. */
-/* The fdlibm code requires no interrupts for exceptions. Don't
- change the rounding mode, it would break long double I/O! */
+/* The fdlibm code requires no interrupts for exceptions. */
#define _FPU_DEFAULT 0x00000000 /* Default value. */
/* IEEE: same as above, but (some) exceptions;
we leave the 'inexact' exception off.
*/
-#define _FPU_IEEE 0x000003f0
+#define _FPU_IEEE 0x000000f0
/* Type of the control word. */
typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
tmp[1]; } )
#define _FPU_SETCW(cw) { \
fpu_control_t tmp[2] __attribute__ ((__aligned__(8))); \
- tmp[0] = 0xFFF80000; /* arbitrary, more-or-less */ \
+ tmp[0] = 0xFFF80000; /* More-or-less arbitrary; this is a QNaN. */ \
tmp[1] = cw; \
__asm__ ("lfd 0,%0; mtfsf 255,0" : : "m" (*tmp) : "fr0"); \
}
--- /dev/null
+/* Raise given exceptions.
+ Copyright (C) 1997 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 <fenv_libc.h>
+
+void
+feraiseexcept (int excepts)
+{
+ fenv_union_t u;
+
+ /* Raise exceptions represented by EXCEPTS. It is the responsibility of
+ the OS to ensure that if multiple exceptions occur they are fed back
+ to this process in the proper way; this can happen in hardware,
+ anyway (in particular, inexact with overflow or underflow). */
+
+ /* Get the current state. */
+ u.fenv = fegetenv_register ();
+
+ /* Add the exceptions */
+ u.l[1] = (u.l[1]
+ | excepts & __FPSCR_STICKY_BITS
+ /* Turn FE_INVALID into FE_INVALID_SOFTWARE. */
+ | excepts << (31 - 21) - (31 - 24) & __FE_INVALID_SOFTWARE);
+
+ /* Store the new status word (along with the rest of the environment),
+ triggering any appropriate exceptions. */
+ fesetenv_register (u.fenv);
+}
--- /dev/null
+/* Set floating-point environment exception handling.
+ Copyright (C) 1997 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 <fenv_libc.h>
+
+void
+fesetexceptflag (const fexcept_t *flagp, int excepts)
+{
+ fenv_union_t u;
+
+ /* Get the current state. */
+ u.fenv = fegetenv_register ();
+
+ /* Replace the exception status */
+ u.l[1] = u.l[1] & FPSCR_STICKY_BITS | *flagp & FE_to_sticky (excepts);
+
+ /* Store the new status word (along with the rest of the environment).
+ This may cause floating-point exceptions if the restored state
+ requests it. */
+ fesetenv_register (u.fenv);
+}
--- /dev/null
+/* Test exception in current environment.
+ Copyright (C) 1997 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 <fenv_libc.h>
+
+int
+fetestexcept (int excepts)
+{
+ fenv_union_t u;
+ int flags;
+
+ /* Get the current state. */
+ u.fenv = fegetenv_register ();
+
+ /* Find the bits that indicate exceptions have occurred. */
+ flags = u.l[1] & FPSCR_STICKY_BITS;
+
+ /* Set the FE_INVALID bit if any of the FE_INVALID_* bits are set. */
+ flags |= ((u.l[1] & FE_ALL_INVALID) != 0) << 31-24;
+
+ return flags & excepts;
+}
--- /dev/null
+/* Copyright (C) 1997 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. */
+
+#ifndef _MATHBITS_H
+#define _MATHBITS_H 1
+
+/* FIXME! This file describes properties of the compiler, not the machine;
+ it should not be part of libc!
+
+ FIXME! This file does not deal with the -fshort-double option of
+ gcc! */
+
+#ifdef __GNUC__
+#if __STDC__ == 1
+
+/* In GNU or ANSI mode, gcc leaves `float' expressions as-is, I think. */
+typedef float float_t; /* `float' expressions are evaluated as
+ `float'. */
+typedef double double_t; /* `double' expressions are evaluated as
+ `double'. */
+
+/* Signal that types stay as they were declared. */
+#define FLT_EVAL_METHOD 0
+
+/* Define `INFINITY' as value of type `float_t'. */
+#define INFINITY HUGE_VALF
+
+#else
+
+/* For `gcc -traditional', `float' expressions are evaluated as `double'. */
+typedef double float_t; /* `float' expressions are evaluated as
+ `double'. */
+typedef double double_t; /* `double' expressions are evaluated as
+ `double'. */
+
+/* Signal that both types are `double'. */
+#define FLT_EVAL_METHOD 1
+
+/* Define `INFINITY' as value of type `float_t'. */
+#define INFINITY HUGE_VAL
+
+#endif
+#else
+
+/* Wild guess at types for float_t and double_t. */
+typedef double float_t;
+typedef double double_t;
+
+/* Strange compiler, we don't know how it works. */
+#define FLT_EVAL_METHOD -1
+
+/* Define `INFINITY' as value of type `float_t'. */
+#define INFINITY HUGE_VAL
+
+#endif
+
+#endif /* mathbits.h */
#include <jmp_buf.h>
ENTRY (__sigsetjmp)
- stw 1,(JB_GPR1*4)(3)
- mflr 0
- stw 2,(JB_GPR2*4)(3)
- stw 14,((JB_GPRS+0)*4)(3)
- stfd 14,((JB_FPRS+0*2)*4)(3)
- stw 0,(JB_LR*4)(3)
- stw 15,((JB_GPRS+1)*4)(3)
- stfd 15,((JB_FPRS+1*2)*4)(3)
- stw 16,((JB_GPRS+2)*4)(3)
- stfd 16,((JB_FPRS+2*2)*4)(3)
- stw 17,((JB_GPRS+3)*4)(3)
- stfd 17,((JB_FPRS+3*2)*4)(3)
- stw 18,((JB_GPRS+4)*4)(3)
- stfd 18,((JB_FPRS+4*2)*4)(3)
- stw 19,((JB_GPRS+5)*4)(3)
- stfd 19,((JB_FPRS+5*2)*4)(3)
- stw 20,((JB_GPRS+6)*4)(3)
- stfd 20,((JB_FPRS+6*2)*4)(3)
- stw 21,((JB_GPRS+7)*4)(3)
- stfd 21,((JB_FPRS+7*2)*4)(3)
- stw 22,((JB_GPRS+8)*4)(3)
- stfd 22,((JB_FPRS+8*2)*4)(3)
- stw 23,((JB_GPRS+9)*4)(3)
- stfd 23,((JB_FPRS+9*2)*4)(3)
- stw 24,((JB_GPRS+10)*4)(3)
- stfd 24,((JB_FPRS+10*2)*4)(3)
- stw 25,((JB_GPRS+11)*4)(3)
- stfd 25,((JB_FPRS+11*2)*4)(3)
- stw 26,((JB_GPRS+12)*4)(3)
- stfd 26,((JB_FPRS+12*2)*4)(3)
- stw 27,((JB_GPRS+13)*4)(3)
- stfd 27,((JB_FPRS+13*2)*4)(3)
- stw 28,((JB_GPRS+14)*4)(3)
- stfd 28,((JB_FPRS+14*2)*4)(3)
- stw 29,((JB_GPRS+15)*4)(3)
- stfd 29,((JB_FPRS+15*2)*4)(3)
- stw 30,((JB_GPRS+16)*4)(3)
- stfd 30,((JB_FPRS+16*2)*4)(3)
- stw 31,((JB_GPRS+17)*4)(3)
- stfd 31,((JB_FPRS+17*2)*4)(3)
+ stw %r1,(JB_GPR1*4)(3)
+ mflr %r0
+ stw %r2,(JB_GPR2*4)(3)
+ stw %r14,((JB_GPRS+0)*4)(3)
+ stfd %f14,((JB_FPRS+0*2)*4)(3)
+ stw %r0,(JB_LR*4)(3)
+ stw %r15,((JB_GPRS+1)*4)(3)
+ stfd %f15,((JB_FPRS+1*2)*4)(3)
+ stw %r16,((JB_GPRS+2)*4)(3)
+ stfd %f16,((JB_FPRS+2*2)*4)(3)
+ stw %r17,((JB_GPRS+3)*4)(3)
+ stfd %f17,((JB_FPRS+3*2)*4)(3)
+ stw %r18,((JB_GPRS+4)*4)(3)
+ stfd %f18,((JB_FPRS+4*2)*4)(3)
+ stw %r19,((JB_GPRS+5)*4)(3)
+ stfd %f19,((JB_FPRS+5*2)*4)(3)
+ stw %r20,((JB_GPRS+6)*4)(3)
+ stfd %f20,((JB_FPRS+6*2)*4)(3)
+ stw %r21,((JB_GPRS+7)*4)(3)
+ stfd %f21,((JB_FPRS+7*2)*4)(3)
+ stw %r22,((JB_GPRS+8)*4)(3)
+ stfd %f22,((JB_FPRS+8*2)*4)(3)
+ stw %r23,((JB_GPRS+9)*4)(3)
+ stfd %f23,((JB_FPRS+9*2)*4)(3)
+ stw %r24,((JB_GPRS+10)*4)(3)
+ stfd %f24,((JB_FPRS+10*2)*4)(3)
+ stw %r25,((JB_GPRS+11)*4)(3)
+ stfd %f25,((JB_FPRS+11*2)*4)(3)
+ stw %r26,((JB_GPRS+12)*4)(3)
+ stfd %f26,((JB_FPRS+12*2)*4)(3)
+ stw %r27,((JB_GPRS+13)*4)(3)
+ stfd %f27,((JB_FPRS+13*2)*4)(3)
+ stw %r28,((JB_GPRS+14)*4)(3)
+ stfd %f28,((JB_FPRS+14*2)*4)(3)
+ stw %r29,((JB_GPRS+15)*4)(3)
+ stfd %f29,((JB_FPRS+15*2)*4)(3)
+ stw %r30,((JB_GPRS+16)*4)(3)
+ stfd %f30,((JB_FPRS+16*2)*4)(3)
+ stw %r31,((JB_GPRS+17)*4)(3)
+ stfd %f31,((JB_FPRS+17*2)*4)(3)
#ifdef PIC
b __sigjmp_save@plt
#else
# them, the others we must save.
.section ".text"
- .align 3
+ .align 2
.globl strlen
.type strlen,@function
strlen:
# On entry, r3 points to the string, and it's left that way.
- # We use r6 to store 0x01010101, and r7 to store 0x7f7f7f7f.
+ # We use r6 to store 0xfefefeff, and r7 to store 0x7f7f7f7f.
# r4 is used to keep the current index into the string; r5 holds
# the number of padding bits we prepend to the string to make it
# start at a word boundary. r8 holds the 'current' word.
# r9-12 are temporaries. r0 is used as a temporary and for discarded
# results.
- clrrwi 4,3,2
- lis 6,0xfeff
- lis 7,0x7f7f
- rlwinm 10,3,0,29,29
- lwz 8,0(4)
- addi 7,7,0x7f7f
- rlwinm 5,3,3,27,28
- cmpwi 1,10,0
- li 9,-1
+ clrrwi %r4,%r3,2
+ lis %r6,0xfeff
+ lis %r7,0x7f7f
+ rlwinm %r10,%r3,0,29,29
+ lwz %r8,0(%r4)
+ addi %r7,%r7,0x7f7f
+ rlwinm %r5,%r3,3,27,28
+ cmpwi %cr1,%r10,0
+ li %r9,-1
# That's the setup done, now do the first pair of words.
# We make an exception and use method (2) on the first two words, to reduce
# overhead.
- srw 9,9,5
- and 0,7,8
- or 10,7,8
- add 0,0,7
- nor 0,10,0
- and. 8,0,9
- bne done0
+ srw %r9,%r9,%r5
+ and %r0,%r7,%r8
+ or %r10,%r7,%r8
+ add %r0,%r0,%r7
+ nor %r0,%r10,%r0
+ and. %r8,%r0,%r9
+ bne done0
# Handle second word of pair. Put addi between branches to avoid hurting
# branch prediction.
- addi 6,6,0xfffffeff
-
- bne 1,loop
- lwzu 8,4(4)
- and 0,7,8
- or 10,7,8
- add 0,0,7
- nor. 0,10,0
- bne done0
+ addi %r6,%r6,0xfffffeff
+
+ bne %cr1,loop
+ lwzu %r8,4(%r4)
+ and %r0,%r7,%r8
+ or %r10,%r7,%r8
+ add %r0,%r0,%r7
+ nor. %r8,%r10,%r0
+ bne done0
# The loop.
+
+loop: lwz %r8,4(%r4)
+ lwzu %r9,8(%r4)
+ add %r0,%r6,%r8
+ nor %r10,%r7,%r8
+ and. %r0,%r0,%r10
+ add %r11,%r6,%r9
+ nor %r12,%r7,%r9
+ bne done1
+ and. %r0,%r11,%r12
+ beq loop
-loop: lwz 8,4(4)
- lwzu 9,8(4)
- add 0,6,8
- nor 10,7,8
- and. 0,0,10
- add 11,6,9
- nor 12,7,9
- bne done1
- and. 0,11,12
- beq loop
-
- and 0,7,9
- or 10,7,9
- b done2
-
-done1: addi 4,4,-4
- and 0,7,9
- or 10,7,9
-done2: add 0,0,7
- nor 0,10,0
-
+ and %r0,%r7,%r9
+ add %r0,%r0,%r7
+ andc %r8,%r12,%r0
+ b done0
+
+done1: and %r0,%r7,%r8
+ subi %r4,%r4,4
+ add %r0,%r0,%r7
+ andc %r8,%r10,%r0
+
# When we get to here, r4 points to the first word in the string that
# contains a zero byte, and the most significant set bit in r8 is in that
# byte.
-done0: cntlzw 11,8
- subf 0,3,4
- srwi 11,11,3
- add 3,0,11
+done0: cntlzw %r11,%r8
+ subf %r0,%r3,%r4
+ srwi %r11,%r11,3
+ add %r3,%r0,%r11
blr
0:
.size strlen,0b-strlen
Cambridge, MA 02139, USA. */
#include <ansidecl.h>
-#include <bstring.h>
+#include <string.h>
#undef ffs
/* Save our SP and FP; in the delay slot of the jump, save our
return PC. Save the signal mask if requested with a tail-call
for simplicity; it always returns zero. */
+ ta ST_FLUSH_WINDOWS
#ifdef PIC
mov %o7,%g1
2:
--- /dev/null
+/* Copyright (C) 1991, 1994, 1996, 1997 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. */
+
+/* This file defines the `errno' constants for standalone ARM machines.
+ These constants are essentially arbitrary. */
+
+#if !defined(__Emath_defined) && (defined(_ERRNO_H) || defined(__need_Emath))
+#undef __need_Emath
+#define __Emath_defined 1
+
+#define EDOM 1
+#define ERANGE 2
+#endif
+
+#ifdef _ERRNO_H
+#define ENOSYS 3
+#define EINVAL 4
+#define ESPIPE 5
+#define EBADF 6
+#define ENOMEM 7
+#define EACCES 8
+#define ENFILE 9
+#define EMFILE 10
+#define ENAMETOOLONG 11 /* File name too long */
+#define ELOOP 12 /* Too many symbolic links encountered */
+#define ENOMSG 13 /* No message of desired type */
+#define E2BIG 14 /* Arg list too long */
+#define EINTR 15
+#define EILSEQ 16
+#define ENOEXEC 17
+#define ENOENT 18
+#endif
+
+#define __set_errno(val) errno = (val)
The miscellaneous Unix `readdir' implementations read directory data
into a buffer and fill in a `struct dirent' copy in the `DIR' object. */
-typedef struct
+struct __dirstream
{
int __fd; /* File descriptor. */
size_t __size; /* Total valid data in the block. */
struct dirent __entry; /* Returned by `readdir'. */
- } DIR;
+ };
#endif /* dirstream.h */
struct dirent
{
char d_name[1]; /* Variable length. */
- }
+ };
int
dirfd (dirp)
- FILE *dirp;
+ DIR *dirp;
{
__set_errno (ENOSYS);
return -1;
--- /dev/null
+/* Copyright (C) 1997 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. */
+
+unsigned int if_nametoindex(const char *ifname)
+{
+ return 0;
+}
+
+char *if_indextoname(unsigned int ifindex, char *ifname)
+{
+ return NULL;
+}
+
+void if_freenameindex(struct if_nameindex *ifn)
+{
+}
+
+struct if_nameindex *if_nameindex(void)
+{
+ return NULL;
+}
/* Seek to position POS in DIRP. */
void
seekdir (dirp, pos)
- DIR *dirp
+ DIR *dirp;
off_t pos;
{
if (dirp == NULL)
-/* Copyright (C) 1991, 1994, 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1991, 1994, 1995, 1996, 1997 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 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.
+ 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. */
+ 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 <stddef.h>
#include <errno.h>
int
__setitimer (which, new, old)
enum __itimer_which which;
- struct itimerval *new;
+ const struct itimerval *new;
struct itimerval *old;
{
if (new == NULL)
__sigaction (sig, act, oact)
int sig;
const struct sigaction *act;
- struct sigaction *OACT;
+ struct sigaction *oact;
{
if (sig <= 0 || sig >= NSIG)
{
the installed headers on the system. */
#include <limits.h>
+
+#define MAXSYMLINKS 1
case _SC_SEMAPHORES:
case _SC_SHARED_MEMORY_OBJECTS:
- case _SC_AIO_LIST_MAX:
+ case _SC_AIO_LISTIO_MAX:
case _SC_AIO_MAX:
case _SC_AIO_PRIO_DELTA_MAX:
- case _SC_DELAYTIME_MAX:
+ case _SC_DELAYTIMER_MAX:
case _SC_MQ_OPEN_MAX:
case _SC_MQ_PRIO_MAX:
case _SC_VERSION:
Return the generated filename or NULL if one could not
be generated, putting the length of the string in *LENPTR. */
char *
-__stdio_gen_tempname (buf, bufsize, dir, pfx, dir_search, lenptr)
+__stdio_gen_tempname (buf, bufsize, dir, pfx, dir_search, lenptr, streamptr)
char *buf;
size_t bufsize;
const char *dir;
#include <errno.h>
#include <stdio.h>
+#include <stdarg.h>
/* Write formatted output to file descriptor D according to the format string
FORMAT, using the argument list in ARG. */
vdprintf (int d, const char *format, va_list arg)
{
__set_errno (ENOSYS);
- return NULL;
-}
-
-stub_warning (vdprintf)
-/* Copyright (C) 1997 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 <errno.h>
-#include <stdio.h>
-
-/* Write formatted output to file descriptor D according to the format string
- FORMAT, using the argument list in ARG. */
-int
-vdprintf (int d, const char *format, va_list arg)
-{
- __set_errno (ENOSYS);
- return NULL;
+ return 0;
}
stub_warning (vdprintf)
--- /dev/null
+/* Copyright (C) 1991, 1992, 1994, 1995, 1997 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 <sysdep.h>
+
+/* ARM version. */
+
+SYSCALL__ (fork, 0)
+ /* R1 is now 0 for the parent and 1 for the child. Decrement it to
+ make it -1 (all bits set) for the parent, and 0 (no bits set)
+ for the child. Then AND it with R0, so the parent gets
+ R0&-1==R0, and the child gets R0&0==0. */
+ sub r1, r1, $1
+ and r0, r0, r1
+ RETINSTR(mov, pc, r14)
+PSEUDO_END(fork)
+
+weak_alias (__fork, fork)
#include <sysdeps/unix/sysdep.h>
#include <sysdeps/arm/sysdep.h>
+/* Some definitions to allow the assembler in sysdeps/unix/*.S to build
+ without needing ARM-specific versions of all the files. */
+
+#define ret RETINSTR(mov, pc, r14)
+#define MOVE(a,b) mov b,a
--- /dev/null
+/* Copyright (C) 1996, 1997 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. */
+
+/* clone() is even more special than fork() as it mucks with stacks
+ and invokes a function in the right context after its all over. */
+
+#include <sysdep.h>
+#define _ERRNO_H 1
+#include <errnos.h>
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
+
+ .text
+ENTRY(__clone)
+ /* Somebody needs to write this. */
+PSEUDO_END (__clone)
+
+weak_alias (__clone, clone)
--- /dev/null
+/* Copyright (C) 1995, 1996, 1997 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 <sysdep.h>
+#include <sys/socketcall.h>
+
+#define P(a, b) P2(a, b)
+#define P2(a, b) a##b
+
+ .text
+/* The socket-oriented system calls are handled unusally in Linux.
+ They are all gated through the single `socketcall' system call number.
+ `socketcall' takes two arguments: the first is the subcode, specifying
+ which socket function is being called; and the second is a pointer to
+ the arguments to the specific function.
+
+ The .S files for the other calls just #define socket and #include this. */
+
+.globl P(__,socket)
+ENTRY (P(__,socket))
+
+ /* Do the system call trap. */
+ swi SYS_ify(socketcall)
+
+ /* %eax is < 0 if there was an error. */
+ cmn r0, $124
+ bge syscall_error
+
+ /* Successful; return the syscall's value. */
+ RETINSTR(mov,pc,r14)
+
+PSEUDO_END (P(__,socket))
+
+weak_alias (P(__,socket), socket)
--- /dev/null
+/* Copyright (C) 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
+ 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 <sysdep.h>
+
+/* Please consult the file sysdeps/unix/sysv/linux/arm/sysdep.h for
+ more information about the value -4095 used below.*/
+
+ .text
+ENTRY (syscall)
+
+ /* Normally encoding the system call number in the instruction is
+ good. But we pay the price here. */
+
+ sub sp, sp, $0xc @ get 3 words on the stack
+ orr r0, r0, $0xef000000 @ make up a SWI instruction
+ orr r0, r0, $SWI_BASE
+ str r0, [sp]
+ ldr r0, _reti
+ str r0, [sp, $4]
+ adr r0, _ret
+ str r0, [sp, $8]
+ mov r0, r1
+ mov r1, r2
+ mov r2, r3
+ mov pc, sp
+_ret: add sp, sp, $0xc
+ RETINSTR(mov, pc, r14)
+
+_reti: .word 0xe51ff004 @ ldr pc, [pc, $4]
+
+PSEUDO_END (syscall)
--- /dev/null
+/* Copyright (C) 1992, 93, 95, 96, 97 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995.
+ARM changes by Philip Blundell, <pjb27@cam.ac.uk>, May 1997.
+
+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 _LINUX_ARM_SYSDEP_H
+#define _LINUX_ARM_SYSDEP_H 1
+
+/* There is some commonality. */
+#include <sysdeps/unix/arm/sysdep.h>
+
+/* For Linux we can use the system call table in the header file
+ /usr/include/asm/unistd.h
+ of the kernel. But these symbols do not follow the SYS_* syntax
+ so we have to redefine the `SYS_ify' macro here. */
+#undef SYS_ify
+#define SWI_BASE (9 << 20)
+#define SYS_ify(syscall_name) (SWI_BASE + __NR_##syscall_name)
+
+
+#ifdef ASSEMBLER
+
+/* Linux uses a negative return value to indicate syscall errors,
+ unlike most Unices, which use the condition codes' carry flag.
+
+ Since version 2.1 the return value of a system call might be
+ negative even if the call succeeded. E.g., the `lseek' system call
+ might return a large offset. Therefore we must not anymore test
+ for < 0, but test for a real error by making sure the value in %eax
+ is a real error number. Linus said he will make sure the no syscall
+ returns a value in -1 .. -4095 as a valid result so we can savely
+ test with -4095. */
+#undef PSEUDO
+#define PSEUDO(name, syscall_name, args) \
+ .text; \
+ ENTRY (name) \
+ DO_CALL (args, syscall_name); \
+ cmn r0, $4096; \
+ bge syscall_error;
+
+#undef PSEUDO_END
+#define PSEUDO_END(name) \
+ SYSCALL_ERROR_HANDLER \
+ END (name)
+
+#ifndef PIC
+#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
+#else
+#error Aiee
+#endif /* PIC */
+
+#undef DO_CALL
+#define DO_CALL(args, syscall_name) \
+ swi SYS_ify (syscall_name);
+
+#endif /* ASSEMBLER */
+
+#endif /* linux/arm/sysdep.h */
--- /dev/null
+/* Copyright (C) 1997 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 <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <net/if.h>
+
+#define IF_INET6_FILENAME "/proc/net/if_inet6"
+
+/* /proc/net/if_inet6 contains lines that look like this:
+ *
+ * fe8000000000000000000000836fc168 0b 00 20 80 sit7
+ *
+ * | | | | | |
+ * address --' | | | | |
+ * index --------' | | | |
+ * prefix length ---' | | |
+ * scope --------------' | |
+ * flags -----------------' |
+ * name -------------------------'
+ *
+ */
+
+static int get_one_interface(FILE *fd, char *interface, int iflen, unsigned int *index)
+{
+ char buffer[80];
+ static char seps[] = " \012";
+ char *c = buffer;
+ char *sp;
+ if (!fgets(buffer, 80, fd))
+ return 1;
+ if (strtok_r(buffer, seps, &sp) == NULL) return 1;
+ if (c = strtok_r(NULL, seps, &sp), c == NULL) return 1;
+ *index = strtoul(c, NULL, 16);
+ if (strtok_r(NULL, seps, &sp) == NULL) return 1;
+ if (strtok_r(NULL, seps, &sp) == NULL) return 1;
+ if (strtok_r(NULL, seps, &sp) == NULL) return 1;
+ if (c = strtok_r(NULL, seps, &sp), c == NULL) return 1;
+ strncpy(interface, c, iflen);
+ return 0;
+}
+
+unsigned int if_nametoindex(const char *ifname)
+{
+ FILE *fd = fopen(IF_INET6_FILENAME, "r");
+ char this_ifname[IFNAMSIZ];
+ unsigned int this_index;
+ if (!fd) return 0;
+ while (get_one_interface(fd, this_ifname, IFNAMSIZ, &this_index) == 0) {
+ if (!strcmp(this_ifname, ifname)) {
+ fclose(fd);
+ return this_index;
+ }
+ }
+ fclose(fd);
+ return 0;
+}
+
+char *if_indextoname(unsigned int ifindex, char *ifname)
+{
+ FILE *fd = fopen(IF_INET6_FILENAME, "r");
+ unsigned int this_index;
+ if (!fd) return NULL;
+ while (get_one_interface(fd, ifname, IFNAMSIZ, &this_index) == 0) {
+ if (this_index == ifindex) {
+ fclose(fd);
+ return ifname;
+ }
+ }
+ fclose(fd);
+ return NULL;
+}
+
+void if_freenameindex(struct if_nameindex *ifn)
+{
+ struct if_nameindex *ptr = ifn;
+ while (ptr->if_name || ptr->if_index)
+ {
+ if (ptr->if_name)
+ free(ptr->if_name);
+ ptr++;
+ }
+ free(ifn);
+}
+
+struct if_nameindex *if_nameindex(void)
+{
+ FILE *fd = fopen(IF_INET6_FILENAME, "r");
+ struct if_nameindex *ifn = NULL;
+ int nifs = 0;
+ if (!fd) return NULL;
+ do
+ {
+ struct if_nameindex *newifn;
+ nifs++;
+ newifn = realloc(ifn, nifs*sizeof(struct if_nameindex));
+ if (!newifn)
+ {
+ /* We ran out of memory. */
+ if (--nifs)
+ {
+ free(ifn[nifs-1].if_name);
+ ifn[nifs-1].if_name = 0;
+ ifn[nifs-1].if_index = 0;
+ if_freenameindex(ifn);
+ }
+ return NULL;
+ }
+ ifn = newifn;
+ ifn[nifs-1].if_index = 0;
+ ifn[nifs-1].if_name = malloc(IFNAMSIZ);
+ if (ifn[nifs-1].if_name == NULL)
+ {
+ if_freenameindex(ifn);
+ return NULL;
+ }
+ }
+ while (get_one_interface(fd, ifn[nifs-1].if_name, IFNAMSIZ,
+ &ifn[nifs-1].if_index) == 0);
+ free(ifn[nifs-1].if_name);
+ ifn[nifs-1].if_name = NULL;
+ fclose(fd);
+ return ifn;
+}
# File name Caller Syscall name # args Strong name Weak names
+cacheflush EXTRA cacheflush 4 __cacheflush cacheflush
+
s_getgroups getgroups getgroups 2 __syscall_getgroups
s_llseek llseek _llseek 5 __sys_llseek
s_setgroups setgroups setgroups 2 __syscall_setgroups
#define ifc_buf ifc_ifcu.ifcu_buf /* Buffer address. */
#define ifc_req ifc_ifcu.ifcu_req /* Array of structures. */
+
+/* Convert an interface name to an index, and vice versa. */
+
+unsigned int if_nametoindex(const char *ifname);
+char *if_indextoname(unsigned int ifindex, char *ifname);
+
+/* Return a list of all interfaces and their indices. */
+
+struct if_nameindex {
+ unsigned int if_index; /* 1, 2, ... */
+ char *if_name; /* null terminated name: "eth0", ... */
+};
+
+struct if_nameindex *if_nameindex(void);
+
+/* Free the data returned from if_nameindex. */
+
+void if_freenameindex(struct if_nameindex *ptr);
+
#endif /* net/if.h */
/* IPV6 socket options. */
#define IPV6_ADDRFORM 1
-#define IPV6_RXINFO 2
+#define IPV6_PKTINFO 2
#define IPV6_RXHOPOPTS 3
#define IPV6_RXDSTOPTS 4
#define IPV6_RXSRCRT 5
#define IPV6_CHECKSUM 7
#define IPV6_HOPLIMIT 8
-#define IPV6_TXINFO IPV6_RXINFO
-#define SCM_SRCINFO IPV6_TXINFO
#define SCM_SRCRT IPV6_RXSRCRT
#define IPV6_UNICAST_HOPS 16
/* Bind socket to a priviledged IP port. */
extern int bindresvport __P ((int __sockfd, struct sockaddr_in *__sin));
+
+/* IPv6 packet information. */
+struct in6_pktinfo
+ {
+ struct in6_addr ipi6_addr; /* src/dst IPv6 address */
+ int ipi6_ifindex; /* send/recv interface index */
+ };
+
__END_DECLS
#endif /* netinet/in.h */
ENTRY(__clone)
/* Set up stack frame, save registers. */
- stwu 1,-32(1)
- stw 31,16(1)
- stw 30,20(1)
+ stwu %r1,-32(%r1)
+ stw %r31,16(%r1)
+ stw %r30,20(%r1)
/* Check for child_stack == NULL || fn == NULL. */
- cmpwi 0,4,0
- cmpwi 1,3,0
- cror 2+0*4,2+0*4,2+1*4
- beq- 0,badargs
+ cmpwi %cr0,%r4,0
+ beq- %cr0,badargs
+ cmpwi %cr1,%r3,0
+ beq- %cr1,badargs
/* Set up stack frame for child. */
- addi 4,4,-16
- clrrwi 4,4,4
- li 0,0
- stw 0,0(4)
+ addi %r4,%r4,-16
+ clrrwi %r4,%r4,4
+ li %r0,0
+ stw %r0,0(%r4)
/* Save new stack, fn, args across syscall. */
- mr 30,3 /* Function in r30. */
- mr 31,6 /* Arguments in r31. */
+ mr %r30,%r3 /* Function in r30. */
+ mr %r31,%r6 /* Arguments in r31. */
/* 'flags' argument is first parameter to clone syscall. (The other
argument is the stack pointer, already in r4.) */
- mr 3,5
+ mr %r3,%r5
/* Do the call. */
DO_CALL(SYS_ify(clone))
- bso- error
- beq child
+ bso- error
+ beq child
/* Parent. Restore registers & return. */
- lwz 31,16(1)
- lwz 30,20(1)
- addi 1,1,32
+ lwz %r31,16(%r1)
+ lwz %r30,20(%r1)
+ addi %r1,%r1,32
blr
child:
/* Call procedure. */
- mtlr 30
- mr 3,31
+ mtlr %r30
+ mr %r3,%r31
blrl
/* Call _exit with result from procedure. */
#ifdef PIC
.text
ENTRY(P(__,socket))
- stwu 1,-48(1)
+ stwu %r1,-48(%r1)
#if NARGS >= 1
- stw 3,stackblock(1)
+ stw %r3,stackblock(%r1)
#endif
#if NARGS >= 2
- stw 4,4+stackblock(1)
+ stw %r4,4+stackblock(%r1)
#endif
#if NARGS >= 3
- stw 5,8+stackblock(1)
+ stw %r5,8+stackblock(%r1)
#endif
#if NARGS >= 4
- stw 6,12+stackblock(1)
+ stw %r6,12+stackblock(%r1)
#endif
#if NARGS >= 5
- stw 7,16+stackblock(1)
+ stw %r7,16+stackblock(%r1)
#endif
#if NARGS >= 6
- stw 8,20+stackblock(1)
+ stw %r8,20+stackblock(%r1)
#endif
#if NARGS >= 7
- stw 9,24+stackblock(1)
+ stw %r9,24+stackblock(%r1)
#endif
#if NARGS >= 8
- stw 10,28+stackblock(1)
+ stw %r10,28+stackblock(%r1)
#endif
#if NARGS >= 9
#error too many arguments!
#endif
- li 3,P(SOCKOP_,socket)
- addi 4,1,stackblock
+ li %r3,P(SOCKOP_,socket)
+ addi %r4,%r1,stackblock
DO_CALL(SYS_ify(socketcall))
- addi 1,1,48
+ addi %r1,%r1,48
bnslr
#ifdef PIC
b __syscall_error@plt
.text
ENTRY (syscall)
- mr 0,3
- mr 3,4
- mr 4,5
- mr 5,6
- mr 6,7
- mr 7,8
+ mr %r0,%r3
+ mr %r3,%r4
+ mr %r4,%r5
+ mr %r5,%r6
+ mr %r6,%r7
+ mr %r7,%r8
sc
bnslr
#ifdef PIC
b __syscall_error@plt
#else
#define PSEUDO(name, syscall_name, args) \
- .text; \
+ .section ".text"; \
ENTRY (name) \
DO_CALL (SYS_ify (syscall_name)); \
bnslr; \
shmdt (shmaddr)
const void *shmaddr;
{
- return __ipc (IPCOP_shmdt, 0, 0, 0, shmaddr);
+ return __ipc (IPCOP_shmdt, 0, 0, 0, (void *) shmaddr);
}
#ifndef _STATFSBUF_H
#define _STATFSBUF_H
+#include <gnu/types.h> /* for __fsid_t */
+
struct statfs
{
int f_type;
-# @(#)europe 7.43
+# @(#)europe 7.44
# This data is by no means authoritative; if you think you know better,
# go ahead and edit the file (and please send any changes to
1:00 - CET 1941 Apr 18 23:00
1:00 C-Eur CE%sT 1945 May 8 2:00s
1:00 1:00 CEST 1945 Sep 16 2:00s
- 1:00 - CET 1983
+ 1:00 - CET 1982 Oct 11
1:00 EU CE%sT
# Bulgaria
1:00 - CET 1941 Apr 18 23:00
1:00 C-Eur CE%sT 1945 May 8 2:00s
1:00 1:00 CEST 1945 Sep 16 2:00s
- 1:00 - CET 1983
+ 1:00 - CET 1982 Oct 11
1:00 EU CE%sT
# Czech Republic
1:00 - CET 1941 Apr 18 23:00
1:00 C-Eur CE%sT 1945 May 8 2:00s
1:00 1:00 CEST 1945 Sep 16 2:00s
- 1:00 - CET 1983
+ 1:00 - CET 1982 Oct 11
1:00 EU CE%sT
# Malta
1:00 - CET 1941 Apr 18 23:00
1:00 C-Eur CE%sT 1945 May 8 2:00s
1:00 1:00 CEST 1945 Sep 16 2:00s
- 1:00 - CET 1983
+ 1:00 - CET 1982 Oct 11
1:00 EU CE%sT
# Spain
1:00 - CET 1941 Apr 18 23:00
1:00 C-Eur CE%sT 1945 May 8 2:00s
1:00 1:00 CEST 1945 Sep 16 2:00s
- 1:00 - CET 1983
+# Metod Kozelj <metod.kozelj@rzs-hm.si> reports that the legal date of
+# transition to EU rules was 1982-10-11, for all of Yugoslavia at the time.
+# Shanks doesn't give as much detail, so go with Kozelj.
+ 1:00 - CET 1982 Oct 11
1:00 EU CE%sT
###############################################################################
set *OLD to the old value of timer WHICH.
Returns 0 on success, -1 on errors. */
extern int __setitimer __P ((enum __itimer_which __which,
- struct itimerval *__new,
+ __const struct itimerval *__new,
struct itimerval *__old));
extern int setitimer __P ((enum __itimer_which __which,
- struct itimerval *__new,
+ __const struct itimerval *__new,
struct itimerval *__old));
/* Change the access time of FILE to TVP[0] and
#ifndef lint
#ifndef NOID
-static char elsieid[] = "@(#)zic.c 7.83";
+static char elsieid[] = "@(#)zic.c 7.87";
#endif /* !defined NOID */
#endif /* !defined lint */
static int linenum;
static time_t max_time;
static int max_year;
+static int max_year_representable;
static time_t min_time;
static int min_year;
+static int min_year_representable;
static int noise;
static const char * rfilename;
static int rlinenum;
cp = ecpyalloc("warning: ");
cp = ecatalloc(cp, string);
- error(string);
+ error(cp);
ifree(cp);
--errors;
}
}
min_year = TM_YEAR_BASE + gmtime(&min_time)->tm_year;
max_year = TM_YEAR_BASE + gmtime(&max_time)->tm_year;
+ min_year_representable = min_year;
+ max_year_representable = max_year;
}
static int
rp->r_todisstd = FALSE;
rp->r_todisgmt = FALSE;
*ep = '\0';
+ break;
case 'g': /* Greenwich */
case 'u': /* Universal */
case 'z': /* Zulu */
} else if (sscanf(cp, scheck(cp, "%d"), &rp->r_loyear) != 1) {
error(_("invalid starting year"));
return;
- }
+ } else if (noise)
+ if (rp->r_loyear < min_year_representable)
+ warning(_("starting year too low to be represented"));
+ else if (rp->r_loyear > max_year_representable)
+ warning(_("starting year too high to be represented"));
cp = hiyearp;
if ((lp = byword(cp, end_years)) != NULL) switch ((int) lp->l_value) {
case YR_MINIMUM:
} else if (sscanf(cp, scheck(cp, "%d"), &rp->r_hiyear) != 1) {
error(_("invalid ending year"));
return;
- }
+ } else if (noise)
+ if (rp->r_loyear < min_year_representable)
+ warning(_("starting year too low to be represented"));
+ else if (rp->r_loyear > max_year_representable)
+ warning(_("starting year too high to be represented"));
if (rp->r_loyear > rp->r_hiyear) {
error(_("starting year greater than ending year"));
return;