ref: 36f18c50a8d8b01ca698af36b20b816293ae0df8
parent: 4d4140d98d6869142a2e5bdb60e42596552afe7b
author: 9ferno <gophone2015@gmail.com>
date: Fri Nov 25 06: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 */