krb5 commit: Refactor gss mech config parser

Greg Hudson ghudson at MIT.EDU
Mon Sep 17 22:08:50 EDT 2012


https://github.com/krb5/krb5/commit/f220948484d08147b5572af89c69251e33bde6d7
commit f220948484d08147b5572af89c69251e33bde6d7
Author: Greg Hudson <ghudson at mit.edu>
Date:   Mon Sep 17 21:52:04 2012 -0400

    Refactor gss mech config parser
    
    Use helper functions to shorten and clarify loadConfigFile.

 src/lib/gssapi/mechglue/g_initialize.c |  138 ++++++++++++--------------------
 1 files changed, 53 insertions(+), 85 deletions(-)

diff --git a/src/lib/gssapi/mechglue/g_initialize.c b/src/lib/gssapi/mechglue/g_initialize.c
index 9749cf7..13177c2 100644
--- a/src/lib/gssapi/mechglue/g_initialize.c
+++ b/src/lib/gssapi/mechglue/g_initialize.c
@@ -792,16 +792,49 @@ static gss_mech_info searchMechList(gss_const_OID oid)
 	return ((gss_mech_info) NULL);
 } /* searchMechList */
 
+/* Return the first non-whitespace character starting from str. */
+static char *
+skip_whitespace(char *str)
+{
+	while (isspace(*str))
+		str++;
+	return str;
+}
+
+/* Truncate str at the first whitespace character and return the first
+ * non-whitespace character after that point. */
+static char *
+delimit_ws(char *str)
+{
+	while (*str != '\0' && !isspace(*str))
+		str++;
+	if (*str != '\0')
+		*str++ = '\0';
+	return skip_whitespace(str);
+}
+
+/* Truncate str at the first occurrence of delimiter and return the first
+ * non-whitespace character after that point. */
+static char *
+delimit(char *str, char delimiter)
+{
+	while (*str != '\0' && *str != delimiter)
+		str++;
+	if (*str != '\0')
+		*str++ = '\0';
+	return skip_whitespace(str);
+}
+
 /*
  * loads the configuration file
  * this is called while having a mutex lock on the mechanism list
  * entries for libraries that have been loaded can't be modified
  * mechNameStr and mech_type fields are not updated during updates
  */
-static void loadConfigFile(fileName)
-const char *fileName;
+static void
+loadConfigFile(const char *fileName)
 {
-	char *sharedLib, *kernMod, *modOptions, *oid, *endp;
+	char *sharedLib, *kernMod, *modOptions, *oid, *next;
 	char buffer[BUFSIZ], *oidStr;
 	FILE *confFile;
 
@@ -816,93 +849,28 @@ const char *fileName;
 		if (*buffer == '#')
 			continue;
 
-		/*
-		 * find the first white-space character after
-		 * the mechanism name
-		 */
+		/* Parse out the name, oid, and shared library path. */
 		oidStr = buffer;
-		for (endp = buffer; *endp && !isspace(*endp); endp++);
-
-		/* Now find the first non-white-space character */
-		if (*endp) {
-			*endp = '\0';
-			endp++;
-			while (*endp && isspace(*endp))
-				endp++;
-		}
-
-		/*
-		 * If that's all, then this is a corrupt entry. Skip it.
-		 */
-		if (! *endp)
+		oid = delimit_ws(oidStr);
+		if (*oid == '\0')
 			continue;
+		sharedLib = delimit_ws(oid);
+		if (*sharedLib == '\0')
+			continue;
+		next = delimit_ws(sharedLib);
 
-		/* Find the end of the oid and make sure it is NULL-ended */
-		for (oid = endp; *endp && !isspace(*endp); endp++)
-			;
-
-		if (*endp) {
-			*endp = '\0';
-			endp++;
-		}
-
-		/* Find the start of the shared lib name */
-		for (sharedLib = endp; *sharedLib && isspace(*sharedLib);
-		     sharedLib++)
-			;
-
-		/*
-		 * Find the end of the shared lib name and make sure it is
-		 *  NULL-terminated.
-		 */
-		for (endp = sharedLib; *endp && !isspace(*endp); endp++)
-			;
-
-		if (*endp) {
-			*endp = '\0';
-			endp++;
-		}
-
-		/* Find the start of the optional kernel module lib name */
-		for (kernMod = endp; *kernMod && isspace(*kernMod);
-		     kernMod++)
-			;
-
-		/*
-		 * If this item starts with a bracket "[", then
-		 * it is not a kernel module, but is a list of
-		 * options for the user module to parse later.
-		 */
-		if (*kernMod && *kernMod != '[') {
-			/*
-			 * Find the end of the shared lib name and make sure
-			 * it is NULL-terminated.
-			 */
-			for (endp = kernMod; *endp && !isspace(*endp); endp++)
-				;
-
-			if (*endp) {
-				*endp = '\0';
-				endp++;
-			}
-		} else
+		/* Parse out the kernel module name if present. */
+		if (*next != '\0' && *next != '[') {
+			kernMod = next;
+			next = delimit_ws(kernMod);
+		} else {
 			kernMod = NULL;
+		}
 
-		/* Find the start of the optional module options list */
-		for (modOptions = endp; *modOptions && isspace(*modOptions);
-		     modOptions++);
-
-		if (*modOptions == '[')  {
-			/* move past the opening bracket */
-			for (modOptions = modOptions+1;
-			     *modOptions && isspace(*modOptions);
-			     modOptions++);
-
-			/* Find the closing bracket */
-			for (endp = modOptions;
-			     *endp && *endp != ']'; endp++);
-
-			*endp = '\0';
+		/* Parse out the module options if present. */
+		if (*next == '[') {
+			modOptions = next + 1;
+			next = delimit(modOptions, ']');
 		} else {
 			modOptions = NULL;
 		}


More information about the cvs-krb5 mailing list