Merge branch 'liboping-1.2'
authorFlorian Forster <sifnfors@stud.informatik.uni-erlangen.de>
Fri, 17 Jul 2009 12:53:04 +0000 (14:53 +0200)
committerFlorian Forster <sifnfors@stud.informatik.uni-erlangen.de>
Fri, 17 Jul 2009 12:53:04 +0000 (14:53 +0200)
1  2 
src/liboping.c

diff --combined src/liboping.c
@@@ -134,8 -134,6 +134,8 @@@ struct pingob
        struct sockaddr         *srcaddr;
        socklen_t                srcaddrlen;
  
 +      char                    *device;
 +
        char                     errmsg[PING_ERRMSG_LEN];
  
        pinghost_t              *head;
@@@ -1007,6 -1005,8 +1007,8 @@@ static void ping_free (pinghost_t *ph
   */
  const char *ping_get_error (pingobj_t *obj)
  {
+       if (obj == NULL)
+               return (NULL);
        return (obj->errmsg);
  }
  
@@@ -1031,6 -1031,9 +1033,9 @@@ void ping_destroy (pingobj_t *obj
        pinghost_t *current;
        pinghost_t *next;
  
+       if (obj == NULL)
+               return;
        current = obj->head;
        next = NULL;
  
        if (obj->srcaddr != NULL)
                free (obj->srcaddr);
  
 +      if (obj->device != NULL)
 +              free (obj->device);
 +
        free (obj);
  
        return;
@@@ -1059,6 -1059,9 +1064,9 @@@ int ping_setopt (pingobj_t *obj, int op
  {
        int ret = 0;
  
+       if ((obj == NULL) || (value == NULL))
+               return (-1);
        switch (option)
        {
                case PING_OPT_TIMEOUT:
                } /* case PING_OPT_SOURCE */
                break;
  
 +              case PING_OPT_DEVICE:
 +              {
 +#ifdef SO_BINDTODEVICE
 +                      char *device = strdup ((char *) value);
 +
 +                      if (device == NULL)
 +                      {
 +                              ping_set_errno (obj, errno);
 +                              ret = -1;
 +                              break;
 +                      }
 +
 +                      if (obj->device != NULL)
 +                              free (obj->device);
 +                      obj->device = device;
 +#else /* ! SO_BINDTODEVICE */
 +                      ping_set_errno (obj, ENOTSUP);
 +                      ret = -1;
 +#endif /* ! SO_BINDTODEVICE */
 +              } /* case PING_OPT_DEVICE */
 +              break;
 +
                default:
                        ret = -2;
        } /* switch (option) */
@@@ -1206,6 -1187,9 +1214,9 @@@ int ping_send (pingobj_t *obj
  {
        int ret;
  
+       if (obj == NULL)
+               return (-1);
        if (ping_send_all (obj) < 0)
                return (-1);
  
@@@ -1236,6 -1220,9 +1247,9 @@@ int ping_host_add (pingobj_t *obj, cons
        struct addrinfo *ai_list, *ai_ptr;
        int              ai_return;
  
+       if ((obj == NULL) || (host == NULL))
+               return (-1);
        dprintf ("host = %s\n", host);
  
        if (ping_host_search (obj->head, host) != NULL)
                        }
                }
  
 +#ifdef SO_BINDTODEVICE
 +              if (obj->device != NULL)
 +              {
 +                      if (setsockopt (ph->fd, SOL_SOCKET, SO_BINDTODEVICE,
 +                                      obj->device, strlen (obj->device) + 1) != 0)
 +                      {
 +#if WITH_DEBUG
 +                              char errbuf[PING_ERRMSG_LEN];
 +                              dprintf ("setsockopt: %s\n",
 +                                              sstrerror (errno, errbuf, sizeof (errbuf)));
 +#endif
 +                              ping_set_errno (obj, errno);
 +                              close (ph->fd);
 +                              ph->fd = -1;
 +                              continue;
 +                      }
 +              }
 +#endif /* SO_BINDTODEVICE */
 +
                assert (sizeof (struct sockaddr_storage) >= ai_ptr->ai_addrlen);
                memset (ph->addr, '\0', sizeof (struct sockaddr_storage));
                memcpy (ph->addr, ai_ptr->ai_addr, ai_ptr->ai_addrlen);
@@@ -1466,6 -1434,9 +1480,9 @@@ int ping_host_remove (pingobj_t *obj, c
  {
        pinghost_t *pre, *cur;
  
+       if ((obj == NULL) || (host == NULL))
+               return (-1);
        pre = NULL;
        cur = obj->head;
  
  
  pingobj_iter_t *ping_iterator_get (pingobj_t *obj)
  {
+       if (obj == NULL)
+               return (NULL);
        return ((pingobj_iter_t *) obj->head);
  }
  
  pingobj_iter_t *ping_iterator_next (pingobj_iter_t *iter)
  {
+       if (iter == NULL)
+               return (NULL);
        return ((pingobj_iter_t *) iter->next);
  }
  
@@@ -1511,6 -1486,9 +1532,9 @@@ int ping_iterator_get_info (pingobj_ite
  
        size_t orig_buffer_len = *buffer_len;
  
+       if ((iter == NULL) || (buffer == NULL) || (buffer_len == NULL))
+               return (-1);
        switch (info)
        {
                case PING_INFO_USERNAME:
  
  void *ping_iterator_get_context (pingobj_iter_t *iter)
  {
+       if (iter == NULL)
+               return (NULL);
        return (iter->context);
  }
  
  void ping_iterator_set_context (pingobj_iter_t *iter, void *context)
  {
+       if (iter == NULL)
+               return;
        iter->context = context;
  }