Add getline_wrapped() to parse config files

Basically copied from module-init-tools
diff --git a/libkmod/libkmod-util.c b/libkmod/libkmod-util.c
new file mode 100644
index 0000000..a1f5fa1
--- /dev/null
+++ b/libkmod/libkmod-util.c
@@ -0,0 +1,85 @@
+/*
+ * libkmod - interface to kernel module operations
+ *
+ * Copyright (C) 2011  ProFUSION embedded systems
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation version 2.1.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "libkmod.h"
+#include "libkmod-private.h"
+
+/*
+ * Read one logical line from a configuration file.
+ *
+ * Line endings may be escaped with backslashes, to form one logical line from
+ * several physical lines.  No end of line character(s) are included in the
+ * result.
+ *
+ * If linenum is not NULL, it is incremented by the number of physical lines
+ * which have been read.
+ */
+char *getline_wrapped(FILE *fp, unsigned int *linenum)
+{
+	int size = 256;
+	int i = 0;
+	char *buf = malloc(size);
+	for(;;) {
+		int ch = getc_unlocked(fp);
+
+		switch(ch) {
+		case EOF:
+			if (i == 0) {
+				free(buf);
+				return NULL;
+			}
+			/* else fall through */
+
+		case '\n':
+			if (linenum)
+				(*linenum)++;
+			if (i == size)
+				buf = realloc(buf, size + 1);
+			buf[i] = '\0';
+			return buf;
+
+		case '\\':
+			ch = getc_unlocked(fp);
+
+			if (ch == '\n') {
+				if (linenum)
+					(*linenum)++;
+				continue;
+			}
+			/* else fall through */
+
+		default:
+			buf[i++] = ch;
+
+			if (i == size) {
+				size *= 2;
+				buf = realloc(buf, size);
+			}
+		}
+	}
+}