Move code away from libminijail.c.

The file has over 2000 lines. Move code to other files as it makes
sense.

Bug: 30662698
Change-Id: Iad3c4a5b2327a4c6956a837a08eb880c7edd7b03
diff --git a/util.c b/util.c
index 3de8eb7..b77de37 100644
--- a/util.c
+++ b/util.c
@@ -6,6 +6,7 @@
 #include <ctype.h>
 #include <stdio.h>
 #include <string.h>
+#include <sys/utsname.h>
 
 #include "util.h"
 
@@ -61,8 +62,6 @@
 
 const size_t log_syscalls_len = sizeof(log_syscalls)/sizeof(log_syscalls[0]);
 
-long int parse_single_constant(char *constant_str, char **endptr);
-
 int lookup_syscall(const char *name)
 {
 	const struct syscall_entry *entry = syscall_table;
@@ -81,6 +80,21 @@
 	return NULL;
 }
 
+long int parse_single_constant(char *constant_str, char **endptr)
+{
+	const struct constant_entry *entry = constant_table;
+	for (; entry->name; ++entry) {
+		if (!strcmp(entry->name, constant_str)) {
+			if (endptr)
+				*endptr = constant_str + strlen(constant_str);
+
+			return entry->value;
+		}
+	}
+
+	return strtol(constant_str, endptr, 0);
+}
+
 long int parse_constant(char *constant_str, char **endptr)
 {
 	long int value = 0;
@@ -111,21 +125,6 @@
 	return value;
 }
 
-long int parse_single_constant(char *constant_str, char **endptr)
-{
-	const struct constant_entry *entry = constant_table;
-	for (; entry->name; ++entry) {
-		if (!strcmp(entry->name, constant_str)) {
-			if (endptr)
-				*endptr = constant_str + strlen(constant_str);
-
-			return entry->value;
-		}
-	}
-
-	return strtol(constant_str, endptr, 0);
-}
-
 char *strip(char *s)
 {
 	char *end;
@@ -187,3 +186,44 @@
 
 	return ret;
 }
+
+int kernel_lessthan_3_8()
+{
+	int major, minor;
+	struct utsname uts;
+	return (uname(&uts) != -1 &&
+			sscanf(uts.release, "%d.%d", &major, &minor) == 2 &&
+			((major < 3) || ((major == 3) && (minor < 8))));
+}
+
+char *path_join(const char *external_path, const char *internal_path)
+{
+	char *path;
+	size_t pathlen;
+
+	/* One extra char for '/' and one for '\0', hence + 2. */
+	pathlen = strlen(external_path) + strlen(internal_path) + 2;
+	path = malloc(pathlen);
+	snprintf(path, pathlen, "%s/%s", external_path, internal_path);
+
+	return path;
+}
+
+void *consumebytes(size_t length, char **buf, size_t *buflength)
+{
+	char *p = *buf;
+	if (length > *buflength)
+		return NULL;
+	*buf += length;
+	*buflength -= length;
+	return p;
+}
+
+char *consumestr(char **buf, size_t *buflength)
+{
+	size_t len = strnlen(*buf, *buflength);
+	if (len == *buflength)
+		/* There's no null-terminator. */
+		return NULL;
+	return consumebytes(len + 1, buf, buflength);
+}