WiringPi: Implement storing current operating board's kernel version

Signed-off-by: Deokgyu Yang <secugyu@gmail.com>
Change-Id: I663d1df07e88ebae4e975afc2ebae6122d5918e9
diff --git a/wiringPi/wiringPi.c b/wiringPi/wiringPi.c
index 609ccd9..1701c9d 100644
--- a/wiringPi/wiringPi.c
+++ b/wiringPi/wiringPi.c
@@ -26,6 +26,7 @@
 #include <sys/stat.h>
 #include <sys/wait.h>
 #include <sys/ioctl.h>
+#include <sys/utsname.h>
 #include <asm/ioctl.h>
 
 /*----------------------------------------------------------------------------*/
@@ -134,6 +135,14 @@
 // ODROID Wiring Library
 struct libodroid	libwiring;
 
+// Current kernel version
+struct kernelVersionStruct *kernelVersion = &(struct kernelVersionStruct) {
+	.major = 0,
+	.minor = 0,
+	.revision = 0,
+	.patch = 0
+};
+
 /*----------------------------------------------------------------------------*/
 //
 // Return true/false if the supplied module is loaded
@@ -253,6 +262,38 @@
 }
 
 /*----------------------------------------------------------------------------*/
+/*
+ * setKernelVersion:
+ *	It sets current operating kernel version to the global struct variable.
+ */
+/*----------------------------------------------------------------------------*/
+void setKernelVersion() {
+	struct utsname uname_buf;
+
+	char* buf;
+	char* delimiter[] = { ".", "-" };
+	int i, kernelNumbers[4] = { 0, };
+
+	uname(&uname_buf);
+
+	buf = strtok(uname_buf.release, delimiter[0]);
+	for (i = 0; i < 4; i++) {
+		if (i < 1) {
+			kernelNumbers[i] = atoi(buf);
+			buf = strtok(NULL, delimiter[0]);
+		} else {
+			kernelNumbers[i] = atoi(buf);
+			buf = strtok(NULL, delimiter[1]);
+		}
+	}
+
+	kernelVersion->major = kernelNumbers[0];
+	kernelVersion->minor = kernelNumbers[1];
+	kernelVersion->revision = kernelNumbers[2];
+	kernelVersion->patch = kernelNumbers[3];
+}
+
+/*----------------------------------------------------------------------------*/
 int getModelFromCpuinfo(char *line, FILE *cpuFd) {
 	char *model;
 
@@ -396,6 +437,7 @@
 	if (wiringPiDebug)
 		printf("BoardRev: Returning revision: %d\n", libwiring.rev);
 
+	setKernelVersion();
 	return libwiring.rev;
 }
 
diff --git a/wiringPi/wiringPi.h b/wiringPi/wiringPi.h
index f24b3e8..05adf8f 100644
--- a/wiringPi/wiringPi.h
+++ b/wiringPi/wiringPi.h
@@ -242,6 +242,20 @@
 extern struct wiringPiNodeStruct *wiringPiNodes;
 
 /*----------------------------------------------------------------------------*/
+// kernelVersionStruct:
+//	Contains the kernel version of the operating board's.
+/*----------------------------------------------------------------------------*/
+struct kernelVersionStruct
+{
+	int major;
+	int minor;
+	int revision;
+	int patch;
+};
+
+extern struct kernelVersionStruct *kernelVersion;
+
+/*----------------------------------------------------------------------------*/
 // Function prototypes
 //	c++ wrappers thanks to a comment by Nick Lott
 //	(and others on the Raspberry Pi forums)
@@ -261,6 +275,7 @@
 extern		void setupCheck		(const char *fName);
 extern		void usingGpiomemCheck	(const char *what);
 extern		void setUsingGpiomem	(const unsigned int value);
+extern		void setKernelVersion	(void);
 
 // Core WiringPi functions
 extern		void wiringPiVersion	(int *major, char **minor);