117 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * 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);
 | 
						|
}
 |