]>
Commit | Line | Data |
---|---|---|
dd43edf4 TS |
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 sufficent. */ \ | |
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 | } |