/mandos/release

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

« back to all changes in this revision

Viewing changes to plugins.d/mandosclient.c

  • Committer: Teddy Hogeborn
  • Date: 2008-08-01 20:03:03 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080801200303-3xjn9gjewg87365i
* plugbasedclient.c (main): Check if plugin dir could be opened.  Set
                            FD_CLOEXEC on the directory, if possible,
                            and also on both ends of the pipe.  Do not
                            allocate buffer for process in advance.
                            Free the plugin list.  Bug fix: exit if no
                            plugins found, not if any found.  Set
                            "exitstatus" in many places.  Simplify and
                            un-indent the loop reading process pipes.
                            Renamed process list iterator to "proc".
                            Bug fix:  retry password write on EINTR.
                            Free the process list properly, including
                            the process structs themselves.

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
#include <stdlib.h>
38
38
#include <time.h>
39
39
#include <net/if.h>             /* if_nametoindex */
40
 
#include <sys/ioctl.h>          // ioctl, ifreq, SIOCGIFFLAGS, IFF_UP, SIOCSIFFLAGS
41
 
#include <net/if.h>             // ioctl, ifreq, SIOCGIFFLAGS, IFF_UP, SIOCSIFFLAGS
42
40
 
43
41
#include <avahi-core/core.h>
44
42
#include <avahi-core/lookup.h>
71
69
#define BUFFER_SIZE 256
72
70
#define DH_BITS 1024
73
71
 
74
 
static const char *certdir = "/conf/conf.d/mandos";
75
 
static const char *certfile = "openpgp-client.txt";
76
 
static const char *certkey = "openpgp-client-key.txt";
 
72
const char *certdir = "/conf/conf.d/cryptkeyreq/";
 
73
const char *certfile = "openpgp-client.txt";
 
74
const char *certkey = "openpgp-client-key.txt";
77
75
 
78
76
bool debug = false;
79
77
 
84
82
} encrypted_session;
85
83
 
86
84
 
87
 
static ssize_t pgp_packet_decrypt (char *packet, size_t packet_size,
88
 
                                   char **new_packet,
89
 
                                   const char *homedir){
 
85
ssize_t pgp_packet_decrypt (char *packet, size_t packet_size,
 
86
                            char **new_packet, const char *homedir){
90
87
  gpgme_data_t dh_crypto, dh_plain;
91
88
  gpgme_ctx_t ctx;
92
89
  gpgme_error_t rc;
248
245
  return ret;
249
246
}
250
247
 
251
 
static void debuggnutls(__attribute__((unused)) int level,
252
 
                        const char* string){
 
248
void debuggnutls(__attribute__((unused)) int level,
 
249
                 const char* string){
253
250
  fprintf(stderr, "%s", string);
254
251
}
255
252
 
256
 
static int initgnutls(encrypted_session *es){
 
253
int initgnutls(encrypted_session *es){
257
254
  const char *err;
258
255
  int ret;
259
256
  
347
344
  return 0;
348
345
}
349
346
 
350
 
static void empty_log(__attribute__((unused)) AvahiLogLevel level,
351
 
                      __attribute__((unused)) const char *txt){}
 
347
void empty_log(__attribute__((unused)) AvahiLogLevel level,
 
348
               __attribute__((unused)) const char *txt){}
352
349
 
353
 
static int start_mandos_communication(const char *ip, uint16_t port,
354
 
                                      AvahiIfIndex if_index){
 
350
int start_mandos_communication(const char *ip, uint16_t port,
 
351
                               AvahiIfIndex if_index){
355
352
  int ret, tcp_sd;
356
353
  struct sockaddr_in6 to;
357
354
  encrypted_session es;
374
371
    perror("socket");
375
372
    return -1;
376
373
  }
377
 
 
 
374
  
 
375
  if(if_indextoname((unsigned int)if_index, interface) == NULL){
 
376
    if(debug){
 
377
      perror("if_indextoname");
 
378
    }
 
379
    return -1;
 
380
  }
 
381
  
378
382
  if(debug){
379
 
    if(if_indextoname((unsigned int)if_index, interface) == NULL){
380
 
      if(debug){
381
 
        perror("if_indextoname");
382
 
      }
383
 
      return -1;
384
 
    }
385
 
    
386
383
    fprintf(stderr, "Binding to interface %s\n", interface);
387
384
  }
388
385
  
630
627
    }
631
628
}
632
629
 
633
 
/* Combines file name and path and returns the malloced new
634
 
   string. some sane checks could/should be added */
635
 
static const char *combinepath(const char *first, const char *second){
636
 
  size_t f_len = strlen(first);
637
 
  size_t s_len = strlen(second);
638
 
  char *tmp = malloc(f_len + s_len + 2);
 
630
/* combinds file name and path and returns the malloced new string. som sane checks could/should be added */
 
631
const char *combinepath(const char *first, const char *second){
 
632
  char *tmp;
 
633
  tmp = malloc(strlen(first) + strlen(second) + 2);
639
634
  if (tmp == NULL){
 
635
    perror("malloc");
640
636
    return NULL;
641
637
  }
642
 
  if(f_len > 0){
643
 
    memcpy(tmp, first, f_len);
644
 
  }
645
 
  tmp[f_len] = '/';
646
 
  if(s_len > 0){
647
 
    memcpy(tmp + f_len + 1, second, s_len);
648
 
  }
649
 
  tmp[f_len + 1 + s_len] = '\0';
 
638
  strcpy(tmp, first);
 
639
  if (first[0] != '\0' and first[strlen(first) - 1] != '/'){
 
640
    strcat(tmp, "/");
 
641
  }
 
642
  strcat(tmp, second);
650
643
  return tmp;
651
644
}
652
645
 
657
650
    int error;
658
651
    int ret;
659
652
    int returncode = EXIT_SUCCESS;
660
 
    const char *interface = "eth0";
661
 
    struct ifreq network;
662
 
    int sd;
 
653
    const char *interface = NULL;
 
654
    AvahiIfIndex if_index = AVAHI_IF_UNSPEC;
663
655
    char *connect_to = NULL;
664
 
    AvahiIfIndex if_index = AVAHI_IF_UNSPEC;
665
656
    
666
657
    while (true){
667
658
      static struct option long_options[] = {
703
694
        exit(EXIT_FAILURE);
704
695
      }
705
696
    }
706
 
    
 
697
 
707
698
    certfile = combinepath(certdir, certfile);
708
699
    if (certfile == NULL){
709
 
      perror("combinepath");
710
 
      returncode = EXIT_FAILURE;
711
 
      goto exit;
712
 
    }
713
 
 
714
 
    certkey = combinepath(certdir, certkey);
715
 
    if (certkey == NULL){
716
 
      perror("combinepath");
717
 
      returncode = EXIT_FAILURE;
718
700
      goto exit;
719
701
    }
720
702
    
721
 
    if_index = (AvahiIfIndex) if_nametoindex(interface);
722
 
    if(if_index == 0){
723
 
      fprintf(stderr, "No such interface: \"%s\"\n", interface);
724
 
      exit(EXIT_FAILURE);
 
703
    if(interface != NULL){
 
704
      if_index = (AvahiIfIndex) if_nametoindex(interface);
 
705
      if(if_index == 0){
 
706
        fprintf(stderr, "No such interface: \"%s\"\n", interface);
 
707
        exit(EXIT_FAILURE);
 
708
      }
725
709
    }
726
710
    
727
711
    if(connect_to != NULL){
748
732
      }
749
733
    }
750
734
    
751
 
    sd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
752
 
    if(sd < 0) {
753
 
      perror("socket");
754
 
      returncode = EXIT_FAILURE;
755
 
      goto exit;
756
 
    }
757
 
    strcpy(network.ifr_name, interface);    
758
 
    ret = ioctl(sd, SIOCGIFFLAGS, &network);
759
 
    if(ret == -1){
760
 
      
761
 
      perror("ioctl SIOCGIFFLAGS");
762
 
      returncode = EXIT_FAILURE;
763
 
      goto exit;
764
 
    }
765
 
    if((network.ifr_flags & IFF_UP) == 0){
766
 
      network.ifr_flags |= IFF_UP;
767
 
      ret = ioctl(sd, SIOCSIFFLAGS, &network);
768
 
      if(ret == -1){
769
 
        perror("ioctl SIOCSIFFLAGS");
770
 
        returncode = EXIT_FAILURE;
771
 
        goto exit;
772
 
      }
773
 
    }
774
 
    close(sd);
 
735
    certkey = combinepath(certdir, certkey);
 
736
    if (certkey == NULL){
 
737
      goto exit;
 
738
    }
775
739
    
776
740
    if (not debug){
777
741
      avahi_set_log_function(empty_log);
783
747
    /* Allocate main loop object */
784
748
    if (!(simple_poll = avahi_simple_poll_new())) {
785
749
        fprintf(stderr, "Failed to create simple poll object.\n");
786
 
        returncode = EXIT_FAILURE;      
 
750
        
787
751
        goto exit;
788
752
    }
789
753