X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fliboping.c;h=9d1482634fa12baf36f5c81c9a518ecdbe6449dd;hb=fe4f50e98128beffb0e04844b383f804ca3ca13b;hp=0dc956ea06310d337ead1168d96581c152216c3f;hpb=b60ab936dc30f7e3b22585575befde9a2a70c132;p=liboping.git diff --git a/src/liboping.c b/src/liboping.c index 0dc956e..9d14826 100644 --- a/src/liboping.c +++ b/src/liboping.c @@ -1,6 +1,6 @@ /** * Object oriented C module to send ICMP and ICMPv6 `echo's. - * Copyright (C) 2006 Florian octo Forster + * Copyright (C) 2006-2008 Florian octo Forster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -97,6 +97,9 @@ struct pinghost { + /* username: name passed in by the user */ + char *username; + /* hostname: name returned by the reverse lookup */ char *hostname; struct sockaddr_storage *addr; socklen_t addrlen; @@ -288,6 +291,22 @@ static pinghost_t *ping_receive_ipv4 (pinghost_t *ph, char *buffer, size_t buffe return (ptr); } +#ifndef ICMP6_ECHO_REQUEST +# ifdef ICMP6_ECHO /* AIX netinet/ip6_icmp.h */ +# define ICMP6_ECHO_REQUEST ICMP6_ECHO +# else +# define ICMP6_ECHO_REQUEST 128 +# endif +#endif + +#ifndef ICMP6_ECHO_REPLY +# ifdef ICMP6_ECHOREPLY /* AIX netinet/ip6_icmp.h */ +# define ICMP6_ECHO_REPLY ICMP6_ECHOREPLY +# else +# define ICMP6_ECHO_REPLY 129 +# endif +#endif + static pinghost_t *ping_receive_ipv6 (pinghost_t *ph, char *buffer, size_t buffer_len) { struct icmp6_hdr *icmp_hdr; @@ -540,7 +559,17 @@ static ssize_t ping_sendto (pingobj_t *obj, pinghost_t *ph, (struct sockaddr *) ph->addr, ph->addrlen); if (ret < 0) + { +#if defined(EHOSTUNREACH) + if (errno == EHOSTUNREACH) + return (0); +#endif +#if defined(ENETUNREACH) + if (errno == ENETUNREACH) + return (0); +#endif ping_set_error (obj, "sendto", strerror (errno)); + } return (ret); } @@ -768,6 +797,7 @@ static pinghost_t *ping_alloc (void) ph->addr = (struct sockaddr_storage *) (ph->timer + 1); ph->addrlen = sizeof (struct sockaddr_storage); + ph->fd = -1; ph->latency = -1.0; ph->ident = ping_get_ident () & 0xFFFF; @@ -776,6 +806,12 @@ static pinghost_t *ping_alloc (void) static void ping_free (pinghost_t *ph) { + if (ph->fd >= 0) + close (ph->fd); + + if (ph->username != NULL) + free (ph->username); + if (ph->hostname != NULL) free (ph->hostname); @@ -966,7 +1002,7 @@ static pinghost_t *ping_host_search (pinghost_t *ph, const char *host) { while (ph != NULL) { - if (strcasecmp (ph->hostname, host) == 0) + if (strcasecmp (ph->username, host) == 0) break; ph = ph->next; @@ -1008,6 +1044,14 @@ int ping_host_add (pingobj_t *obj, const char *host) return (-1); } + if ((ph->username = strdup (host)) == NULL) + { + dprintf ("Out of memory!\n"); + ping_set_error (obj, "strdup", strerror (errno)); + ping_free (ph); + return (-1); + } + if ((ph->hostname = strdup (host)) == NULL) { dprintf ("Out of memory!\n"); @@ -1142,8 +1186,7 @@ int ping_host_add (pingobj_t *obj, const char *host) if (ph->fd < 0) { - free (ph->hostname); - free (ph); + ping_free (ph); return (-1); } @@ -1182,7 +1225,7 @@ int ping_host_remove (pingobj_t *obj, const char *host) while (cur != NULL) { - if (strcasecmp (host, cur->hostname)) + if (strcasecmp (host, cur->username) == 0) break; pre = cur; @@ -1200,9 +1243,6 @@ int ping_host_remove (pingobj_t *obj, const char *host) else pre->next = cur->next; - if (cur->fd >= 0) - close (cur->fd); - ping_free (cur); return (0); @@ -1227,6 +1267,18 @@ int ping_iterator_get_info (pingobj_iter_t *iter, int info, switch (info) { + case PING_INFO_USERNAME: + ret = ENOMEM; + *buffer_len = strlen (iter->username); + if (orig_buffer_len <= *buffer_len) + break; + /* Since (orig_buffer_len > *buffer_len) `strncpy' + * will copy `*buffer_len' and pad the rest of + * `buffer' with null-bytes */ + strncpy (buffer, iter->username, orig_buffer_len); + ret = 0; + break; + case PING_INFO_HOSTNAME: ret = ENOMEM; *buffer_len = strlen (iter->hostname); @@ -1255,7 +1307,6 @@ int ping_iterator_get_info (pingobj_iter_t *iter, int info, ) ret = ENOMEM; else if (ret == EAI_SYSTEM) - /* XXX: Not thread-safe! */ ret = errno; else ret = EINVAL;