kernels. */ \
if (__LINUX_KERNEL_VERSION > 0) \
{ \
- static const int sysctl_args[] = { CTL_KERN, KERN_OSRELEASE }; \
- char buf[64]; \
- size_t reslen = sizeof (buf); \
+ char bufmem[64]; \
+ char *buf = bufmem; \
unsigned int version; \
int parts; \
char *cp; \
+ struct utsname uts; \
\
- /* Try reading the number using `sysctl' first. */ \
- if (__sysctl ((int *) sysctl_args, \
- sizeof (sysctl_args) / sizeof (sysctl_args[0]), \
- buf, &reslen, NULL, 0) < 0) \
- { \
- /* 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); \
- } \
+ /* Try the uname syscall */ \
+ if (__uname (&uts)) \
+ { \
+ /* This was not successful. Now try reading the /proc \
+ filesystem. */ \
+ ssize_t reslen; \
+ int fd = __open ("/proc/sys/kernel/osrelease", O_RDONLY); \
+ if (fd == -1 \
+ || (reslen = __read (fd, bufmem, sizeof (bufmem))) <= 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); \
+ buf[MIN (reslen, sizeof (bufmem) - 1)] = '\0'; \
} \
- buf[MIN (reslen, sizeof (buf) - 1)] = '\0'; \
+ else \
+ buf = uts.release; \
\
/* Now convert it into a number. The string consists of at most \
three parts. */ \