mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Update.
1999-12-17 Ulrich Drepper <drepper@cygnus.com> * string/bits/string2.h (__strtok_r_1c): Help gcc optimizing string access. * locale/programs/ld-collate.c: Implement handling of absolute ellipsis. Parsing of file and constructing the internal data structures should now be complete. (collate_finish): Start adding support to generate the data structures which are written out to the file. * intl/dcgettext.c: Rewrite to handle caching of previous results here instead of in the dcgettext macro. * intl/libintl.h (dcgettext): Don't define for systems using this glibc or systems with tsearch. * sysdeps/generic/mathdef.h: Protect definitions for math.h against double inclusion. * sysdeps/alpha/fpu/bits/mathdef.h: Likewise. * sysdeps/i386/fpu/bits/mathdef.h: Likewise. * sysdeps/m68k/fpu/bits/mathdef.h: Likewise. * sysdeps/powerpc/fpu/bits/mathdef.h: Likewise. * sysdeps/i386/fpu/libm-test-ulps: Add more deltas (are mobile PIIs that different?). 1999-12-17 Andreas Jaeger <aj@suse.de> * rt/aio.h (struct aiocb64): Add member __next_prio to sync the struct with aiocb. * rt/Makefile (tests): Added tst-aio64. Added dependency rules for tst-aio64. * rt/tst-aio64.c: New file, copied from tst-aio.c and changed for 64bit tests. 1999-12-15 Thorsten Kukuk <kukuk@suse.de> * sysdeps/unix/sysv/linux/alpha/oldgetrlimit64.c: Removed. * sysdeps/unix/sysv/linux/alpha/oldsetrlimit64.c: Removed. * sysdeps/unix/sysv/linux/bits/resource.h: Change RLIM_INFINITY back to old value (signed long). * sysdeps/unix/sysv/linux/i386/bits/resource.h: New, with unsigned long RLIM_INFINITY. * sysdeps/unix/sysv/linux/getrlimit.c: Moved from here to ... * sysdeps/unix/sysv/linux/i386/getrlimit.c: ... here. * sysdeps/unix/sysv/linux/getrlimit64.c: Moved from here to ... * sysdeps/unix/sysv/linux/i386/getrlimit64.c: ... here. * sysdeps/unix/sysv/linux/oldgetrlimit64.c: Moved from here to ... * sysdeps/unix/sysv/linux/i386/oldgetrlimit64.c: ... here. * sysdeps/unix/sysv/linux/oldsetrlimit64.c: Moved from here to ... * sysdeps/unix/sysv/linux/i386/oldsetrlimit64.c: ... here. * sysdeps/unix/sysv/linux/setrlimit.c: Moved from here to ... * sysdeps/unix/sysv/linux/i386/setrlimit.c: ... here. * sysdeps/unix/sysv/linux/setrlimit64.c: Moved from here to ... * sysdeps/unix/sysv/linux/i386/setrlimit64.c: ... here. * sysdeps/unix/sysv/linux/sparc/bits/resource.h: New. * sysdeps/unix/sysv/linux/sparc/sparc64/oldgetrlimit64.c: Removed. * sysdeps/unix/sysv/linux/sparc/sparc64/oldsetrlimit64.c: Removed. 1999-12-17 Andreas Jaeger <aj@suse.de> * elf/ldconfig.c: Add new option -l to manualy link shared libraries. (options): Added option. (parse_opt): Set option. (main): Handle option. (manual_link): New function. 1999-12-17 Thorsten Kukuk <kukuk@suse.de> * string/bits/string2.h: Fix patch from 1999-12-07. 1999-12-16 Ulrich Drepper <drepper@cygnus.com> * sysdeps/generic/strsep.c: If delim string has only one character don't run over end of string. * locale/programs/ld-collate.c (insert_weights): Also update next pointer of last cursor element. (insert_value): Return nonzero value if nothing got inserted. (handle_ellipsis): Don't do anything if to-value cannot be inserted. 1999-12-10 Jakub Jelinek <jakub@redhat.com> * stdlib/longlong.h (__sparc_v9__): Use %rDIGIT instead of %DIGIT where appropriate. 1999-12-10 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c (__sigaction): Copy sa_flags into kernel sigaction structure. 1999-12-14 Andreas Jaeger <aj@suse.de> * string/tester.c (test_strsep): More tests for access beyond the final NUL. The first two tests come from PR libc/1486 by martinea@iro.umontreal.ca. 1999-12-14 Thorsten Kukuk <kukuk@suse.de> * nis/ypclnt.c: Correct handling of cached client handles. (__xdr_ypresp_all): Call callback function for errors, too, like Solaris does. * nis/nss_compat/compat-grp.c: Make sure errno is always set correct. * nis/nss_compat/compat-initgroups.c: Likewise. * nis/nss_compat/compat-spwd.c: Likewise. * nis/nss_nis/nis-alias.c: Likewise. * nis/nss_nis/nis-ethers.c: Likewise. * nis/nss_nis/nis-grp.c: Likewise. * nis/nss_nis/nis-hosts.c: Likewise. * nis/nss_nis/nis-netgrp.c: Likewise. * nis/nss_nis/nis-publickey.c: Likewise. * nis/nss_nis/nis-service.c: Likewise. Also use services.byservicename Map if available, optimize query if name/port and protocol is known.
This commit is contained in:
117
ChangeLog
117
ChangeLog
@ -1,3 +1,120 @@
|
|||||||
|
1999-12-17 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* string/bits/string2.h (__strtok_r_1c): Help gcc optimizing string
|
||||||
|
access.
|
||||||
|
|
||||||
|
* locale/programs/ld-collate.c: Implement handling of absolute
|
||||||
|
ellipsis. Parsing of file and constructing the internal data
|
||||||
|
structures should now be complete.
|
||||||
|
(collate_finish): Start adding support to generate the data
|
||||||
|
structures which are written out to the file.
|
||||||
|
|
||||||
|
* intl/dcgettext.c: Rewrite to handle caching of previous results here
|
||||||
|
instead of in the dcgettext macro.
|
||||||
|
* intl/libintl.h (dcgettext): Don't define for systems using this
|
||||||
|
glibc or systems with tsearch.
|
||||||
|
|
||||||
|
* sysdeps/generic/mathdef.h: Protect definitions for math.h
|
||||||
|
against double inclusion.
|
||||||
|
* sysdeps/alpha/fpu/bits/mathdef.h: Likewise.
|
||||||
|
* sysdeps/i386/fpu/bits/mathdef.h: Likewise.
|
||||||
|
* sysdeps/m68k/fpu/bits/mathdef.h: Likewise.
|
||||||
|
* sysdeps/powerpc/fpu/bits/mathdef.h: Likewise.
|
||||||
|
|
||||||
|
* sysdeps/i386/fpu/libm-test-ulps: Add more deltas (are mobile PIIs
|
||||||
|
that different?).
|
||||||
|
|
||||||
|
1999-12-17 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
|
* rt/aio.h (struct aiocb64): Add member __next_prio to sync the
|
||||||
|
struct with aiocb.
|
||||||
|
|
||||||
|
* rt/Makefile (tests): Added tst-aio64.
|
||||||
|
Added dependency rules for tst-aio64.
|
||||||
|
|
||||||
|
* rt/tst-aio64.c: New file, copied from tst-aio.c and changed for
|
||||||
|
64bit tests.
|
||||||
|
|
||||||
|
1999-12-15 Thorsten Kukuk <kukuk@suse.de>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/alpha/oldgetrlimit64.c: Removed.
|
||||||
|
* sysdeps/unix/sysv/linux/alpha/oldsetrlimit64.c: Removed.
|
||||||
|
* sysdeps/unix/sysv/linux/bits/resource.h: Change RLIM_INFINITY back to
|
||||||
|
old value (signed long).
|
||||||
|
* sysdeps/unix/sysv/linux/i386/bits/resource.h: New, with unsigned
|
||||||
|
long RLIM_INFINITY.
|
||||||
|
* sysdeps/unix/sysv/linux/getrlimit.c: Moved from here to ...
|
||||||
|
* sysdeps/unix/sysv/linux/i386/getrlimit.c: ... here.
|
||||||
|
* sysdeps/unix/sysv/linux/getrlimit64.c: Moved from here to ...
|
||||||
|
* sysdeps/unix/sysv/linux/i386/getrlimit64.c: ... here.
|
||||||
|
* sysdeps/unix/sysv/linux/oldgetrlimit64.c: Moved from here to ...
|
||||||
|
* sysdeps/unix/sysv/linux/i386/oldgetrlimit64.c: ... here.
|
||||||
|
* sysdeps/unix/sysv/linux/oldsetrlimit64.c: Moved from here to ...
|
||||||
|
* sysdeps/unix/sysv/linux/i386/oldsetrlimit64.c: ... here.
|
||||||
|
* sysdeps/unix/sysv/linux/setrlimit.c: Moved from here to ...
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setrlimit.c: ... here.
|
||||||
|
* sysdeps/unix/sysv/linux/setrlimit64.c: Moved from here to ...
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setrlimit64.c: ... here.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/bits/resource.h: New.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sparc64/oldgetrlimit64.c: Removed.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sparc64/oldsetrlimit64.c: Removed.
|
||||||
|
|
||||||
|
1999-12-17 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
|
* elf/ldconfig.c: Add new option -l to manualy link shared
|
||||||
|
libraries.
|
||||||
|
(options): Added option.
|
||||||
|
(parse_opt): Set option.
|
||||||
|
(main): Handle option.
|
||||||
|
(manual_link): New function.
|
||||||
|
|
||||||
|
1999-12-17 Thorsten Kukuk <kukuk@suse.de>
|
||||||
|
|
||||||
|
* string/bits/string2.h: Fix patch from 1999-12-07.
|
||||||
|
|
||||||
|
1999-12-16 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* sysdeps/generic/strsep.c: If delim string has only one character
|
||||||
|
don't run over end of string.
|
||||||
|
|
||||||
|
* locale/programs/ld-collate.c (insert_weights): Also update next
|
||||||
|
pointer of last cursor element.
|
||||||
|
(insert_value): Return nonzero value if nothing got inserted.
|
||||||
|
(handle_ellipsis): Don't do anything if to-value cannot be inserted.
|
||||||
|
|
||||||
|
1999-12-10 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* stdlib/longlong.h (__sparc_v9__): Use %rDIGIT instead of %DIGIT
|
||||||
|
where appropriate.
|
||||||
|
|
||||||
|
1999-12-10 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c (__sigaction):
|
||||||
|
Copy sa_flags into kernel sigaction structure.
|
||||||
|
|
||||||
|
1999-12-14 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
|
* string/tester.c (test_strsep): More tests for access beyond
|
||||||
|
the final NUL. The first two tests come from PR libc/1486 by
|
||||||
|
martinea@iro.umontreal.ca.
|
||||||
|
|
||||||
|
1999-12-14 Thorsten Kukuk <kukuk@suse.de>
|
||||||
|
|
||||||
|
* nis/ypclnt.c: Correct handling of cached client handles.
|
||||||
|
(__xdr_ypresp_all): Call callback function for errors, too,
|
||||||
|
like Solaris does.
|
||||||
|
* nis/nss_compat/compat-grp.c: Make sure errno is always set correct.
|
||||||
|
* nis/nss_compat/compat-initgroups.c: Likewise.
|
||||||
|
* nis/nss_compat/compat-spwd.c: Likewise.
|
||||||
|
* nis/nss_nis/nis-alias.c: Likewise.
|
||||||
|
* nis/nss_nis/nis-ethers.c: Likewise.
|
||||||
|
* nis/nss_nis/nis-grp.c: Likewise.
|
||||||
|
* nis/nss_nis/nis-hosts.c: Likewise.
|
||||||
|
* nis/nss_nis/nis-netgrp.c: Likewise.
|
||||||
|
* nis/nss_nis/nis-publickey.c: Likewise.
|
||||||
|
* nis/nss_nis/nis-service.c: Likewise. Also use services.byservicename
|
||||||
|
Map if available, optimize query if name/port and protocol is known.
|
||||||
|
|
||||||
1999-12-12 Ulrich Drepper <drepper@cygnus.com>
|
1999-12-12 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
* locale/programs/ld-collate.c (collate_read): Make symbolic
|
* locale/programs/ld-collate.c (collate_read): Make symbolic
|
||||||
|
@ -20,7 +20,9 @@
|
|||||||
# error "Never use <bits/mathdef.h> directly; include <math.h> instead"
|
# error "Never use <bits/mathdef.h> directly; include <math.h> instead"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined __USE_ISOC99 && defined _MATH_H
|
#if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF
|
||||||
|
# define _MATH_H_MATHDEF 1
|
||||||
|
|
||||||
/* Normally, there is no long double type and the `float' and `double'
|
/* Normally, there is no long double type and the `float' and `double'
|
||||||
expressions are evaluated as `double'. */
|
expressions are evaluated as `double'. */
|
||||||
typedef double float_t; /* `float' expressions are evaluated as
|
typedef double float_t; /* `float' expressions are evaluated as
|
||||||
|
@ -97,6 +97,9 @@ static int opt_only_cline = 0;
|
|||||||
/* Path to root for chroot. */
|
/* Path to root for chroot. */
|
||||||
static char *opt_chroot;
|
static char *opt_chroot;
|
||||||
|
|
||||||
|
/* Manually link given shared libraries. */
|
||||||
|
static int opt_manual_link = 0;
|
||||||
|
|
||||||
/* Cache file to use. */
|
/* Cache file to use. */
|
||||||
static const char *cache_file;
|
static const char *cache_file;
|
||||||
|
|
||||||
@ -119,6 +122,7 @@ static const struct argp_option options[] =
|
|||||||
{ NULL, 'C', "CACHE", 0, N_("Use CACHE as cache file"), 0},
|
{ NULL, 'C', "CACHE", 0, N_("Use CACHE as cache file"), 0},
|
||||||
{ NULL, 'f', "CONF", 0, N_("Use CONF as configuration file"), 0},
|
{ NULL, 'f', "CONF", 0, N_("Use CONF as configuration file"), 0},
|
||||||
{ NULL, 'n', NULL, 0, N_("Only process directories specified on the command line. Don't build cache."), 0},
|
{ NULL, 'n', NULL, 0, N_("Only process directories specified on the command line. Don't build cache."), 0},
|
||||||
|
{ NULL, 'l', NULL, 0, N_("Manually link individual libraries."), 0},
|
||||||
{ NULL, 0, NULL, 0, NULL, 0 }
|
{ NULL, 0, NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -148,6 +152,9 @@ parse_opt (int key, char *arg, struct argp_state *state)
|
|||||||
case 'f':
|
case 'f':
|
||||||
config_file = arg;
|
config_file = arg;
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
opt_manual_link = 1;
|
||||||
|
break;
|
||||||
case 'N':
|
case 'N':
|
||||||
opt_build_cache = 0;
|
opt_build_cache = 0;
|
||||||
break;
|
break;
|
||||||
@ -323,6 +330,75 @@ create_links (const char *path, const char *libname, const char *soname)
|
|||||||
fputs ("\n", stdout);
|
fputs ("\n", stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Manually link the given library. */
|
||||||
|
static void
|
||||||
|
manual_link (char *library)
|
||||||
|
{
|
||||||
|
char *path;
|
||||||
|
char *libname;
|
||||||
|
char *soname;
|
||||||
|
struct stat stat_buf;
|
||||||
|
int flag;
|
||||||
|
|
||||||
|
/* Prepare arguments for create_links call. Split library name in
|
||||||
|
directory and filename first. Since path is allocated, we've got
|
||||||
|
to be careful to free at the end. */
|
||||||
|
path = xstrdup (library);
|
||||||
|
libname = strrchr (path, '/');
|
||||||
|
|
||||||
|
if (libname)
|
||||||
|
{
|
||||||
|
/* Successfully split names. Check if path is just "/" to avoid
|
||||||
|
an empty path. */
|
||||||
|
if (libname == path)
|
||||||
|
{
|
||||||
|
libname = library + 1;
|
||||||
|
path = xrealloc (path, 2);
|
||||||
|
strcpy (path, "/");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*libname = '\0';
|
||||||
|
++libname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* There's no path, construct one. */
|
||||||
|
libname = library;
|
||||||
|
path = xrealloc (path, 2);
|
||||||
|
strcpy (path, ".");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do some sanity checks first. */
|
||||||
|
if (lstat (library, &stat_buf))
|
||||||
|
{
|
||||||
|
error (0, errno, _("Can't lstat %s"), library);
|
||||||
|
free (path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* We don't want links here! */
|
||||||
|
else if (!S_ISREG (stat_buf.st_mode))
|
||||||
|
{
|
||||||
|
error (0, 0, _("Ignored file %s since it is not a regular file."),
|
||||||
|
library);
|
||||||
|
free (path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
libname = basename (library);
|
||||||
|
if (process_file (library, libname, &flag, &soname, 0))
|
||||||
|
{
|
||||||
|
error (0, 0, _("No link created since soname could not be found for %s"),
|
||||||
|
library);
|
||||||
|
free (path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
create_links (path, libname, soname);
|
||||||
|
free (soname);
|
||||||
|
free (path);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Read a whole directory and search for libraries.
|
/* Read a whole directory and search for libraries.
|
||||||
The purpose is two-fold:
|
The purpose is two-fold:
|
||||||
- search for libraries which will be added to the cache
|
- search for libraries which will be added to the cache
|
||||||
@ -595,8 +671,9 @@ main (int argc, char **argv)
|
|||||||
/* Parse and process arguments. */
|
/* Parse and process arguments. */
|
||||||
argp_parse (&argp, argc, argv, 0, &remaining, NULL);
|
argp_parse (&argp, argc, argv, 0, &remaining, NULL);
|
||||||
|
|
||||||
/* Remaining arguments are additional libraries. */
|
/* Remaining arguments are additional libraries if opt_manual_link
|
||||||
if (remaining != argc)
|
is not set. */
|
||||||
|
if (remaining != argc && !opt_manual_link)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = remaining; i < argc; ++i)
|
for (i = remaining; i < argc; ++i)
|
||||||
@ -626,6 +703,18 @@ main (int argc, char **argv)
|
|||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opt_manual_link)
|
||||||
|
{
|
||||||
|
/* Link all given libraries manually. */
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = remaining; i < argc; ++i)
|
||||||
|
manual_link (argv [i]);
|
||||||
|
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (opt_build_cache)
|
if (opt_build_cache)
|
||||||
init_cache ();
|
init_cache ();
|
||||||
|
|
||||||
|
175
intl/dcgettext.c
175
intl/dcgettext.c
@ -121,6 +121,9 @@ char *getcwd ();
|
|||||||
# ifndef HAVE_STPCPY
|
# ifndef HAVE_STPCPY
|
||||||
static char *stpcpy PARAMS ((char *dest, const char *src));
|
static char *stpcpy PARAMS ((char *dest, const char *src));
|
||||||
# endif
|
# endif
|
||||||
|
# ifndef HAVE_MEMPCPY
|
||||||
|
static void *mempcpy PARAMS ((void *dest, const void *src, size_t n));
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Amount to increase buffer size by in each try. */
|
/* Amount to increase buffer size by in each try. */
|
||||||
@ -130,7 +133,7 @@ static char *stpcpy PARAMS ((char *dest, const char *src));
|
|||||||
/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
|
/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
|
||||||
PATH_MAX but might cause redefinition warnings when sys/param.h is
|
PATH_MAX but might cause redefinition warnings when sys/param.h is
|
||||||
later included (as on MORE/BSD 4.3). */
|
later included (as on MORE/BSD 4.3). */
|
||||||
#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__))
|
#if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__)
|
||||||
# include <limits.h>
|
# include <limits.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -138,16 +141,16 @@ static char *stpcpy PARAMS ((char *dest, const char *src));
|
|||||||
# define _POSIX_PATH_MAX 255
|
# define _POSIX_PATH_MAX 255
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(PATH_MAX) && defined(_PC_PATH_MAX)
|
#if !defined PATH_MAX && defined _PC_PATH_MAX
|
||||||
# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
|
# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Don't include sys/param.h if it already has been. */
|
/* Don't include sys/param.h if it already has been. */
|
||||||
#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN)
|
#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
|
||||||
# include <sys/param.h>
|
# include <sys/param.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(PATH_MAX) && defined(MAXPATHLEN)
|
#if !defined PATH_MAX && defined MAXPATHLEN
|
||||||
# define PATH_MAX MAXPATHLEN
|
# define PATH_MAX MAXPATHLEN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -165,6 +168,68 @@ static char *stpcpy PARAMS ((char *dest, const char *src));
|
|||||||
# define HAVE_LOCALE_NULL
|
# define HAVE_LOCALE_NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* We want to allocate a string at the end of the struct. gcc makes
|
||||||
|
this easy. */
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define ZERO 0
|
||||||
|
#else
|
||||||
|
# define ZERO 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This is the type used for the search tree where known translations
|
||||||
|
are stored. */
|
||||||
|
struct known_translation_t
|
||||||
|
{
|
||||||
|
/* Domain in which to search. */
|
||||||
|
char *domain;
|
||||||
|
|
||||||
|
/* The category. */
|
||||||
|
int category;
|
||||||
|
|
||||||
|
/* State of the catalog counter at the point the string was found. */
|
||||||
|
int counter;
|
||||||
|
|
||||||
|
/* And finally the translation. */
|
||||||
|
const char *translation;
|
||||||
|
|
||||||
|
/* Pointer to the string in question. */
|
||||||
|
char msgid[ZERO];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Root of the search tree with known translations. We can use this
|
||||||
|
only if the system provides the `tsearch' function family. */
|
||||||
|
#if defined HAVE_TSEARCH || defined _LIBC
|
||||||
|
# include <search.h>
|
||||||
|
|
||||||
|
static void *root;
|
||||||
|
|
||||||
|
# ifdef _LIBC
|
||||||
|
# define tsearch __tsearch
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Function to compare two entries in the table of known translations. */
|
||||||
|
static int
|
||||||
|
transcmp (const void *p1, const void *p2)
|
||||||
|
{
|
||||||
|
struct known_translation_t *s1 = (struct known_translation_t *) p1;
|
||||||
|
struct known_translation_t *s2 = (struct known_translation_t *) p2;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = strcmp (s1->msgid, s2->msgid);
|
||||||
|
if (result == 0)
|
||||||
|
{
|
||||||
|
result = strcmp (s1->msgid, s2->msgid);
|
||||||
|
if (result == 0)
|
||||||
|
/* We compare the category last (though this is the cheapest
|
||||||
|
operation) since it is hopefully always the same (namely
|
||||||
|
LC_MESSAGES). */
|
||||||
|
result = s1->category - s2->category;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Name of the default domain used for gettext(3) prior any call to
|
/* Name of the default domain used for gettext(3) prior any call to
|
||||||
textdomain(3). The default value for this is "messages". */
|
textdomain(3). The default value for this is "messages". */
|
||||||
const char _nl_default_default_domain[] = "messages";
|
const char _nl_default_default_domain[] = "messages";
|
||||||
@ -268,12 +333,34 @@ DCGETTEXT (domainname, msgid, category)
|
|||||||
char *dirname, *xdomainname;
|
char *dirname, *xdomainname;
|
||||||
char *single_locale;
|
char *single_locale;
|
||||||
char *retval;
|
char *retval;
|
||||||
int saved_errno = errno;
|
int saved_errno;
|
||||||
|
#if defined HAVE_TSEARCH || defined _LIBC
|
||||||
|
struct known_translation_t *search;
|
||||||
|
struct known_translation_t **foundp;
|
||||||
|
size_t msgid_len = strlen (msgid) + 1;
|
||||||
|
#endif
|
||||||
|
size_t domainname_len;
|
||||||
|
|
||||||
/* If no real MSGID is given return NULL. */
|
/* If no real MSGID is given return NULL. */
|
||||||
if (msgid == NULL)
|
if (msgid == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
#if defined HAVE_TSEARCH || defined _LIBC
|
||||||
|
/* Try to find the translation among those which we found at some time. */
|
||||||
|
search = (struct known_translation_t *) alloca (sizeof (*search)
|
||||||
|
+ msgid_len);
|
||||||
|
memcpy (search->msgid, msgid, msgid_len);
|
||||||
|
search->domain = (char *) domainname;
|
||||||
|
search->category = category;
|
||||||
|
|
||||||
|
foundp = (struct known_translation_t **) tfind (search, &root, transcmp);
|
||||||
|
if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr)
|
||||||
|
return (char *) (*foundp)->translation;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Preserve the `errno' value. */
|
||||||
|
saved_errno = errno;
|
||||||
|
|
||||||
/* See whether this is a SUID binary or not. */
|
/* See whether this is a SUID binary or not. */
|
||||||
DETERMINE_SECURE;
|
DETERMINE_SECURE;
|
||||||
|
|
||||||
@ -340,12 +427,13 @@ DCGETTEXT (domainname, msgid, category)
|
|||||||
categoryname = category_to_name (category);
|
categoryname = category_to_name (category);
|
||||||
categoryvalue = guess_category_value (category, categoryname);
|
categoryvalue = guess_category_value (category, categoryname);
|
||||||
|
|
||||||
|
domainname_len = strlen (domainname);
|
||||||
xdomainname = (char *) alloca (strlen (categoryname)
|
xdomainname = (char *) alloca (strlen (categoryname)
|
||||||
+ strlen (domainname) + 5);
|
+ domainname_len + 5);
|
||||||
ADD_BLOCK (block_list, xdomainname);
|
ADD_BLOCK (block_list, xdomainname);
|
||||||
|
|
||||||
stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
|
stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
|
||||||
domainname),
|
domainname, domainname_len),
|
||||||
".mo");
|
".mo");
|
||||||
|
|
||||||
/* Creating working area. */
|
/* Creating working area. */
|
||||||
@ -422,6 +510,38 @@ DCGETTEXT (domainname, msgid, category)
|
|||||||
{
|
{
|
||||||
FREE_BLOCKS (block_list);
|
FREE_BLOCKS (block_list);
|
||||||
__set_errno (saved_errno);
|
__set_errno (saved_errno);
|
||||||
|
#if defined HAVE_TSEARCH || defined _LIBC
|
||||||
|
if (foundp == NULL)
|
||||||
|
{
|
||||||
|
/* Create a new entry and add it to the search tree. */
|
||||||
|
struct known_translation_t *newp;
|
||||||
|
|
||||||
|
newp = (struct known_translation_t *)
|
||||||
|
malloc (sizeof (*newp) + msgid_len
|
||||||
|
+ domainname_len + 1 - ZERO);
|
||||||
|
if (newp != NULL)
|
||||||
|
{
|
||||||
|
newp->domain = mempcpy (newp->msgid, msgid, msgid_len);
|
||||||
|
memcpy (newp->domain, domainname, domainname_len + 1);
|
||||||
|
newp->category = category;
|
||||||
|
newp->counter = _nl_msg_cat_cntr;
|
||||||
|
newp->translation = retval;
|
||||||
|
|
||||||
|
/* Insert the entry in the search tree. */
|
||||||
|
foundp = (struct known_translation_t **)
|
||||||
|
tsearch (newp, &root, transcmp);
|
||||||
|
if (&newp != foundp)
|
||||||
|
/* The insert failed. */
|
||||||
|
free (newp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We can update the existing entry. */
|
||||||
|
(*foundp)->counter = _nl_msg_cat_cntr;
|
||||||
|
(*foundp)->translation = retval;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -571,12 +691,13 @@ _nl_find_msg (domain_file, msgid)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
|
if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
|
||||||
&& strcmp (msgid,
|
&& (strcmp (msgid,
|
||||||
domain->data + W (domain->must_swap,
|
domain->data + W (domain->must_swap,
|
||||||
domain->orig_tab[nstr - 1].offset))
|
domain->orig_tab[nstr - 1].offset))
|
||||||
== 0)
|
== 0))
|
||||||
return (char *) domain->data
|
return ((char *) domain->data
|
||||||
+ W (domain->must_swap, domain->trans_tab[nstr - 1].offset);
|
+ W (domain->must_swap,
|
||||||
|
domain->trans_tab[nstr - 1].offset));
|
||||||
}
|
}
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
@ -590,9 +711,9 @@ _nl_find_msg (domain_file, msgid)
|
|||||||
int cmp_val;
|
int cmp_val;
|
||||||
|
|
||||||
act = (bottom + top) / 2;
|
act = (bottom + top) / 2;
|
||||||
cmp_val = strcmp (msgid, domain->data
|
cmp_val = strcmp (msgid, (domain->data
|
||||||
+ W (domain->must_swap,
|
+ W (domain->must_swap,
|
||||||
domain->orig_tab[act].offset));
|
domain->orig_tab[act].offset)));
|
||||||
if (cmp_val < 0)
|
if (cmp_val < 0)
|
||||||
top = act;
|
top = act;
|
||||||
else if (cmp_val > 0)
|
else if (cmp_val > 0)
|
||||||
@ -602,9 +723,9 @@ _nl_find_msg (domain_file, msgid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If an translation is found return this. */
|
/* If an translation is found return this. */
|
||||||
return bottom >= top ? NULL : (char *) domain->data
|
return bottom >= top ? NULL : ((char *) domain->data
|
||||||
+ W (domain->must_swap,
|
+ W (domain->must_swap,
|
||||||
domain->trans_tab[act].offset);
|
domain->trans_tab[act].offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -728,6 +849,17 @@ stpcpy (dest, src)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !_LIBC && !HAVE_MEMPCPY
|
||||||
|
static void *
|
||||||
|
mempcpy (dest, src, n)
|
||||||
|
void *dest;
|
||||||
|
const void *src;
|
||||||
|
size_t n;
|
||||||
|
{
|
||||||
|
return (void *) ((char *) memcpy (dst, src, n) + n);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
/* If we want to free all resources we have to do some work at
|
/* If we want to free all resources we have to do some work at
|
||||||
@ -748,6 +880,9 @@ free_mem (void)
|
|||||||
if (_nl_current_default_domain != _nl_default_default_domain)
|
if (_nl_current_default_domain != _nl_default_default_domain)
|
||||||
/* Yes, again a pointer comparison. */
|
/* Yes, again a pointer comparison. */
|
||||||
free ((char *) _nl_current_default_domain);
|
free ((char *) _nl_current_default_domain);
|
||||||
|
|
||||||
|
/* Remove the search tree with the know translations. */
|
||||||
|
__tdestroy (root, free);
|
||||||
}
|
}
|
||||||
|
|
||||||
text_set_element (__libc_subfreeres, free_mem);
|
text_set_element (__libc_subfreeres, free_mem);
|
||||||
|
@ -82,7 +82,7 @@ extern char *bindtextdomain (__const char *__domainname,
|
|||||||
# define dgettext(domainname, msgid) \
|
# define dgettext(domainname, msgid) \
|
||||||
dcgettext (domainname, msgid, LC_MESSAGES)
|
dcgettext (domainname, msgid, LC_MESSAGES)
|
||||||
|
|
||||||
# if __GNUC_PREREQ (2,7)
|
# if __GLIBC__ >= 2 && __GNUC_PREREQ (2,7)
|
||||||
/* Variable defined in loadmsgcat.c which gets incremented every time a
|
/* Variable defined in loadmsgcat.c which gets incremented every time a
|
||||||
new catalog is loaded. */
|
new catalog is loaded. */
|
||||||
extern int _nl_msg_cat_cntr;
|
extern int _nl_msg_cat_cntr;
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
|
1999-12-18 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* manager.c (pthread_allocate_stack): Correct computation of
|
||||||
|
new_thread_bottom. Correct handling of stack size and when the
|
||||||
|
rlimit method to guard for stack growth is used.
|
||||||
|
* pthread.c (pthread_initialize): Stack limit must be STACK_SIZE
|
||||||
|
minus one pagesize (not two).
|
||||||
|
|
||||||
1999-12-03 Andreas Jaeger <aj@suse.de>
|
1999-12-03 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
* Versions: Add __res_state with version GLIBC_2.2.
|
* Versions: Add __res_state with version GLIBC_2.2.
|
||||||
|
@ -289,9 +289,12 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
stacksize = STACK_SIZE - pagesize;
|
||||||
|
if (attr != NULL)
|
||||||
|
stacksize = MIN (stacksize, roundup(attr->__stacksize, pagesize));
|
||||||
/* Allocate space for stack and thread descriptor at default address */
|
/* Allocate space for stack and thread descriptor at default address */
|
||||||
new_thread = default_new_thread;
|
new_thread = default_new_thread;
|
||||||
new_thread_bottom = (char *) new_thread - STACK_SIZE;
|
new_thread_bottom = (char *) (new_thread + 1) - stacksize;
|
||||||
if (mmap((caddr_t)((char *)(new_thread + 1) - INITIAL_STACK_SIZE),
|
if (mmap((caddr_t)((char *)(new_thread + 1) - INITIAL_STACK_SIZE),
|
||||||
INITIAL_STACK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
|
INITIAL_STACK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_GROWSDOWN,
|
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_GROWSDOWN,
|
||||||
@ -300,14 +303,10 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
|
|||||||
return -1;
|
return -1;
|
||||||
/* We manage to get a stack. Now see whether we need a guard
|
/* We manage to get a stack. Now see whether we need a guard
|
||||||
and allocate it if necessary. Notice that the default
|
and allocate it if necessary. Notice that the default
|
||||||
attributes (stack_size = STACK_SIZE - pagesize and
|
attributes (stack_size = STACK_SIZE - pagesize) do not need
|
||||||
guardsize = pagesize) do not need a guard page, since
|
a guard page, since the RLIMIT_STACK soft limit prevents stacks
|
||||||
the RLIMIT_STACK soft limit prevents stacks from
|
from running into one another. */
|
||||||
running into one another. */
|
if (stacksize == STACK_SIZE - pagesize)
|
||||||
if (attr == NULL ||
|
|
||||||
attr->__guardsize == 0 ||
|
|
||||||
(attr->__guardsize == pagesize &&
|
|
||||||
attr->__stacksize == STACK_SIZE - pagesize))
|
|
||||||
{
|
{
|
||||||
/* We don't need a guard page. */
|
/* We don't need a guard page. */
|
||||||
guardaddr = NULL;
|
guardaddr = NULL;
|
||||||
@ -316,10 +315,7 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Put a bad page at the bottom of the stack */
|
/* Put a bad page at the bottom of the stack */
|
||||||
stacksize = roundup(attr->__stacksize, pagesize);
|
guardaddr = (void *)new_thread_bottom - stacksize;
|
||||||
if (stacksize >= STACK_SIZE - pagesize)
|
|
||||||
stacksize = STACK_SIZE - pagesize;
|
|
||||||
guardaddr = (void *)new_thread - stacksize;
|
|
||||||
guardsize = attr->__guardsize;
|
guardsize = attr->__guardsize;
|
||||||
if (mmap ((caddr_t) guardaddr, guardsize, 0, MAP_FIXED, -1, 0)
|
if (mmap ((caddr_t) guardaddr, guardsize, 0, MAP_FIXED, -1, 0)
|
||||||
== MAP_FAILED)
|
== MAP_FAILED)
|
||||||
|
@ -300,10 +300,9 @@ static void pthread_initialize(void)
|
|||||||
__pthread_initial_thread_bos =
|
__pthread_initial_thread_bos =
|
||||||
(char *)(((long)CURRENT_STACK_FRAME - 2 * STACK_SIZE) & ~(STACK_SIZE - 1));
|
(char *)(((long)CURRENT_STACK_FRAME - 2 * STACK_SIZE) & ~(STACK_SIZE - 1));
|
||||||
/* Play with the stack size limit to make sure that no stack ever grows
|
/* Play with the stack size limit to make sure that no stack ever grows
|
||||||
beyond STACK_SIZE minus two pages (one page for the thread descriptor
|
beyond STACK_SIZE minus one page (to act as a guard page). */
|
||||||
immediately beyond, and one page to act as a guard page). */
|
|
||||||
getrlimit(RLIMIT_STACK, &limit);
|
getrlimit(RLIMIT_STACK, &limit);
|
||||||
max_stack = STACK_SIZE - 2 * __getpagesize();
|
max_stack = STACK_SIZE - __getpagesize();
|
||||||
if (limit.rlim_cur > max_stack) {
|
if (limit.rlim_cur > max_stack) {
|
||||||
limit.rlim_cur = max_stack;
|
limit.rlim_cur = max_stack;
|
||||||
setrlimit(RLIMIT_STACK, &limit);
|
setrlimit(RLIMIT_STACK, &limit);
|
||||||
|
@ -73,7 +73,8 @@ struct element_t
|
|||||||
|
|
||||||
const char *mbs;
|
const char *mbs;
|
||||||
const uint32_t *wcs;
|
const uint32_t *wcs;
|
||||||
int order;
|
int mborder;
|
||||||
|
int wcorder;
|
||||||
|
|
||||||
struct element_list_t *weights;
|
struct element_list_t *weights;
|
||||||
|
|
||||||
@ -87,6 +88,9 @@ struct element_t
|
|||||||
/* Predecessor and successor in the order list. */
|
/* Predecessor and successor in the order list. */
|
||||||
struct element_t *last;
|
struct element_t *last;
|
||||||
struct element_t *next;
|
struct element_t *next;
|
||||||
|
|
||||||
|
/* Next element in multibyte output list. */
|
||||||
|
struct element_t *mbnext;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Special element value. */
|
/* Special element value. */
|
||||||
@ -151,6 +155,10 @@ struct locale_collate_t
|
|||||||
that the definitions from more than one input file contains information.
|
that the definitions from more than one input file contains information.
|
||||||
Therefore we keep all relevant input in a list. */
|
Therefore we keep all relevant input in a list. */
|
||||||
struct locale_collate_t *next;
|
struct locale_collate_t *next;
|
||||||
|
|
||||||
|
/* Arrays with heads of the list for each of the leading bytes in
|
||||||
|
the multibyte sequences. */
|
||||||
|
struct element_t *mbheads[256];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -176,7 +184,7 @@ make_seclist_elem (struct locale_collate_t *collate, const char *string,
|
|||||||
|
|
||||||
|
|
||||||
static struct element_t *
|
static struct element_t *
|
||||||
new_element (struct locale_collate_t *collate, const char *mbs,
|
new_element (struct locale_collate_t *collate, const char *mbs, size_t mbslen,
|
||||||
const uint32_t *wcs, const char *name, size_t namelen)
|
const uint32_t *wcs, const char *name, size_t namelen)
|
||||||
{
|
{
|
||||||
struct element_t *newp;
|
struct element_t *newp;
|
||||||
@ -185,7 +193,10 @@ new_element (struct locale_collate_t *collate, const char *mbs,
|
|||||||
sizeof (*newp));
|
sizeof (*newp));
|
||||||
newp->name = name == NULL ? NULL : obstack_copy (&collate->mempool,
|
newp->name = name == NULL ? NULL : obstack_copy (&collate->mempool,
|
||||||
name, namelen);
|
name, namelen);
|
||||||
newp->mbs = mbs;
|
if (mbs != NULL)
|
||||||
|
newp->mbs = obstack_copy0 (&collate->mempool, mbs, mbslen);
|
||||||
|
else
|
||||||
|
newp->mbs = NULL;
|
||||||
if (wcs != NULL)
|
if (wcs != NULL)
|
||||||
{
|
{
|
||||||
size_t nwcs = wcslen ((wchar_t *) wcs) + 1;
|
size_t nwcs = wcslen ((wchar_t *) wcs) + 1;
|
||||||
@ -196,7 +207,8 @@ new_element (struct locale_collate_t *collate, const char *mbs,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
newp->wcs = NULL;
|
newp->wcs = NULL;
|
||||||
newp->order = 0;
|
newp->mborder = 0;
|
||||||
|
newp->wcorder = 0;
|
||||||
|
|
||||||
/* Will be allocated later. */
|
/* Will be allocated later. */
|
||||||
newp->weights = NULL;
|
newp->weights = NULL;
|
||||||
@ -209,6 +221,8 @@ new_element (struct locale_collate_t *collate, const char *mbs,
|
|||||||
newp->last = NULL;
|
newp->last = NULL;
|
||||||
newp->next = NULL;
|
newp->next = NULL;
|
||||||
|
|
||||||
|
newp->mbnext = NULL;
|
||||||
|
|
||||||
return newp;
|
return newp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -457,14 +471,15 @@ find_element (struct linereader *ldfile, struct locale_collate_t *collate,
|
|||||||
result = sym->order;
|
result = sym->order;
|
||||||
|
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
result = sym->order = new_element (collate, NULL, NULL, NULL, 0);
|
result = sym->order = new_element (collate, NULL, 0, NULL,
|
||||||
|
NULL, 0);
|
||||||
}
|
}
|
||||||
else if (find_entry (&collate->elem_table, str, len,
|
else if (find_entry (&collate->elem_table, str, len,
|
||||||
(void **) &result) != 0)
|
(void **) &result) != 0)
|
||||||
{
|
{
|
||||||
/* It's also no collation element. So it is an character
|
/* It's also no collation element. So it is an character
|
||||||
element defined later. */
|
element defined later. */
|
||||||
result = new_element (collate, NULL, NULL, str, len);
|
result = new_element (collate, NULL, 0, NULL, str, len);
|
||||||
if (result != NULL)
|
if (result != NULL)
|
||||||
/* Insert it into the sequence table. */
|
/* Insert it into the sequence table. */
|
||||||
insert_entry (&collate->seq_table, str, len, result);
|
insert_entry (&collate->seq_table, str, len, result);
|
||||||
@ -499,6 +514,8 @@ insert_weights (struct linereader *ldfile, struct element_t *elem,
|
|||||||
elem->line = ldfile->lineno;
|
elem->line = ldfile->lineno;
|
||||||
elem->last = collate->cursor;
|
elem->last = collate->cursor;
|
||||||
elem->next = collate->cursor ? collate->cursor->next : NULL;
|
elem->next = collate->cursor ? collate->cursor->next : NULL;
|
||||||
|
if (collate->cursor != NULL)
|
||||||
|
collate->cursor->next = elem;
|
||||||
elem->weights = (struct element_list_t *)
|
elem->weights = (struct element_list_t *)
|
||||||
obstack_alloc (&collate->mempool, nrules * sizeof (struct element_list_t));
|
obstack_alloc (&collate->mempool, nrules * sizeof (struct element_list_t));
|
||||||
memset (elem->weights, '\0', nrules * sizeof (struct element_list_t));
|
memset (elem->weights, '\0', nrules * sizeof (struct element_list_t));
|
||||||
@ -683,7 +700,7 @@ insert_weights (struct linereader *ldfile, struct element_t *elem,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static int
|
||||||
insert_value (struct linereader *ldfile, struct token *arg,
|
insert_value (struct linereader *ldfile, struct token *arg,
|
||||||
struct charmap_t *charmap, struct repertoire_t *repertoire,
|
struct charmap_t *charmap, struct repertoire_t *repertoire,
|
||||||
struct locale_collate_t *collate)
|
struct locale_collate_t *collate)
|
||||||
@ -721,14 +738,14 @@ insert_value (struct linereader *ldfile, struct token *arg,
|
|||||||
elem = sym->order;
|
elem = sym->order;
|
||||||
|
|
||||||
if (elem == NULL)
|
if (elem == NULL)
|
||||||
elem = sym->order = new_element (collate, NULL, NULL, NULL, 0);
|
elem = sym->order = new_element (collate, NULL, 0, NULL, NULL, 0);
|
||||||
}
|
}
|
||||||
else if (find_entry (&collate->elem_table, arg->val.str.startmb,
|
else if (find_entry (&collate->elem_table, arg->val.str.startmb,
|
||||||
arg->val.str.lenmb, (void **) &elem) != 0)
|
arg->val.str.lenmb, (void **) &elem) != 0)
|
||||||
{
|
{
|
||||||
/* It's also no collation element. Therefore ignore it. */
|
/* It's also no collation element. Therefore ignore it. */
|
||||||
lr_ignore_rest (ldfile, 0);
|
lr_ignore_rest (ldfile, 0);
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -741,6 +758,7 @@ insert_value (struct linereader *ldfile, struct token *arg,
|
|||||||
|
|
||||||
/* We have to allocate an entry. */
|
/* We have to allocate an entry. */
|
||||||
elem = new_element (collate, seq != NULL ? seq->bytes : NULL,
|
elem = new_element (collate, seq != NULL ? seq->bytes : NULL,
|
||||||
|
seq != NULL ? seq->nbytes : 0,
|
||||||
wcs, arg->val.str.startmb, arg->val.str.lenmb);
|
wcs, arg->val.str.startmb, arg->val.str.lenmb);
|
||||||
|
|
||||||
/* And add it to the table. */
|
/* And add it to the table. */
|
||||||
@ -755,14 +773,16 @@ insert_value (struct linereader *ldfile, struct token *arg,
|
|||||||
if (elem->next != NULL || (collate->cursor != NULL
|
if (elem->next != NULL || (collate->cursor != NULL
|
||||||
&& elem->next == collate->cursor))
|
&& elem->next == collate->cursor))
|
||||||
{
|
{
|
||||||
lr_error (ldfile, _("order for `%.*s' already defined at %s:%Z"),
|
lr_error (ldfile, _("order for `%.*s' already defined at %s:%zu"),
|
||||||
arg->val.str.lenmb, arg->val.str.startmb,
|
arg->val.str.lenmb, arg->val.str.startmb,
|
||||||
elem->file, elem->line);
|
elem->file, elem->line);
|
||||||
lr_ignore_rest (ldfile, 0);
|
lr_ignore_rest (ldfile, 0);
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
insert_weights (ldfile, elem, charmap, repertoire, collate, tok_none);
|
insert_weights (ldfile, elem, charmap, repertoire, collate, tok_none);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -780,8 +800,11 @@ handle_ellipsis (struct linereader *ldfile, struct token *arg,
|
|||||||
startp = collate->cursor;
|
startp = collate->cursor;
|
||||||
|
|
||||||
/* Process and add the end-entry. */
|
/* Process and add the end-entry. */
|
||||||
if (arg != NULL)
|
if (arg != NULL
|
||||||
insert_value (ldfile, arg, charmap, repertoire, collate);
|
&& insert_value (ldfile, arg, charmap, repertoire, collate))
|
||||||
|
/* Something went wrong with inserting the to-value. This means
|
||||||
|
we cannot process the ellipsis. */
|
||||||
|
return;
|
||||||
|
|
||||||
/* Reset the cursor. */
|
/* Reset the cursor. */
|
||||||
collate->cursor = startp;
|
collate->cursor = startp;
|
||||||
@ -805,7 +828,168 @@ handle_ellipsis (struct linereader *ldfile, struct token *arg,
|
|||||||
|
|
||||||
if (ellipsis == tok_ellipsis3)
|
if (ellipsis == tok_ellipsis3)
|
||||||
{
|
{
|
||||||
/* XXX */
|
/* One requirement we make here: the length of the byte
|
||||||
|
sequences for the first and end character must be the same.
|
||||||
|
This is mainly to prevent unwanted effects and this is often
|
||||||
|
not what is wanted. */
|
||||||
|
size_t len = (startp->mbs != NULL ? strlen (startp->mbs)
|
||||||
|
: (endp->mbs != NULL ? strlen (endp->mbs) : 0));
|
||||||
|
char mbcnt[len + 1];
|
||||||
|
char mbend[len + 1];
|
||||||
|
|
||||||
|
/* Well, this should be caught somewhere else already. Just to
|
||||||
|
make sure. */
|
||||||
|
assert (startp == NULL || startp->wcs == NULL || startp->wcs[1] == 0);
|
||||||
|
assert (endp == NULL || endp->wcs == NULL || endp->wcs[1] == 0);
|
||||||
|
|
||||||
|
if (startp != NULL && endp != NULL
|
||||||
|
&& startp->mbs != NULL && endp->mbs != NULL
|
||||||
|
&& strlen (startp->mbs) != strlen (endp->mbs))
|
||||||
|
{
|
||||||
|
lr_error (ldfile, _("\
|
||||||
|
%s: byte sequences of first and last character must have the same length"),
|
||||||
|
"LC_COLLATE");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Determine whether we have to generate multibyte sequences. */
|
||||||
|
if ((startp == NULL || startp->mbs != NULL)
|
||||||
|
&& (endp == NULL || endp->mbs != NULL))
|
||||||
|
{
|
||||||
|
int cnt;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Prepare the beginning byte sequence. This is either from the
|
||||||
|
beginning byte sequence or it is all nulls if it was an
|
||||||
|
initial ellipsis. */
|
||||||
|
if (startp == NULL || startp->mbs == NULL)
|
||||||
|
memset (mbcnt, '\0', len);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memcpy (mbcnt, startp->mbs, len);
|
||||||
|
|
||||||
|
/* And increment it so that the value is the first one we will
|
||||||
|
try to insert. */
|
||||||
|
for (cnt = len - 1; cnt >= 0; --cnt)
|
||||||
|
if (++mbcnt[cnt] != '\0')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mbcnt[len] = '\0';
|
||||||
|
|
||||||
|
/* And the end sequence. */
|
||||||
|
if (endp == NULL || endp->mbs == NULL)
|
||||||
|
memset (mbend, '\0', len);
|
||||||
|
else
|
||||||
|
memcpy (mbend, endp->mbs, len);
|
||||||
|
mbend[len] = '\0';
|
||||||
|
|
||||||
|
/* Test whether we have a correct range. */
|
||||||
|
ret = memcmp (mbcnt, mbend, len);
|
||||||
|
if (ret >= 0)
|
||||||
|
{
|
||||||
|
if (ret > 0)
|
||||||
|
lr_error (ldfile, _("%s: byte sequence of first character of \
|
||||||
|
sequence is not lower than that of the last character"), "LC_COLLATE");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Generate the byte sequences data. */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
struct charseq *seq;
|
||||||
|
|
||||||
|
/* Quite a bit of work ahead. We have to find the character
|
||||||
|
definition for the byte sequence and then determine the
|
||||||
|
wide character belonging to it. */
|
||||||
|
seq = charmap_find_symbol (charmap, mbcnt, len);
|
||||||
|
if (seq != NULL)
|
||||||
|
{
|
||||||
|
struct element_t *elem;
|
||||||
|
size_t namelen;
|
||||||
|
|
||||||
|
if (seq->ucs4 == UNINITIALIZED_CHAR_VALUE)
|
||||||
|
seq->ucs4 = repertoire_find_value (repertoire, seq->name,
|
||||||
|
strlen (seq->name));
|
||||||
|
|
||||||
|
/* I don't this this can ever happen. */
|
||||||
|
assert (seq->name != NULL);
|
||||||
|
namelen = strlen (seq->name);
|
||||||
|
|
||||||
|
/* Now we are ready to insert the new value in the
|
||||||
|
sequence. Find out whether the element is
|
||||||
|
already known. */
|
||||||
|
if (find_entry (&collate->seq_table, seq->name, namelen,
|
||||||
|
(void **) &elem) != 0)
|
||||||
|
{
|
||||||
|
uint32_t wcs[2] = { seq->ucs4, 0 };
|
||||||
|
|
||||||
|
/* We have to allocate an entry. */
|
||||||
|
elem = new_element (collate, mbcnt, len, wcs, seq->name,
|
||||||
|
namelen);
|
||||||
|
|
||||||
|
/* And add it to the table. */
|
||||||
|
if (insert_entry (&collate->seq_table, seq->name,
|
||||||
|
namelen, elem) != 0)
|
||||||
|
/* This cannot happen. */
|
||||||
|
assert (! "Internal error");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test whether this element is not already in the list. */
|
||||||
|
if (elem->next != NULL || (collate->cursor != NULL
|
||||||
|
&& elem->next == collate->cursor))
|
||||||
|
{
|
||||||
|
lr_error (ldfile, _("\
|
||||||
|
order for `%.*s' already defined at %s:%zu"),
|
||||||
|
namelen, seq->name, elem->file, elem->line);
|
||||||
|
goto increment;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enqueue the new element. */
|
||||||
|
elem->last = collate->cursor;
|
||||||
|
elem->next = collate->cursor->next;
|
||||||
|
elem->last->next = elem;
|
||||||
|
if (elem->next != NULL)
|
||||||
|
elem->next->last = elem;
|
||||||
|
collate->cursor = elem;
|
||||||
|
|
||||||
|
/* Add the weight value. We take them from the
|
||||||
|
`ellipsis_weights' member of `collate'. */
|
||||||
|
elem->weights = (struct element_list_t *)
|
||||||
|
obstack_alloc (&collate->mempool,
|
||||||
|
nrules * sizeof (struct element_list_t));
|
||||||
|
for (cnt = 0; cnt < nrules; ++cnt)
|
||||||
|
if (collate->ellipsis_weight.weights[cnt].cnt == 1
|
||||||
|
&& (collate->ellipsis_weight.weights[cnt].w[0]
|
||||||
|
== ELEMENT_ELLIPSIS2))
|
||||||
|
{
|
||||||
|
elem->weights[cnt].w = (struct element_t **)
|
||||||
|
obstack_alloc (&collate->mempool,
|
||||||
|
sizeof (struct element_t *));
|
||||||
|
elem->weights[cnt].w[0] = elem;
|
||||||
|
elem->weights[cnt].cnt = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Simly use the weight from `ellipsis_weight'. */
|
||||||
|
elem->weights[cnt].w =
|
||||||
|
collate->ellipsis_weight.weights[cnt].w;
|
||||||
|
elem->weights[cnt].cnt =
|
||||||
|
collate->ellipsis_weight.weights[cnt].cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Increment for the next round. */
|
||||||
|
increment:
|
||||||
|
for (cnt = len - 1; cnt >= 0; --cnt)
|
||||||
|
if (++mbcnt[cnt] != '\0')
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Find out whether this was all. */
|
||||||
|
if (cnt < 0 || memcmp (mbcnt, mbend, len) >= 0)
|
||||||
|
/* Yep, that's all. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -883,7 +1067,7 @@ handle_ellipsis (struct linereader *ldfile, struct token *arg,
|
|||||||
&& elem->next == collate->cursor))
|
&& elem->next == collate->cursor))
|
||||||
{
|
{
|
||||||
lr_error (ldfile, _("\
|
lr_error (ldfile, _("\
|
||||||
%s: order for `%.*s' already defined at %s:%Z"),
|
%s: order for `%.*s' already defined at %s:%zu"),
|
||||||
"LC_COLLATE", lenfrom, buf,
|
"LC_COLLATE", lenfrom, buf,
|
||||||
elem->file, elem->line);
|
elem->file, elem->line);
|
||||||
continue;
|
continue;
|
||||||
@ -923,6 +1107,7 @@ handle_ellipsis (struct linereader *ldfile, struct token *arg,
|
|||||||
/* We have to allocate an entry. */
|
/* We have to allocate an entry. */
|
||||||
elem = new_element (collate,
|
elem = new_element (collate,
|
||||||
seq != NULL ? seq->bytes : NULL,
|
seq != NULL ? seq->bytes : NULL,
|
||||||
|
seq != NULL ? seq->nbytes : 0,
|
||||||
wc == ILLEGAL_CHAR_VALUE
|
wc == ILLEGAL_CHAR_VALUE
|
||||||
? NULL : wcs,
|
? NULL : wcs,
|
||||||
buf, lenfrom);
|
buf, lenfrom);
|
||||||
@ -1023,6 +1208,67 @@ collate_startup (struct linereader *ldfile, struct localedef_t *locale,
|
|||||||
void
|
void
|
||||||
collate_finish (struct localedef_t *locale, struct charmap_t *charmap)
|
collate_finish (struct localedef_t *locale, struct charmap_t *charmap)
|
||||||
{
|
{
|
||||||
|
/* Now is the time when we can assign the individual collation
|
||||||
|
values for all the symbols. We have possibly different values
|
||||||
|
for the wide- and the multibyte-character symbols. This is done
|
||||||
|
since it might make a difference in the encoding if there is in
|
||||||
|
some cases no multibyte-character but there are wide-characters.
|
||||||
|
(The other way around it is not important since theencoded
|
||||||
|
collation value in the wide-character case is 32 bits wide and
|
||||||
|
therefore requires no encoding).
|
||||||
|
|
||||||
|
The lowest collation value assigned is 2. Zero is reserved for
|
||||||
|
the NUL byte terminating the strings in the `strxfrm'/`wcsxfrm'
|
||||||
|
functions and 1 is used to separate the individual passes for the
|
||||||
|
different rules.
|
||||||
|
|
||||||
|
We also have to construct is list with all the bytes/words which
|
||||||
|
can come first in a sequence, followed by all the elements which
|
||||||
|
also start with this byte/word. The order is reverse which has
|
||||||
|
among others the important effect that longer strings are located
|
||||||
|
first in the list. This is required for the output data since
|
||||||
|
the algorithm used in `strcoll' etc depends on this.
|
||||||
|
|
||||||
|
The multibyte case is easy. We simply sort into an array with
|
||||||
|
256 elements. */
|
||||||
|
struct locale_collate_t *collate = locale->categories[LC_COLLATE].collate;
|
||||||
|
int mbact = 2;
|
||||||
|
int wcact = 2;
|
||||||
|
struct element_t *runp = collate->start;
|
||||||
|
|
||||||
|
while (runp != NULL)
|
||||||
|
{
|
||||||
|
if (runp->mbs != NULL)
|
||||||
|
{
|
||||||
|
struct element_t **eptr;
|
||||||
|
|
||||||
|
/* Determine the order. */
|
||||||
|
runp->mborder = mbact++;
|
||||||
|
|
||||||
|
/* Find the point where to insert in the list. */
|
||||||
|
eptr = &collate->mbheads[(unsigned int) runp->mbs[0]];
|
||||||
|
while (*eptr != NULL)
|
||||||
|
{
|
||||||
|
/* Check which string is larger, the one we want to insert
|
||||||
|
or the current element of the list we are looking at. */
|
||||||
|
assert (runp->mbs[0] == (*eptr)->mbs[0]);
|
||||||
|
if (strcmp (runp->mbs, (*eptr)->mbs) > 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
eptr = &(*eptr)->mbnext;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the pointers. */
|
||||||
|
runp->mbnext = *eptr;
|
||||||
|
*eptr = runp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (runp->wcs != NULL)
|
||||||
|
runp->wcorder = wcact++;
|
||||||
|
|
||||||
|
/* Up to the next entry. */
|
||||||
|
runp = runp->next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1257,7 +1503,8 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
|
|||||||
if (insert_entry (&collate->elem_table,
|
if (insert_entry (&collate->elem_table,
|
||||||
symbol, symbol_len,
|
symbol, symbol_len,
|
||||||
new_element (collate,
|
new_element (collate,
|
||||||
NULL, NULL, NULL, 0)) < 0)
|
NULL, 0, NULL, symbol,
|
||||||
|
symbol_len)) < 0)
|
||||||
lr_error (ldfile, _("\
|
lr_error (ldfile, _("\
|
||||||
error while adding collating element"));
|
error while adding collating element"));
|
||||||
}
|
}
|
||||||
@ -1519,9 +1766,12 @@ error while adding equivalent collating symbol"));
|
|||||||
goto err_label;
|
goto err_label;
|
||||||
|
|
||||||
/* Handle ellipsis at end of list. */
|
/* Handle ellipsis at end of list. */
|
||||||
if (was_ellipsis)
|
if (was_ellipsis != tok_none)
|
||||||
/* XXX */
|
{
|
||||||
abort ();
|
handle_ellipsis (ldfile, NULL, was_ellipsis, charmap, repertoire,
|
||||||
|
collate);
|
||||||
|
was_ellipsis = tok_none;
|
||||||
|
}
|
||||||
|
|
||||||
state = 2;
|
state = 2;
|
||||||
lr_ignore_rest (ldfile, 1);
|
lr_ignore_rest (ldfile, 1);
|
||||||
@ -1543,9 +1793,12 @@ error while adding equivalent collating symbol"));
|
|||||||
state = 2;
|
state = 2;
|
||||||
|
|
||||||
/* Handle ellipsis at end of list. */
|
/* Handle ellipsis at end of list. */
|
||||||
if (was_ellipsis)
|
if (was_ellipsis != tok_none)
|
||||||
/* XXX */
|
{
|
||||||
abort ();
|
handle_ellipsis (ldfile, arg, was_ellipsis, charmap,
|
||||||
|
repertoire, collate);
|
||||||
|
was_ellipsis = tok_none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (state != 2 && state != 3)
|
else if (state != 2 && state != 3)
|
||||||
goto err_label;
|
goto err_label;
|
||||||
@ -1610,9 +1863,12 @@ error while adding equivalent collating symbol"));
|
|||||||
state = 2;
|
state = 2;
|
||||||
|
|
||||||
/* Handle ellipsis at end of list. */
|
/* Handle ellipsis at end of list. */
|
||||||
if (was_ellipsis)
|
if (was_ellipsis != tok_none)
|
||||||
/* XXX */
|
{
|
||||||
abort ();
|
handle_ellipsis (ldfile, NULL, was_ellipsis, charmap,
|
||||||
|
repertoire, collate);
|
||||||
|
was_ellipsis = tok_none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (state == 3)
|
else if (state == 3)
|
||||||
{
|
{
|
||||||
@ -1848,7 +2104,7 @@ error while adding equivalent collating symbol"));
|
|||||||
&& collate->undefined.next == collate->cursor))
|
&& collate->undefined.next == collate->cursor))
|
||||||
{
|
{
|
||||||
lr_error (ldfile,
|
lr_error (ldfile,
|
||||||
_("%s: order for `%.*s' already defined at %s:%Z"),
|
_("%s: order for `%.*s' already defined at %s:%zu"),
|
||||||
"LC_COLLATE", 9, "UNDEFINED", collate->undefined.file,
|
"LC_COLLATE", 9, "UNDEFINED", collate->undefined.file,
|
||||||
collate->undefined.line);
|
collate->undefined.line);
|
||||||
lr_ignore_rest (ldfile, 0);
|
lr_ignore_rest (ldfile, 0);
|
||||||
@ -1892,9 +2148,12 @@ error while adding equivalent collating symbol"));
|
|||||||
"LC_COLLATE");
|
"LC_COLLATE");
|
||||||
|
|
||||||
/* Handle ellipsis at end of list. */
|
/* Handle ellipsis at end of list. */
|
||||||
if (was_ellipsis)
|
if (was_ellipsis != tok_none)
|
||||||
/* XXX */
|
{
|
||||||
abort ();
|
handle_ellipsis (ldfile, NULL, was_ellipsis, charmap,
|
||||||
|
repertoire, collate);
|
||||||
|
was_ellipsis = tok_none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (state == 3)
|
else if (state == 3)
|
||||||
error (0, 0, _("%s: missing `reorder-end' keyword"),
|
error (0, 0, _("%s: missing `reorder-end' keyword"),
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
|
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
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
|
modify it under the terms of the GNU Library General Public License as
|
||||||
@ -730,7 +730,10 @@ _nss_compat_getgrnam_r (const char *name, struct group *grp,
|
|||||||
enum nss_status status;
|
enum nss_status status;
|
||||||
|
|
||||||
if (name[0] == '-' || name[0] == '+')
|
if (name[0] == '-' || name[0] == '+')
|
||||||
return NSS_STATUS_NOTFOUND;
|
{
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
|
|
||||||
__libc_lock_lock (lock);
|
__libc_lock_lock (lock);
|
||||||
|
|
||||||
@ -915,7 +918,10 @@ internal_getgrgid_r (gid_t gid, struct group *result, ent_t *ent,
|
|||||||
|
|
||||||
status = getgrgid_plusgroup (gid, result, buffer, buflen, errnop);
|
status = getgrgid_plusgroup (gid, result, buffer, buflen, errnop);
|
||||||
if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
|
if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
|
||||||
return NSS_STATUS_NOTFOUND;
|
{
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -263,6 +263,7 @@ getgrent_next_nis (struct group *result, ent_t *ent, char *buffer,
|
|||||||
if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
|
if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
|
||||||
{
|
{
|
||||||
ent->nis = 0;
|
ent->nis = 0;
|
||||||
|
*errnop = ENOENT;
|
||||||
return NSS_STATUS_NOTFOUND;
|
return NSS_STATUS_NOTFOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,7 +446,10 @@ getgrnam_plusgroup (const char *name, struct group *result, char *buffer,
|
|||||||
++p;
|
++p;
|
||||||
parse_res = _nss_files_parse_grent (p, result, data, buflen, errnop);
|
parse_res = _nss_files_parse_grent (p, result, data, buflen, errnop);
|
||||||
if (parse_res == -1)
|
if (parse_res == -1)
|
||||||
return NSS_STATUS_TRYAGAIN;
|
{
|
||||||
|
*errnop = ERANGE;
|
||||||
|
return NSS_STATUS_TRYAGAIN;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parse_res)
|
if (parse_res)
|
||||||
|
@ -383,6 +383,7 @@ getspent_next_nis_netgr (const char *name, struct spwd *result, ent_t *ent,
|
|||||||
if (parse_res == -1)
|
if (parse_res == -1)
|
||||||
{
|
{
|
||||||
ent->netgrdata.cursor = saved_cursor;
|
ent->netgrdata.cursor = saved_cursor;
|
||||||
|
*errnop = ERANGE;
|
||||||
return NSS_STATUS_TRYAGAIN;
|
return NSS_STATUS_TRYAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1112,7 +1113,10 @@ internal_getspnam_r (const char *name, struct spwd *result, ent_t *ent,
|
|||||||
&& result->sp_namp[1] != '@')
|
&& result->sp_namp[1] != '@')
|
||||||
{
|
{
|
||||||
if (strcmp (&result->sp_namp[1], name) == 0)
|
if (strcmp (&result->sp_namp[1], name) == 0)
|
||||||
return NSS_STATUS_NOTFOUND;
|
{
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1128,8 +1132,11 @@ internal_getspnam_r (const char *name, struct spwd *result, ent_t *ent,
|
|||||||
status = getspnam_plususer (name, result, buffer, buflen,
|
status = getspnam_plususer (name, result, buffer, buflen,
|
||||||
errnop);
|
errnop);
|
||||||
if (status == NSS_STATUS_RETURN)
|
if (status == NSS_STATUS_RETURN)
|
||||||
/* We couldn't parse the entry */
|
{
|
||||||
return NSS_STATUS_NOTFOUND;
|
/* We couldn't parse the entry */
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -1142,7 +1149,10 @@ internal_getspnam_r (const char *name, struct spwd *result, ent_t *ent,
|
|||||||
|
|
||||||
status = getspnam_plususer (name, result, buffer, buflen, errnop);
|
status = getspnam_plususer (name, result, buffer, buflen, errnop);
|
||||||
if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
|
if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
|
||||||
return NSS_STATUS_NOTFOUND;
|
{
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -1159,7 +1169,10 @@ _nss_compat_getspnam_r (const char *name, struct spwd *pwd,
|
|||||||
enum nss_status status;
|
enum nss_status status;
|
||||||
|
|
||||||
if (name[0] == '-' || name[0] == '+')
|
if (name[0] == '-' || name[0] == '+')
|
||||||
return NSS_STATUS_NOTFOUND;
|
{
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
|
|
||||||
if (ni == NULL)
|
if (ni == NULL)
|
||||||
{
|
{
|
||||||
|
@ -278,7 +278,10 @@ _nss_nis_getaliasbyname_r (const char *name, struct aliasent *alias,
|
|||||||
if (parse_res == -1)
|
if (parse_res == -1)
|
||||||
return NSS_STATUS_TRYAGAIN;
|
return NSS_STATUS_TRYAGAIN;
|
||||||
else
|
else
|
||||||
return NSS_STATUS_NOTFOUND;
|
{
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NSS_STATUS_SUCCESS;
|
return NSS_STATUS_SUCCESS;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
|
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
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
|
modify it under the terms of the GNU Library General Public License as
|
||||||
@ -241,7 +241,10 @@ _nss_nis_gethostton_r (const char *name, struct ether *eth,
|
|||||||
if (parse_res == -1)
|
if (parse_res == -1)
|
||||||
return NSS_STATUS_TRYAGAIN;
|
return NSS_STATUS_TRYAGAIN;
|
||||||
else
|
else
|
||||||
return NSS_STATUS_NOTFOUND;
|
{
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return NSS_STATUS_SUCCESS;
|
return NSS_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
|
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
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
|
modify it under the terms of the GNU Library General Public License as
|
||||||
@ -207,7 +207,7 @@ _nss_nis_getgrnam_r (const char *name, struct group *grp,
|
|||||||
return NSS_STATUS_TRYAGAIN;
|
return NSS_STATUS_TRYAGAIN;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*errnop = EAGAIN;
|
*errnop = ENOENT;
|
||||||
return NSS_STATUS_NOTFOUND;
|
return NSS_STATUS_NOTFOUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -321,6 +321,7 @@ internal_gethostbyname2_r (const char *name, int af, struct hostent *host,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
*h_errnop = HOST_NOT_FOUND;
|
*h_errnop = HOST_NOT_FOUND;
|
||||||
|
*errnop = ENOENT;
|
||||||
return NSS_STATUS_NOTFOUND;
|
return NSS_STATUS_NOTFOUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -392,7 +393,10 @@ _nss_nis_gethostbyaddr_r (char *addr, size_t addrlen, int af,
|
|||||||
*errnop = errno;
|
*errnop = errno;
|
||||||
}
|
}
|
||||||
if (retval == NSS_STATUS_NOTFOUND)
|
if (retval == NSS_STATUS_NOTFOUND)
|
||||||
*h_errnop = HOST_NOT_FOUND;
|
{
|
||||||
|
*h_errnop = HOST_NOT_FOUND;
|
||||||
|
*errnop = ENOENT;
|
||||||
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
/* Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
|
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
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
|
modify it under the terms of the GNU Library General Public License as
|
||||||
@ -117,7 +117,10 @@ _nss_nis_getnetgrent_r (struct __netgrent *result, char *buffer, size_t buflen,
|
|||||||
enum nss_status status;
|
enum nss_status status;
|
||||||
|
|
||||||
if (cursor == NULL)
|
if (cursor == NULL)
|
||||||
return NSS_STATUS_NOTFOUND;
|
{
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
|
|
||||||
__libc_lock_lock (lock);
|
__libc_lock_lock (lock);
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
|
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
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
|
modify it under the terms of the GNU Library General Public License as
|
||||||
@ -50,8 +50,11 @@ _nss_nis_getpublickey (const char *netname, char *pkey, int *errnop)
|
|||||||
|
|
||||||
domain = strchr (netname, '@');
|
domain = strchr (netname, '@');
|
||||||
if (!domain)
|
if (!domain)
|
||||||
return NSS_STATUS_UNAVAIL;
|
{
|
||||||
domain++;
|
*errnop = EINVAL;
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
}
|
||||||
|
++domain;
|
||||||
|
|
||||||
retval = yperr2nss (yp_match (domain, "publickey.byname", netname,
|
retval = yperr2nss (yp_match (domain, "publickey.byname", netname,
|
||||||
strlen (netname), &result, &len));
|
strlen (netname), &result, &len));
|
||||||
@ -95,8 +98,11 @@ _nss_nis_getsecretkey (const char *netname, char *skey, char *passwd,
|
|||||||
|
|
||||||
domain = strchr (netname, '@');
|
domain = strchr (netname, '@');
|
||||||
if (!domain)
|
if (!domain)
|
||||||
return NSS_STATUS_UNAVAIL;
|
{
|
||||||
domain++;
|
*errnop = EINVAL;
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
}
|
||||||
|
++domain;
|
||||||
|
|
||||||
retval = yperr2nss (yp_match (domain, "publickey.byname", netname,
|
retval = yperr2nss (yp_match (domain, "publickey.byname", netname,
|
||||||
strlen (netname), &result, &len));
|
strlen (netname), &result, &len));
|
||||||
@ -196,10 +202,13 @@ _nss_nis_netname2user (char netname[MAXNETNAMELEN + 1], uid_t *uidp,
|
|||||||
|
|
||||||
domain = strchr (netname, '@');
|
domain = strchr (netname, '@');
|
||||||
if (!domain)
|
if (!domain)
|
||||||
return NSS_STATUS_UNAVAIL;
|
{
|
||||||
|
*errnop = EINVAL;
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Point past the '@' character */
|
/* Point past the '@' character */
|
||||||
domain++;
|
++domain;
|
||||||
lookup = NULL;
|
lookup = NULL;
|
||||||
yperr = yp_match (domain, "netid.byname", netname, strlen (netname),
|
yperr = yp_match (domain, "netid.byname", netname, strlen (netname),
|
||||||
&lookup, &len);
|
&lookup, &len);
|
||||||
@ -209,11 +218,13 @@ _nss_nis_netname2user (char netname[MAXNETNAMELEN + 1], uid_t *uidp,
|
|||||||
break; /* the successful case */
|
break; /* the successful case */
|
||||||
case YPERR_DOMAIN:
|
case YPERR_DOMAIN:
|
||||||
case YPERR_KEY:
|
case YPERR_KEY:
|
||||||
|
*errnop = ENOENT;
|
||||||
return NSS_STATUS_NOTFOUND;
|
return NSS_STATUS_NOTFOUND;
|
||||||
case YPERR_MAP:
|
case YPERR_MAP:
|
||||||
default:
|
default:
|
||||||
return NSS_STATUS_UNAVAIL;
|
return NSS_STATUS_UNAVAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lookup)
|
if (lookup)
|
||||||
{
|
{
|
||||||
enum nss_status err;
|
enum nss_status err;
|
||||||
@ -224,7 +235,9 @@ _nss_nis_netname2user (char netname[MAXNETNAMELEN + 1], uid_t *uidp,
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return NSS_STATUS_NOTFOUND;
|
{
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
return NSS_STATUS_SUCCESS;
|
return NSS_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -172,7 +172,7 @@ internal_nis_getservent_r (struct servent *serv, char *buffer,
|
|||||||
return NSS_STATUS_NOTFOUND;
|
return NSS_STATUS_NOTFOUND;
|
||||||
}
|
}
|
||||||
p = strncpy (buffer, data->next->val, buflen);
|
p = strncpy (buffer, data->next->val, buflen);
|
||||||
while (isspace (*p))
|
while (isspace (*p))
|
||||||
++p;
|
++p;
|
||||||
|
|
||||||
parse_res = _nss_files_parse_servent (p, serv, pdata, buflen, errnop);
|
parse_res = _nss_files_parse_servent (p, serv, pdata, buflen, errnop);
|
||||||
@ -215,6 +215,63 @@ _nss_nis_getservbyname_r (const char *name, char *protocol,
|
|||||||
return NSS_STATUS_UNAVAIL;
|
return NSS_STATUS_UNAVAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If the protocol is given, we could try if our NIS server knows
|
||||||
|
about services.byservicename map. If yes, we only need one query */
|
||||||
|
if (protocol != NULL)
|
||||||
|
{
|
||||||
|
char key[strlen (name) + strlen (protocol) + 2];
|
||||||
|
char *cp, *domain, *result;
|
||||||
|
size_t keylen, len;
|
||||||
|
|
||||||
|
/* If this fails, the other solution will also fail. */
|
||||||
|
if (yp_get_default_domain (&domain))
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
|
||||||
|
/* key is: "name/protocol" */
|
||||||
|
cp = stpcpy (key, name);
|
||||||
|
*cp++ = '/';
|
||||||
|
stpcpy (cp, protocol);
|
||||||
|
keylen = strlen (key);
|
||||||
|
status = yperr2nss (yp_match (domain, "services.byservicename", key,
|
||||||
|
keylen, &result, &len));
|
||||||
|
|
||||||
|
/* If we found the key, it's ok and parse the result. If not,
|
||||||
|
fall through and parse the complete table. */
|
||||||
|
if (status == NSS_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
struct parser_data *pdata = (void *) buffer;
|
||||||
|
int parse_res;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
if ((size_t) (len + 1) > buflen)
|
||||||
|
{
|
||||||
|
free (result);
|
||||||
|
*errnop = ERANGE;
|
||||||
|
return NSS_STATUS_TRYAGAIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = strncpy (buffer, result, len);
|
||||||
|
buffer[len] = '\0';
|
||||||
|
while (isspace (*p))
|
||||||
|
++p;
|
||||||
|
free (result);
|
||||||
|
parse_res = _nss_files_parse_servent (p, serv, pdata,
|
||||||
|
buflen, errnop);
|
||||||
|
if (parse_res < 0)
|
||||||
|
{
|
||||||
|
if (parse_res == -1)
|
||||||
|
return NSS_STATUS_TRYAGAIN;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return NSS_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
status = internal_nis_setservent (&data);
|
status = internal_nis_setservent (&data);
|
||||||
if (status != NSS_STATUS_SUCCESS)
|
if (status != NSS_STATUS_SUCCESS)
|
||||||
return status;
|
return status;
|
||||||
@ -256,10 +313,57 @@ _nss_nis_getservbyport_r (int port, char *protocol, struct servent *serv,
|
|||||||
enum nss_status status;
|
enum nss_status status;
|
||||||
int found;
|
int found;
|
||||||
|
|
||||||
if (protocol == NULL)
|
/* If the protocol is given, we only need one query */
|
||||||
|
if (protocol != NULL)
|
||||||
{
|
{
|
||||||
*errnop = EINVAL;
|
char key[100 + strlen (protocol) + 2];
|
||||||
return NSS_STATUS_UNAVAIL;
|
char *domain, *result;
|
||||||
|
size_t keylen, len;
|
||||||
|
|
||||||
|
/* If this fails, the other solution will also fail. */
|
||||||
|
if (yp_get_default_domain (&domain))
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
|
||||||
|
/* key is: "port/protocol" */
|
||||||
|
keylen = snprintf (key, sizeof (key), "%d/%s", port, protocol);
|
||||||
|
status = yperr2nss (yp_match (domain, "services.byname", key,
|
||||||
|
keylen, &result, &len));
|
||||||
|
|
||||||
|
/* If we found the key, it's ok and parse the result. If not,
|
||||||
|
fall through and parse the complete table. */
|
||||||
|
if (status == NSS_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
struct parser_data *pdata = (void *) buffer;
|
||||||
|
int parse_res;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
if ((size_t) (len + 1) > buflen)
|
||||||
|
{
|
||||||
|
free (result);
|
||||||
|
*errnop = ERANGE;
|
||||||
|
return NSS_STATUS_TRYAGAIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = strncpy (buffer, result, len);
|
||||||
|
buffer[len] = '\0';
|
||||||
|
while (isspace (*p))
|
||||||
|
++p;
|
||||||
|
free (result);
|
||||||
|
parse_res = _nss_files_parse_servent (p, serv, pdata,
|
||||||
|
buflen, errnop);
|
||||||
|
if (parse_res < 0)
|
||||||
|
{
|
||||||
|
if (parse_res == -1)
|
||||||
|
return NSS_STATUS_TRYAGAIN;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return NSS_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
status = internal_nis_setservent (&data);
|
status = internal_nis_setservent (&data);
|
||||||
@ -270,7 +374,8 @@ _nss_nis_getservbyport_r (int port, char *protocol, struct servent *serv,
|
|||||||
while (!found &&
|
while (!found &&
|
||||||
((status = internal_nis_getservent_r (serv, buffer, buflen, errnop,
|
((status = internal_nis_getservent_r (serv, buffer, buflen, errnop,
|
||||||
&data)) == NSS_STATUS_SUCCESS))
|
&data)) == NSS_STATUS_SUCCESS))
|
||||||
if (serv->s_port == port && strcmp (serv->s_proto, protocol) == 0)
|
if (serv->s_port == port &&
|
||||||
|
(protocol == NULL || strcmp (serv->s_proto, protocol) == 0))
|
||||||
found = 1;
|
found = 1;
|
||||||
|
|
||||||
internal_nis_endservent (&data);
|
internal_nis_endservent (&data);
|
||||||
|
348
nis/ypclnt.c
348
nis/ypclnt.c
@ -1,6 +1,6 @@
|
|||||||
/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
|
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
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
|
modify it under the terms of the GNU Library General Public License as
|
||||||
@ -42,7 +42,6 @@ struct dom_binding
|
|||||||
struct sockaddr_in dom_server_addr;
|
struct sockaddr_in dom_server_addr;
|
||||||
int dom_socket;
|
int dom_socket;
|
||||||
CLIENT *dom_client;
|
CLIENT *dom_client;
|
||||||
long int dom_vers;
|
|
||||||
};
|
};
|
||||||
typedef struct dom_binding dom_binding;
|
typedef struct dom_binding dom_binding;
|
||||||
|
|
||||||
@ -63,7 +62,6 @@ __yp_bind (const char *domain, dom_binding **ypdb)
|
|||||||
int clnt_sock;
|
int clnt_sock;
|
||||||
CLIENT *client;
|
CLIENT *client;
|
||||||
int is_new = 0;
|
int is_new = 0;
|
||||||
int try;
|
|
||||||
|
|
||||||
if (domain == NULL || domain[0] == '\0')
|
if (domain == NULL || domain[0] == '\0')
|
||||||
return YPERR_BADARGS;
|
return YPERR_BADARGS;
|
||||||
@ -83,137 +81,127 @@ __yp_bind (const char *domain, dom_binding **ypdb)
|
|||||||
{
|
{
|
||||||
is_new = 1;
|
is_new = 1;
|
||||||
ysd = (dom_binding *) calloc (1, sizeof *ysd);
|
ysd = (dom_binding *) calloc (1, sizeof *ysd);
|
||||||
ysd->dom_socket = -1;
|
|
||||||
ysd->dom_vers = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try = 0;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
++try;
|
|
||||||
if (try > MAXTRIES)
|
|
||||||
{
|
|
||||||
if (is_new)
|
|
||||||
free (ysd);
|
|
||||||
return YPERR_YPBIND;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if USE_BINDINGDIR
|
#if USE_BINDINGDIR
|
||||||
if (ysd->dom_vers < 1 && try == 1) /* Try binding dir only first time */
|
if (ysd->dom_client == NULL)
|
||||||
|
{
|
||||||
|
/* Try binding dir at first if we have no binding */
|
||||||
|
char path[sizeof (BINDINGDIR) + strlen (domain) + 10];
|
||||||
|
struct iovec vec[2];
|
||||||
|
unsigned short port;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
sprintf (path, "%s/%s.%d", BINDINGDIR, domain, YPBINDVERS);
|
||||||
|
fd = open (path, O_RDONLY);
|
||||||
|
if (fd >= 0)
|
||||||
{
|
{
|
||||||
char path[sizeof (BINDINGDIR) - 1 + strlen (domain) + 10];
|
/* We have a binding file and could save a RPC call */
|
||||||
struct iovec vec[2];
|
vec[0].iov_base = &port;
|
||||||
unsigned short port;
|
vec[0].iov_len = sizeof (port);
|
||||||
int fd;
|
vec[1].iov_base = &ypbr;
|
||||||
|
vec[1].iov_len = sizeof (ypbr);
|
||||||
|
|
||||||
sprintf (path, "%s/%s.%d", BINDINGDIR, domain, YPBINDVERS);
|
if (readv (fd, vec, 2) == sizeof (port) + sizeof (ypbr))
|
||||||
fd = open (path, O_RDONLY);
|
|
||||||
if (fd >= 0)
|
|
||||||
{
|
{
|
||||||
/* We have a binding file and could save a RPC call */
|
ysd->dom_server_addr.sin_family = AF_INET;
|
||||||
vec[0].iov_base = &port;
|
memcpy (&ysd->dom_server_addr.sin_port,
|
||||||
vec[0].iov_len = sizeof (port);
|
ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port,
|
||||||
vec[1].iov_base = &ypbr;
|
sizeof (ysd->dom_server_addr.sin_port));
|
||||||
vec[1].iov_len = sizeof (ypbr);
|
memcpy (&ysd->dom_server_addr.sin_addr.s_addr,
|
||||||
|
ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr,
|
||||||
|
sizeof (ysd->dom_server_addr.sin_addr.s_addr));
|
||||||
|
strncpy (ysd->dom_domain, domain, YPMAXDOMAIN);
|
||||||
|
ysd->dom_domain[YPMAXDOMAIN] = '\0';
|
||||||
|
|
||||||
if (readv (fd, vec, 2) == sizeof (port) + sizeof (ypbr))
|
ysd->dom_socket = RPC_ANYSOCK;
|
||||||
{
|
ysd->dom_client = clntudp_create (&ysd->dom_server_addr, YPPROG,
|
||||||
ysd->dom_server_addr.sin_family = AF_INET;
|
YPVERS, UDPTIMEOUT,
|
||||||
memcpy (&ysd->dom_server_addr.sin_port,
|
&ysd->dom_socket);
|
||||||
ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port,
|
|
||||||
sizeof (ysd->dom_server_addr.sin_port));
|
if (ysd->dom_client != NULL)
|
||||||
memcpy (&ysd->dom_server_addr.sin_addr.s_addr,
|
/* If the program exits, close the socket */
|
||||||
ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr,
|
if (fcntl (ysd->dom_socket, F_SETFD, 1) == -1)
|
||||||
sizeof (ysd->dom_server_addr.sin_addr.s_addr));
|
perror ("fcntl: F_SETFD");
|
||||||
ysd->dom_vers = YPVERS;
|
|
||||||
strncpy (ysd->dom_domain, domain, YPMAXDOMAIN);
|
|
||||||
ysd->dom_domain[YPMAXDOMAIN] = '\0';
|
|
||||||
}
|
|
||||||
close (fd);
|
|
||||||
}
|
}
|
||||||
|
close (fd);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif /* USE_BINDINGDIR */
|
#endif /* USE_BINDINGDIR */
|
||||||
|
|
||||||
if (ysd->dom_vers == -1)
|
if (ysd->dom_client == NULL)
|
||||||
|
{
|
||||||
|
memset (&clnt_saddr, '\0', sizeof clnt_saddr);
|
||||||
|
clnt_saddr.sin_family = AF_INET;
|
||||||
|
clnt_saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
|
||||||
|
clnt_sock = RPC_ANYSOCK;
|
||||||
|
client = clnttcp_create (&clnt_saddr, YPBINDPROG, YPBINDVERS,
|
||||||
|
&clnt_sock, 0, 0);
|
||||||
|
if (client == NULL)
|
||||||
{
|
{
|
||||||
if (ysd->dom_client)
|
if (is_new)
|
||||||
{
|
free (ysd);
|
||||||
clnt_destroy (ysd->dom_client);
|
return YPERR_YPBIND;
|
||||||
ysd->dom_client = NULL;
|
}
|
||||||
ysd->dom_socket = -1;
|
/* Check the port number -- should be < IPPORT_RESERVED.
|
||||||
}
|
If not, it's possible someone has registered a bogus
|
||||||
memset (&clnt_saddr, '\0', sizeof clnt_saddr);
|
ypbind with the portmapper and is trying to trick us. */
|
||||||
clnt_saddr.sin_family = AF_INET;
|
if (ntohs (clnt_saddr.sin_port) >= IPPORT_RESERVED)
|
||||||
clnt_saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
|
{
|
||||||
clnt_sock = RPC_ANYSOCK;
|
clnt_destroy (client);
|
||||||
client = clnttcp_create (&clnt_saddr, YPBINDPROG, YPBINDVERS,
|
if (is_new)
|
||||||
&clnt_sock, 0, 0);
|
free (ysd);
|
||||||
if (client == NULL)
|
return YPERR_YPBIND;
|
||||||
{
|
}
|
||||||
if (is_new)
|
|
||||||
free (ysd);
|
|
||||||
return YPERR_YPBIND;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
** Check the port number -- should be < IPPORT_RESERVED.
|
|
||||||
** If not, it's possible someone has registered a bogus
|
|
||||||
** ypbind with the portmapper and is trying to trick us.
|
|
||||||
*/
|
|
||||||
if (ntohs (clnt_saddr.sin_port) >= IPPORT_RESERVED)
|
|
||||||
{
|
|
||||||
clnt_destroy (client);
|
|
||||||
if (is_new)
|
|
||||||
free (ysd);
|
|
||||||
return YPERR_YPBIND;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clnt_call (client, YPBINDPROC_DOMAIN,
|
if (clnt_call (client, YPBINDPROC_DOMAIN,
|
||||||
(xdrproc_t) xdr_domainname, (caddr_t) &domain,
|
(xdrproc_t) xdr_domainname, (caddr_t) &domain,
|
||||||
(xdrproc_t) xdr_ypbind_resp,
|
(xdrproc_t) xdr_ypbind_resp,
|
||||||
(caddr_t) &ypbr, RPCTIMEOUT) != RPC_SUCCESS)
|
(caddr_t) &ypbr, RPCTIMEOUT) != RPC_SUCCESS)
|
||||||
{
|
{
|
||||||
clnt_destroy (client);
|
clnt_destroy (client);
|
||||||
if (is_new)
|
if (is_new)
|
||||||
free (ysd);
|
free (ysd);
|
||||||
return YPERR_YPBIND;
|
return YPERR_YPBIND;
|
||||||
}
|
}
|
||||||
|
|
||||||
clnt_destroy (client);
|
clnt_destroy (client);
|
||||||
|
|
||||||
if (ypbr.ypbind_status != YPBIND_SUCC_VAL)
|
if (ypbr.ypbind_status != YPBIND_SUCC_VAL)
|
||||||
{
|
{
|
||||||
fprintf (stderr, _("YPBINDPROC_DOMAIN: %s\n"),
|
fprintf (stderr, _("YPBINDPROC_DOMAIN: %s\n"),
|
||||||
ypbinderr_string (ypbr.ypbind_resp_u.ypbind_error));
|
ypbinderr_string (ypbr.ypbind_resp_u.ypbind_error));
|
||||||
if (is_new)
|
if (is_new)
|
||||||
free (ysd);
|
free (ysd);
|
||||||
return YPERR_DOMAIN;
|
return YPERR_DOMAIN;
|
||||||
}
|
}
|
||||||
memset (&ysd->dom_server_addr, '\0', sizeof ysd->dom_server_addr);
|
memset (&ysd->dom_server_addr, '\0', sizeof ysd->dom_server_addr);
|
||||||
ysd->dom_server_addr.sin_family = AF_INET;
|
ysd->dom_server_addr.sin_family = AF_INET;
|
||||||
memcpy (&ysd->dom_server_addr.sin_port,
|
memcpy (&ysd->dom_server_addr.sin_port,
|
||||||
ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port,
|
ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port,
|
||||||
sizeof (ysd->dom_server_addr.sin_port));
|
sizeof (ysd->dom_server_addr.sin_port));
|
||||||
memcpy (&ysd->dom_server_addr.sin_addr.s_addr,
|
memcpy (&ysd->dom_server_addr.sin_addr.s_addr,
|
||||||
ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr,
|
ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr,
|
||||||
sizeof (ysd->dom_server_addr.sin_addr.s_addr));
|
sizeof (ysd->dom_server_addr.sin_addr.s_addr));
|
||||||
ysd->dom_vers = YPVERS;
|
strncpy (ysd->dom_domain, domain, YPMAXDOMAIN);
|
||||||
strncpy (ysd->dom_domain, domain, YPMAXDOMAIN);
|
ysd->dom_domain[YPMAXDOMAIN] = '\0';
|
||||||
ysd->dom_domain[YPMAXDOMAIN] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
ysd->dom_socket = RPC_ANYSOCK;
|
ysd->dom_socket = RPC_ANYSOCK;
|
||||||
ysd->dom_client = clntudp_create (&ysd->dom_server_addr, YPPROG, YPVERS,
|
ysd->dom_client = clntudp_create (&ysd->dom_server_addr, YPPROG, YPVERS,
|
||||||
UDPTIMEOUT, &ysd->dom_socket);
|
UDPTIMEOUT, &ysd->dom_socket);
|
||||||
if (ysd->dom_client == NULL)
|
|
||||||
ysd->dom_vers = -1;
|
|
||||||
|
|
||||||
|
if (ysd->dom_client != NULL)
|
||||||
|
/* If the program exits, close the socket */
|
||||||
|
if (fcntl (ysd->dom_socket, F_SETFD, 1) == -1)
|
||||||
|
perror ("fcntl: F_SETFD");
|
||||||
}
|
}
|
||||||
while (ysd->dom_client == NULL);
|
|
||||||
|
|
||||||
/* If the program exists, close the socket */
|
if (ysd->dom_client == NULL)
|
||||||
if (fcntl (ysd->dom_socket, F_SETFD, 1) == -1)
|
{
|
||||||
perror ("fcntl: F_SETFD");
|
if (is_new)
|
||||||
|
free (ysd);
|
||||||
|
return YPERR_YPSERV;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_new && ypdb != NULL)
|
if (is_new && ypdb != NULL)
|
||||||
{
|
{
|
||||||
@ -229,7 +217,60 @@ __yp_unbind (dom_binding *ydb)
|
|||||||
{
|
{
|
||||||
clnt_destroy (ydb->dom_client);
|
clnt_destroy (ydb->dom_client);
|
||||||
ydb->dom_client = NULL;
|
ydb->dom_client = NULL;
|
||||||
ydb->dom_socket = -1;
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
yp_bind (const char *indomain)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
__libc_lock_lock (ypbindlist_lock);
|
||||||
|
|
||||||
|
status = __yp_bind (indomain, &__ypbindlist);
|
||||||
|
|
||||||
|
__libc_lock_unlock (ypbindlist_lock);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
yp_unbind_locked (const char *indomain)
|
||||||
|
{
|
||||||
|
dom_binding *ydbptr, *ydbptr2;
|
||||||
|
|
||||||
|
ydbptr2 = NULL;
|
||||||
|
ydbptr = __ypbindlist;
|
||||||
|
|
||||||
|
while (ydbptr != NULL)
|
||||||
|
{
|
||||||
|
if (strcmp (ydbptr->dom_domain, indomain) == 0)
|
||||||
|
{
|
||||||
|
dom_binding *work;
|
||||||
|
|
||||||
|
work = ydbptr;
|
||||||
|
if (ydbptr2 == NULL)
|
||||||
|
__ypbindlist = __ypbindlist->dom_pnext;
|
||||||
|
else
|
||||||
|
ydbptr2 = ydbptr->dom_pnext;
|
||||||
|
__yp_unbind (work);
|
||||||
|
free (work);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ydbptr2 = ydbptr;
|
||||||
|
ydbptr = ydbptr->dom_pnext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
yp_unbind (const char *indomain)
|
||||||
|
{
|
||||||
|
__libc_lock_lock (ypbindlist_lock);
|
||||||
|
|
||||||
|
yp_unbind_locked (indomain);
|
||||||
|
|
||||||
|
__libc_lock_unlock (ypbindlist_lock);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -278,14 +319,26 @@ do_ypcall (const char *domain, u_long prog, xdrproc_t xargs,
|
|||||||
|
|
||||||
if (result != RPC_SUCCESS)
|
if (result != RPC_SUCCESS)
|
||||||
{
|
{
|
||||||
clnt_perror (ydb->dom_client, "do_ypcall: clnt_call");
|
/* Don't print the error message on the first try. It
|
||||||
ydb->dom_vers = -1;
|
could be that we use cached data which is now invalid. */
|
||||||
if (!use_ypbindlist)
|
if (try != 0)
|
||||||
|
clnt_perror (ydb->dom_client, "do_ypcall: clnt_call");
|
||||||
|
|
||||||
|
if (use_ypbindlist)
|
||||||
|
{
|
||||||
|
/* We use ypbindlist, and the old cached data is
|
||||||
|
invalid. unbind now and create a new binding */
|
||||||
|
yp_unbind_locked (domain);
|
||||||
|
__libc_lock_unlock (ypbindlist_lock);
|
||||||
|
use_ypbindlist = FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
__yp_unbind (ydb);
|
__yp_unbind (ydb);
|
||||||
free (ydb);
|
free (ydb);
|
||||||
ydb = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ydb = NULL;
|
||||||
status = YPERR_RPC;
|
status = YPERR_RPC;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -311,52 +364,6 @@ do_ypcall (const char *domain, u_long prog, xdrproc_t xargs,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
yp_bind (const char *indomain)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
|
|
||||||
__libc_lock_lock (ypbindlist_lock);
|
|
||||||
|
|
||||||
status = __yp_bind (indomain, &__ypbindlist);
|
|
||||||
|
|
||||||
__libc_lock_unlock (ypbindlist_lock);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
yp_unbind (const char *indomain)
|
|
||||||
{
|
|
||||||
dom_binding *ydbptr, *ydbptr2;
|
|
||||||
|
|
||||||
__libc_lock_lock (ypbindlist_lock);
|
|
||||||
|
|
||||||
ydbptr2 = NULL;
|
|
||||||
ydbptr = __ypbindlist;
|
|
||||||
while (ydbptr != NULL)
|
|
||||||
{
|
|
||||||
if (strcmp (ydbptr->dom_domain, indomain) == 0)
|
|
||||||
{
|
|
||||||
dom_binding *work;
|
|
||||||
|
|
||||||
work = ydbptr;
|
|
||||||
if (ydbptr2 == NULL)
|
|
||||||
__ypbindlist = __ypbindlist->dom_pnext;
|
|
||||||
else
|
|
||||||
ydbptr2 = ydbptr->dom_pnext;
|
|
||||||
__yp_unbind (work);
|
|
||||||
free (work);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ydbptr2 = ydbptr;
|
|
||||||
ydbptr = ydbptr->dom_pnext;
|
|
||||||
}
|
|
||||||
|
|
||||||
__libc_lock_unlock (ypbindlist_lock);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
__libc_lock_define_initialized (static, domainname_lock)
|
__libc_lock_define_initialized (static, domainname_lock)
|
||||||
|
|
||||||
@ -374,7 +381,7 @@ yp_get_default_domain (char **outdomain)
|
|||||||
result = YPERR_NODOM;
|
result = YPERR_NODOM;
|
||||||
else if (strcmp (__ypdomainname, "(none)") == 0)
|
else if (strcmp (__ypdomainname, "(none)") == 0)
|
||||||
{
|
{
|
||||||
/* If domainname is not set, some Systems will return "(none)" */
|
/* If domainname is not set, some systems will return "(none)" */
|
||||||
__ypdomainname[0] = '\0';
|
__ypdomainname[0] = '\0';
|
||||||
result = YPERR_NODOM;
|
result = YPERR_NODOM;
|
||||||
}
|
}
|
||||||
@ -629,6 +636,10 @@ __xdr_ypresp_all (XDR *xdrs, u_long *objp)
|
|||||||
int keylen = resp.ypresp_all_u.val.key.keydat_len;
|
int keylen = resp.ypresp_all_u.val.key.keydat_len;
|
||||||
int vallen = resp.ypresp_all_u.val.val.valdat_len;
|
int vallen = resp.ypresp_all_u.val.val.valdat_len;
|
||||||
|
|
||||||
|
/* We are not allowed to modify the key and val data.
|
||||||
|
But we are allowed to add data behind the buffer,
|
||||||
|
if we don't modify the length. So add an extra NUL
|
||||||
|
character to avoid trouble with broken code. */
|
||||||
*objp = YP_TRUE;
|
*objp = YP_TRUE;
|
||||||
memcpy (key, resp.ypresp_all_u.val.key.keydat_val, keylen);
|
memcpy (key, resp.ypresp_all_u.val.key.keydat_val, keylen);
|
||||||
key[keylen] = '\0';
|
key[keylen] = '\0';
|
||||||
@ -640,14 +651,13 @@ __xdr_ypresp_all (XDR *xdrs, u_long *objp)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case YP_NOMORE:
|
|
||||||
*objp = YP_NOMORE;
|
|
||||||
xdr_free ((xdrproc_t) xdr_ypresp_all, (char *) &resp);
|
|
||||||
return TRUE;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
*objp = resp.ypresp_all_u.val.stat;
|
*objp = resp.ypresp_all_u.val.stat;
|
||||||
xdr_free ((xdrproc_t) xdr_ypresp_all, (char *) &resp);
|
xdr_free ((xdrproc_t) xdr_ypresp_all, (char *) &resp);
|
||||||
|
/* Sun says we don't need to make this call, but must return
|
||||||
|
immediatly. Since Solaris makes this call, we will call
|
||||||
|
the callback function, too. */
|
||||||
|
(*ypall_foreach) (*objp, NULL, 0, NULL, 0, ypall_data);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ include ../Makeconfig
|
|||||||
|
|
||||||
ifeq ($(have-thread-library),yes)
|
ifeq ($(have-thread-library),yes)
|
||||||
|
|
||||||
tests := tst-aio
|
tests := tst-aio tst-aio64
|
||||||
|
|
||||||
extra-libs := librt
|
extra-libs := librt
|
||||||
extra-libs-others := $(extra-libs)
|
extra-libs-others := $(extra-libs)
|
||||||
@ -51,6 +51,8 @@ $(objpfx)librt.so: $(common-objpfx)libc.so $(shared-thread-library)
|
|||||||
|
|
||||||
ifeq (yes,$(build-shared))
|
ifeq (yes,$(build-shared))
|
||||||
$(objpfx)tst-aio: $(objpfx)librt.so $(shared-thread-library)
|
$(objpfx)tst-aio: $(objpfx)librt.so $(shared-thread-library)
|
||||||
|
$(objpfx)tst-aio64: $(objpfx)librt.so $(shared-thread-library)
|
||||||
else
|
else
|
||||||
$(objpfx)tst-aio: $(objpfx)librt.a $(static-thread-library)
|
$(objpfx)tst-aio: $(objpfx)librt.a $(static-thread-library)
|
||||||
|
$(objpfx)tst-aio64: $(objpfx)librt.a $(static-thread-library)
|
||||||
endif
|
endif
|
4
rt/aio.h
4
rt/aio.h
@ -57,7 +57,8 @@ struct aiocb
|
|||||||
char __unused[32];
|
char __unused[32];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The same for the 64bit offsets. */
|
/* The same for the 64bit offsets. Please note that the members aio_fildes
|
||||||
|
to __return_value have to be the same in aiocb and aiocb64. */
|
||||||
#ifdef __USE_LARGEFILE64
|
#ifdef __USE_LARGEFILE64
|
||||||
struct aiocb64
|
struct aiocb64
|
||||||
{
|
{
|
||||||
@ -69,6 +70,7 @@ struct aiocb64
|
|||||||
struct sigevent aio_sigevent; /* Signal number and value. */
|
struct sigevent aio_sigevent; /* Signal number and value. */
|
||||||
|
|
||||||
/* Internal members. */
|
/* Internal members. */
|
||||||
|
struct aiocb *__next_prio;
|
||||||
int __abs_prio;
|
int __abs_prio;
|
||||||
int __policy;
|
int __policy;
|
||||||
int __error_code;
|
int __error_code;
|
||||||
|
196
rt/tst-aio64.c
Normal file
196
rt/tst-aio64.c
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
/* Tests for 64bit AIO in librt.
|
||||||
|
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
||||||
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||||
|
|
||||||
|
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. */
|
||||||
|
|
||||||
|
#define _LARGEFILE_SOURCE 1
|
||||||
|
#include <aio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <error.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Prototype for our test function. */
|
||||||
|
extern void do_prepare (int argc, char *argv[]);
|
||||||
|
extern int do_test (int argc, char *argv[]);
|
||||||
|
|
||||||
|
/* We have a preparation function. */
|
||||||
|
#define PREPARE do_prepare
|
||||||
|
|
||||||
|
/* We might need a bit longer timeout. */
|
||||||
|
#define TIMEOUT 20 /* sec */
|
||||||
|
|
||||||
|
/* This defines the `main' function and some more. */
|
||||||
|
#include <test-skeleton.c>
|
||||||
|
|
||||||
|
|
||||||
|
/* These are for the temporary file we generate. */
|
||||||
|
char *name;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
void
|
||||||
|
do_prepare (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char name_len;
|
||||||
|
|
||||||
|
name_len = strlen (test_dir);
|
||||||
|
name = malloc (name_len + sizeof ("/aioXXXXXX"));
|
||||||
|
mempcpy (mempcpy (name, test_dir, name_len),
|
||||||
|
"/aioXXXXXX", sizeof ("/aioXXXXXX"));
|
||||||
|
add_temp_file (name);
|
||||||
|
|
||||||
|
/* Open our test file. */
|
||||||
|
fd = mkstemp (name);
|
||||||
|
if (fd == -1)
|
||||||
|
error (EXIT_FAILURE, errno, "cannot open test file `%s'", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
test_file (const void *buf, size_t size, int fd, const char *msg)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
char tmp[size];
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
if (fstat (fd, &st) < 0)
|
||||||
|
{
|
||||||
|
error (0, errno, "%s: failed stat", msg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (st.st_size != size)
|
||||||
|
{
|
||||||
|
error (0, errno, "%s: wrong size: %lu, should be %lu",
|
||||||
|
msg, (unsigned long int) st.st_size, (unsigned long int) size);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pread (fd, tmp, size, 0) != size)
|
||||||
|
{
|
||||||
|
error (0, errno, "%s: failed stat", msg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (memcmp (buf, tmp, size) != 0)
|
||||||
|
{
|
||||||
|
error (0, errno, "%s: failed comparison", msg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf ("%s test ok\n", msg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
do_wait (struct aiocb64 **cbp, size_t nent)
|
||||||
|
{
|
||||||
|
int go_on;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
size_t cnt;
|
||||||
|
|
||||||
|
aio_suspend64 ((const struct aiocb64 *const *) cbp, nent, NULL);
|
||||||
|
go_on = 0;
|
||||||
|
for (cnt = 0; cnt < nent; ++cnt)
|
||||||
|
if (cbp[cnt] != NULL && aio_error64 (cbp[cnt]) == EINPROGRESS)
|
||||||
|
go_on = 1;
|
||||||
|
else
|
||||||
|
cbp[cnt] = NULL;
|
||||||
|
}
|
||||||
|
while (go_on);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
do_test (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct aiocb64 cbs[10];
|
||||||
|
struct aiocb64 *cbp[10];
|
||||||
|
char buf[1000];
|
||||||
|
size_t cnt;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
/* Preparation. */
|
||||||
|
for (cnt = 0; cnt < 10; ++cnt)
|
||||||
|
{
|
||||||
|
cbs[cnt].aio_fildes = fd;
|
||||||
|
cbs[cnt].aio_reqprio = 0;
|
||||||
|
cbs[cnt].aio_buf = memset (&buf[cnt * 100], '0' + cnt, 100);
|
||||||
|
cbs[cnt].aio_nbytes = 100;
|
||||||
|
cbs[cnt].aio_offset = cnt * 100;
|
||||||
|
cbs[cnt].aio_sigevent.sigev_notify = SIGEV_NONE;
|
||||||
|
|
||||||
|
cbp[cnt] = &cbs[cnt];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* First a simple test. */
|
||||||
|
for (cnt = 10; cnt > 0; )
|
||||||
|
aio_write64 (cbp[--cnt]);
|
||||||
|
/* Wait 'til the results are there. */
|
||||||
|
do_wait (cbp, 10);
|
||||||
|
/* Test this. */
|
||||||
|
result |= test_file (buf, sizeof (buf), fd, "aio_write");
|
||||||
|
|
||||||
|
/* Read now as we've written it. */
|
||||||
|
memset (buf, '\0', sizeof (buf));
|
||||||
|
/* Issue the commands. */
|
||||||
|
for (cnt = 10; cnt > 0; )
|
||||||
|
{
|
||||||
|
--cnt;
|
||||||
|
cbp[cnt] = &cbs[cnt];
|
||||||
|
aio_read64 (cbp[cnt]);
|
||||||
|
}
|
||||||
|
/* Wait 'til the results are there. */
|
||||||
|
do_wait (cbp, 10);
|
||||||
|
/* Test this. */
|
||||||
|
for (cnt = 0; cnt < 1000; ++cnt)
|
||||||
|
if (buf[cnt] != '0' + (cnt / 100))
|
||||||
|
{
|
||||||
|
result = 1;
|
||||||
|
error (0, 0, "comparison failed for aio_read test");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cnt == 1000)
|
||||||
|
puts ("aio_read test ok");
|
||||||
|
|
||||||
|
/* Remove the test file contents. */
|
||||||
|
if (ftruncate64 (fd, 0) < 0)
|
||||||
|
{
|
||||||
|
error (0, errno, "ftruncate failed\n");
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test lio_listio. */
|
||||||
|
for (cnt = 0; cnt < 10; ++cnt)
|
||||||
|
{
|
||||||
|
cbs[cnt].aio_lio_opcode = LIO_WRITE;
|
||||||
|
cbp[cnt] = &cbs[cnt];
|
||||||
|
}
|
||||||
|
/* Issue the command. */
|
||||||
|
lio_listio64 (LIO_WAIT, cbp, 10, NULL);
|
||||||
|
/* ...and immediately test it since we started it in wait mode. */
|
||||||
|
result |= test_file (buf, sizeof (buf), fd, "lio_listio (write)");
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
@ -1185,8 +1185,8 @@ UDItype __umulsidi3 (USItype, USItype);
|
|||||||
#if (defined (__sparc_v9__) || (defined (__sparc__) && defined (__arch64__)) \
|
#if (defined (__sparc_v9__) || (defined (__sparc__) && defined (__arch64__)) \
|
||||||
|| defined (__sparcv9)) && W_TYPE_SIZE == 64
|
|| defined (__sparcv9)) && W_TYPE_SIZE == 64
|
||||||
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
|
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
|
||||||
__asm__ ("addcc %4,%5,%1
|
__asm__ ("addcc %r4,%5,%1
|
||||||
add %2,%3,%0
|
add %r2,%3,%0
|
||||||
bcs,a,pn %%xcc, 1f
|
bcs,a,pn %%xcc, 1f
|
||||||
add %0, 1, %0
|
add %0, 1, %0
|
||||||
1:" \
|
1:" \
|
||||||
@ -1199,8 +1199,8 @@ UDItype __umulsidi3 (USItype, USItype);
|
|||||||
__CLOBBER_CC)
|
__CLOBBER_CC)
|
||||||
|
|
||||||
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
|
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
|
||||||
__asm__ ("subcc %4,%5,%1
|
__asm__ ("subcc %r4,%5,%1
|
||||||
sub %2,%3,%0
|
sub %r2,%3,%0
|
||||||
bcs,a,pn %%xcc, 1f
|
bcs,a,pn %%xcc, 1f
|
||||||
sub %0, 1, %0
|
sub %0, 1, %0
|
||||||
1:" \
|
1:" \
|
||||||
|
@ -118,7 +118,7 @@ __STRING2_COPY_TYPE (8);
|
|||||||
__uint8_t __c = (__uint8_t) (c); \
|
__uint8_t __c = (__uint8_t) (c); \
|
||||||
\
|
\
|
||||||
/* This `switch' statement will be removed at compile-time. */ \
|
/* This `switch' statement will be removed at compile-time. */ \
|
||||||
switch ((unsigned int) n) \
|
switch ((unsigned int) (n)) \
|
||||||
{ \
|
{ \
|
||||||
case 15: \
|
case 15: \
|
||||||
__u->__ui = __c * 0x01010101; \
|
__u->__ui = __c * 0x01010101; \
|
||||||
@ -1078,8 +1078,10 @@ __strtok_r_1c (char *__s, char __sep, char **__nextp)
|
|||||||
__extension__ \
|
__extension__ \
|
||||||
({ char __r0, __r1, __r2; \
|
({ char __r0, __r1, __r2; \
|
||||||
(__builtin_constant_p (reject) && __string2_1bptr_p (reject) \
|
(__builtin_constant_p (reject) && __string2_1bptr_p (reject) \
|
||||||
&& (__r0 = ((__const char *) (reject))[0], __r0 != '\0') \
|
&& (__r0 = ((__const char *) (reject))[0], \
|
||||||
? ((__r1 = ((__const char *) (reject))[1], __r1 == '\0') \
|
((__const char *) (reject))[0] != '\0') \
|
||||||
|
? ((__r1 = ((__const char *) (reject))[1], \
|
||||||
|
((__const char *) (reject))[1] == '\0') \
|
||||||
? __strsep_1c (s, __r0) \
|
? __strsep_1c (s, __r0) \
|
||||||
: ((__r2 = ((__const char *) (reject))[2], __r2 == '\0') \
|
: ((__r2 = ((__const char *) (reject))[2], __r2 == '\0') \
|
||||||
? __strsep_2c (s, __r0, __r1) \
|
? __strsep_2c (s, __r0, __r1) \
|
||||||
|
@ -807,6 +807,7 @@ test_strtok_r (void)
|
|||||||
void
|
void
|
||||||
test_strsep (void)
|
test_strsep (void)
|
||||||
{
|
{
|
||||||
|
char *ptr;
|
||||||
it = "strsep";
|
it = "strsep";
|
||||||
cp = strcpy(one, "first, second, third");
|
cp = strcpy(one, "first, second, third");
|
||||||
equal(strsep(&cp, ", "), "first", 1); /* Basic test. */
|
equal(strsep(&cp, ", "), "first", 1); /* Basic test. */
|
||||||
@ -901,6 +902,32 @@ test_strsep (void)
|
|||||||
equal(strsep(&cp, "xy,"), "", 71);
|
equal(strsep(&cp, "xy,"), "", 71);
|
||||||
check(strsep(&cp, "x,y") == NULL, 72);
|
check(strsep(&cp, "x,y") == NULL, 72);
|
||||||
check(strsep(&cp, ",xy") == NULL, 73); /* Persistence. */
|
check(strsep(&cp, ",xy") == NULL, 73); /* Persistence. */
|
||||||
|
|
||||||
|
cp = strcpy(one, "ABC");
|
||||||
|
one[4] = ':';
|
||||||
|
equal(strsep(&cp, "C"), "AB", 74); /* Access beyond NUL. */
|
||||||
|
ptr = strsep(&cp, ":");
|
||||||
|
equal(ptr, "", 75);
|
||||||
|
check(ptr == one + 3, 76);
|
||||||
|
check(cp == NULL, 77);
|
||||||
|
|
||||||
|
cp = strcpy(one, "ABC");
|
||||||
|
one[4] = ':';
|
||||||
|
equal(strsep(&cp, "CD"), "AB", 78); /* Access beyond NUL. */
|
||||||
|
ptr = strsep(&cp, ":.");
|
||||||
|
equal(ptr, "", 79);
|
||||||
|
check(ptr == one + 3, 80);
|
||||||
|
|
||||||
|
cp = strcpy(one, "ABC"); /* No token in string. */
|
||||||
|
equal(strsep(&cp, ","), "ABC", 81);
|
||||||
|
check(cp == NULL, 82);
|
||||||
|
|
||||||
|
*one = '\0'; /* Empty string. */
|
||||||
|
cp = one;
|
||||||
|
ptr = strsep(&cp, ",");
|
||||||
|
equal(ptr, "", 83);
|
||||||
|
check(ptr == one, 84);
|
||||||
|
check(cp == NULL, 85);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -23,7 +23,9 @@
|
|||||||
/* FIXME! This file describes properties of the compiler, not the machine;
|
/* FIXME! This file describes properties of the compiler, not the machine;
|
||||||
it should not be part of libc! */
|
it should not be part of libc! */
|
||||||
|
|
||||||
#if defined __USE_ISOC99 && defined _MATH_H
|
#if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF
|
||||||
|
# define _MATH_H_MATHDEF 1
|
||||||
|
|
||||||
# ifdef __GNUC__
|
# ifdef __GNUC__
|
||||||
# if __STDC__ == 1
|
# if __STDC__ == 1
|
||||||
|
|
||||||
|
@ -20,7 +20,9 @@
|
|||||||
# error "Never use <bits/mathdef.h> directly; include <math.h> instead"
|
# error "Never use <bits/mathdef.h> directly; include <math.h> instead"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined __USE_ISOC99 && defined _MATH_H
|
#if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF
|
||||||
|
# define _MATH_H_MATHDEF 1
|
||||||
|
|
||||||
/* Normally, there is no long double type and the `float' and `double'
|
/* Normally, there is no long double type and the `float' and `double'
|
||||||
expressions are evaluated as `double'. */
|
expressions are evaluated as `double'. */
|
||||||
typedef double float_t; /* `float' expressions are evaluated as
|
typedef double float_t; /* `float' expressions are evaluated as
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1992, 1993, 1996, 1997, 1998 Free Software Foundation, Inc.
|
/* Copyright (C) 1992, 93, 96, 97, 98, 99 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -43,6 +43,8 @@ __strsep (char **stringp, const char *delim)
|
|||||||
{
|
{
|
||||||
if (*begin == ch)
|
if (*begin == ch)
|
||||||
end = begin;
|
end = begin;
|
||||||
|
else if (*begin == '\0')
|
||||||
|
end = NULL;
|
||||||
else
|
else
|
||||||
end = strchr (begin + 1, ch);
|
end = strchr (begin + 1, ch);
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,9 @@
|
|||||||
# error "Never use <bits/mathdef.h> directly; include <math.h> instead"
|
# error "Never use <bits/mathdef.h> directly; include <math.h> instead"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined __USE_ISOC99 && defined _MATH_H
|
#if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF
|
||||||
|
# define _MATH_H_MATHDEF 1
|
||||||
|
|
||||||
/* The ix87 FPUs evaluate all values in the 80 bit floating-point format
|
/* The ix87 FPUs evaluate all values in the 80 bit floating-point format
|
||||||
which is also available for the user as `long double'. Therefore we
|
which is also available for the user as `long double'. Therefore we
|
||||||
define: */
|
define: */
|
||||||
|
@ -488,10 +488,14 @@ Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383
|
|||||||
ildouble: 2
|
ildouble: 2
|
||||||
ldouble: 2
|
ldouble: 2
|
||||||
Test "Imaginary part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i":
|
Test "Imaginary part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i":
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
ildouble: 23
|
ildouble: 23
|
||||||
ldouble: 23
|
ldouble: 23
|
||||||
Test "Real part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i":
|
Test "Real part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i":
|
||||||
Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i":
|
Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i":
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
double: 0.5
|
double: 0.5
|
||||||
idouble: 0.5
|
idouble: 0.5
|
||||||
Test "Real part of: ctanh (0.7 + 1.2 i) == 1.3472197399061191630 + 0.4778641038326365540 i":
|
Test "Real part of: ctanh (0.7 + 1.2 i) == 1.3472197399061191630 + 0.4778641038326365540 i":
|
||||||
@ -636,6 +640,9 @@ idouble: 1
|
|||||||
Test "j0 (8.0) == 0.17165080713755390609":
|
Test "j0 (8.0) == 0.17165080713755390609":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
|
Test "j0 (10.0) == -0.24593576445134833520":
|
||||||
|
double: 2
|
||||||
|
idouble: 2
|
||||||
|
|
||||||
# j1
|
# j1
|
||||||
Test "j1 (10.0) == 0.043472746168861436670":
|
Test "j1 (10.0) == 0.043472746168861436670":
|
||||||
@ -654,6 +661,8 @@ ifloat: 1
|
|||||||
Test "jn (0, 10.0) == -0.24593576445134833520":
|
Test "jn (0, 10.0) == -0.24593576445134833520":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
|
double: 2
|
||||||
|
idouble: 2
|
||||||
Test "jn (0, 2.0) == 0.22389077914123566805":
|
Test "jn (0, 2.0) == 0.22389077914123566805":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
@ -673,33 +682,46 @@ idouble: 1
|
|||||||
Test "jn (1, 8.0) == 0.23463634685391462438":
|
Test "jn (1, 8.0) == 0.23463634685391462438":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
|
Test "jn (10, -1.0) == 0.26306151236874532070e-9":
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
Test "jn (10, 0.1) == 0.26905328954342155795e-19":
|
Test "jn (10, 0.1) == 0.26905328954342155795e-19":
|
||||||
double: 4
|
double: 4
|
||||||
float: 2
|
float: 2
|
||||||
idouble: 4
|
idouble: 4
|
||||||
ifloat: 2
|
ifloat: 2
|
||||||
Test "jn (10, 0.7) == 0.75175911502153953928e-11":
|
Test "jn (10, 0.7) == 0.75175911502153953928e-11":
|
||||||
double: 3
|
double: 4
|
||||||
|
float: 1
|
||||||
|
idouble: 4
|
||||||
|
ifloat: 1
|
||||||
|
Test "jn (10, 1.0) == 0.26306151236874532070e-9":
|
||||||
float: 1
|
float: 1
|
||||||
idouble: 3
|
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
Test "jn (10, 2.0) == 0.25153862827167367096e-6":
|
Test "jn (10, 2.0) == 0.25153862827167367096e-6":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
double: 1
|
double: 2
|
||||||
idouble: 1
|
idouble: 2
|
||||||
Test "jn (10, 10.0) == 0.20748610663335885770":
|
Test "jn (10, 10.0) == 0.20748610663335885770":
|
||||||
float: 1
|
float: 2
|
||||||
ifloat: 1
|
ifloat: 2
|
||||||
|
double: 4
|
||||||
|
idouble: 4
|
||||||
Test "jn (3, 0.1) == 0.000020820315754756261429":
|
Test "jn (3, 0.1) == 0.000020820315754756261429":
|
||||||
double: 1
|
double: 1
|
||||||
idouble: 1
|
idouble: 1
|
||||||
Test "jn (3, 0.7) == 0.0069296548267508408077":
|
Test "jn (3, 0.7) == 0.0069296548267508408077":
|
||||||
double: 2
|
double: 2
|
||||||
idouble: 2
|
idouble: 2
|
||||||
|
Test "jn (3, 2.0) == 0.12894324947440205110":
|
||||||
|
double: 1
|
||||||
|
idouble: 1
|
||||||
Test "jn (3, 10.0) == 0.058379379305186812343":
|
Test "jn (3, 10.0) == 0.058379379305186812343":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
|
double: 3
|
||||||
|
idouble: 3
|
||||||
|
|
||||||
# lgamma
|
# lgamma
|
||||||
Test "lgamma (-0.5) == log(2*sqrt(pi))":
|
Test "lgamma (-0.5) == log(2*sqrt(pi))":
|
||||||
@ -847,6 +869,8 @@ float: 1
|
|||||||
idouble: 1
|
idouble: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
Test "y0 (0.7) == -0.19066492933739506743":
|
Test "y0 (0.7) == -0.19066492933739506743":
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
double: 2
|
double: 2
|
||||||
idouble: 2
|
idouble: 2
|
||||||
Test "y0 (1.0) == 0.088256964215676957983":
|
Test "y0 (1.0) == 0.088256964215676957983":
|
||||||
@ -857,6 +881,8 @@ ifloat: 1
|
|||||||
Test "y0 (1.5) == 0.38244892379775884396":
|
Test "y0 (1.5) == 0.38244892379775884396":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
|
double: 1
|
||||||
|
idouble: 1
|
||||||
Test "y0 (2.0) == 0.51037567264974511960":
|
Test "y0 (2.0) == 0.51037567264974511960":
|
||||||
double: 1
|
double: 1
|
||||||
idouble: 1
|
idouble: 1
|
||||||
@ -891,9 +917,9 @@ idouble: 3
|
|||||||
ifloat: 2
|
ifloat: 2
|
||||||
Test "y1 (2.0) == -0.10703243154093754689":
|
Test "y1 (2.0) == -0.10703243154093754689":
|
||||||
double: 1
|
double: 1
|
||||||
float: 1
|
float: 2
|
||||||
idouble: 1
|
idouble: 1
|
||||||
ifloat: 1
|
ifloat: 2
|
||||||
Test "y1 (8.0) == -0.15806046173124749426":
|
Test "y1 (8.0) == -0.15806046173124749426":
|
||||||
float: 2
|
float: 2
|
||||||
ifloat: 2
|
ifloat: 2
|
||||||
@ -905,6 +931,8 @@ float: 1
|
|||||||
idouble: 1
|
idouble: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
Test "yn (0, 0.7) == -0.19066492933739506743":
|
Test "yn (0, 0.7) == -0.19066492933739506743":
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
double: 2
|
double: 2
|
||||||
idouble: 2
|
idouble: 2
|
||||||
Test "yn (0, 1.0) == 0.088256964215676957983":
|
Test "yn (0, 1.0) == 0.088256964215676957983":
|
||||||
@ -915,6 +943,8 @@ ifloat: 1
|
|||||||
Test "yn (0, 1.5) == 0.38244892379775884396":
|
Test "yn (0, 1.5) == 0.38244892379775884396":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
|
double: 1
|
||||||
|
idouble: 1
|
||||||
Test "yn (0, 2.0) == 0.51037567264974511960":
|
Test "yn (0, 2.0) == 0.51037567264974511960":
|
||||||
double: 1
|
double: 1
|
||||||
idouble: 1
|
idouble: 1
|
||||||
@ -947,9 +977,9 @@ idouble: 3
|
|||||||
ifloat: 2
|
ifloat: 2
|
||||||
Test "yn (1, 2.0) == -0.10703243154093754689":
|
Test "yn (1, 2.0) == -0.10703243154093754689":
|
||||||
double: 1
|
double: 1
|
||||||
float: 1
|
float: 2
|
||||||
idouble: 1
|
idouble: 1
|
||||||
ifloat: 1
|
ifloat: 2
|
||||||
Test "yn (1, 8.0) == -0.15806046173124749426":
|
Test "yn (1, 8.0) == -0.15806046173124749426":
|
||||||
float: 2
|
float: 2
|
||||||
ifloat: 2
|
ifloat: 2
|
||||||
@ -974,8 +1004,8 @@ ifloat: 1
|
|||||||
Test "yn (10, 2.0) == -129184.54220803928264":
|
Test "yn (10, 2.0) == -129184.54220803928264":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
double: 1
|
double: 2
|
||||||
idouble: 1
|
idouble: 2
|
||||||
Test "yn (3, 0.1) == -5099.3323786129048894":
|
Test "yn (3, 0.1) == -5099.3323786129048894":
|
||||||
double: 1
|
double: 1
|
||||||
float: 1
|
float: 1
|
||||||
@ -984,6 +1014,9 @@ ifloat: 1
|
|||||||
Test "yn (3, 0.7) == -15.819479052819633505":
|
Test "yn (3, 0.7) == -15.819479052819633505":
|
||||||
double: 2
|
double: 2
|
||||||
idouble: 2
|
idouble: 2
|
||||||
|
Test "yn (3, 2.0) == -1.1277837768404277861":
|
||||||
|
double: 1
|
||||||
|
idouble: 1
|
||||||
Test "yn (3, 10.0) == -0.25136265718383732978":
|
Test "yn (3, 10.0) == -0.25136265718383732978":
|
||||||
double: 1
|
double: 1
|
||||||
float: 1
|
float: 1
|
||||||
@ -1263,6 +1296,8 @@ ildouble: 286
|
|||||||
ldouble: 286
|
ldouble: 286
|
||||||
|
|
||||||
Function: Imaginary part of "ctanh":
|
Function: Imaginary part of "ctanh":
|
||||||
|
float: 1
|
||||||
|
ifloat: 1
|
||||||
double: 1
|
double: 1
|
||||||
idouble: 1
|
idouble: 1
|
||||||
ildouble: 3074
|
ildouble: 3074
|
||||||
@ -1313,8 +1348,8 @@ ldouble: 560
|
|||||||
Function: "j0":
|
Function: "j0":
|
||||||
float: 1
|
float: 1
|
||||||
ifloat: 1
|
ifloat: 1
|
||||||
double: 1
|
double: 2
|
||||||
idouble: 1
|
idouble: 2
|
||||||
|
|
||||||
Function: "j1":
|
Function: "j1":
|
||||||
double: 1
|
double: 1
|
||||||
|
@ -20,7 +20,9 @@
|
|||||||
# error "Never use <bits/mathdef.h> directly; include <math.h> instead"
|
# error "Never use <bits/mathdef.h> directly; include <math.h> instead"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined __USE_ISOC99 && defined _MATH_H
|
#if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF
|
||||||
|
# define _MATH_H_MATHDEF 1
|
||||||
|
|
||||||
/* The m68k FPUs evaluate all values in the 96 bit floating-point format
|
/* The m68k FPUs evaluate all values in the 96 bit floating-point format
|
||||||
which is also available for the user as `long double'. Therefore we
|
which is also available for the user as `long double'. Therefore we
|
||||||
define: */
|
define: */
|
||||||
|
@ -27,7 +27,9 @@
|
|||||||
FIXME! This file does not deal with the -fshort-double option of
|
FIXME! This file does not deal with the -fshort-double option of
|
||||||
gcc! */
|
gcc! */
|
||||||
|
|
||||||
#if defined __USE_ISOC99 && defined _MATH_H
|
#if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF
|
||||||
|
# define _MATH_H_MATHDEF 1
|
||||||
|
|
||||||
# ifdef __GNUC__
|
# ifdef __GNUC__
|
||||||
# if __STDC__ == 1
|
# if __STDC__ == 1
|
||||||
|
|
||||||
|
@ -25,7 +25,9 @@
|
|||||||
/* FIXME! This file describes properties of the compiler, not the machine;
|
/* FIXME! This file describes properties of the compiler, not the machine;
|
||||||
it should not be part of libc! */
|
it should not be part of libc! */
|
||||||
|
|
||||||
#if defined __USE_ISOC99 && defined _MATH_H
|
#if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF
|
||||||
|
# define _MATH_H_MATHDEF 1
|
||||||
|
|
||||||
# ifdef __GNUC__
|
# ifdef __GNUC__
|
||||||
# if __STDC__ == 1
|
# if __STDC__ == 1
|
||||||
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
/* getrlimit64 is the same as getrlimit. */
|
|
@ -1 +0,0 @@
|
|||||||
/* setrlimit64 is the same as setrlimit. */
|
|
@ -106,13 +106,13 @@ enum __rlimit_resource
|
|||||||
|
|
||||||
/* Value to indicate that there is no limit. */
|
/* Value to indicate that there is no limit. */
|
||||||
#ifndef __USE_FILE_OFFSET64
|
#ifndef __USE_FILE_OFFSET64
|
||||||
# define RLIM_INFINITY ((unsigned long int)(~0UL))
|
# define RLIM_INFINITY ((long int)(~0UL >> 1))
|
||||||
#else
|
#else
|
||||||
# define RLIM_INFINITY 0xffffffffffffffffuLL
|
# define RLIM_INFINITY 0x7fffffffffffffffLL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __USE_LARGEFILE64
|
#ifdef __USE_LARGEFILE64
|
||||||
# define RLIM64_INFINITY 0xffffffffffffffffuLL
|
# define RLIM64_INFINITY 0x7fffffffffffffffLL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* We can represent all limits. */
|
/* We can represent all limits. */
|
||||||
|
227
sysdeps/unix/sysv/linux/i386/bits/resource.h
Normal file
227
sysdeps/unix/sysv/linux/i386/bits/resource.h
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
/* Bit values & structures for resource limits. Linux version.
|
||||||
|
Copyright (C) 1994, 1996, 1997, 1998, 1999 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 _SYS_RESOURCE_H
|
||||||
|
# error "Never use <bits/resource.h> directly; include <sys/resource.h> instead."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <asm/resource.h>
|
||||||
|
#include <bits/types.h>
|
||||||
|
|
||||||
|
/* Transmute defines to enumerations. The macro re-definitions are
|
||||||
|
necessary because some programs want to test for operating system
|
||||||
|
features with #ifdef RUSAGE_SELF. In ISO C the reflexive
|
||||||
|
definition is a no-op. */
|
||||||
|
|
||||||
|
/* Kinds of resource limit. */
|
||||||
|
enum __rlimit_resource
|
||||||
|
{
|
||||||
|
/* Per-process CPU limit, in seconds. */
|
||||||
|
_RLIMIT_CPU = RLIMIT_CPU,
|
||||||
|
#undef RLIMIT_CPU
|
||||||
|
RLIMIT_CPU = _RLIMIT_CPU,
|
||||||
|
#define RLIMIT_CPU RLIMIT_CPU
|
||||||
|
|
||||||
|
/* Largest file that can be created, in bytes. */
|
||||||
|
_RLIMIT_FSIZE = RLIMIT_FSIZE,
|
||||||
|
#undef RLIMIT_FSIZE
|
||||||
|
RLIMIT_FSIZE = _RLIMIT_FSIZE,
|
||||||
|
#define RLIMIT_FSIZE RLIMIT_FSIZE
|
||||||
|
|
||||||
|
/* Maximum size of data segment, in bytes. */
|
||||||
|
_RLIMIT_DATA = RLIMIT_DATA,
|
||||||
|
#undef RLIMIT_DATA
|
||||||
|
RLIMIT_DATA = _RLIMIT_DATA,
|
||||||
|
#define RLIMIT_DATA RLIMIT_DATA
|
||||||
|
|
||||||
|
/* Maximum size of stack segment, in bytes. */
|
||||||
|
_RLIMIT_STACK = RLIMIT_STACK,
|
||||||
|
#undef RLIMIT_STACK
|
||||||
|
RLIMIT_STACK = _RLIMIT_STACK,
|
||||||
|
#define RLIMIT_STACK RLIMIT_STACK
|
||||||
|
|
||||||
|
/* Largest core file that can be created, in bytes. */
|
||||||
|
_RLIMIT_CORE = RLIMIT_CORE,
|
||||||
|
#undef RLIMIT_CORE
|
||||||
|
RLIMIT_CORE = _RLIMIT_CORE,
|
||||||
|
#define RLIMIT_CORE RLIMIT_CORE
|
||||||
|
|
||||||
|
/* Largest resident set size, in bytes.
|
||||||
|
This affects swapping; processes that are exceeding their
|
||||||
|
resident set size will be more likely to have physical memory
|
||||||
|
taken from them. */
|
||||||
|
_RLIMIT_RSS = RLIMIT_RSS,
|
||||||
|
#undef RLIMIT_RSS
|
||||||
|
RLIMIT_RSS = _RLIMIT_RSS,
|
||||||
|
#define RLIMIT_RSS RLIMIT_RSS
|
||||||
|
|
||||||
|
/* Number of open files. */
|
||||||
|
_RLIMIT_NOFILE = RLIMIT_NOFILE,
|
||||||
|
#undef RLIMIT_NOFILE
|
||||||
|
RLIMIT_NOFILE = _RLIMIT_NOFILE,
|
||||||
|
RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same. */
|
||||||
|
#define RLIMIT_NOFILE RLIMIT_NOFILE
|
||||||
|
#define RLIMIT_OFILE RLIMIT_OFILE
|
||||||
|
|
||||||
|
/* Address space limit (?) */
|
||||||
|
_RLIMIT_AS = RLIMIT_AS,
|
||||||
|
#undef RLIMIT_AS
|
||||||
|
RLIMIT_AS = _RLIMIT_AS,
|
||||||
|
#define RLIMIT_AS RLIMIT_AS
|
||||||
|
|
||||||
|
/* Number of processes. */
|
||||||
|
_RLIMIT_NPROC = RLIMIT_NPROC,
|
||||||
|
#undef RLIMIT_NPROC
|
||||||
|
RLIMIT_NPROC = _RLIMIT_NPROC,
|
||||||
|
#define RLIMIT_NPROC RLIMIT_NPROC
|
||||||
|
|
||||||
|
/* Locked-in-memory address space. */
|
||||||
|
_RLIMIT_MEMLOCK = RLIMIT_MEMLOCK,
|
||||||
|
#undef RLIMIT_MEMLOCK
|
||||||
|
RLIMIT_MEMLOCK = _RLIMIT_MEMLOCK,
|
||||||
|
#define RLIMIT_MEMLOCK RLIMIT_MEMLOCK
|
||||||
|
|
||||||
|
RLIMIT_NLIMITS = RLIM_NLIMITS,
|
||||||
|
#undef RLIM_NLIMITS
|
||||||
|
RLIM_NLIMITS = RLIMIT_NLIMITS
|
||||||
|
#define RLIMIT_NLIMITS RLIMIT_NLIMITS
|
||||||
|
#define RLIM_NLIMITS RLIM_NLIMITS
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Value to indicate that there is no limit. */
|
||||||
|
#ifndef __USE_FILE_OFFSET64
|
||||||
|
# define RLIM_INFINITY ((unsigned long int)(~0UL))
|
||||||
|
#else
|
||||||
|
# define RLIM_INFINITY 0xffffffffffffffffuLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __USE_LARGEFILE64
|
||||||
|
# define RLIM64_INFINITY 0xffffffffffffffffuLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* We can represent all limits. */
|
||||||
|
#define RLIM_SAVED_MAX RLIM_INFINITY
|
||||||
|
#define RLIM_SAVED_CUR RLIM_INFINITY
|
||||||
|
|
||||||
|
|
||||||
|
/* Type for resource quantity measurement. */
|
||||||
|
#ifndef __USE_FILE_OFFSET64
|
||||||
|
typedef __rlim_t rlim_t;
|
||||||
|
#else
|
||||||
|
typedef __rlim64_t rlim_t;
|
||||||
|
#endif
|
||||||
|
#ifdef __USE_LARGEFILE64
|
||||||
|
typedef __rlim64_t rlim64_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct rlimit
|
||||||
|
{
|
||||||
|
/* The current (soft) limit. */
|
||||||
|
rlim_t rlim_cur;
|
||||||
|
/* The hard limit. */
|
||||||
|
rlim_t rlim_max;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __USE_LARGEFILE64
|
||||||
|
struct rlimit64
|
||||||
|
{
|
||||||
|
/* The current (soft) limit. */
|
||||||
|
rlim64_t rlim_cur;
|
||||||
|
/* The hard limit. */
|
||||||
|
rlim64_t rlim_max;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Whose usage statistics do you want? */
|
||||||
|
enum __rusage_who
|
||||||
|
{
|
||||||
|
/* The calling process. */
|
||||||
|
RUSAGE_SELF = 0,
|
||||||
|
#define RUSAGE_SELF RUSAGE_SELF
|
||||||
|
|
||||||
|
/* All of its terminated child processes. */
|
||||||
|
RUSAGE_CHILDREN = -1,
|
||||||
|
#define RUSAGE_CHILDREN RUSAGE_CHILDREN
|
||||||
|
|
||||||
|
/* Both. */
|
||||||
|
RUSAGE_BOTH = -2
|
||||||
|
#define RUSAGE_BOTH RUSAGE_BOTH
|
||||||
|
};
|
||||||
|
|
||||||
|
#define __need_timeval
|
||||||
|
#include <bits/time.h> /* For `struct timeval'. */
|
||||||
|
|
||||||
|
/* Structure which says how much of each resource has been used. */
|
||||||
|
struct rusage
|
||||||
|
{
|
||||||
|
/* Total amount of user time used. */
|
||||||
|
struct timeval ru_utime;
|
||||||
|
/* Total amount of system time used. */
|
||||||
|
struct timeval ru_stime;
|
||||||
|
/* Maximum resident set size (in kilobytes). */
|
||||||
|
long int ru_maxrss;
|
||||||
|
/* Amount of sharing of text segment memory
|
||||||
|
with other processes (kilobyte-seconds). */
|
||||||
|
long int ru_ixrss;
|
||||||
|
/* Amount of data segment memory used (kilobyte-seconds). */
|
||||||
|
long int ru_idrss;
|
||||||
|
/* Amount of stack memory used (kilobyte-seconds). */
|
||||||
|
long int ru_isrss;
|
||||||
|
/* Number of soft page faults (i.e. those serviced by reclaiming
|
||||||
|
a page from the list of pages awaiting reallocation. */
|
||||||
|
long int ru_minflt;
|
||||||
|
/* Number of hard page faults (i.e. those that required I/O). */
|
||||||
|
long int ru_majflt;
|
||||||
|
/* Number of times a process was swapped out of physical memory. */
|
||||||
|
long int ru_nswap;
|
||||||
|
/* Number of input operations via the file system. Note: This
|
||||||
|
and `ru_oublock' do not include operations with the cache. */
|
||||||
|
long int ru_inblock;
|
||||||
|
/* Number of output operations via the file system. */
|
||||||
|
long int ru_oublock;
|
||||||
|
/* Number of IPC messages sent. */
|
||||||
|
long int ru_msgsnd;
|
||||||
|
/* Number of IPC messages received. */
|
||||||
|
long int ru_msgrcv;
|
||||||
|
/* Number of signals delivered. */
|
||||||
|
long int ru_nsignals;
|
||||||
|
/* Number of voluntary context switches, i.e. because the process
|
||||||
|
gave up the process before it had to (usually to wait for some
|
||||||
|
resource to be available). */
|
||||||
|
long int ru_nvcsw;
|
||||||
|
/* Number of involuntary context switches, i.e. a higher priority process
|
||||||
|
became runnable or the current process used up its time slice. */
|
||||||
|
long int ru_nivcsw;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Priority limits. */
|
||||||
|
#define PRIO_MIN -20 /* Minimum priority a process can have. */
|
||||||
|
#define PRIO_MAX 20 /* Maximum priority a process can have. */
|
||||||
|
|
||||||
|
/* The type of the WHICH argument to `getpriority' and `setpriority',
|
||||||
|
indicating what flavor of entity the WHO argument specifies. */
|
||||||
|
enum __priority_which
|
||||||
|
{
|
||||||
|
PRIO_PROCESS = 0, /* WHO is a process ID. */
|
||||||
|
#define PRIO_PROCESS PRIO_PROCESS
|
||||||
|
PRIO_PGRP = 1, /* WHO is a process group ID. */
|
||||||
|
#define PRIO_PGRP PRIO_PGRP
|
||||||
|
PRIO_USER = 2 /* WHO is a user ID. */
|
||||||
|
#define PRIO_USER PRIO_USER
|
||||||
|
};
|
243
sysdeps/unix/sysv/linux/sparc/bits/resource.h
Normal file
243
sysdeps/unix/sysv/linux/sparc/bits/resource.h
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
/* Bit values & structures for resource limits. Linux version.
|
||||||
|
Copyright (C) 1994, 1996, 1997, 1998, 1999 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 _SYS_RESOURCE_H
|
||||||
|
# error "Never use <bits/resource.h> directly; include <sys/resource.h> instead."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <asm/resource.h>
|
||||||
|
#include <bits/types.h>
|
||||||
|
|
||||||
|
/* Transmute defines to enumerations. The macro re-definitions are
|
||||||
|
necessary because some programs want to test for operating system
|
||||||
|
features with #ifdef RUSAGE_SELF. In ISO C the reflexive
|
||||||
|
definition is a no-op. */
|
||||||
|
|
||||||
|
/* Kinds of resource limit. */
|
||||||
|
enum __rlimit_resource
|
||||||
|
{
|
||||||
|
/* Per-process CPU limit, in seconds. */
|
||||||
|
_RLIMIT_CPU = RLIMIT_CPU,
|
||||||
|
#undef RLIMIT_CPU
|
||||||
|
RLIMIT_CPU = _RLIMIT_CPU,
|
||||||
|
#define RLIMIT_CPU RLIMIT_CPU
|
||||||
|
|
||||||
|
/* Largest file that can be created, in bytes. */
|
||||||
|
_RLIMIT_FSIZE = RLIMIT_FSIZE,
|
||||||
|
#undef RLIMIT_FSIZE
|
||||||
|
RLIMIT_FSIZE = _RLIMIT_FSIZE,
|
||||||
|
#define RLIMIT_FSIZE RLIMIT_FSIZE
|
||||||
|
|
||||||
|
/* Maximum size of data segment, in bytes. */
|
||||||
|
_RLIMIT_DATA = RLIMIT_DATA,
|
||||||
|
#undef RLIMIT_DATA
|
||||||
|
RLIMIT_DATA = _RLIMIT_DATA,
|
||||||
|
#define RLIMIT_DATA RLIMIT_DATA
|
||||||
|
|
||||||
|
/* Maximum size of stack segment, in bytes. */
|
||||||
|
_RLIMIT_STACK = RLIMIT_STACK,
|
||||||
|
#undef RLIMIT_STACK
|
||||||
|
RLIMIT_STACK = _RLIMIT_STACK,
|
||||||
|
#define RLIMIT_STACK RLIMIT_STACK
|
||||||
|
|
||||||
|
/* Largest core file that can be created, in bytes. */
|
||||||
|
_RLIMIT_CORE = RLIMIT_CORE,
|
||||||
|
#undef RLIMIT_CORE
|
||||||
|
RLIMIT_CORE = _RLIMIT_CORE,
|
||||||
|
#define RLIMIT_CORE RLIMIT_CORE
|
||||||
|
|
||||||
|
/* Largest resident set size, in bytes.
|
||||||
|
This affects swapping; processes that are exceeding their
|
||||||
|
resident set size will be more likely to have physical memory
|
||||||
|
taken from them. */
|
||||||
|
_RLIMIT_RSS = RLIMIT_RSS,
|
||||||
|
#undef RLIMIT_RSS
|
||||||
|
RLIMIT_RSS = _RLIMIT_RSS,
|
||||||
|
#define RLIMIT_RSS RLIMIT_RSS
|
||||||
|
|
||||||
|
/* Number of open files. */
|
||||||
|
_RLIMIT_NOFILE = RLIMIT_NOFILE,
|
||||||
|
#undef RLIMIT_NOFILE
|
||||||
|
RLIMIT_NOFILE = _RLIMIT_NOFILE,
|
||||||
|
RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same. */
|
||||||
|
#define RLIMIT_NOFILE RLIMIT_NOFILE
|
||||||
|
#define RLIMIT_OFILE RLIMIT_OFILE
|
||||||
|
|
||||||
|
/* Address space limit (?) */
|
||||||
|
_RLIMIT_AS = RLIMIT_AS,
|
||||||
|
#undef RLIMIT_AS
|
||||||
|
RLIMIT_AS = _RLIMIT_AS,
|
||||||
|
#define RLIMIT_AS RLIMIT_AS
|
||||||
|
|
||||||
|
/* Number of processes. */
|
||||||
|
_RLIMIT_NPROC = RLIMIT_NPROC,
|
||||||
|
#undef RLIMIT_NPROC
|
||||||
|
RLIMIT_NPROC = _RLIMIT_NPROC,
|
||||||
|
#define RLIMIT_NPROC RLIMIT_NPROC
|
||||||
|
|
||||||
|
/* Locked-in-memory address space. */
|
||||||
|
_RLIMIT_MEMLOCK = RLIMIT_MEMLOCK,
|
||||||
|
#undef RLIMIT_MEMLOCK
|
||||||
|
RLIMIT_MEMLOCK = _RLIMIT_MEMLOCK,
|
||||||
|
#define RLIMIT_MEMLOCK RLIMIT_MEMLOCK
|
||||||
|
|
||||||
|
RLIMIT_NLIMITS = RLIM_NLIMITS,
|
||||||
|
#undef RLIM_NLIMITS
|
||||||
|
RLIM_NLIMITS = RLIMIT_NLIMITS
|
||||||
|
#define RLIMIT_NLIMITS RLIMIT_NLIMITS
|
||||||
|
#define RLIM_NLIMITS RLIM_NLIMITS
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Value to indicate that there is no limit. */
|
||||||
|
#if __WORDSIZE == 64
|
||||||
|
|
||||||
|
#ifndef __USE_FILE_OFFSET64
|
||||||
|
# define RLIM_INFINITY ((unsigned long int)(~0UL))
|
||||||
|
#else
|
||||||
|
# define RLIM_INFINITY 0xffffffffffffffffuLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __USE_LARGEFILE64
|
||||||
|
# define RLIM64_INFINITY 0xffffffffffffffffuLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef __USE_FILE_OFFSET64
|
||||||
|
# define RLIM_INFINITY ((long int)(~0UL >> 1))
|
||||||
|
#else
|
||||||
|
# define RLIM_INFINITY 0x7fffffffffffffffLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __USE_LARGEFILE64
|
||||||
|
# define RLIM64_INFINITY 0x7fffffffffffffffLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* We can represent all limits. */
|
||||||
|
#define RLIM_SAVED_MAX RLIM_INFINITY
|
||||||
|
#define RLIM_SAVED_CUR RLIM_INFINITY
|
||||||
|
|
||||||
|
|
||||||
|
/* Type for resource quantity measurement. */
|
||||||
|
#ifndef __USE_FILE_OFFSET64
|
||||||
|
typedef __rlim_t rlim_t;
|
||||||
|
#else
|
||||||
|
typedef __rlim64_t rlim_t;
|
||||||
|
#endif
|
||||||
|
#ifdef __USE_LARGEFILE64
|
||||||
|
typedef __rlim64_t rlim64_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct rlimit
|
||||||
|
{
|
||||||
|
/* The current (soft) limit. */
|
||||||
|
rlim_t rlim_cur;
|
||||||
|
/* The hard limit. */
|
||||||
|
rlim_t rlim_max;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __USE_LARGEFILE64
|
||||||
|
struct rlimit64
|
||||||
|
{
|
||||||
|
/* The current (soft) limit. */
|
||||||
|
rlim64_t rlim_cur;
|
||||||
|
/* The hard limit. */
|
||||||
|
rlim64_t rlim_max;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Whose usage statistics do you want? */
|
||||||
|
enum __rusage_who
|
||||||
|
{
|
||||||
|
/* The calling process. */
|
||||||
|
RUSAGE_SELF = 0,
|
||||||
|
#define RUSAGE_SELF RUSAGE_SELF
|
||||||
|
|
||||||
|
/* All of its terminated child processes. */
|
||||||
|
RUSAGE_CHILDREN = -1,
|
||||||
|
#define RUSAGE_CHILDREN RUSAGE_CHILDREN
|
||||||
|
|
||||||
|
/* Both. */
|
||||||
|
RUSAGE_BOTH = -2
|
||||||
|
#define RUSAGE_BOTH RUSAGE_BOTH
|
||||||
|
};
|
||||||
|
|
||||||
|
#define __need_timeval
|
||||||
|
#include <bits/time.h> /* For `struct timeval'. */
|
||||||
|
|
||||||
|
/* Structure which says how much of each resource has been used. */
|
||||||
|
struct rusage
|
||||||
|
{
|
||||||
|
/* Total amount of user time used. */
|
||||||
|
struct timeval ru_utime;
|
||||||
|
/* Total amount of system time used. */
|
||||||
|
struct timeval ru_stime;
|
||||||
|
/* Maximum resident set size (in kilobytes). */
|
||||||
|
long int ru_maxrss;
|
||||||
|
/* Amount of sharing of text segment memory
|
||||||
|
with other processes (kilobyte-seconds). */
|
||||||
|
long int ru_ixrss;
|
||||||
|
/* Amount of data segment memory used (kilobyte-seconds). */
|
||||||
|
long int ru_idrss;
|
||||||
|
/* Amount of stack memory used (kilobyte-seconds). */
|
||||||
|
long int ru_isrss;
|
||||||
|
/* Number of soft page faults (i.e. those serviced by reclaiming
|
||||||
|
a page from the list of pages awaiting reallocation. */
|
||||||
|
long int ru_minflt;
|
||||||
|
/* Number of hard page faults (i.e. those that required I/O). */
|
||||||
|
long int ru_majflt;
|
||||||
|
/* Number of times a process was swapped out of physical memory. */
|
||||||
|
long int ru_nswap;
|
||||||
|
/* Number of input operations via the file system. Note: This
|
||||||
|
and `ru_oublock' do not include operations with the cache. */
|
||||||
|
long int ru_inblock;
|
||||||
|
/* Number of output operations via the file system. */
|
||||||
|
long int ru_oublock;
|
||||||
|
/* Number of IPC messages sent. */
|
||||||
|
long int ru_msgsnd;
|
||||||
|
/* Number of IPC messages received. */
|
||||||
|
long int ru_msgrcv;
|
||||||
|
/* Number of signals delivered. */
|
||||||
|
long int ru_nsignals;
|
||||||
|
/* Number of voluntary context switches, i.e. because the process
|
||||||
|
gave up the process before it had to (usually to wait for some
|
||||||
|
resource to be available). */
|
||||||
|
long int ru_nvcsw;
|
||||||
|
/* Number of involuntary context switches, i.e. a higher priority process
|
||||||
|
became runnable or the current process used up its time slice. */
|
||||||
|
long int ru_nivcsw;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Priority limits. */
|
||||||
|
#define PRIO_MIN -20 /* Minimum priority a process can have. */
|
||||||
|
#define PRIO_MAX 20 /* Maximum priority a process can have. */
|
||||||
|
|
||||||
|
/* The type of the WHICH argument to `getpriority' and `setpriority',
|
||||||
|
indicating what flavor of entity the WHO argument specifies. */
|
||||||
|
enum __priority_which
|
||||||
|
{
|
||||||
|
PRIO_PROCESS = 0, /* WHO is a process ID. */
|
||||||
|
#define PRIO_PROCESS PRIO_PROCESS
|
||||||
|
PRIO_PGRP = 1, /* WHO is a process group ID. */
|
||||||
|
#define PRIO_PGRP PRIO_PGRP
|
||||||
|
PRIO_USER = 2 /* WHO is a user ID. */
|
||||||
|
#define PRIO_USER PRIO_USER
|
||||||
|
};
|
@ -1 +0,0 @@
|
|||||||
/* getrlimit64 is the same as getrlimit. */
|
|
@ -1 +0,0 @@
|
|||||||
/* setrlimit64 is the same as setrlimit. */
|
|
@ -44,6 +44,7 @@ __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact)
|
|||||||
{
|
{
|
||||||
kact.k_sa_handler = act->sa_handler;
|
kact.k_sa_handler = act->sa_handler;
|
||||||
memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t));
|
memcpy (&kact.sa_mask, &act->sa_mask, sizeof (sigset_t));
|
||||||
|
kact.sa_flags = act->sa_flags;
|
||||||
kact.sa_restorer = NULL;
|
kact.sa_restorer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user