The main motivation to separate out the range parsing from libxcpu was that it could be used in statfs. Added a new function nodecreate_from_range in statfs.
statfs.conf now supports node ranges like x[0-100]=10.0.0.[10-110] x[101-200]=10.0.1.[10-109] and so on. It assumes the node range and address range is equal. Signed-off-by: Abhishek Kulkarni <[email protected]> Index: statfs/statfs.c =================================================================== --- statfs/statfs.c (revision 752) +++ statfs/statfs.c (working copy) @@ -199,6 +199,46 @@ np_werror(NULL, 0); } +static int +nodecreate_from_range(char *namerange, char *addrrange) +{ + int nname, naddr, i; + char **name = NULL, **addr = NULL; + Node *nd, **lnd; + + nname = parse_range(namerange, &name); + if (nname < 0) + goto error; + + naddr = parse_range(addrrange, &addr); + if (naddr < 0) + goto error; + + if (nname != naddr) { + np_werror("syntax error: name and address range mismatch", EIO); + return -1; + } + + for (i = 0; i < nname; i++) { + nd = nodecreate(name[i], addr[i]); + if (!nd) + goto error; + + nd->next = nodes; + nodes = nd; + } + + free(name); + free(addr); + return nname; +error: + free(name); + free(addr); + np_werror("syntax error: '%s %s' invalid node range description", + EIO, namerange, addrrange); + return -1; +} + static void nodereseterror(Node *nd) { @@ -333,16 +373,14 @@ int errorcount = 0; char buf[256], *p, *s; FILE *f; - Node *nd, **lnd; + f = fopen(path, "r"); if (!f) { np_suerror(path, errno); return -1; } - lnd = &nodes; - /* there are few things worse than a program that feeds you * config file errors one line at a time. So, if you get an * error, track the fact, but keep trying to parse, so @@ -383,19 +421,14 @@ ; p[n+1] = '\0'; - nd = nodecreate(s, p); - if (!nd){ + if (nodecreate_from_range(s, p) < 0) { errorcount++; continue; } - - *lnd = nd; - lnd = &nd->next; } fclose(f); return -errorcount; - } static Npfile*
