cmdparse: refactor CPS_ParseNTPSourceAdd()

This commit is contained in:
Miroslav Lichvar 2016-06-27 13:36:37 +02:00
parent 57fc2ff1be
commit d78e8f096c

View file

@ -43,19 +43,14 @@ CPS_Status
CPS_ParseNTPSourceAdd(char *line, CPS_NTP_Source *src) CPS_ParseNTPSourceAdd(char *line, CPS_NTP_Source *src)
{ {
char *hostname, *cmd; char *hostname, *cmd;
int n, done; int n;
CPS_Status result;
src->port = SRC_DEFAULT_PORT; src->port = SRC_DEFAULT_PORT;
src->params.minpoll = SRC_DEFAULT_MINPOLL; src->params.minpoll = SRC_DEFAULT_MINPOLL;
src->params.maxpoll = SRC_DEFAULT_MAXPOLL; src->params.maxpoll = SRC_DEFAULT_MAXPOLL;
src->params.presend_minpoll = SRC_DEFAULT_PRESEND_MINPOLL;
src->params.authkey = INACTIVE_AUTHKEY;
src->params.max_delay = SRC_DEFAULT_MAXDELAY;
src->params.max_delay_ratio = SRC_DEFAULT_MAXDELAYRATIO;
src->params.max_delay_dev_ratio = SRC_DEFAULT_MAXDELAYDEVRATIO;
src->params.online = 1; src->params.online = 1;
src->params.auto_offline = 0; src->params.auto_offline = 0;
src->params.presend_minpoll = SRC_DEFAULT_PRESEND_MINPOLL;
src->params.iburst = 0; src->params.iburst = 0;
src->params.min_stratum = SRC_DEFAULT_MINSTRATUM; src->params.min_stratum = SRC_DEFAULT_MINSTRATUM;
src->params.poll_target = SRC_DEFAULT_POLLTARGET; src->params.poll_target = SRC_DEFAULT_POLLTARGET;
@ -64,161 +59,88 @@ CPS_ParseNTPSourceAdd(char *line, CPS_NTP_Source *src)
src->params.min_samples = SRC_DEFAULT_MINSAMPLES; src->params.min_samples = SRC_DEFAULT_MINSAMPLES;
src->params.max_samples = SRC_DEFAULT_MAXSAMPLES; src->params.max_samples = SRC_DEFAULT_MAXSAMPLES;
src->params.sel_options = 0; src->params.sel_options = 0;
src->params.authkey = INACTIVE_AUTHKEY;
src->params.max_delay = SRC_DEFAULT_MAXDELAY;
src->params.max_delay_ratio = SRC_DEFAULT_MAXDELAYRATIO;
src->params.max_delay_dev_ratio = SRC_DEFAULT_MAXDELAYDEVRATIO;
result = CPS_Success;
hostname = line; hostname = line;
line = CPS_SplitWord(line); line = CPS_SplitWord(line);
if (!*hostname) { if (!*hostname)
result = CPS_BadHost; return CPS_BadHost;
} else {
src->name = hostname;
/* Parse subfields */ src->name = hostname;
done = 0;
do {
cmd = line;
line = CPS_SplitWord(line);
if (*cmd) { /* Parse options */
if (!strcasecmp(cmd, "port")) { for (; *line; line += n) {
if (sscanf(line, "%hu%n", &src->port, &n) != 1) { cmd = line;
result = CPS_BadPort; line = CPS_SplitWord(line);
done = 1; n = 0;
} else {
line += n;
}
} else if (!strcasecmp(cmd, "minpoll")) {
if (sscanf(line, "%d%n", &src->params.minpoll, &n) != 1) {
result = CPS_BadMinpoll;
done = 1;
} else {
line += n;
}
} else if (!strcasecmp(cmd, "maxpoll")) {
if (sscanf(line, "%d%n", &src->params.maxpoll, &n) != 1) {
result = CPS_BadMaxpoll;
done = 1;
} else {
line += n;
}
} else if (!strcasecmp(cmd, "presend")) {
if (sscanf(line, "%d%n", &src->params.presend_minpoll, &n) != 1) {
result = CPS_BadPresend;
done = 1;
} else {
line += n;
}
} else if (!strcasecmp(cmd, "maxdelaydevratio")) {
if (sscanf(line, "%lf%n", &src->params.max_delay_dev_ratio, &n) != 1) {
result = CPS_BadMaxdelaydevratio;
done = 1;
} else {
line += n;
}
} else if (!strcasecmp(cmd, "maxdelayratio")) {
if (sscanf(line, "%lf%n", &src->params.max_delay_ratio, &n) != 1) {
result = CPS_BadMaxdelayratio;
done = 1;
} else {
line += n;
}
} else if (!strcasecmp(cmd, "maxdelay")) {
if (sscanf(line, "%lf%n", &src->params.max_delay, &n) != 1) {
result = CPS_BadMaxdelay;
done = 1;
} else {
line += n;
}
} else if (!strcasecmp(cmd, "key")) {
if (sscanf(line, "%"SCNu32"%n", &src->params.authkey, &n) != 1 ||
src->params.authkey == INACTIVE_AUTHKEY) {
result = CPS_BadKey;
done = 1;
} else {
line += n;
}
} else if (!strcasecmp(cmd, "offline")) {
src->params.online = 0;
} else if (!strcasecmp(cmd, "auto_offline")) { if (!strcasecmp(cmd, "auto_offline")) {
src->params.auto_offline = 1; src->params.auto_offline = 1;
} else if (!strcasecmp(cmd, "iburst")) {
} else if (!strcasecmp(cmd, "iburst")) { src->params.iburst = 1;
src->params.iburst = 1; } else if (!strcasecmp(cmd, "offline")) {
src->params.online = 0;
} else if (!strcasecmp(cmd, "minstratum")) { } else if (!strcasecmp(cmd, "noselect")) {
if (sscanf(line, "%d%n", &src->params.min_stratum, &n) != 1) { src->params.sel_options |= SRC_SELECT_NOSELECT;
result = CPS_BadMinstratum; } else if (!strcasecmp(cmd, "prefer")) {
done = 1; src->params.sel_options |= SRC_SELECT_PREFER;
} else { } else if (!strcasecmp(cmd, "require")) {
line += n; src->params.sel_options |= SRC_SELECT_REQUIRE;
} } else if (!strcasecmp(cmd, "trust")) {
src->params.sel_options |= SRC_SELECT_TRUST;
} else if (!strcasecmp(cmd, "polltarget")) { } else if (!strcasecmp(cmd, "key")) {
if (sscanf(line, "%d%n", &src->params.poll_target, &n) != 1) { if (sscanf(line, "%"SCNu32"%n", &src->params.authkey, &n) != 1 ||
result = CPS_BadPolltarget; src->params.authkey == INACTIVE_AUTHKEY)
done = 1; return CPS_BadKey;
} else { } else if (!strcasecmp(cmd, "maxdelay")) {
line += n; if (sscanf(line, "%lf%n", &src->params.max_delay, &n) != 1)
} return CPS_BadMaxdelay;
} else if (!strcasecmp(cmd, "maxdelayratio")) {
} else if (!strcasecmp(cmd, "noselect")) { if (sscanf(line, "%lf%n", &src->params.max_delay_ratio, &n) != 1)
src->params.sel_options |= SRC_SELECT_NOSELECT; return CPS_BadMaxdelayratio;
} else if (!strcasecmp(cmd, "maxdelaydevratio")) {
} else if (!strcasecmp(cmd, "prefer")) { if (sscanf(line, "%lf%n", &src->params.max_delay_dev_ratio, &n) != 1)
src->params.sel_options |= SRC_SELECT_PREFER; return CPS_BadMaxdelaydevratio;
} else if (!strcasecmp(cmd, "maxpoll")) {
} else if (!strcasecmp(cmd, "trust")) { if (sscanf(line, "%d%n", &src->params.maxpoll, &n) != 1)
src->params.sel_options |= SRC_SELECT_TRUST; return CPS_BadMaxpoll;
} else if (!strcasecmp(cmd, "maxsamples")) {
} else if (!strcasecmp(cmd, "require")) { if (sscanf(line, "%d%n", &src->params.max_samples, &n) != 1)
src->params.sel_options |= SRC_SELECT_REQUIRE; return CPS_BadMaxsamples;
} else if (!strcasecmp(cmd, "maxsources")) {
} else if (!strcasecmp(cmd, "version")) { if (sscanf(line, "%d%n", &src->params.max_sources, &n) != 1)
if (sscanf(line, "%d%n", &src->params.version, &n) != 1) { return CPS_BadMaxsources;
result = CPS_BadVersion; } else if (!strcasecmp(cmd, "minpoll")) {
done = 1; if (sscanf(line, "%d%n", &src->params.minpoll, &n) != 1)
} else { return CPS_BadMinpoll;
line += n; } else if (!strcasecmp(cmd, "minsamples")) {
} if (sscanf(line, "%d%n", &src->params.min_samples, &n) != 1)
return CPS_BadMinsamples;
} else if (!strcasecmp(cmd, "maxsources")) { } else if (!strcasecmp(cmd, "minstratum")) {
if (sscanf(line, "%d%n", &src->params.max_sources, &n) != 1) { if (sscanf(line, "%d%n", &src->params.min_stratum, &n) != 1)
result = CPS_BadMaxsources; return CPS_BadMinstratum;
done = 1; } else if (!strcasecmp(cmd, "port")) {
} else { if (sscanf(line, "%hu%n", &src->port, &n) != 1)
line += n; return CPS_BadPort;
} } else if (!strcasecmp(cmd, "polltarget")) {
if (sscanf(line, "%d%n", &src->params.poll_target, &n) != 1)
} else if (!strcasecmp(cmd, "minsamples")) { return CPS_BadPolltarget;
if (sscanf(line, "%d%n", &src->params.min_samples, &n) != 1) { } else if (!strcasecmp(cmd, "presend")) {
result = CPS_BadMinsamples; if (sscanf(line, "%d%n", &src->params.presend_minpoll, &n) != 1)
done = 1; return CPS_BadPresend;
} else { } else if (!strcasecmp(cmd, "version")) {
line += n; if (sscanf(line, "%d%n", &src->params.version, &n) != 1)
} return CPS_BadVersion;
} else {
} else if (!strcasecmp(cmd, "maxsamples")) { return CPS_BadOption;
if (sscanf(line, "%d%n", &src->params.max_samples, &n) != 1) { }
result = CPS_BadMaxsamples;
done = 1;
} else {
line += n;
}
} else {
result = CPS_BadOption;
done = 1;
}
} else {
done = 1;
}
} while (!done);
} }
return result; return CPS_Success;
} }
/* ================================================== */ /* ================================================== */