summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/dl-osinfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/dl-osinfo.h')
-rw-r--r--sysdeps/unix/sysv/linux/dl-osinfo.h30
1 files changed, 20 insertions, 10 deletions
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 <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'; \
\