/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: 2012-06-16 23:39:10 UTC
  • Revision ID: teddy@recompile.se-20120616233910-jxxxriq608qa6o8z
* plugins.d/mandos-client (mandos_context): New "interfaces" and
                                            "interfaces_size" members.
  (main): Removed "interfaces" and "interfaces_size" variabled; all
          users changed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
 * "browse_callback", and parts of "main".
10
10
 * 
11
11
 * Everything else is
12
 
 * Copyright © 2008-2013 Teddy Hogeborn
13
 
 * Copyright © 2008-2013 Björn Påhlsson
 
12
 * Copyright © 2008-2012 Teddy Hogeborn
 
13
 * Copyright © 2008-2012 Björn Påhlsson
14
14
 * 
15
15
 * This program is free software: you can redistribute it and/or
16
16
 * modify it under the terms of the GNU General Public License as
187
187
  
188
188
  TEMP_FAILURE_RETRY(fprintf(stream, "Mandos plugin %s: ",
189
189
                             program_invocation_short_name));
190
 
  return (int)TEMP_FAILURE_RETRY(vfprintf(stream, format, ap));
 
190
  return TEMP_FAILURE_RETRY(vfprintf(stream, format, ap));
191
191
}
192
192
 
193
193
/*
659
659
    return -1;
660
660
  }
661
661
  
662
 
  /* If the interface is specified and we have a list of interfaces */
663
 
  if(if_index != AVAHI_IF_UNSPEC and mc->interfaces != NULL){
664
 
    /* Check if the interface is one of the interfaces we are using */
665
 
    bool match = false;
666
 
    {
667
 
      char *interface = NULL;
668
 
      while((interface=argz_next(mc->interfaces, mc->interfaces_size,
669
 
                                 interface))){
670
 
        if(if_nametoindex(interface) == (unsigned int)if_index){
671
 
          match = true;
672
 
          break;
673
 
        }
674
 
      }
675
 
    }
676
 
    if(not match){
677
 
      /* This interface does not match any in the list, so we don't
678
 
         connect to the server */
679
 
      if(debug){
680
 
        char interface[IF_NAMESIZE];
681
 
        if(if_indextoname((unsigned int)if_index, interface) == NULL){
682
 
          perror_plus("if_indextoname");
683
 
        } else {
684
 
          fprintf_plus(stderr, "Skipping server on non-used interface"
685
 
                       " \"%s\"\n",
686
 
                       if_indextoname((unsigned int)if_index,
687
 
                                      interface));
688
 
        }
689
 
      }
690
 
      return -1;
691
 
    }
692
 
  }
693
 
  
694
662
  ret = init_gnutls_session(&session, mc);
695
663
  if(ret != 0){
696
664
    return -1;
736
704
  }
737
705
  if(af == AF_INET6){
738
706
    to.in6.sin6_port = htons(port);    
739
 
#ifdef __GNUC__
740
 
#pragma GCC diagnostic push
741
 
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
742
 
#endif
743
707
    if(IN6_IS_ADDR_LINKLOCAL /* Spurious warnings from */
744
 
       (&to.in6.sin6_addr)){ /* -Wstrict-aliasing=2 or lower */
745
 
#ifdef __GNUC__
746
 
#pragma GCC diagnostic pop
747
 
#endif
 
708
       (&to.in6.sin6_addr)){ /* -Wstrict-aliasing=2 or lower and
 
709
                                -Wunreachable-code*/
748
710
      if(if_index == AVAHI_IF_UNSPEC){
749
711
        fprintf_plus(stderr, "An IPv6 link-local address is"
750
712
                     " incomplete without a network interface\n");
755
717
      to.in6.sin6_scope_id = (uint32_t)if_index;
756
718
    }
757
719
  } else {
758
 
    to.in.sin_port = htons(port);
 
720
    to.in.sin_port = htons(port); /* Spurious warnings from
 
721
                                     -Wconversion and
 
722
                                     -Wunreachable-code */
759
723
  }
760
724
  
761
725
  if(quit_now){
2040
2004
      }
2041
2005
    
2042
2006
      /* Lower privileges */
2043
 
      lower_privileges();
 
2007
      errno = 0;
 
2008
      ret = seteuid(uid);
 
2009
      if(ret == -1){
 
2010
        perror_plus("seteuid");
 
2011
      }
2044
2012
    }
2045
2013
  }
2046
2014
  
2047
 
  /* Remove invalid interface names (except "none") */
 
2015
  /* Remove empty interface names */
2048
2016
  {
2049
2017
    char *interface = NULL;
2050
2018
    while((interface = argz_next(mc.interfaces, mc.interfaces_size,
2051
2019
                                 interface))){
2052
 
      if(strcmp(interface, "none") != 0
2053
 
         and if_nametoindex(interface) == 0){
2054
 
        if(interface[0] != '\0'){
 
2020
      if(if_nametoindex(interface) == 0){
 
2021
        if(interface[0] != '\0' and strcmp(interface, "none") != 0){
2055
2022
          fprintf_plus(stderr, "Not using nonexisting interface"
2056
2023
                       " \"%s\"\n", interface);
2057
2024
        }
2063
2030
  
2064
2031
  /* Run network hooks */
2065
2032
  {
 
2033
    
2066
2034
    if(mc.interfaces != NULL){
2067
2035
      interfaces_hooks = malloc(mc.interfaces_size);
2068
2036
      if(interfaces_hooks == NULL){
2188
2156
    }
2189
2157
  }
2190
2158
  
2191
 
  /* Bring up interfaces which are down, and remove any "none"s */
2192
 
  {
 
2159
  /* If we only got one interface, explicitly use only that one */
 
2160
  if(argz_count(mc.interfaces, mc.interfaces_size) == 1){
 
2161
    if(debug){
 
2162
      fprintf_plus(stderr, "Using only interface \"%s\"\n",
 
2163
                   mc.interfaces);
 
2164
    }
 
2165
    if_index = (AvahiIfIndex)if_nametoindex(mc.interfaces);
 
2166
  }
 
2167
  
 
2168
  /* Bring up interfaces which are down */
 
2169
  if(not (argz_count(mc.interfaces, mc.interfaces_size) == 1
 
2170
          and strcmp(mc.interfaces, "none") == 0)){
2193
2171
    char *interface = NULL;
2194
2172
    while((interface = argz_next(mc.interfaces, mc.interfaces_size,
2195
2173
                                 interface))){
2196
 
      /* If interface name is "none", stop bringing up interfaces.
2197
 
         Also remove all instances of "none" from the list */
2198
 
      if(strcmp(interface, "none") == 0){
2199
 
        argz_delete(&mc.interfaces, &mc.interfaces_size,
2200
 
                    interface);
2201
 
        interface = NULL;
2202
 
        while((interface = argz_next(mc.interfaces,
2203
 
                                     mc.interfaces_size, interface))){
2204
 
          if(strcmp(interface, "none") == 0){
2205
 
            argz_delete(&mc.interfaces, &mc.interfaces_size,
2206
 
                        interface);
2207
 
            interface = NULL;
2208
 
          }
2209
 
        }
2210
 
        break;
2211
 
      }
2212
2174
      bool interface_was_up = interface_is_up(interface);
2213
2175
      ret = bring_up_interface(interface, delay);
2214
2176
      if(not interface_was_up){
2222
2184
        }
2223
2185
      }
2224
2186
    }
 
2187
    free(mc.interfaces);
 
2188
    mc.interfaces = NULL;
 
2189
    mc.interfaces_size = 0;
2225
2190
    if(debug and (interfaces_to_take_down == NULL)){
2226
2191
      fprintf_plus(stderr, "No interfaces were brought up\n");
2227
2192
    }
2228
2193
  }
2229
2194
  
2230
 
  /* If we only got one interface, explicitly use only that one */
2231
 
  if(argz_count(mc.interfaces, mc.interfaces_size) == 1){
2232
 
    if(debug){
2233
 
      fprintf_plus(stderr, "Using only interface \"%s\"\n",
2234
 
                   mc.interfaces);
2235
 
    }
2236
 
    if_index = (AvahiIfIndex)if_nametoindex(mc.interfaces);
2237
 
  }
2238
 
  
2239
2195
  if(quit_now){
2240
2196
    goto end;
2241
2197
  }
2299
2255
      exitcode = EX_USAGE;
2300
2256
      goto end;
2301
2257
    }
2302
 
    
 
2258
  
2303
2259
    if(quit_now){
2304
2260
      goto end;
2305
2261
    }
2335
2291
        fprintf_plus(stderr, "Retrying in %d seconds\n",
2336
2292
                     (int)retry_interval);
2337
2293
      }
2338
 
      sleep((unsigned int)retry_interval);
 
2294
      sleep((int)retry_interval);
2339
2295
    }
2340
2296
    
2341
2297
    if (not quit_now){
2414
2370
  }
2415
2371
  
2416
2372
  /* Cleanup things */
2417
 
  free(mc.interfaces);
2418
 
  
2419
2373
  if(sb != NULL)
2420
2374
    avahi_s_service_browser_free(sb);
2421
2375