tuntap.c | tuntap.c | |||
---|---|---|---|---|
skipping to change at line 217 | skipping to change at line 217 | |||
(void)memcpy(ifr.ifr_name, dev->if_name, sizeof dev->if_name); | (void)memcpy(ifr.ifr_name, dev->if_name, sizeof dev->if_name); | |||
ifr.ifr_mtu = mtu; | ifr.ifr_mtu = mtu; | |||
if (ioctl(dev->ctrl_sock, SIOCSIFMTU, &ifr) == -1) { | if (ioctl(dev->ctrl_sock, SIOCSIFMTU, &ifr) == -1) { | |||
return -1; | return -1; | |||
} | } | |||
return 0; | return 0; | |||
} | } | |||
int | int | |||
tuntap_set_ip(struct device *dev, const char *saddr, const char *smask) { | tuntap_set_ip(struct device *dev, const char *saddr, int bits) { | |||
struct sockaddr_in sa; | struct sockaddr_in sa; | |||
unsigned int addr; | unsigned int addr; | |||
unsigned int mask; | unsigned int mask; | |||
if (saddr == NULL || smask == NULL) { | if (saddr == NULL) { | |||
(void)fprintf(stderr, "libtuntap: tuntap_set_ip" | (void)fprintf(stderr, "libtuntap: tuntap_set_ip" | |||
" invalid argument\n"); | " invalid address\n"); | |||
return -1; | ||||
} | ||||
if (bits < 0 || bits > 128) { | ||||
(void)fprintf(stderr, "libtuntap: tuntap_set_ip" | ||||
" invalid netmask\n"); | ||||
return -1; | return -1; | |||
} | } | |||
/* Destination address */ | /* Destination address */ | |||
if (inet_pton(AF_INET, saddr, &(sa.sin_addr)) != 1) { | if (inet_pton(AF_INET, saddr, &(sa.sin_addr)) != 1) { | |||
(void)fprintf(stderr, "libtuntap: tuntap_set_ip (IPv4)" | (void)fprintf(stderr, "libtuntap: tuntap_set_ip (IPv4)" | |||
" bad address\n"); | " bad address\n"); | |||
return -1; | return -1; | |||
} | } | |||
addr = sa.sin_addr.s_addr; | addr = sa.sin_addr.s_addr; | |||
/* Netmask */ | /* Netmask */ | |||
if (inet_pton(AF_INET, smask, &(sa.sin_addr)) != 1) { | mask = ~0; | |||
(void)fprintf(stderr, "libtuntap: tuntap_set_ip (IPv4)" | mask = ~(mask >> bits); | |||
" bad netmask\n"); | mask = ntohl(mask); | |||
return -1; | ||||
} | ||||
mask = sa.sin_addr.s_addr; | ||||
return tuntap_sys_set_ip(dev, addr, mask); | return tuntap_sys_set_ip(dev, addr, mask); | |||
} | } | |||
int | int | |||
tuntap_read(struct device *dev, void *buf, size_t size) { | tuntap_read(struct device *dev, void *buf, size_t size) { | |||
int n; | int n; | |||
/* Only accept started device */ | /* Only accept started device */ | |||
if (dev->tun_fd == -1) | if (dev->tun_fd == -1) | |||
End of changes. 4 change blocks. | ||||
9 lines changed or deleted | 12 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |