aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Vorel <pvorel@suse.cz>2023-08-24 08:46:54 +0200
committerPetr Vorel <pvorel@suse.cz>2023-10-06 17:39:04 +0200
commitfb75557ed8bb1c513e8178c92bbcf5ff27fbc418 (patch)
tree53be8d1e78cffce7f9b3d8cf475738d0fabaa37c
parent170e51d860df47c4e8e788ea54406970e6a46a3a (diff)
downloadiputils-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.c4
-rw-r--r--ping/ping.h1
-rw-r--r--ping/ping6_common.c5
-rw-r--r--ping/ping_common.c20
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;
+}