1 /*
2  * Check the lz insn.
3  */
4 
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <stdint.h>
8 #include "sys.h"
9 
10 #define __LINUX_KERNEL_VERSION 131584
11 
12 #define DL_SYSDEP_OSCHECK(FATAL) \
13   do {                                                                        \
14     /* Test whether the kernel is new enough.  This test is only              \
15        performed if the library is not compiled to run on all                 \
16        kernels.  */                                                           \
17     if (__LINUX_KERNEL_VERSION > 0)                                           \
18       {                                                                       \
19         char bufmem[64];                                                      \
20         char *buf = bufmem;                                                   \
21         unsigned int version;                                                 \
22         int parts;                                                            \
23         char *cp;                                                             \
24         struct utsname uts;                                                   \
25                                                                               \
26         /* Try the uname syscall */                                           \
27         if (__uname (&uts))                                                   \
28           {                                                                   \
29             /* This was not successful.  Now try reading the /proc            \
30                filesystem.  */                                                \
31             ssize_t reslen;                                                   \
32             int fd = __open ("/proc/sys/kernel/osrelease", O_RDONLY);         \
33             if (fd == -1                                                      \
34                 || (reslen = __read (fd, bufmem, sizeof (bufmem))) <= 0)      \
35               /* This also didn't work.  We give up since we cannot           \
36                  make sure the library can actually work.  */                 \
37               FATAL ("FATAL: cannot determine library version\n");            \
38             __close (fd);                                                     \
39             buf[MIN (reslen, (ssize_t) sizeof (bufmem) - 1)] = '\0';          \
40           }                                                                   \
41         else                                                                  \
42           buf = uts.release;                                                  \
43                                                                               \
44         /* Now convert it into a number.  The string consists of at most      \
45            three parts.  */                                                   \
46         version = 0;                                                          \
47         parts = 0;                                                            \
48         cp = buf;                                                             \
49         while ((*cp >= '0') && (*cp <= '9'))                                  \
50           {                                                                   \
51             unsigned int here = *cp++ - '0';                                  \
52                                                                               \
53             while ((*cp >= '0') && (*cp <= '9'))                              \
54               {                                                               \
55                 here *= 10;                                                   \
56                 here += *cp++ - '0';                                          \
57               }                                                               \
58                                                                               \
59             ++parts;                                                          \
60             version <<= 8;                                                    \
61             version |= here;                                                  \
62                                                                               \
63             if (*cp++ != '.')                                                 \
64               /* Another part following?  */                                  \
65               break;                                                          \
66           }                                                                   \
67                                                                               \
68         if (parts < 3)                                                        \
69           version <<= 8 * (3 - parts);                                        \
70                                                                               \
71         /* Now we can test with the required version.  */                     \
72         if (version < __LINUX_KERNEL_VERSION)                                 \
73           /* Not sufficient.  */                                               \
74           FATAL ("FATAL: kernel too old\n");                                  \
75                                                                               \
76         _dl_osversion = version;                                              \
77       }                                                                       \
78   } while (0)
79 
80 int main(void)
81 {
82         char bufmem[64] = "2.6.22";
83         char *buf = bufmem;
84         unsigned int version;
85         int parts;
86         char *cp;
87 
88         version = 0;
89         parts = 0;
90         cp = buf;
91         while ((*cp >= '0') && (*cp <= '9'))
92           {
93             unsigned int here = *cp++ - '0';
94 
95             while ((*cp >= '0') && (*cp <= '9'))
96               {
97                 here *= 10;
98                 here += *cp++ - '0';
99               }
100 
101             ++parts;
102             version <<= 8;
103             version |= here;
104 
105             if (*cp++ != '.')
106               /* Another part following?  */
107               break;
108           }
109 
110         if (parts < 3)
111           version <<= 8 * (3 - parts);
112         if (version < __LINUX_KERNEL_VERSION)
113                 err();
114         pass();
115         exit(0);
116 }
117