1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
/*
* Oracle Linux DTrace.
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* Licensed under the Universal Permissive License v 1.0 as shown at
* http://oss.oracle.com/licenses/upl.
*/
#include <sys/utsname.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <dt_debug.h>
static unsigned long version;
static int
parse_tok(char *utsrelease, char **saveptr)
{
const char *tok;
int ver;
tok = strtok_r(utsrelease, ".-+", saveptr);
if (!tok)
return -1;
errno = 0;
ver = strtol(tok, NULL, 10);
if (errno)
return -1;
return ver;
}
unsigned long
linux_version_code(void)
{
struct utsname uts;
char *saveptr;
int major;
int minor;
int micro;
if (version)
return version;
uname(&uts);
major = parse_tok(uts.release, &saveptr);
if (major < 0)
goto err;
minor = parse_tok(NULL, &saveptr);
if (minor < 0)
goto err;
micro = parse_tok(NULL, &saveptr);
if (micro < 0)
goto err;
version = (major << 16) + (minor << 8) + micro;
return version;
err:
uname(&uts);
dt_dprintf("Cannot derive kernel version code from utsrelease of %s\n",
uts.release);
return 0;
}
|