| #include <stdio.h> |
| #include <sys/utsname.h> |
| |
| #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 <stdlib.h> |
| 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 [<oper> <x> <y> <z>]\n" |
| "supported operators:\n" |
| " ==, <=, >=\n", |
| program_invocation_short_name); |
| |
| return rc; |
| } |
| #endif |