aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog22
-rw-r--r--iconv/gconv_dl.c15
-rw-r--r--include/sys/utsname.h4
-rw-r--r--posix/getopt.c3
-rw-r--r--sysdeps/generic/uname.c5
-rw-r--r--sysdeps/mach/hurd/uname.c5
-rw-r--r--sysdeps/unix/syscalls.list2
-rw-r--r--sysdeps/unix/sysv/linux/dl-osinfo.h30
8 files changed, 61 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index 399a35e..56d1700 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2000-09-09 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/dl-osinfo.h (DL_SYSDEP_OSCHECK): Use uname
+ before trying to read /proc.
+ Patch by Matt Wilson <msw@redhat.com>.
+ * 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 <drepper@redhat.com>
+
+ * posix/getopt.c (_getopt_internal): When long_only is set always
+ recognize conflicts just like before.
+
+2000-09-08 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ * sysdeps/ia64/Makefile (sysdep-rtld-routines): New variable.
+
2000-09-08 Greg McGary <greg@mcgary.org>
* sysdeps/unix/sysv/linux/syscalls.list (mincore): Fix arg signature.
diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c
index 308db52..114619e 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 ff81bdf..39ca7f5 100644
--- a/include/sys/utsname.h
+++ b/include/sys/utsname.h
@@ -1 +1,5 @@
+#ifndef _SYS_UTSNAME_H
#include <posix/sys/utsname.h>
+
+extern int __uname (struct utsname *__name);
+#endif
diff --git a/posix/getopt.c b/posix/getopt.c
index 2ad4ee9..a6d2d04 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 68335c2..aacb5f3 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 37e4b4e..316ecf3 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 <hurd/startup.h>
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 0ac0ac9..3c60597 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 7fc0259..a29d255 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 <sys/sysctl.h>
+#include <sys/utsname.h>
#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'; \
\