get_linux_version_code: don't fail on Linux version strints like "3.0-foo"
[oweals/busybox.git] / libbb / kernel_version.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Utility routines.
4  *
5  * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6  *
7  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8  */
9
10 #include "libbb.h"
11 /* After libbb.h, since it needs sys/types.h on some systems */
12 #include <sys/utsname.h>  /* for uname(2) */
13
14
15 /* Returns current kernel version encoded as major*65536 + minor*256 + patch,
16  * so, for example,  to check if the kernel is greater than 2.2.11:
17  *
18  *     if (get_linux_version_code() > KERNEL_VERSION(2,2,11)) { <stuff> }
19  */
20 int FAST_FUNC get_linux_version_code(void)
21 {
22         struct utsname name;
23         char *s, *t;
24         int i, r;
25
26         uname(&name); /* never fails */
27         s = name.release;
28         r = 0;
29         for (i = 0; i < 3; i++) {
30                 t = strtok(s, ".");
31                 r = r * 256 + (t ? atoi(t) : 0);
32                 s = NULL;
33         }
34         return r;
35 }