diff options
-rw-r--r-- | plugins-root/check_icmp.c | 82 |
1 files changed, 45 insertions, 37 deletions
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c index 7140aa50..7c04ef21 100644 --- a/plugins-root/check_icmp.c +++ b/plugins-root/check_icmp.c | |||
@@ -216,6 +216,7 @@ static int recvfrom_wto(int, void *, unsigned int, struct sockaddr *, u_int *, s | |||
216 | static int send_icmp_ping(int, struct rta_host *); | 216 | static int send_icmp_ping(int, struct rta_host *); |
217 | static int get_threshold(char *str, threshold *th); | 217 | static int get_threshold(char *str, threshold *th); |
218 | static bool get_threshold2(char *str, size_t length, threshold *, threshold *, threshold_mode mode); | 218 | static bool get_threshold2(char *str, size_t length, threshold *, threshold *, threshold_mode mode); |
219 | static bool parse_threshold2_helper(char *s, size_t length, threshold *thr, threshold_mode mode); | ||
219 | static void run_checks(void); | 220 | static void run_checks(void); |
220 | static void set_source_ip(char *); | 221 | static void set_source_ip(char *); |
221 | static int add_target(char *); | 222 | static int add_target(char *); |
@@ -1880,59 +1881,66 @@ get_threshold(char *str, threshold *th) | |||
1880 | static bool get_threshold2(char *str, size_t length, threshold *warn, threshold *crit, threshold_mode mode) { | 1881 | static bool get_threshold2(char *str, size_t length, threshold *warn, threshold *crit, threshold_mode mode) { |
1881 | if (!str || !length || !warn || !crit) return false; | 1882 | if (!str || !length || !warn || !crit) return false; |
1882 | 1883 | ||
1883 | char *p = NULL; | ||
1884 | bool first_iteration = true; | ||
1885 | 1884 | ||
1886 | // p points to the last char in str | 1885 | // p points to the last char in str |
1887 | p = &str[length - 1]; | 1886 | char *p = &str[length - 1]; |
1888 | 1887 | ||
1889 | // first_iteration is bof-stop on stupid libc's | 1888 | // first_iteration is bof-stop on stupid libc's |
1889 | bool first_iteration = true; | ||
1890 | |||
1890 | while(p != &str[0]) { | 1891 | while(p != &str[0]) { |
1891 | if( (*p == 'm') || (*p == '%') ) { | 1892 | if( (*p == 'm') || (*p == '%') ) { |
1892 | *p = '\0'; | 1893 | *p = '\0'; |
1893 | } else if(*p == ',' && !first_iteration) { | 1894 | } else if(*p == ',' && !first_iteration) { |
1894 | *p = '\0'; /* reset it so get_timevar(str) works nicely later */ | 1895 | *p = '\0'; /* reset it so get_timevar(str) works nicely later */ |
1895 | 1896 | ||
1896 | switch (mode) { | 1897 | char *start_of_value = p + 1; |
1897 | case const_rta_mode: | 1898 | |
1898 | crit->rta = atof(p+1)*1000; | 1899 | if (!parse_threshold2_helper(start_of_value, strlen(start_of_value), crit, mode)){ |
1899 | break; | 1900 | return false; |
1900 | case const_packet_loss_mode: | ||
1901 | crit->pl = (unsigned char)strtoul(p+1, NULL, 0); | ||
1902 | break; | ||
1903 | case const_jitter_mode: | ||
1904 | crit->jitter = atof(p+1); | ||
1905 | break; | ||
1906 | case const_mos_mode: | ||
1907 | crit->mos = atof(p+1); | ||
1908 | break; | ||
1909 | case const_score_mode: | ||
1910 | crit->score = atof(p+1); | ||
1911 | break; | ||
1912 | } | 1901 | } |
1902 | |||
1913 | } | 1903 | } |
1914 | first_iteration = false; | 1904 | first_iteration = false; |
1915 | p--; | 1905 | p--; |
1916 | } | 1906 | } |
1917 | 1907 | ||
1918 | switch (mode) { | 1908 | return parse_threshold2_helper(p, strlen(p), warn, mode); |
1919 | case const_rta_mode: | 1909 | } |
1920 | warn->rta = atof(p)*1000; | 1910 | |
1921 | break; | 1911 | static bool parse_threshold2_helper(char *s, size_t length, threshold *thr, threshold_mode mode) { |
1922 | case const_packet_loss_mode: | 1912 | char *resultChecker = {0}; |
1923 | warn->pl = (unsigned char)strtoul(p, NULL, 0); | 1913 | |
1924 | break; | 1914 | switch (mode) { |
1925 | case const_jitter_mode: | 1915 | case const_rta_mode: |
1926 | warn->jitter = atof(p); | 1916 | thr->rta = strtod(s, &resultChecker) * 1000; |
1927 | break; | 1917 | break; |
1928 | case const_mos_mode: | 1918 | case const_packet_loss_mode: |
1929 | warn->mos = atof(p); | 1919 | thr->pl = (unsigned char)strtoul(s, &resultChecker, 0); |
1930 | break; | 1920 | break; |
1931 | case const_score_mode: | 1921 | case const_jitter_mode: |
1932 | warn->score = atof(p); | 1922 | thr->jitter = strtod(s, &resultChecker); |
1933 | break; | 1923 | |
1934 | } | 1924 | break; |
1935 | return true; | 1925 | case const_mos_mode: |
1926 | thr->mos = strtod(s, &resultChecker); | ||
1927 | break; | ||
1928 | case const_score_mode: | ||
1929 | thr->score = strtod(s, &resultChecker); | ||
1930 | break; | ||
1931 | } | ||
1932 | |||
1933 | if (resultChecker == s) { | ||
1934 | // Failed to parse | ||
1935 | return false; | ||
1936 | } | ||
1937 | |||
1938 | if (resultChecker != (s + length)) { | ||
1939 | // Trailing symbols | ||
1940 | return false; | ||
1941 | } | ||
1942 | |||
1943 | return true; | ||
1936 | } | 1944 | } |
1937 | 1945 | ||
1938 | unsigned short | 1946 | unsigned short |