--- ./makedumpfile.h.org	2006-09-07 17:47:08.000000000 +0900
+++ ./makedumpfile.h	2006-09-07 18:17:20.000000000 +0900
@@ -142,13 +142,28 @@ isAnon(unsigned long mapping)
  * for symbol
  */
 #define NOT_FOUND_SYMBOL	(0)
+#define INVALID_SYMBOL_DATA	(ULONG_MAX)
 #define SYMBOL(X)		(symbol_table.X)
+#define WRITE_SYMBOL(str_symbol, symbol) \
+do { \
+	if (SYMBOL(symbol) != NOT_FOUND_SYMBOL) { \
+		fprintf(info->file_configfile, "%s%lx\n", \
+		    STR_SYMBOL(str_symbol), SYMBOL(symbol)); \
+	} \
+} while (0)
+#define READ_SYMBOL(str_symbol, symbol) \
+do { \
+	SYMBOL(symbol) = read_config_symbol(info, STR_SYMBOL(str_symbol)); \
+	if (SYMBOL(symbol) == INVALID_SYMBOL_DATA) \
+		return FALSE; \
+} while (0)
 
 /*
  * for structure
  */
 #define NOT_FOUND_STRUCTURE	(-1)
 #define FAILED_DWARFINFO	(-2)
+#define INVALID_STRUCTURE_DATA	(-3)
 #define SIZE(X)			(size_table.X)
 #define OFFSET(X)		(offset_table.X)
 #define GET_STRUCTURE_SIZE	get_structure_size
@@ -170,6 +185,32 @@ do { \
 	     == FAILED_DWARFINFO) \
 		return FALSE; \
 } while (0)
+#define WRITE_STRUCTURE_SIZE(str_structure, structure) \
+do { \
+	if (SIZE(structure) != NOT_FOUND_STRUCTURE) { \
+		fprintf(info->file_configfile, "%s%ld\n", \
+		    STR_SIZE(str_structure), SIZE(structure)); \
+	} \
+} while (0)
+#define WRITE_MEMBER_OFFSET(str_member, member) \
+do { \
+	if (OFFSET(member) != NOT_FOUND_STRUCTURE) { \
+		fprintf(info->file_configfile, "%s%ld\n", \
+		    STR_OFFSET(str_member), OFFSET(member)); \
+	} \
+} while (0)
+#define READ_STRUCTURE_SIZE(str_structure, structure) \
+do { \
+	SIZE(structure) = read_config_structure(info,STR_SIZE(str_structure)); \
+	if (SIZE(structure) == INVALID_STRUCTURE_DATA) \
+		return FALSE; \
+} while (0)
+#define READ_MEMBER_OFFSET(str_member, member) \
+do { \
+	OFFSET(member) = read_config_structure(info, STR_OFFSET(str_member)); \
+	if (OFFSET(member) == INVALID_STRUCTURE_DATA) \
+		return FALSE; \
+} while (0)
 
 /*
  * kernel version
--- ./makedumpfile.c.org	2006-09-07 17:47:04.000000000 +0900
+++ ./makedumpfile.c	2006-09-07 18:16:26.000000000 +0900
@@ -845,7 +845,7 @@ generate_config(struct DumpInfo *info)
 	    (int)info->page_size);
 
 	/*
-	 * write 1st kernel's address of SYMBOL(mem_map)
+	 * write the symbol of 1st kernel
 	 */
 	if (!get_symbol_info(info))
 		return FALSE;
@@ -854,14 +854,8 @@ generate_config(struct DumpInfo *info)
 		ERRMSG("Can't get the symbol of mem_map.\n");
 		return FALSE;
 	}
-	fprintf(info->file_configfile, "%s%lx\n", STR_SYMBOL("mem_map"),
-	    SYMBOL(mem_map));
-
-	/*
-	 * write 1st kernel's address of SYMBOL(system_utsname)
-	 */
-	fprintf(info->file_configfile, "%s%lx\n", STR_SYMBOL("system_utsname"),
-	    SYMBOL(system_utsname));
+	WRITE_SYMBOL("mem_map", mem_map);
+	WRITE_SYMBOL("system_utsname", system_utsname);
 
 	/*
 	 * get 1st kernel's version
@@ -871,43 +865,30 @@ generate_config(struct DumpInfo *info)
 		return FALSE;
 
 	/*
-	 * write 1st kernel's size of struct page
+	 * write the structure size of 1st kernel
 	 */
 	if (!get_structure_info(info))
 		return FALSE;
-	fprintf(info->file_configfile, "%s%ld\n", STR_SIZE("page"),
-	    SIZE(page));
-
-	/*
-	 * write 1st kernel's offset of page.flags
-	 */
-	fprintf(info->file_configfile, "%s%ld\n", STR_OFFSET("page.flags"),
-	    OFFSET(page.flags));
-
-	/*
-	 * write 1st kernel's offset of page._count
-	 */
-	fprintf(info->file_configfile, "%s%ld\n", STR_OFFSET("page._count"),
-	    OFFSET(page._count));
+	WRITE_STRUCTURE_SIZE("page", page);
 
 	/*
-	 * write 1st kernel's offset of page.mapping
+	 * write the member offset of 1st kernel
 	 */
-	fprintf(info->file_configfile, "%s%ld\n", STR_OFFSET("page.mapping"),
-	    OFFSET(page.mapping));
+	WRITE_MEMBER_OFFSET("page.flags", page.flags);
+	WRITE_MEMBER_OFFSET("page._count", page._count);
+	WRITE_MEMBER_OFFSET("page.mapping", page.mapping);
 
 	return TRUE;
 }
 
 int
-read_config(struct DumpInfo *info)
+read_config_basic_info(struct DumpInfo *info)
 {
-	unsigned long tmp_ulong;
+	unsigned long page_size;
 	char buf[BUFSIZE_FGETS], *endp;
-	unsigned int ok_flag = 0, i;
+	unsigned int get_release = FALSE, i;
 
-	SYMBOL(mem_map) = NOT_FOUND_SYMBOL;
-	SYMBOL(system_utsname) = NOT_FOUND_SYMBOL;
+	fseek(info->file_configfile, 0L, SEEK_SET);
 
 	while (fgets(buf, BUFSIZE_FGETS, info->file_configfile)) {
 		i = strlen(buf);
@@ -915,93 +896,100 @@ read_config(struct DumpInfo *info)
 			buf[i - 1] = '\0';
 		if (strncmp(buf, STR_OSRELEASE, strlen(STR_OSRELEASE)) == 0) {
 			strcpy(info->release, buf + strlen(STR_OSRELEASE));
-			ok_flag = 1;
+			get_release = TRUE;
 		}
 		if (strncmp(buf, STR_PAGESIZE, strlen(STR_PAGESIZE)) == 0) {
-			tmp_ulong = strtoul(buf + strlen(STR_PAGESIZE), &endp, 10);
-	       		if ((!tmp_ulong || tmp_ulong == ULONG_MAX)
-			    || strlen(endp) != 0) {
-				ERRMSG("Invalid data in %s: %s",
-					info->name_configfile, buf);
-				return FALSE;
-			}
-			if (!is_page_size(tmp_ulong)) {
-				ERRMSG("Invalid data in %s: %s",
-				info->name_configfile, buf);
-				return FALSE;
-			}
-			info->page_size = tmp_ulong;
-		}
-		if (strncmp(buf, STR_SYMBOL("mem_map"), strlen(STR_SYMBOL("mem_map"))) == 0) {
-			tmp_ulong = strtoul(buf + strlen(STR_SYMBOL("mem_map")),
-				&endp, 16);
-	       		if ((!tmp_ulong || tmp_ulong == ULONG_MAX)
+			page_size = strtoul(buf+strlen(STR_PAGESIZE),&endp,10);
+			if ((!page_size || page_size == ULONG_MAX)
 			    || strlen(endp) != 0) {
 				ERRMSG("Invalid data in %s: %s",
-					info->name_configfile, buf);
+				    info->name_configfile, buf);
 				return FALSE;
 			}
-			SYMBOL(mem_map) = tmp_ulong;
-		}
-		if (strncmp(buf, STR_SYMBOL("system_utsname"), strlen(STR_SYMBOL("system_utsname"))) == 0) {
-			tmp_ulong = strtoul(buf
-				+ strlen(STR_SYMBOL("system_utsname")), &endp, 16);
-        		if ((!tmp_ulong || tmp_ulong == ULONG_MAX)
-			    || strlen(endp) != 0) {
-				ERRMSG("Invalid data in %s: %s",
-					info->name_configfile, buf);
-				return FALSE;
-			}
-			SYMBOL(system_utsname) = tmp_ulong;
-		}
-		if (strncmp(buf, STR_SIZE("page"), strlen(STR_SIZE("page"))) == 0) {
-			tmp_ulong = strtoul(buf + strlen(STR_SIZE("page")), &endp, 10);
-	       		if ((!tmp_ulong || tmp_ulong == ULONG_MAX)
-			    || strlen(endp) != 0) {
-				ERRMSG("Invalid data in %s: %s",
-					info->name_configfile, buf);
-				return FALSE;
-			}
-			SIZE(page) = tmp_ulong;
-		}
-		if (strncmp(buf, STR_OFFSET("page.flags"), strlen(STR_OFFSET("page.flags"))) == 0) {
-			tmp_ulong = strtoul(buf + strlen(STR_OFFSET("page.flags")),
-				&endp, 10);
-	       		if (tmp_ulong == ULONG_MAX
-			    || strlen(endp) != 0) {
+			if (!is_page_size(page_size)) {
 				ERRMSG("Invalid data in %s: %s",
-					info->name_configfile, buf);
+				    info->name_configfile, buf);
 				return FALSE;
 			}
-			OFFSET(page.flags) = tmp_ulong;
+			info->page_size = page_size;
 		}
-		if (strncmp(buf, STR_OFFSET("page._count"), strlen(STR_OFFSET("page._count"))) == 0) {
-			tmp_ulong = strtoul(buf + strlen(STR_OFFSET("page._count")),
-				&endp, 10);
-	       		if (tmp_ulong == ULONG_MAX
+		if (get_release && info->page_size)
+			break;
+	}
+	if (!get_release || !info->page_size) {
+		ERRMSG("Invalid format in %s", info->name_configfile);
+		return FALSE;
+	}
+	return TRUE;
+}
+
+unsigned long
+read_config_symbol(struct DumpInfo *info, char *str_symbol)
+{
+	unsigned long symbol = NOT_FOUND_SYMBOL;
+	char buf[BUFSIZE_FGETS], *endp;
+	unsigned int i;
+
+	fseek(info->file_configfile, 0L, SEEK_SET);
+
+	while (fgets(buf, BUFSIZE_FGETS, info->file_configfile)) {
+		i = strlen(buf);
+		if (buf[i - 1] == '\n')
+			buf[i - 1] = '\0';
+		if (strncmp(buf, str_symbol, strlen(str_symbol)) == 0) {
+			symbol = strtoul(buf + strlen(str_symbol), &endp, 16);
+			if ((!symbol || symbol == ULONG_MAX)
 			    || strlen(endp) != 0) {
 				ERRMSG("Invalid data in %s: %s",
-					info->name_configfile, buf);
-				return FALSE;
+				    info->name_configfile, buf);
+				return INVALID_SYMBOL_DATA;
 			}
-			OFFSET(page._count) = tmp_ulong;
+			break;
 		}
-		if (strncmp(buf, STR_OFFSET("page.mapping"), strlen(STR_OFFSET("page.mapping"))) == 0) {
-			tmp_ulong = strtoul(buf + strlen(STR_OFFSET("page.mapping")),
-				&endp, 10);
-	       		if (tmp_ulong == ULONG_MAX
-			    || strlen(endp) != 0) {
+	}
+	return symbol;
+}
+
+long
+read_config_structure(struct DumpInfo *info, char *str_structure)
+{
+	long data = NOT_FOUND_STRUCTURE;
+	char buf[BUFSIZE_FGETS], *endp;
+	unsigned int i;
+
+	fseek(info->file_configfile, 0L, SEEK_SET);
+
+	while (fgets(buf, BUFSIZE_FGETS, info->file_configfile)) {
+		i = strlen(buf);
+		if (buf[i - 1] == '\n')
+			buf[i - 1] = '\0';
+		if (strncmp(buf, str_structure, strlen(str_structure)) == 0) {
+			data = strtol(buf + strlen(str_structure), &endp, 10);
+			if ((data == LONG_MAX) || strlen(endp) != 0) {
 				ERRMSG("Invalid data in %s: %s",
-					info->name_configfile, buf);
-				return FALSE;
+				    info->name_configfile, buf);
+				return INVALID_STRUCTURE_DATA;
 			}
-			OFFSET(page.mapping) = tmp_ulong;
+			break;
 		}
 	}
-	if (!ok_flag || !info->page_size) {
-		ERRMSG("Invalid format in %s", info->name_configfile);
+	return data;
+}
+
+int
+read_config(struct DumpInfo *info)
+{
+	if (!read_config_basic_info(info))
 		return FALSE;
-	}
+
+	READ_SYMBOL("mem_map", mem_map);
+	READ_SYMBOL("system_utsname", system_utsname);
+
+	READ_STRUCTURE_SIZE("page", page);
+	READ_MEMBER_OFFSET("page.flags", page.flags);
+	READ_MEMBER_OFFSET("page._count", page._count);
+	READ_MEMBER_OFFSET("page.mapping", page.mapping);
+
 	return TRUE;
 }
 
