code: mafs

Download patch

ref: 36f18c50a8d8b01ca698af36b20b816293ae0df8
parent: 4d4140d98d6869142a2e5bdb60e42596552afe7b
author: 9ferno <gophone2015@gmail.com>
date: Fri Nov 25 13:12:16 EST 2022

test config parser

--- a/config.c
+++ b/config.c
@@ -5,8 +5,7 @@
 initconfig(u64 dblkno)
 {
 	Iobuf *buf;
-	char *tokens[128], cfg[Ddatasize], *nl;
-	s32 n, i;
+	char cfg[Ddatasize];
 
 	buf = getmetachk(dblkno, Breadonly, Tdentry, Qpconfig);
 	if(buf == nil)
@@ -14,72 +13,7 @@
 	memcpy(cfg, buf->cur->buf, buf->cur->size);
 	putbuf(buf, 0);
 
-	n = tokenize(cfg, tokens, 128);
-	if(n > 128)
-		panic("cannot read config, increase tokens size\n");
-	if(n == 0){
-		panic("nil config");
-	}
-	for(i = 0; i<n; i++){
-		if(strcmp(tokens[i], "nblocks") == 0){
-			if((config.nblocks = atoll(tokens[++i])) == 0)
-				panic("mafs: %s initconfig(): invalid nblocks\n", service);
-		}else if(strcmp(tokens[i], "size") == 0){
-			if((config.size = atoll(tokens[++i])) == 0)
-				panic("mafs: %s initconfig(): invalid size\n", service);
-		}else if(strcmp(tokens[i], "backup") == 0 &&
-					strcmp(tokens[i+1], "config") == 0){
-				i++;
-				if((config.config.srcbno = atoll(tokens[++i])) == 0)
-					panic("mafs: %s initconfig(): invalid size\n", service);
-				i++; /* skip over to */
-				if((config.config.dest[0] = atoll(tokens[++i])) == 0)
-					panic("mafs: %s initconfig(): invalid size\n", service);
-				if((config.config.dest[1] = atoll(tokens[++i])) == 0)
-					panic("mafs: %s initconfig(): invalid size\n", service);
-		}else if(strcmp(tokens[i], "backup") == 0 &&
-					strcmp(tokens[i+1], "super") == 0){
-				i++;
-				if((config.super.srcbno = atoll(tokens[++i])) == 0)
-					panic("mafs: %s initconfig(): invalid size\n", service);
-				i++; /* skip over to */
-				if((config.super.dest[0] = atoll(tokens[++i])) == 0)
-					panic("mafs: %s initconfig(): invalid size\n", service);
-				if((config.super.dest[1] = atoll(tokens[++i])) == 0)
-					panic("mafs: %s initconfig(): invalid size\n", service);
-		}else if(strcmp(tokens[i], "backup") == 0 &&
-					strcmp(tokens[i+1], "root") == 0){
-				i++;
-				if((config.root.srcbno = atoll(tokens[++i])) == 0)
-					panic("mafs: %s initconfig(): invalid size\n", service);
-				i++; /* skip over to */
-				if((config.root.dest[0] = atoll(tokens[++i])) == 0)
-					panic("mafs: %s initconfig(): invalid size\n", service);
-				if((config.root.dest[1] = atoll(tokens[++i])) == 0)
-					panic("mafs: %s initconfig(): invalid size\n", service);
-		}else if(strcmp(tokens[i], "service") == 0){
-			snprint(config.service, Namelen,"%s", tokens[++i]);
-			if((nl=strchr(config.service, '\n')) != nil)
-				*nl = '\0';
-		}
-	}
-	if(chatty9p > 1)
-	dprint("config:\n"
-			"size %llud\n"
-			"nblocks %llud\n"
-			"backup config %llud to %llud\n"
-			"backup super %llud to %llud\n"
-			"backup root %llud to %llud\n",
-			"service %s\n",
-			config.size,
-			config.nblocks,
-			config.config.srcbno,
-			config.config.dest[0],
-			config.super.srcbno,
-			config.super.dest[0],
-			config.root.srcbno,
-			config.root.dest[0],
-			config.service);
+	parseconfig(cfg, &config);
 }
 
 void
--- a/dat.h
+++ b/dat.h
@@ -390,3 +390,4 @@
 
 extern Config config;
 extern char userserrmsg[Nuserserrmsg];
+Config *parseconfig(s8 *cfg, Config *c);
--- a/mkfile
+++ b/mkfile
@@ -13,6 +13,7 @@
 	extents.$O\
 	iobuf.$O\
 	misc.$O\
+	parseconfig.$O\
 	sub.$O\
 	tag.$O\
 	user.$O\
--- /dev/null
+++ b/parseconfig.c
@@ -1,0 +1,79 @@
+#include "all.h"
+
+Config *
+parseconfig(s8 *cfg, Config *c)
+{
+	char *tokens[128], *nl;
+	s32 n, i;
+
+	n = tokenize(cfg, tokens, 128);
+	if(n > 128)
+		panic("cannot read config, increase tokens size\n");
+	if(n == 0){
+		panic("nil config");
+	}
+//	for(i=0; i<n; i++)
+//		print("i %d has %s\n", i, tokens[i]);
+
+	for(i = 0; i<n; i++){
+		if(strcmp(tokens[i], "nblocks") == 0){
+			if((c->nblocks = atoll(tokens[++i])) == 0)
+				panic("mafs: %s initconfig(): invalid nblocks\n", service);
+		}else if(strcmp(tokens[i], "size") == 0){
+			if((c->size = atoll(tokens[++i])) == 0)
+				panic("mafs: %s initconfig(): invalid size\n", service);
+		}else if(strcmp(tokens[i], "backup") == 0 &&
+					strcmp(tokens[i+1], "config") == 0){
+				i++;
+				if((c->config.srcbno = atoll(tokens[++i])) == 0)
+					panic("mafs: %s initconfig(): invalid size\n", service);
+				i++; /* skip over to */
+				if((c->config.dest[0] = atoll(tokens[++i])) == 0)
+					panic("mafs: %s initconfig(): invalid size\n", service);
+//				if((c->config.dest[1] = atoll(tokens[++i])) == 0)
+//					panic("mafs: %s initconfig(): invalid size\n", service);
+		}else if(strcmp(tokens[i], "backup") == 0 &&
+					strcmp(tokens[i+1], "super") == 0){
+				i++;
+				if((c->super.srcbno = atoll(tokens[++i])) == 0)
+					panic("mafs: %s initconfig(): invalid size\n", service);
+				i++; /* skip over to */
+				if((c->super.dest[0] = atoll(tokens[++i])) == 0)
+					panic("mafs: %s initconfig(): invalid size\n", service);
+//				if((c->super.dest[1] = atoll(tokens[++i])) == 0)
+//					panic("mafs: %s initconfig(): invalid size\n", service);
+		}else if(strcmp(tokens[i], "backup") == 0 &&
+					strcmp(tokens[i+1], "root") == 0){
+				i++;
+				if((c->root.srcbno = atoll(tokens[++i])) == 0)
+					panic("mafs: %s initconfig(): invalid size\n", service);
+				i++; /* skip over to */
+				if((c->root.dest[0] = atoll(tokens[++i])) == 0)
+					panic("mafs: %s initconfig(): invalid size\n", service);
+//				if((c->root.dest[1] = atoll(tokens[++i])) == 0)
+//					panic("mafs: %s initconfig(): invalid size\n", service);
+		}else if(strcmp(tokens[i], "service") == 0){
+			snprint(c->service, Namelen,"%s", tokens[++i]);
+			if((nl=strchr(c->service, '\n')) != nil)
+				*nl = '\0';
+		}
+	}
+	if(chatty9p > 1)
+	dprint("config:\n"
+			"size %llud\n"
+			"nblocks %llud\n"
+			"backup config %llud to %llud\n"
+			"backup super %llud to %llud\n"
+			"backup root %llud to %llud\n"
+			"service %s\n",
+			c->size,
+			c->nblocks,
+			c->config.srcbno,
+			c->config.dest[0],
+			c->super.srcbno,
+			c->super.dest[0],
+			c->root.srcbno,
+			c->root.dest[0],
+			c->service);
+	return c;
+}
--- a/tests/mkfile
+++ b/tests/mkfile
@@ -2,7 +2,7 @@
 
 BIN=/$objtype/bin/disk
 
-TARG=sizes offsets testextents pwrites reli nlastdatablocks # mfsck
+TARG=sizes offsets testextents pwrites reli nlastdatablocks testconfig # mfsck
 
 OFILES=\
 	../dat.$O\
@@ -20,6 +20,9 @@
 
 tests: 6.sizes
 	./6.sizes
+
+$O.testconfig:	../dat.$O ../parseconfig.$O ../misc.$O testconfig.$O
+	$LD $LDFLAGS -o $target $prereq
 
 $O.testextents:	../dat.$O ../extents.$O ../misc.$O testextents.$O
 	$LD $LDFLAGS -o $target $prereq
--- /dev/null
+++ b/tests/testconfig.c
@@ -1,0 +1,39 @@
+#include <u.h>
+#include <libc.h>
+#include "../dat.h"
+
+/*
+	test the config parser
+	awk 'BEGIN{p=0}; p==1{print $0}; $1=="mode"{p=1};' test.0/blocks/2 | ./6.testconfig
+	disk/block /dev/sdF1/fs 2 | awk 'BEGIN{p=0}; p==1{print $0}; $1=="mode"{p=1};' | ./6.testconfig
+ */
+
+int chatty9p = 0;
+Config config = {0};
+char	service[Namelen] = "testcofig";
+
+static void
+usage(void)
+{
+	fprint(2, "usage: parseconfig [-D ]\n");
+	exits("usage");
+}
+
+void
+main(int argc, char *argv[])
+{
+	s8 buf[Ddatasize];
+
+	ARGBEGIN{
+	default:	usage();
+	case 'D':	chatty9p=2; break;
+	}ARGEND
+
+	if(argc != 0)
+		usage();
+
+	chatty9p=2;
+	readn(0, buf, Ddatasize);
+	parseconfig(buf, &config);
+	exits(nil);
+}
--- a/tests/testextents.c
+++ b/tests/testextents.c
@@ -37,7 +37,7 @@
 	bp = Bfdopen(0, OREAD);
 	Blethal(bp, nil);
 
-	initextents(&es);
+	initextents(&es, "testextents");
 	while((line = Brdstr(bp, '\n', 1)) != nil) {
 		bno = strtoull(line, &p, 10);
 		p++;	/* for the space */