/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-07 21:00:57 UTC
  • mto: This revision was merged to the branch mainline in revision 596.
  • Revision ID: teddy@recompile.se-20120607210057-9k4mou58uht7sj2m
* plugins.d/mandos-client.c (bring_up_interface): Bug fix: Return
                                                  errno code.  Don't
                                                  modify errno.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1563
1563
 
1564
1564
int bring_up_interface(const char * const interface, const float delay){
1565
1565
  int sd = -1;
 
1566
  int old_errno = errno;
 
1567
  int ret_errno = 0;
1566
1568
  int ret;
1567
1569
  struct ifreq network;
1568
1570
  AvahiIfIndex if_index = (AvahiIfIndex)if_nametoindex(interface);
1569
1571
  if(if_index == 0){
1570
1572
    fprintf_plus(stderr, "No such interface: \"%s\"\n", interface);
1571
 
    return EX_UNAVAILABLE;
 
1573
    errno = old_errno;
 
1574
    return ENXIO;
1572
1575
  }
1573
1576
  
1574
1577
  if(quit_now){
 
1578
    errno = old_errno;
1575
1579
    return EINTR;
1576
1580
  }
1577
1581
  
1578
1582
  /* Re-raise priviliges */
1579
1583
  raise_privileges();
1580
 
    
 
1584
  
1581
1585
#ifdef __linux__
1582
1586
  /* Lower kernel loglevel to KERN_NOTICE to avoid KERN_INFO
1583
1587
     messages about the network interface to mess up the prompt */
1591
1595
    
1592
1596
  sd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
1593
1597
  if(sd < 0){
 
1598
    ret_errno = errno;
1594
1599
    perror_plus("socket");
1595
1600
#ifdef __linux__
1596
1601
    if(restore_loglevel){
1602
1607
#endif  /* __linux__ */
1603
1608
    /* Lower privileges */
1604
1609
    lower_privileges();
1605
 
    return EX_OSERR;
1606
 
;
 
1610
    errno = old_errno;
 
1611
    return ret_errno;
1607
1612
  }
1608
1613
  strcpy(network.ifr_name, interface);
1609
1614
  ret = ioctl(sd, SIOCGIFFLAGS, &network);
1610
1615
  if(ret == -1){
 
1616
    ret_errno = errno;
1611
1617
    perror_plus("ioctl SIOCGIFFLAGS");
1612
1618
#ifdef __linux__
1613
1619
    if(restore_loglevel){
1619
1625
#endif  /* __linux__ */
1620
1626
    /* Lower privileges */
1621
1627
    lower_privileges();
1622
 
    return EX_OSERR;
 
1628
    errno = old_errno;
 
1629
    return ret_errno;
1623
1630
  }
1624
1631
  if((network.ifr_flags & IFF_UP) == 0){
1625
1632
    network.ifr_flags |= IFF_UP;
1626
1633
    ret = ioctl(sd, SIOCSIFFLAGS, &network);
1627
1634
    if(ret == -1){
 
1635
      ret_errno = errno;
1628
1636
      perror_plus("ioctl SIOCSIFFLAGS +IFF_UP");
1629
1637
#ifdef __linux__
1630
1638
      if(restore_loglevel){
1636
1644
#endif  /* __linux__ */
1637
1645
        /* Lower privileges */
1638
1646
      lower_privileges();
1639
 
      return EX_OSERR;
 
1647
      errno = old_errno;
 
1648
      return ret_errno;
1640
1649
    }
1641
1650
  }
1642
1651
  /* Sleep checking until interface is running.
1670
1679
#endif  /* __linux__ */
1671
1680
  /* Lower privileges */
1672
1681
  lower_privileges();
1673
 
  return errno;
 
1682
  errno = old_errno;
 
1683
  return 0;
1674
1684
}
1675
1685
 
1676
1686
int main(int argc, char *argv[]){
2042
2052
  /* If the interface is down, bring it up */
2043
2053
  if((interface[0] != '\0') and (strcmp(interface, "none") != 0)){
2044
2054
    ret = bring_up_interface(interface, delay);
2045
 
    if(ret){
 
2055
    if(ret != 0){
2046
2056
      errno = ret;
2047
2057
      perror_plus("Failed to bring up interface");
2048
2058
    }