/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/mandos-client.c

  • Committer: Björn Påhlsson
  • Date: 2011-06-19 20:25:38 UTC
  • mto: (237.7.33 trunk)
  • mto: This revision was merged to the branch mainline in revision 284.
  • Revision ID: belorn@fukt.bsnet.se-20110619202538-0js072v8fso12u07
prepended mandos plugin to error messages in each plugin. Added a better way in TODO.

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,2009 Teddy Hogeborn
13
 
 * Copyright © 2008,2009 Björn Påhlsson
 
12
 * Copyright © 2008-2011 Teddy Hogeborn
 
13
 * Copyright © 2008-2011 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
63
63
                                   strtoimax() */
64
64
#include <assert.h>             /* assert() */
65
65
#include <errno.h>              /* perror(), errno */
66
 
#include <time.h>               /* nanosleep(), time() */
 
66
#include <time.h>               /* nanosleep(), time(), sleep() */
67
67
#include <net/if.h>             /* ioctl, ifreq, SIOCGIFFLAGS, IFF_UP,
68
68
                                   SIOCSIFFLAGS, if_indextoname(),
69
69
                                   if_nametoindex(), IF_NAMESIZE */
690
690
    ret = connect(tcp_sd, &to.in, sizeof(to)); /* IPv4 */
691
691
  }
692
692
  if(ret < 0){
693
 
    int e = errno;
694
 
    perror("connect");
695
 
    errno = e;
 
693
    if ((errno != ECONNREFUSED and errno != ENETUNREACH) or debug){
 
694
      int e = errno;
 
695
      perror("connect");
 
696
      errno = e;
 
697
    }
696
698
    goto mandos_end;
697
699
  }
698
700
  
739
741
    errno = EINTR;
740
742
    goto mandos_end;
741
743
  }
742
 
  
 
744
 
 
745
  /* Spurious warnings from -Wint-to-pointer-cast */
743
746
  gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t) tcp_sd);
744
747
  
745
748
  if(quit_now){
1030
1033
int good_interface(const struct dirent *if_entry){
1031
1034
  ssize_t ssret;
1032
1035
  char *flagname = NULL;
 
1036
  if(if_entry->d_name[0] == '.'){
 
1037
    return 0;
 
1038
  }
1033
1039
  int ret = asprintf(&flagname, "%s/%s/flags", sys_class_net,
1034
1040
                     if_entry->d_name);
1035
1041
  if(ret < 0){
1036
1042
    perror("asprintf");
1037
1043
    return 0;
1038
1044
  }
1039
 
  if(if_entry->d_name[0] == '.'){
1040
 
    return 0;
1041
 
  }
1042
1045
  int flags_fd = (int)TEMP_FAILURE_RETRY(open(flagname, O_RDONLY));
1043
1046
  if(flags_fd == -1){
1044
1047
    perror("open");
 
1048
    free(flagname);
1045
1049
    return 0;
1046
1050
  }
 
1051
  free(flagname);
1047
1052
  typedef short ifreq_flags;    /* ifreq.ifr_flags in netdevice(7) */
1048
1053
  /* read line from flags_fd */
1049
1054
  ssize_t to_read = (sizeof(ifreq_flags)*2)+3; /* "0x1003\n" */
1109
1114
    }
1110
1115
    return 0;
1111
1116
  }
 
1117
  /* Reject non-ARP interfaces (including dummy interfaces) */
 
1118
  if(flags & IFF_NOARP){
 
1119
    if(debug){
 
1120
      fprintf(stderr, "Rejecting non-ARP interface \"%s\"\n",
 
1121
              if_entry->d_name);
 
1122
    }
 
1123
    return 0;
 
1124
  }
1112
1125
  /* Accept this device */
1113
1126
  if(debug){
1114
1127
    fprintf(stderr, "Interface \"%s\" is acceptable\n",
1117
1130
  return 1;
1118
1131
}
1119
1132
 
 
1133
int notdotentries(const struct dirent *direntry){
 
1134
  /* Skip "." and ".." */
 
1135
  if(direntry->d_name[0] == '.'
 
1136
     and (direntry->d_name[1] == '\0'
 
1137
          or (direntry->d_name[1] == '.'
 
1138
              and direntry->d_name[2] == '\0'))){
 
1139
    return 0;
 
1140
  }
 
1141
  return 1;
 
1142
}
 
1143
 
1120
1144
int main(int argc, char *argv[]){
1121
1145
  AvahiSServiceBrowser *sb = NULL;
1122
1146
  int error;
1553
1577
    goto end;
1554
1578
  }
1555
1579
  
1556
 
  tempdir_created = true;
1557
1580
  if(mkdtemp(tempdir) == NULL){
1558
 
    tempdir_created = false;
1559
1581
    perror("mkdtemp");
1560
1582
    goto end;
1561
1583
  }
 
1584
  tempdir_created = true;
1562
1585
  
1563
1586
  if(quit_now){
1564
1587
    goto end;
1618
1641
    if(quit_now){
1619
1642
      goto end;
1620
1643
    }
1621
 
    
1622
 
    ret = start_mandos_communication(address, port, if_index, af);
1623
 
    if(ret < 0){
1624
 
      switch(errno){
1625
 
      case ENETUNREACH:
1626
 
      case EHOSTDOWN:
1627
 
      case EHOSTUNREACH:
1628
 
        exitcode = EX_NOHOST;
1629
 
        break;
1630
 
      case EINVAL:
1631
 
        exitcode = EX_USAGE;
1632
 
        break;
1633
 
      case EIO:
1634
 
        exitcode = EX_IOERR;
1635
 
        break;
1636
 
      case EPROTO:
1637
 
        exitcode = EX_PROTOCOL;
1638
 
        break;
1639
 
      default:
1640
 
        exitcode = EX_OSERR;
 
1644
 
 
1645
    while(not quit_now){
 
1646
      ret = start_mandos_communication(address, port, if_index, af);
 
1647
      if(quit_now or ret == 0){
1641
1648
        break;
1642
1649
      }
1643
 
    } else {
 
1650
      sleep(15);
 
1651
    };
 
1652
 
 
1653
    if (not quit_now){
1644
1654
      exitcode = EXIT_SUCCESS;
1645
1655
    }
 
1656
 
1646
1657
    goto end;
1647
1658
  }
1648
1659
  
1761
1772
    }
1762
1773
  }
1763
1774
  
1764
 
  /* Removes the temp directory used by GPGME */
 
1775
  /* Removes the GPGME temp directory and all files inside */
1765
1776
  if(tempdir_created){
1766
 
    DIR *d;
1767
 
    struct dirent *direntry;
1768
 
    d = opendir(tempdir);
1769
 
    if(d == NULL){
1770
 
      if(errno != ENOENT){
1771
 
        perror("opendir");
1772
 
      }
1773
 
    } else {
1774
 
      while(true){
1775
 
        direntry = readdir(d);
1776
 
        if(direntry == NULL){
1777
 
          break;
1778
 
        }
1779
 
        /* Skip "." and ".." */
1780
 
        if(direntry->d_name[0] == '.'
1781
 
           and (direntry->d_name[1] == '\0'
1782
 
                or (direntry->d_name[1] == '.'
1783
 
                    and direntry->d_name[2] == '\0'))){
1784
 
          continue;
1785
 
        }
 
1777
    struct dirent **direntries = NULL;
 
1778
    struct dirent *direntry = NULL;
 
1779
    ret = scandir(tempdir, &direntries, notdotentries, alphasort);
 
1780
    if (ret > 0){
 
1781
      for(int i = 0; i < ret; i++){
 
1782
        direntry = direntries[i];
1786
1783
        char *fullname = NULL;
1787
1784
        ret = asprintf(&fullname, "%s/%s", tempdir,
1788
1785
                       direntry->d_name);
1797
1794
        }
1798
1795
        free(fullname);
1799
1796
      }
1800
 
      closedir(d);
 
1797
    }
 
1798
 
 
1799
    /* need to be cleaned even if ret == 0 because man page dont specify */
 
1800
    free(direntries);
 
1801
    if (ret == -1){
 
1802
      perror("scandir");
1801
1803
    }
1802
1804
    ret = rmdir(tempdir);
1803
1805
    if(ret == -1 and errno != ENOENT){