|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.