[PATCH 1/2] kconfig: add support for type handlers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 This patch adds type handlers for compressed config files. Initial
 support provides callouts for gzip and bzip2, but there's no reason
 others could be added if demand is there.

 This is intended to allow /proc/config.gz be a configuration source
 for 'make oldconfig' when .config is absent.

Signed-off-by: Jeff Mahoney <jeffm@xxxxxxxx>
---

 scripts/kconfig/zconf.l |   50 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 48 insertions(+), 2 deletions(-)

--- a/scripts/kconfig/zconf.l
+++ b/scripts/kconfig/zconf.l
@@ -256,6 +256,44 @@ static void zconf_endhelp(void)
 	BEGIN(INITIAL);
 }
 
+static const struct type_handler {
+	const char *suffix;
+	const char *command;
+} type_handlers[] = {
+	{
+		.suffix = ".gz",
+		.command = "zcat",
+	},
+	{
+		.suffix = ".bz2",
+		.command = "bzcat",
+	},
+	/* Whatever other algorithms you like */
+	{}
+};
+
+static const struct type_handler *get_type_handler(const char *name)
+{
+	char *p = rindex(name, '.');
+	if (p) {
+		const struct type_handler *ops = type_handlers;
+		for (ops = type_handlers; ops->suffix; ops++) {
+			if (!strcasecmp(ops->suffix, p))
+				break;
+		}
+		if (!ops->suffix)
+			return NULL;
+		return ops;
+	}
+	return NULL;
+}
+
+static FILE *zconf_popen(const char *command, const char *name)
+{
+	char cmdbuf[PATH_MAX + strlen(command) + 2];
+	snprintf(cmdbuf, sizeof(cmdbuf), "%s %s", command, name);
+	return popen(cmdbuf, "r");
+}
 
 /*
  * Try to open specified file with following names:
@@ -267,15 +305,23 @@ static void zconf_endhelp(void)
  */
 FILE *zconf_fopen(const char *name)
 {
+	const struct type_handler *handler = get_type_handler(name);
 	char *env, fullname[PATH_MAX+1];
 	FILE *f;
 
-	f = fopen(name, "r");
+	if (handler)
+		f = zconf_popen(handler->command, name);
+	else
+		f = fopen(name, "r");
+
 	if (!f && name != NULL && name[0] != '/') {
 		env = getenv(SRCTREE);
 		if (env) {
 			sprintf(fullname, "%s/%s", env, name);
-			f = fopen(fullname, "r");
+			if (handler)
+				f = zconf_popen(handler->command, fullname);
+			else
+				f = fopen(fullname, "r");
 		}
 	}
 	return f;

-- 
Jeff Mahoney
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux