From 508000138c53707c961ce7364aff798e594604b7 Mon Sep 17 00:00:00 2001 From: David Sterba Date: Wed, 10 Feb 2016 00:23:29 +0100 Subject: btrfs-progs: mkfs: detect version of running kernel Use the uname syscall and parse the string. Signed-off-by: David Sterba --- utils.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'utils.c') diff --git a/utils.c b/utils.c index 72e6ae90..011e163d 100644 --- a/utils.c +++ b/utils.c @@ -38,6 +38,7 @@ #include #include #include +#include #include "kerncompat.h" #include "radix-tree.h" @@ -1555,6 +1556,53 @@ char* btrfs_parse_fs_features(char *namelist, u64 *flags) return NULL; } +void print_kernel_version(FILE *stream, u32 version) +{ + u32 v[3]; + + v[0] = version & 0xFF; + v[1] = (version >> 8) & 0xFF; + v[2] = version >> 16; + fprintf(stream, "%u.%u", v[2], v[1]); + if (v[0]) + fprintf(stream, ".%u", v[0]); +} + +u32 get_running_kernel_version(void) +{ + struct utsname utsbuf; + char *tmp; + char *saveptr = NULL; + u32 version; + + uname(&utsbuf); + if (strcmp(utsbuf.sysname, "Linux") != 0) { + error("unsupported system: %s", utsbuf.sysname); + exit(1); + } + /* 1.2.3-4-name */ + tmp = strchr(utsbuf.release, '-'); + if (tmp) + *tmp = 0; + + tmp = strtok_r(utsbuf.release, ".", &saveptr); + if (!string_is_numerical(tmp)) + return (u32)-1; + version = atoi(tmp) << 16; + tmp = strtok_r(NULL, ".", &saveptr); + if (!string_is_numerical(tmp)) + return (u32)-1; + version |= atoi(tmp) << 8; + tmp = strtok_r(NULL, ".", &saveptr); + if (tmp) { + if (!string_is_numerical(tmp)) + return (u32)-1; + version |= atoi(tmp); + } + + return version; +} + u64 btrfs_device_size(int fd, struct stat *st) { u64 size; -- cgit v1.2.3