#include #include #include "c.h" #include "linux_version.h" int get_linux_version (void) { static int kver = -1; struct utsname uts; int x = 0, y = 0, z = 0; int n; if (kver != -1) return kver; if (uname(&uts)) return kver = 0; n = sscanf(uts.release, "%d.%d.%d", &x, &y, &z); if (n < 1 || n > 3) return kver = 0; return kver = KERNEL_VERSION(x, y, z); } #ifdef TEST_PROGRAM_LINUXVERSION # include int main(int argc, char *argv[]) { int rc = EXIT_FAILURE; if (argc == 1) { printf("Linux version: %d\n", get_linux_version()); rc = EXIT_SUCCESS; } else if (argc == 5) { const char *oper = argv[1]; int x = atoi(argv[2]), y = atoi(argv[3]), z = atoi(argv[4]); int kver = get_linux_version(); int uver = KERNEL_VERSION(x, y, z); if (strcmp(oper, "==") == 0) rc = kver == uver; else if (strcmp(oper, "<=") == 0) rc = kver <= uver; else if (strcmp(oper, ">=") == 0) rc = kver >= uver; else errx(EXIT_FAILURE, "unsupported operator"); if (rc) printf("match\n"); else printf("not-match [%d %s %d, x.y.z: %d.%d.%d]\n", kver, oper, uver, x, y, z); rc = rc ? EXIT_SUCCESS : EXIT_FAILURE; } else fprintf(stderr, "Usage:\n" " %s [ ]\n" "supported operators:\n" " ==, <=, >=\n", program_invocation_short_name); return rc; } #endif