| From ac878566eb935fd3ebfb804e6bd9e1690d4a65e3 Mon Sep 17 00:00:00 2001 |
| From: Tollef Fog Heen <tfheen@err.no> |
| Date: Tue, 20 Mar 2018 22:40:32 +0100 |
| Subject: [PATCH] Open raw sockets when adding hosts, not when doing the |
| pinging |
| |
| This allows this to run as non-root again, without this, oping will |
| have dropped privileges before trying to ping, which then fails to |
| open the necessary raw sockets. |
| |
| Fixes: #34 |
| |
| [Upstream: https://github.com/octo/liboping/pull/35/commits/a88c51f38dafa1fba9118045176754bec05d3c94] |
| Signed-off-by: Peter Seiderer <ps.report@gmx.net> |
| --- |
| src/liboping.c | 48 +++++++++++++++++------------------------------- |
| 1 file changed, 17 insertions(+), 31 deletions(-) |
| |
| diff --git a/src/liboping.c b/src/liboping.c |
| index 39b0041..f98e810 100644 |
| --- a/src/liboping.c |
| +++ b/src/liboping.c |
| @@ -1344,41 +1344,10 @@ int ping_send (pingobj_t *obj) |
| struct timeval nowtime; |
| struct timeval timeout; |
| |
| - _Bool need_ipv4_socket = 0; |
| - _Bool need_ipv6_socket = 0; |
| - |
| for (ptr = obj->head; ptr != NULL; ptr = ptr->next) |
| { |
| ptr->latency = -1.0; |
| ptr->recv_ttl = -1; |
| - |
| - if (ptr->addrfamily == AF_INET) |
| - need_ipv4_socket = 1; |
| - else if (ptr->addrfamily == AF_INET6) |
| - need_ipv6_socket = 1; |
| - } |
| - |
| - if (!need_ipv4_socket && !need_ipv6_socket) |
| - { |
| - ping_set_error (obj, "ping_send", "No hosts to ping"); |
| - return (-1); |
| - } |
| - |
| - if (need_ipv4_socket && obj->fd4 == -1) |
| - { |
| - obj->fd4 = ping_open_socket(obj, AF_INET); |
| - if (obj->fd4 == -1) |
| - return (-1); |
| - ping_set_ttl (obj, obj->ttl); |
| - ping_set_qos (obj, obj->qos); |
| - } |
| - if (need_ipv6_socket && obj->fd6 == -1) |
| - { |
| - obj->fd6 = ping_open_socket(obj, AF_INET6); |
| - if (obj->fd6 == -1) |
| - return (-1); |
| - ping_set_ttl (obj, obj->ttl); |
| - ping_set_qos (obj, obj->qos); |
| } |
| |
| if (gettimeofday (&nowtime, NULL) == -1) |
| @@ -1698,6 +1667,23 @@ int ping_host_add (pingobj_t *obj, const char *host) |
| ph->table_next = obj->table[ph->ident % PING_TABLE_LEN]; |
| obj->table[ph->ident % PING_TABLE_LEN] = ph; |
| |
| + if (ph->addrfamily == AF_INET && obj->fd4 == -1) |
| + { |
| + obj->fd4 = ping_open_socket(obj, AF_INET); |
| + if (obj->fd4 == -1) |
| + return (-1); |
| + ping_set_ttl (obj, obj->ttl); |
| + ping_set_qos (obj, obj->qos); |
| + } |
| + if (ph->addrfamily == AF_INET6 && obj->fd6 == -1) |
| + { |
| + obj->fd6 = ping_open_socket(obj, AF_INET6); |
| + if (obj->fd6 == -1) |
| + return (-1); |
| + ping_set_ttl (obj, obj->ttl); |
| + ping_set_qos (obj, obj->qos); |
| + } |
| + |
| return (0); |
| } /* int ping_host_add */ |
| |
| -- |
| 2.25.1 |
| |