diff --git a/ChangeLog b/ChangeLog index 399a35e657..56d17002c7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2000-09-09 Ulrich Drepper + + * sysdeps/unix/sysv/linux/dl-osinfo.h (DL_SYSDEP_OSCHECK): Use uname + before trying to read /proc. + Patch by Matt Wilson . + * include/sys/utsname.h: Declare __uname. + * sysdeps/generic/uname.c: Make uname a weak alias of __uname. + * sysdeps/mach/hurd/uname.c: Likewise. + * sysdeps/unix/syscalls.list: Likewise. + + * iconv/gconv_dl.c (do_release_shlib): Rewrite condition for + unloading a bit. + +2000-09-08 Ulrich Drepper + + * posix/getopt.c (_getopt_internal): When long_only is set always + recognize conflicts just like before. + +2000-09-08 Franz Sirl + + * sysdeps/ia64/Makefile (sysdep-rtld-routines): New variable. + 2000-09-08 Greg McGary * sysdeps/unix/sysv/linux/syscalls.list (mincore): Fix arg signature. diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c index 308db52c83..114619ec11 100644 --- a/iconv/gconv_dl.c +++ b/iconv/gconv_dl.c @@ -110,6 +110,7 @@ __gconv_find_shlib (const char *name) { if (found->counter < -TRIES_BEFORE_UNLOAD) { + assert (found->handle == NULL); found->handle = __libc_dlopen (found->name); if (found->handle != NULL) { @@ -162,16 +163,12 @@ do_release_shlib (const void *nodep, VISIT value, int level) assert (obj->counter > 0); --obj->counter; } - else if (obj->counter <= 0) + else if (obj->counter <= 0 && obj->counter >= -TRIES_BEFORE_UNLOAD + && --obj->counter < -TRIES_BEFORE_UNLOAD && obj->handle != NULL) { - if (obj->counter >= -TRIES_BEFORE_UNLOAD) - --obj->counter; - if (obj->counter < -TRIES_BEFORE_UNLOAD && obj->handle != NULL) - { - /* Unload the shared object. */ - __libc_dlclose (obj->handle); - obj->handle = NULL; - } + /* Unload the shared object. */ + __libc_dlclose (obj->handle); + obj->handle = NULL; } } diff --git a/include/sys/utsname.h b/include/sys/utsname.h index ff81bdf48e..39ca7f5740 100644 --- a/include/sys/utsname.h +++ b/include/sys/utsname.h @@ -1 +1,5 @@ +#ifndef _SYS_UTSNAME_H #include + +extern int __uname (struct utsname *__name); +#endif diff --git a/posix/getopt.c b/posix/getopt.c index 2ad4ee961c..a6d2d042c7 100644 --- a/posix/getopt.c +++ b/posix/getopt.c @@ -673,7 +673,8 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) pfound = p; indfound = option_index; } - else if (pfound->has_arg != p->has_arg + else if (long_only + || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) /* Second or later nonexact match found. */ diff --git a/sysdeps/generic/uname.c b/sysdeps/generic/uname.c index 68335c21f9..aacb5f3df0 100644 --- a/sysdeps/generic/uname.c +++ b/sysdeps/generic/uname.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1992, 1996, 1997, 2000 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 @@ -26,7 +26,7 @@ /* Put information about the system in NAME. */ int -uname (name) +__uname (name) struct utsname *name; { int save; @@ -61,3 +61,4 @@ uname (name) return 0; } +weak_alias (__uname, uname) diff --git a/sysdeps/mach/hurd/uname.c b/sysdeps/mach/hurd/uname.c index 37e4b4e57d..316ecf3e6b 100644 --- a/sysdeps/mach/hurd/uname.c +++ b/sysdeps/mach/hurd/uname.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 1993, 1994, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1992,1993,1994,1996,1997,2000 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 @@ -22,7 +22,7 @@ #include int -uname (struct utsname *uname) +__uname (struct utsname *uname) { error_t err; @@ -43,3 +43,4 @@ uname (struct utsname *uname) return 0; } +weak_alias (__uname, uname) diff --git a/sysdeps/unix/syscalls.list b/sysdeps/unix/syscalls.list index 0ac0ac94c1..3c60597329 100644 --- a/sysdeps/unix/syscalls.list +++ b/sysdeps/unix/syscalls.list @@ -58,7 +58,7 @@ sys_fstat fxstat fstat i:ip __syscall_fstat sys_mknod xmknod mknod i:sii __syscall_mknod sys_stat xstat stat i:sp __syscall_stat umask - umask i:i __umask umask -uname - uname i:p uname +uname - uname i:p __uname uname unlink - unlink i:s __unlink unlink utimes - utimes i:sp __utimes utimes write - write i:ibn __libc_write __write write diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h index 7fc0259ae4..a29d255f50 100644 --- a/sysdeps/unix/sysv/linux/dl-osinfo.h +++ b/sysdeps/unix/sysv/linux/dl-osinfo.h @@ -18,6 +18,7 @@ Boston, MA 02111-1307, USA. */ #include +#include #include "kernel-features.h" #ifndef MIN @@ -61,16 +62,25 @@ dl_fatal (const char *str) sizeof (sysctl_args) / sizeof (sysctl_args[0]), \ buf, &reslen, NULL, 0) < 0) \ { \ - /* This was not successful. Now try reading the /proc \ - filesystem. */ \ - int fd = __open ("/proc/sys/kernel/osrelease", O_RDONLY); \ - if (fd == -1 \ - || (reslen = __read (fd, buf, sizeof (buf))) <= 0) \ - /* This also didn't work. We give up since we cannot \ - make sure the library can actually work. */ \ - FATAL ("FATAL: cannot determine library version\n"); \ - \ - __close (fd); \ + /* This didn't work. Next try the uname syscall */ \ + struct utsname uts; \ + if (__uname (&uts)) \ + { \ + /* This was not successful. Now try reading the /proc \ + filesystem. */ \ + int fd = __open ("/proc/sys/kernel/osrelease", O_RDONLY); \ + if (fd == -1 \ + || (reslen = __read (fd, buf, sizeof (buf))) <= 0) \ + /* This also didn't work. We give up since we cannot \ + make sure the library can actually work. */ \ + FATAL ("FATAL: cannot determine library version\n"); \ + __close (fd); \ + } \ + else \ + { \ + strncpy (buf, uts.release, sizeof (buf)); \ + reslen = strlen (uts.release); \ + } \ } \ buf[MIN (reslen, sizeof (buf) - 1)] = '\0'; \ \