X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fliboping.c;h=22ab3a8672167b4d53248c4b92b9646ab82c05ee;hb=4c83ef784bdc0d14fd2b1c20853b678ccc4e18ee;hp=62bc461b8e7b2680c3e93c0a6822da24bb9fa89c;hpb=6d35f0cbf1cb30913020be3b78028ae8299332f0;p=liboping.git diff --git a/src/liboping.c b/src/liboping.c index 62bc461..22ab3a8 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; @@ -778,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; @@ -786,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); @@ -915,9 +941,11 @@ int ping_setopt (pingobj_t *obj, int option, void *value) if (status != 0) { ping_set_error (obj, "getaddrinfo", - status == EAI_SYSTEM - ? strerror (errno) - : gai_strerror (status)); +#if defined(EAI_SYSTEM) + (status == EAI_SYSTEM) + ? strerror (errno) : +#endif + gai_strerror (status)); ret = -1; break; } @@ -976,7 +1004,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; @@ -1018,6 +1046,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"); @@ -1039,9 +1075,11 @@ int ping_host_add (pingobj_t *obj, const char *host) { dprintf ("getaddrinfo failed\n"); ping_set_error (obj, "getaddrinfo", - (ai_return == EAI_SYSTEM) - ? strerror (errno) - : gai_strerror (ai_return)); +#if defined(EAI_SYSTEM) + (ai_return == EAI_SYSTEM) + ? strerror (errno) : +#endif + gai_strerror (ai_return)); ping_free (ph); return (-1); } @@ -1152,8 +1190,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); } @@ -1192,7 +1229,7 @@ int ping_host_remove (pingobj_t *obj, const char *host) while (cur != NULL) { - if (strcasecmp (host, cur->hostname) == 0) + if (strcasecmp (host, cur->username) == 0) break; pre = cur; @@ -1210,9 +1247,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); @@ -1237,6 +1271,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) + 1; + 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) + 1; @@ -1264,9 +1310,10 @@ int ping_iterator_get_info (pingobj_iter_t *iter, int info, #endif ) ret = ENOMEM; +#if defined(EAI_SYSTEM) else if (ret == EAI_SYSTEM) - /* XXX: Not thread-safe! */ ret = errno; +#endif else ret = EINVAL; }