diff options
author | Petr Vorel <pvorel@suse.cz> | 2023-08-24 08:46:54 +0200 |
---|---|---|
committer | Petr Vorel <pvorel@suse.cz> | 2023-10-06 17:39:04 +0200 |
commit | fb75557ed8bb1c513e8178c92bbcf5ff27fbc418 (patch) | |
tree | 53be8d1e78cffce7f9b3d8cf475738d0fabaa37c | |
parent | 170e51d860df47c4e8e788ea54406970e6a46a3a (diff) | |
download | iputils-fb75557ed8bb1c513e8178c92bbcf5ff27fbc418.tar.gz |
ping: Improve interval error message
Improve too low interval for user on broadcast, multicast and flood
error message. Instead of printing "raw" interval (i.e. -i value *
1000) it's more user friendly to print requested -i value.
$ ./builddir/ping/ping -b 192.168.122.255 -i0.1
WARNING: pinging broadcast address
./builddir/ping/ping: minimal interval for broadcast ping for user must be >= 1000 ms, use -i 1 (or higher)
$ ./builddir/ping/ping -i0.1 ff02::1%tun0
./builddir/ping/ping: minimal interval for multicast ping for user must be >= 1000 ms, use -i 1 (or higher)
NOTE: Too low -i value and -f for user without -i use the same message
(maybe that should be further improved):
$ ./builddir/ping/ping ::1 -f
PING ::1 (::1) 56 data bytes
./builddir/ping/ping: cannot flood, minimal interval for user must be >= 2 ms, use -i 0.002 (or higher)
$ ./builddir/ping/ping -i 0.0019 ::1
PING ::1 (::1) 56 data bytes
./builddir/ping/ping: cannot flood, minimal interval for user must be >= 2 ms, use -i 0.002 (or higher)
Modified strings are localized.
Link: https://github.com/iputils/iputils/issues/484#issuecomment-1691025991
Closes: https://github.com/iputils/iputils/pull/487
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
Signed-off-by: Petr Vorel <pvorel@suse.cz>
-rw-r--r-- | ping/ping.c | 4 | ||||
-rw-r--r-- | ping/ping.h | 1 | ||||
-rw-r--r-- | ping/ping6_common.c | 5 | ||||
-rw-r--r-- | ping/ping_common.c | 20 |
4 files changed, 25 insertions, 5 deletions
diff --git a/ping/ping.c b/ping/ping.c index c03bcdf..f850144 100644 --- a/ping/ping.c +++ b/ping/ping.c @@ -880,7 +880,9 @@ int ping4_run(struct ping_rts *rts, int argc, char **argv, struct addrinfo *ai, if (rts->uid) { if (rts->interval < MIN_MULTICAST_USER_INTERVAL_MS) - error(2, 0, _("broadcast ping with too short interval: %d"), rts->interval); + error(2, 0, _("minimal interval for broadcast ping for user must be >= %d ms, use -i %s (or higher)"), + MIN_MULTICAST_USER_INTERVAL_MS, + str_interval(MIN_MULTICAST_USER_INTERVAL_MS)); if (rts->pmtudisc >= 0 && rts->pmtudisc != IP_PMTUDISC_DO) error(2, 0, _("broadcast ping does not fragment")); diff --git a/ping/ping.h b/ping/ping.h index aca0452..04b2ccf 100644 --- a/ping/ping.h +++ b/ping/ping.h @@ -389,6 +389,7 @@ extern void drop_capabilities(void); char *pr_addr(struct ping_rts *rts, void *sa, socklen_t salen); char *pr_raw_addr(struct ping_rts *rts, void *sa, socklen_t salen); +char *str_interval(int interval); int is_ours(struct ping_rts *rts, socket_st *sock, uint16_t id); extern int pinger(struct ping_rts *rts, ping_func_set_st *fset, socket_st *sock); diff --git a/ping/ping6_common.c b/ping/ping6_common.c index bf133ea..40dac0f 100644 --- a/ping/ping6_common.c +++ b/ping/ping6_common.c @@ -264,8 +264,9 @@ int ping6_run(struct ping_rts *rts, int argc, char **argv, struct addrinfo *ai, if (rts->uid) { if (rts->interval < MIN_MULTICAST_USER_INTERVAL_MS) - error(2, 0, _("multicast ping with too short interval: %d"), - rts->interval); + error(2, 0, _("minimal interval for multicast ping for user must be >= %d ms, use -i %s (or higher)"), + MIN_MULTICAST_USER_INTERVAL_MS, + str_interval(MIN_MULTICAST_USER_INTERVAL_MS)); if (rts->pmtudisc >= 0 && rts->pmtudisc != IPV6_PMTUDISC_DO) error(2, 0, _("multicast ping does not fragment")); diff --git a/ping/ping_common.c b/ping/ping_common.c index 2dc51ae..ed4fee8 100644 --- a/ping/ping_common.c +++ b/ping/ping_common.c @@ -484,8 +484,8 @@ void setup(struct ping_rts *rts, socket_st *sock) rts->interval = 0; if (rts->uid && rts->interval < MIN_USER_INTERVAL_MS) - error(2, 0, _("cannot flood; minimal interval allowed for user is %dms"), - MIN_USER_INTERVAL_MS); + error(2, 0, _("cannot flood, minimal interval for user must be >= %d ms, use -i %s (or higher)"), + MIN_USER_INTERVAL_MS, str_interval(MIN_USER_INTERVAL_MS)); if (rts->interval >= INT_MAX / rts->preload) error(2, 0, _("illegal preload and/or interval: %d"), rts->interval); @@ -964,3 +964,19 @@ inline int is_ours(struct ping_rts *rts, socket_st * sock, uint16_t id) { return sock->socktype == SOCK_DGRAM || id == rts->ident; } + +char *str_interval(int interval) +{ + static char buf[14]; + + /* + * Avoid messing with locales and floating point due the different decimal + * point depending on locales. + */ + if (interval % 1000) + snprintf(buf, sizeof(buf), "%1i.%03i", interval/1000, interval%1000); + else + snprintf(buf, sizeof(buf), "%i", interval/1000); + + return buf; +} |