/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-07-21 15:34:44 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080721153444-lugbjkj1oq65ugq3
* Makefile (CFLAGS): Changed to use $(WARN), $(DEBUG), $(COVERAGE) and
                     $(LANGUAGE).
  (WARN, DEBUG, COVERAGE, LANGUAGE): New.
  (LDFLAGS): New; use $(COVERAGE)

* plugbasedclient.c: Added copyright header.
  (process.buffer_size, process.buffer_length): Changed to "size_t".
  (main): Cast arguments to malloc and realloc.  Detect read errors
          from processes.

* mandosclient.c: Added copyright header.
  (interface): Moved to inside "main".
  (gpg_packet_decrypt): Renamed to "pgp_packet_decrypt"; all callers
                        changed.  Changed "new_packet_capacity" and
                        "new_packet_length" to be ssize_t.  Cast
                        arguments to realloc.
  (debuggnutls): Attribute "level" argument as unused.
  (empty_log): Attribute "level" and "txt" arguments as unused.
  (start_mandos_communication): New argument "if_index".  Bug fix:
                                check ret, no tcp_sd, for errors from
                                setsockopt.  Use "if_index" directly
                                instead of looking up the index.  Loop
                                around fwrite until all data is written.
  (resolve_callback): Attribute "txt", and "flags" as usused.  Added
                      default case to switch.  Also show server host
                      name.  Call start_mandos_communication with
                      "interface".
  (browse_callback): Added default case to switch.
  (main): Variable "interface" moved here.  Cast "srand" argument.
          Bug fix: Call avahi_s_service_browser_new with index of
          "interface", not "eth0".

* passprompt.c: Added copyright header.
  (termination_handler): Attribute "signum" argument as unused.

Show diffs side-by-side

added added

removed removed

Lines of Context:
48
48
#include <avahi-common/error.h>
49
49
 
50
50
//mandos client part
51
 
#include <sys/types.h>          /* socket(), inet_pton() */
52
 
#include <sys/socket.h>         /* socket(), struct sockaddr_in6,
 
51
#include <sys/types.h>          /* socket(), setsockopt(),
 
52
                                   inet_pton() */
 
53
#include <sys/socket.h>         /* socket(), setsockopt(),
 
54
                                   struct sockaddr_in6,
53
55
                                   struct in6_addr, inet_pton() */
54
56
#include <gnutls/gnutls.h>      /* All GnuTLS stuff */
55
57
#include <gnutls/openpgp.h>     /* GnuTLS with openpgp stuff */
193
195
  gpgme_data_release(dh_crypto);
194
196
  
195
197
  /* Seek back to the beginning of the GPGME plaintext data buffer */
196
 
  gpgme_data_seek(dh_plain, (off_t) 0, SEEK_SET);
 
198
  gpgme_data_seek(dh_plain, 0, SEEK_SET);
197
199
 
198
200
  *new_packet = 0;
199
201
  while(true){
343
345
void empty_log(__attribute__((unused)) AvahiLogLevel level,
344
346
               __attribute__((unused)) const char *txt){}
345
347
 
346
 
int start_mandos_communication(const char *ip, uint16_t port,
 
348
int start_mandos_communication(char *ip, uint16_t port,
347
349
                               unsigned int if_index){
348
350
  int ret, tcp_sd;
349
351
  struct sockaddr_in6 to;
353
355
  size_t buffer_length = 0;
354
356
  size_t buffer_capacity = 0;
355
357
  ssize_t decrypted_buffer_size;
356
 
  size_t written = 0;
357
358
  int retval = 0;
358
359
  char interface[IF_NAMESIZE];
359
360
  
378
379
    fprintf(stderr, "Binding to interface %s\n", interface);
379
380
  }
380
381
  
381
 
  memset(&to,0,sizeof(to));     /* Spurious warning */
 
382
  ret = setsockopt(tcp_sd, SOL_SOCKET, SO_BINDTODEVICE, interface, 5);
 
383
  if(ret < 0) {
 
384
    perror("setsockopt bindtodevice");
 
385
    return -1;
 
386
  }
 
387
  
 
388
  memset(&to,0,sizeof(to));
382
389
  to.sin6_family = AF_INET6;
383
390
  ret = inet_pton(AF_INET6, ip, &to.sin6_addr);
384
391
  if (ret < 0 ){
389
396
    fprintf(stderr, "Bad address: %s\n", ip);
390
397
    return -1;
391
398
  }
392
 
  to.sin6_port = htons(port);   /* Spurious warning */
 
399
  /* Spurious warnings for the next line, see for instance
 
400
     <http://bugs.debian.org/488884> */
 
401
  to.sin6_port = htons(port);
393
402
  
394
403
  to.sin6_scope_id = (uint32_t)if_index;
395
404
  
479
488
                                               &decrypted_buffer,
480
489
                                               CERT_ROOT);
481
490
    if (decrypted_buffer_size >= 0){
482
 
      while(written < decrypted_buffer_size){
483
 
        ret = (int)fwrite (decrypted_buffer + written, 1,
484
 
                           (size_t)decrypted_buffer_size - written,
485
 
                           stdout);
 
491
      while(decrypted_buffer_size > 0){
 
492
        ret = fwrite (decrypted_buffer, 1, (size_t)decrypted_buffer_size,
 
493
                      stdout);
486
494
        if(ret == 0 and ferror(stdout)){
487
495
          if(debug){
488
496
            fprintf(stderr, "Error writing encrypted data: %s\n",
491
499
          retval = -1;
492
500
          break;
493
501
        }
494
 
        written += (size_t)ret;
 
502
        decrypted_buffer += ret;
 
503
        decrypted_buffer_size -= ret;
495
504
      }
496
505
      free(decrypted_buffer);
497
506
    } else {
520
529
 
521
530
static void resolve_callback(
522
531
    AvahiSServiceResolver *r,
523
 
    AvahiIfIndex interface,
 
532
    AVAHI_GCC_UNUSED AvahiIfIndex interface,
524
533
    AVAHI_GCC_UNUSED AvahiProtocol protocol,
525
534
    AvahiResolverEvent event,
526
535
    const char *name,
533
542
    AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
534
543
    AVAHI_GCC_UNUSED void* userdata) {
535
544
    
536
 
  assert(r);                    /* Spurious warning */
537
 
  
 
545
  assert(r);
 
546
 
538
547
  /* Called whenever a service has been resolved successfully or
539
548
     timed out */
540
 
  
 
549
 
541
550
  switch (event) {
542
551
  default:
543
552
  case AVAHI_RESOLVER_FAILURE:
545
554
            " type '%s' in domain '%s': %s\n", name, type, domain,
546
555
            avahi_strerror(avahi_server_errno(server)));
547
556
    break;
548
 
    
 
557
      
549
558
  case AVAHI_RESOLVER_FOUND:
550
559
    {
551
560
      char ip[AVAHI_ADDRESS_STR_MAX];
555
564
                host_name, ip, port);
556
565
      }
557
566
      int ret = start_mandos_communication(ip, port,
558
 
                                           (unsigned int) interface);
 
567
                                           (unsigned int)
 
568
                                           interface);
559
569
      if (ret == 0){
560
570
        exit(EXIT_SUCCESS);
561
571
      } else {
578
588
    void* userdata) {
579
589
    
580
590
    AvahiServer *s = userdata;
581
 
    assert(b);                  /* Spurious warning */
582
 
    
 
591
    assert(b);
 
592
 
583
593
    /* Called whenever a new services becomes available on the LAN or
584
594
       is removed from the LAN */
585
 
    
 
595
 
586
596
    switch (event) {
587
597
    default:
588
598
    case AVAHI_BROWSER_FAILURE:
628
638
        {"debug", no_argument, (int *)&debug, 1},
629
639
        {"interface", required_argument, 0, 'i'},
630
640
        {0, 0, 0, 0} };
631
 
      
 
641
 
632
642
      int option_index = 0;
633
643
      ret = getopt_long (argc, argv, "i:", long_options,
634
644
                         &option_index);
635
 
      
 
645
 
636
646
      if (ret == -1){
637
647
        break;
638
648
      }