diff --git a/src/send/core/send_packet.c b/src/send/core/send_packet.c index 1bd8ddb..177bbfa 100644 --- a/src/send/core/send_packet.c +++ b/src/send/core/send_packet.c @@ -37,11 +37,12 @@ handle_send_error(struct icmp_handle *h) int saved_errno; saved_errno = errno; - if (EAGAIN == saved_errno || EWOULDBLOCK == saved_errno) + if (EAGAIN == saved_errno || EWOULDBLOCK == saved_errno + || ENOBUFS == saved_errno) { icmp_set_error_fmt(h, ICMP_ERR_EAGAIN, "Send would block (buffer full, retry later)"); - return -1; + return 1; } icmp_set_error_fmt(h, ICMP_ERR_SEND, "sendto() failed: %s", strerror(saved_errno)); diff --git a/src/send/core/send_to_destination.c b/src/send/core/send_to_destination.c index 89d098b..b513f14 100644 --- a/src/send/core/send_to_destination.c +++ b/src/send/core/send_to_destination.c @@ -7,16 +7,20 @@ int send_to_destination(struct icmp_handle *h, const void *packet, size_t len, struct in_addr dest, uint8_t ttl) { - struct sockaddr_in addr; + struct sockaddr_in addr; + int ret; if (send_set_socket_ttl(h, ttl) < 0) return -1; send_prepare_destination(&addr, dest); - if (send_packet(h, packet, len, &addr) < 0) - return -1; + ret = send_packet(h, packet, len, &addr); - icmp_clear_error(h); - return 0; + switch (ret) + { + case -1: return -1; + case 1: return 1; + default: icmp_clear_error(h); return 0; + } }