/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 at bsnet
  • Date: 2010-10-05 19:32:45 UTC
  • mfrom: (237.4.8 mandos-release)
  • Revision ID: teddy@fukt.bsnet.se-20101005193245-2ku2c6a9ht4bfv43
Merge from release branch.

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-2011 Teddy Hogeborn
13
 
 * Copyright © 2008-2011 Björn Påhlsson
 
12
 * Copyright © 2008-2010 Teddy Hogeborn
 
13
 * Copyright © 2008-2010 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
741
741
    errno = EINTR;
742
742
    goto mandos_end;
743
743
  }
744
 
 
745
 
  /* Spurious warnings from -Wint-to-pointer-cast */
 
744
  
746
745
  gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t) tcp_sd);
747
746
  
748
747
  if(quit_now){
1033
1032
int good_interface(const struct dirent *if_entry){
1034
1033
  ssize_t ssret;
1035
1034
  char *flagname = NULL;
1036
 
  if(if_entry->d_name[0] == '.'){
1037
 
    return 0;
1038
 
  }
1039
1035
  int ret = asprintf(&flagname, "%s/%s/flags", sys_class_net,
1040
1036
                     if_entry->d_name);
1041
1037
  if(ret < 0){
1042
1038
    perror("asprintf");
1043
1039
    return 0;
1044
1040
  }
 
1041
  if(if_entry->d_name[0] == '.'){
 
1042
    return 0;
 
1043
  }
1045
1044
  int flags_fd = (int)TEMP_FAILURE_RETRY(open(flagname, O_RDONLY));
1046
1045
  if(flags_fd == -1){
1047
1046
    perror("open");
1048
 
    free(flagname);
1049
1047
    return 0;
1050
1048
  }
1051
 
  free(flagname);
1052
1049
  typedef short ifreq_flags;    /* ifreq.ifr_flags in netdevice(7) */
1053
1050
  /* read line from flags_fd */
1054
1051
  ssize_t to_read = (sizeof(ifreq_flags)*2)+3; /* "0x1003\n" */
1114
1111
    }
1115
1112
    return 0;
1116
1113
  }
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
 
  }
1125
1114
  /* Accept this device */
1126
1115
  if(debug){
1127
1116
    fprintf(stderr, "Interface \"%s\" is acceptable\n",
1130
1119
  return 1;
1131
1120
}
1132
1121
 
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
 
 
1144
1122
int main(int argc, char *argv[]){
1145
1123
  AvahiSServiceBrowser *sb = NULL;
1146
1124
  int error;
1577
1555
    goto end;
1578
1556
  }
1579
1557
  
 
1558
  tempdir_created = true;
1580
1559
  if(mkdtemp(tempdir) == NULL){
 
1560
    tempdir_created = false;
1581
1561
    perror("mkdtemp");
1582
1562
    goto end;
1583
1563
  }
1584
 
  tempdir_created = true;
1585
1564
  
1586
1565
  if(quit_now){
1587
1566
    goto end;
1772
1751
    }
1773
1752
  }
1774
1753
  
1775
 
  /* Removes the GPGME temp directory and all files inside */
 
1754
  /* Removes the temp directory used by GPGME */
1776
1755
  if(tempdir_created){
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];
 
1756
    DIR *d;
 
1757
    struct dirent *direntry;
 
1758
    d = opendir(tempdir);
 
1759
    if(d == NULL){
 
1760
      if(errno != ENOENT){
 
1761
        perror("opendir");
 
1762
      }
 
1763
    } else {
 
1764
      while(true){
 
1765
        direntry = readdir(d);
 
1766
        if(direntry == NULL){
 
1767
          break;
 
1768
        }
 
1769
        /* Skip "." and ".." */
 
1770
        if(direntry->d_name[0] == '.'
 
1771
           and (direntry->d_name[1] == '\0'
 
1772
                or (direntry->d_name[1] == '.'
 
1773
                    and direntry->d_name[2] == '\0'))){
 
1774
          continue;
 
1775
        }
1783
1776
        char *fullname = NULL;
1784
1777
        ret = asprintf(&fullname, "%s/%s", tempdir,
1785
1778
                       direntry->d_name);
1794
1787
        }
1795
1788
        free(fullname);
1796
1789
      }
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");
 
1790
      closedir(d);
1803
1791
    }
1804
1792
    ret = rmdir(tempdir);
1805
1793
    if(ret == -1 and errno != ENOENT){