Ignore:
Timestamp:
Nov 4, 2007, 3:16:40 AM (17 years ago)
Author:
Bruno Cornec
Message:

Update to busybox 1.7.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.5/mindi-busybox/networking/udhcp/socket.c

    r821 r1765  
     1/* vi: set sw=4 ts=4: */
    12/*
    23 * socket.c -- DHCP server client/server socket creation
     
    2324 */
    2425
    25 #include <sys/types.h>
    26 #include <sys/socket.h>
    27 #include <sys/ioctl.h>
    28 #include <netinet/in.h>
    29 #include <unistd.h>
    30 #include <string.h>
    31 #include <arpa/inet.h>
    3226#include <net/if.h>
    33 #include <errno.h>
    3427#include <features.h>
    35 #if (__GLIBC__ >= 2 && __GLIBC_MINOR >= 1) || defined _NEWLIB_VERSION
     28#if (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined _NEWLIB_VERSION
    3629#include <netpacket/packet.h>
    3730#include <net/ethernet.h>
     
    4336
    4437#include "common.h"
    45 #include "socket.h"
    4638
    47 int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp)
     39
     40int read_interface(const char *interface, int *ifindex, uint32_t *addr, uint8_t *arp)
    4841{
    4942    int fd;
     
    5144    struct sockaddr_in *our_ip;
    5245
    53     memset(&ifr, 0, sizeof(struct ifreq));
    54     if((fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) >= 0) {
    55         ifr.ifr_addr.sa_family = AF_INET;
    56         strcpy(ifr.ifr_name, interface);
     46    memset(&ifr, 0, sizeof(ifr));
     47    fd = xsocket(AF_INET, SOCK_RAW, IPPROTO_RAW);
    5748
    58         if (addr) {
    59             if (ioctl(fd, SIOCGIFADDR, &ifr) == 0) {
    60                 our_ip = (struct sockaddr_in *) &ifr.ifr_addr;
    61                 *addr = our_ip->sin_addr.s_addr;
    62                 DEBUG(LOG_INFO, "%s (our ip) = %s", ifr.ifr_name, inet_ntoa(our_ip->sin_addr));
    63             } else {
    64                 LOG(LOG_ERR, "SIOCGIFADDR failed, is the interface up and configured?: %m");
    65                 close(fd);
    66                 return -1;
    67             }
    68         }
    69 
    70         if (ioctl(fd, SIOCGIFINDEX, &ifr) == 0) {
    71             DEBUG(LOG_INFO, "adapter index %d", ifr.ifr_ifindex);
    72             *ifindex = ifr.ifr_ifindex;
    73         } else {
    74             LOG(LOG_ERR, "SIOCGIFINDEX failed!: %m");
     49    ifr.ifr_addr.sa_family = AF_INET;
     50    strncpy(ifr.ifr_name, interface, sizeof(ifr.ifr_name));
     51    if (addr) {
     52        if (ioctl_or_perror(fd, SIOCGIFADDR, &ifr,
     53            "is interface %s up and configured?", interface)
     54        ) {
    7555            close(fd);
    7656            return -1;
    7757        }
    78         if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0) {
    79             memcpy(arp, ifr.ifr_hwaddr.sa_data, 6);
    80             DEBUG(LOG_INFO, "adapter hardware address %02x:%02x:%02x:%02x:%02x:%02x",
    81                 arp[0], arp[1], arp[2], arp[3], arp[4], arp[5]);
    82         } else {
    83             LOG(LOG_ERR, "SIOCGIFHWADDR failed!: %m");
     58        our_ip = (struct sockaddr_in *) &ifr.ifr_addr;
     59        *addr = our_ip->sin_addr.s_addr;
     60        DEBUG("%s (our ip) = %s", ifr.ifr_name, inet_ntoa(our_ip->sin_addr));
     61    }
     62
     63    if (ifindex) {
     64        if (ioctl_or_warn(fd, SIOCGIFINDEX, &ifr) != 0) {
    8465            close(fd);
    8566            return -1;
    8667        }
    87     } else {
    88         LOG(LOG_ERR, "socket failed!: %m");
    89         return -1;
     68        DEBUG("adapter index %d", ifr.ifr_ifindex);
     69        *ifindex = ifr.ifr_ifindex;
    9070    }
     71
     72    if (arp) {
     73        if (ioctl_or_warn(fd, SIOCGIFHWADDR, &ifr) != 0) {
     74            close(fd);
     75            return -1;
     76        }
     77        memcpy(arp, ifr.ifr_hwaddr.sa_data, 6);
     78        DEBUG("adapter hardware address %02x:%02x:%02x:%02x:%02x:%02x",
     79            arp[0], arp[1], arp[2], arp[3], arp[4], arp[5]);
     80    }
     81
    9182    close(fd);
    9283    return 0;
    9384}
    9485
     86/* 1. None of the callers expects it to ever fail */
     87/* 2. ip was always INADDR_ANY */
     88int listen_socket(/*uint32_t ip,*/ int port, const char *inf)
     89{
     90    int fd;
     91    struct ifreq interface;
     92    struct sockaddr_in addr;
    9593
    96 int listen_socket(uint32_t ip, int port, char *inf)
    97 {
    98     struct ifreq interface;
    99     int fd;
    100     struct sockaddr_in addr;
    101     int n = 1;
     94    DEBUG("Opening listen socket on *:%d %s", port, inf);
     95    fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    10296
    103     DEBUG(LOG_INFO, "Opening listen socket on 0x%08x:%d %s", ip, port, inf);
    104     if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
    105         DEBUG(LOG_ERR, "socket call failed: %m");
    106         return -1;
    107     }
     97    setsockopt_reuseaddr(fd);
     98    if (setsockopt_broadcast(fd) == -1)
     99        bb_perror_msg_and_die("SO_BROADCAST");
     100
     101    strncpy(interface.ifr_name, inf, IFNAMSIZ);
     102    if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(interface)) == -1)
     103        bb_perror_msg_and_die("SO_BINDTODEVICE");
    108104
    109105    memset(&addr, 0, sizeof(addr));
    110106    addr.sin_family = AF_INET;
    111107    addr.sin_port = htons(port);
    112     addr.sin_addr.s_addr = ip;
    113 
    114     if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) {
    115         close(fd);
    116         return -1;
    117     }
    118     if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *) &n, sizeof(n)) == -1) {
    119         close(fd);
    120         return -1;
    121     }
    122 
    123     strncpy(interface.ifr_name, inf, IFNAMSIZ);
    124     if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,(char *)&interface, sizeof(interface)) < 0) {
    125         close(fd);
    126         return -1;
    127     }
    128 
    129     if (bind(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) {
    130         close(fd);
    131         return -1;
    132     }
     108    /* addr.sin_addr.s_addr = ip; - all-zeros is INADDR_ANY */
     109    xbind(fd, (struct sockaddr *)&addr, sizeof(addr));
    133110
    134111    return fd;
Note: See TracChangeset for help on using the changeset viewer.