|  | /* | 
|  | * Check the lz insn. | 
|  | */ | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <stdint.h> | 
|  | #include "sys.h" | 
|  |  | 
|  | #define __LINUX_KERNEL_VERSION 131584 | 
|  |  | 
|  | #define DL_SYSDEP_OSCHECK(FATAL) \ | 
|  | do {                                                                        \ | 
|  | /* Test whether the kernel is new enough.  This test is only              \ | 
|  | performed if the library is not compiled to run on all                 \ | 
|  | kernels.  */                                                           \ | 
|  | if (__LINUX_KERNEL_VERSION > 0)                                           \ | 
|  | {                                                                       \ | 
|  | char bufmem[64];                                                      \ | 
|  | char *buf = bufmem;                                                   \ | 
|  | unsigned int version;                                                 \ | 
|  | int parts;                                                            \ | 
|  | char *cp;                                                             \ | 
|  | struct utsname uts;                                                   \ | 
|  | \ | 
|  | /* 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, (ssize_t) sizeof (bufmem) - 1)] = '\0';          \ | 
|  | }                                                                   \ | 
|  | else                                                                  \ | 
|  | buf = uts.release;                                                  \ | 
|  | \ | 
|  | /* Now convert it into a number.  The string consists of at most      \ | 
|  | three parts.  */                                                   \ | 
|  | version = 0;                                                          \ | 
|  | parts = 0;                                                            \ | 
|  | cp = buf;                                                             \ | 
|  | while ((*cp >= '0') && (*cp <= '9'))                                  \ | 
|  | {                                                                   \ | 
|  | unsigned int here = *cp++ - '0';                                  \ | 
|  | \ | 
|  | while ((*cp >= '0') && (*cp <= '9'))                              \ | 
|  | {                                                               \ | 
|  | here *= 10;                                                   \ | 
|  | here += *cp++ - '0';                                          \ | 
|  | }                                                               \ | 
|  | \ | 
|  | ++parts;                                                          \ | 
|  | version <<= 8;                                                    \ | 
|  | version |= here;                                                  \ | 
|  | \ | 
|  | if (*cp++ != '.')                                                 \ | 
|  | /* Another part following?  */                                  \ | 
|  | break;                                                          \ | 
|  | }                                                                   \ | 
|  | \ | 
|  | if (parts < 3)                                                        \ | 
|  | version <<= 8 * (3 - parts);                                        \ | 
|  | \ | 
|  | /* Now we can test with the required version.  */                     \ | 
|  | if (version < __LINUX_KERNEL_VERSION)                                 \ | 
|  | /* Not sufficent.  */                                               \ | 
|  | FATAL ("FATAL: kernel too old\n");                                  \ | 
|  | \ | 
|  | _dl_osversion = version;                                              \ | 
|  | }                                                                       \ | 
|  | } while (0) | 
|  |  | 
|  | int main(void) | 
|  | { | 
|  | char bufmem[64] = "2.6.22"; | 
|  | char *buf = bufmem; | 
|  | unsigned int version; | 
|  | int parts; | 
|  | char *cp; | 
|  |  | 
|  | version = 0; | 
|  | parts = 0; | 
|  | cp = buf; | 
|  | while ((*cp >= '0') && (*cp <= '9')) | 
|  | { | 
|  | unsigned int here = *cp++ - '0'; | 
|  |  | 
|  | while ((*cp >= '0') && (*cp <= '9')) | 
|  | { | 
|  | here *= 10; | 
|  | here += *cp++ - '0'; | 
|  | } | 
|  |  | 
|  | ++parts; | 
|  | version <<= 8; | 
|  | version |= here; | 
|  |  | 
|  | if (*cp++ != '.') | 
|  | /* Another part following?  */ | 
|  | break; | 
|  | } | 
|  |  | 
|  | if (parts < 3) | 
|  | version <<= 8 * (3 - parts); | 
|  | if (version < __LINUX_KERNEL_VERSION) | 
|  | err(); | 
|  | pass(); | 
|  | exit(0); | 
|  | } |