/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to plugins.d/mandos-client.c

  • Committer: Teddy Hogeborn
  • Date: 2014-03-10 06:34:36 UTC
  • Revision ID: teddy@recompile.se-20140310063436-zksdghqvv6k1pbyg
Do not add a new server to server list if clock_gettime() fails

* plugins.d/mandos-client.c (add_server): Set server.last_seen before
                                          adding new server, in case
                                          clock_gettime() fails.

Show diffs side-by-side

added added

removed removed

Lines of Context:
634
634
                                      int af, mandos_context *mc){
635
635
  int ret, tcp_sd = -1;
636
636
  ssize_t sret;
637
 
  struct sockaddr_storage to;
 
637
  union {
 
638
    struct sockaddr_in in;
 
639
    struct sockaddr_in6 in6;
 
640
  } to;
638
641
  char *buffer = NULL;
639
642
  char *decrypted_buffer = NULL;
640
643
  size_t buffer_length = 0;
721
724
  
722
725
  memset(&to, 0, sizeof(to));
723
726
  if(af == AF_INET6){
724
 
    ((struct sockaddr_in6 *)&to)->sin6_family = (sa_family_t)af;
725
 
    ret = inet_pton(af, ip, &((struct sockaddr_in6 *)&to)->sin6_addr);
 
727
    to.in6.sin6_family = (sa_family_t)af;
 
728
    ret = inet_pton(af, ip, &to.in6.sin6_addr);
726
729
  } else {                      /* IPv4 */
727
 
    ((struct sockaddr_in *)&to)->sin_family = (sa_family_t)af;
728
 
    ret = inet_pton(af, ip, &((struct sockaddr_in *)&to)->sin_addr);
 
730
    to.in.sin_family = (sa_family_t)af;
 
731
    ret = inet_pton(af, ip, &to.in.sin_addr);
729
732
  }
730
733
  if(ret < 0 ){
731
734
    int e = errno;
740
743
    goto mandos_end;
741
744
  }
742
745
  if(af == AF_INET6){
743
 
    ((struct sockaddr_in6 *)&to)->sin6_port = htons(port);    
744
 
    if(IN6_IS_ADDR_LINKLOCAL
745
 
       (&((struct sockaddr_in6 *)&to)->sin6_addr)){
 
746
    to.in6.sin6_port = htons(port);    
 
747
#ifdef __GNUC__
 
748
#pragma GCC diagnostic push
 
749
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
 
750
#endif
 
751
    if(IN6_IS_ADDR_LINKLOCAL /* Spurious warnings from */
 
752
       (&to.in6.sin6_addr)){ /* -Wstrict-aliasing=2 or lower */
 
753
#ifdef __GNUC__
 
754
#pragma GCC diagnostic pop
 
755
#endif
746
756
      if(if_index == AVAHI_IF_UNSPEC){
747
757
        fprintf_plus(stderr, "An IPv6 link-local address is"
748
758
                     " incomplete without a network interface\n");
750
760
        goto mandos_end;
751
761
      }
752
762
      /* Set the network interface number as scope */
753
 
      ((struct sockaddr_in6 *)&to)->sin6_scope_id = (uint32_t)if_index;
 
763
      to.in6.sin6_scope_id = (uint32_t)if_index;
754
764
    }
755
765
  } else {
756
 
    ((struct sockaddr_in *)&to)->sin_port = htons(port);
 
766
    to.in.sin_port = htons(port);
757
767
  }
758
768
  
759
769
  if(quit_now){
777
787
    char addrstr[(INET_ADDRSTRLEN > INET6_ADDRSTRLEN) ?
778
788
                 INET_ADDRSTRLEN : INET6_ADDRSTRLEN] = "";
779
789
    if(af == AF_INET6){
780
 
      ret = getnameinfo((struct sockaddr *)&to,
781
 
                        sizeof(struct sockaddr_in6),
 
790
      ret = getnameinfo((struct sockaddr *)&(to.in6), sizeof(to.in6),
782
791
                        addrstr, sizeof(addrstr), NULL, 0,
783
792
                        NI_NUMERICHOST);
784
793
    } else {
785
 
      ret = getnameinfo((struct sockaddr *)&to,
786
 
                        sizeof(struct sockaddr_in),
 
794
      ret = getnameinfo((struct sockaddr *)&(to.in), sizeof(to.in),
787
795
                        addrstr, sizeof(addrstr), NULL, 0,
788
796
                        NI_NUMERICHOST);
789
797
    }
802
810
  }
803
811
  
804
812
  if(af == AF_INET6){
805
 
    ret = connect(tcp_sd, (struct sockaddr *)&to,
806
 
                  sizeof(struct sockaddr_in6));
 
813
    ret = connect(tcp_sd, &to.in6, sizeof(to));
807
814
  } else {
808
 
    ret = connect(tcp_sd, (struct sockaddr *)&to, /* IPv4 */
809
 
                  sizeof(struct sockaddr_in));
 
815
    ret = connect(tcp_sd, &to.in, sizeof(to)); /* IPv4 */
810
816
  }
811
817
  if(ret < 0){
812
818
    if ((errno != ECONNREFUSED and errno != ENETUNREACH) or debug){