diff options
author | Thomas Guyot-Sionnest <dermoth@users.sourceforge.net> | 2008-08-21 04:17:35 +0000 |
---|---|---|
committer | Thomas Guyot-Sionnest <dermoth@users.sourceforge.net> | 2008-08-21 04:17:35 +0000 |
commit | 49bc8237c09e3fc0963ec18cedc549cb5c7373df (patch) | |
tree | 635b00bfff38862df8b975f94121ee8bc87a698b /plugins/check_ntp_peer.c | |
parent | 77362a18bac7e73a4f824736212acb7fd6f7dd1e (diff) | |
download | monitoring-plugins-49bc8237c09e3fc0963ec18cedc549cb5c7373df.tar.gz |
Complete rewrite of the extract_value function
The original one was flawed (easy to trigger segfaults) and did not allow some whitespaces as permitted by rfc1305. This one has been troughfully tested with tap (the testing code might get included later)
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@2036 f882894a-f735-0410-b71e-b25c423dba1c
Diffstat (limited to 'plugins/check_ntp_peer.c')
-rw-r--r-- | plugins/check_ntp_peer.c | 59 |
1 files changed, 46 insertions, 13 deletions
diff --git a/plugins/check_ntp_peer.c b/plugins/check_ntp_peer.c index 67ee0a77..73ba8990 100644 --- a/plugins/check_ntp_peer.c +++ b/plugins/check_ntp_peer.c @@ -175,23 +175,56 @@ void print_ntp_control_message(const ntp_control_message *p){ } } +/* + * Extract the value from NTP key/value pairs, or return NULL. + * The value returned can be free()ed. + */ char *extract_value(const char *varlist, const char *name){ - char *tmpvarlist=NULL, *tmpkey=NULL, *value=NULL; - int last=0; - - /* The following code require a non-empty varlist */ - if(strlen(varlist) == 0) - return NULL; + char *tmp=NULL, *value=NULL; + int i; - tmpvarlist = strdup(varlist); - tmpkey = strtok(tmpvarlist, "="); + /* Strip any leading space */ - do { - if(strstr(tmpkey, name) != NULL) { - value = strtok(NULL, ","); - last = 1; + while (1) { + for (varlist; isspace(varlist[0]); varlist++); + if (strncmp(name, varlist, strlen(name)) == 0) { + varlist += strlen(name); + /* strip trailing spaces */ + for (varlist; isspace(varlist[0]); varlist++); + + if (varlist[0] == '=') { + /* We matched the key, go past the = sign */ + varlist++; + /* strip leading spaces */ + for (varlist; isspace(varlist[0]); varlist++); + + if (tmp = index(varlist, ',')) { + /* Value is delimited by a comma */ + if (tmp-varlist == 0) continue; + value = (char *)malloc(tmp-varlist+1); + strncpy(value, varlist, tmp-varlist); + value[tmp-varlist] = '\0'; + } else { + /* Value is delimited by a \0 */ + if (strlen(varlist) == 0) continue; + value = (char *)malloc(strlen(varlist) + 1); + strncpy(value, varlist, strlen(varlist)); + value[strlen(varlist)] = '\0'; + } + break; + } + } + if (tmp = index(varlist, ',')) { + /* More keys, keep going... */ + varlist = tmp + 1; + } else { + /* We're done */ + break; } - } while (last == 0 && (tmpkey = strtok(NULL, "="))); + } + + /* Clean-up trailing spaces/newlines */ + if (value) for (i=strlen(value)-1; isspace(value[i]); i--) value[i] = '\0'; return value; } |