# define CLLADDR(s) ((const char *)((s)->sdl_data + (s)->sdl_nlen))
#endif
-static int r_fd = -1;
-static char *link_buf;
-static ssize_t link_buflen;
-
int
if_init(__unused struct interface *iface)
{
return 0;
}
-void
-if_free(void)
-{
-
- if (r_fd != -1) {
- close(r_fd);
- r_fd = -1;
- }
- if (link_buflen) {
- free(link_buf);
- link_buflen = 0;
- }
-}
-
-int
-open_sockets(void)
-{
- if ((socket_afnet = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- return -1;
- set_cloexec(socket_afnet);
- if ((r_fd = socket(PF_ROUTE, SOCK_RAW, 0)) == -1)
- return -1;
- set_cloexec(r_fd);
- return 0;
-}
-
int
open_link_socket(void)
{
int
getifssid(const char *ifname, char *ssid)
{
- int retval = -1;
+ int s, retval = -1;
#if defined(SIOCG80211NWID)
struct ifreq ifr;
struct ieee80211_nwid nwid;
char nwid[IEEE80211_NWID_LEN + 1];
#endif
+ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ return -1;
+
#if defined(SIOCG80211NWID) /* NetBSD */
memset(&ifr, 0, sizeof(ifr));
strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
memset(&nwid, 0, sizeof(nwid));
ifr.ifr_data = (void *)&nwid;
- if (ioctl(socket_afnet, SIOCG80211NWID, &ifr) == 0) {
+ if (ioctl(s, SIOCG80211NWID, &ifr) == 0) {
retval = nwid.i_len;
if (ssid) {
memcpy(ssid, nwid.i_nwid, nwid.i_len);
ireq.i_val = -1;
memset(nwid, 0, sizeof(nwid));
ireq.i_data = &nwid;
- if (ioctl(socket_afnet, SIOCG80211, &ireq) == 0) {
+ if (ioctl(s, SIOCG80211, &ireq) == 0) {
retval = ireq.i_len;
if (ssid) {
memcpy(ssid, nwid, ireq.i_len);
}
}
#endif
+
+ close(s);
return retval;
}
int
if_vimaster(const char *ifname)
{
+ int s, r;
struct ifmediareq ifmr;
+ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ return -1;
memset(&ifmr, 0, sizeof(ifmr));
strlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name));
- if (ioctl(socket_afnet, SIOCGIFMEDIA, &ifmr) == -1)
+ r = ioctl(s, SIOCGIFMEDIA, &ifmr);
+ close(s);
+ if (r == -1)
return -1;
if (ifmr.ifm_status & IFM_AVALID &&
IFM_TYPE(ifmr.ifm_active) == IFM_IEEE80211)
const struct in_addr *netmask, const struct in_addr *broadcast,
int action)
{
+ int s, r;
struct ifaliasreq ifa;
union {
struct sockaddr *sa;
struct sockaddr_in *sin;
} _s;
+ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ return -1;
+
memset(&ifa, 0, sizeof(ifa));
strlcpy(ifa.ifra_name, iface->name, sizeof(ifa.ifra_name));
}
#undef ADDADDR
- return ioctl(socket_afnet,
+ r = ioctl(s,
action < 0 ? SIOCDIFADDR :
action == 2 ? SIOCSIFADDR : SIOCAIFADDR, &ifa);
+ close(s);
+ return r;
}
int
} rtm;
char *bp = rtm.buffer;
size_t l;
- int retval = 0;
+ int s, retval;
+
+ if ((s = socket(PF_ROUTE, SOCK_RAW, 0)) == -1)
+ return -1;
#define ADDSU { \
l = RT_ROUNDUP(su.sa.sa_len); \
#undef ADDSU
rtm.hdr.rtm_msglen = l = bp - (char *)&rtm;
- if (write(r_fd, &rtm, l) == -1)
- retval = -1;
+
+ retval = write(s, &rtm, l) == -1 ? -1 : 0;
+ close(s);
return retval;
}
#endif
struct in6_aliasreq ifa;
struct in6_addr mask;
- s = socket(AF_INET6, SOCK_DGRAM, 0);
- if (s == -1)
+ if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) == -1)
return -1;
+
memset(&ifa, 0, sizeof(ifa));
strlcpy(ifa.ifra_name, a->iface->name, sizeof(ifa.ifra_name));
/*
} rtm;
char *bp = rtm.buffer;
size_t l;
- int retval = 0;
+ int s, retval;
const struct ipv6_addr_l *lla;
+ if ((s = socket(PF_ROUTE, SOCK_RAW, 0)) == -1)
+ return -1;
+
/* KAME based systems want to store the scope inside the sin6_addr
* for link local addreses */
#ifdef __KAME__
}
rtm.hdr.rtm_msglen = l = bp - (char *)&rtm;
- if (write(r_fd, &rtm, l) == -1)
- retval = -1;
+
+ retval = write(s, &rtm, l) == -1 ? -1 : 0;
+ close(s);
return retval;
}
#endif
int
manage_link(int fd)
{
- char *p, *e, *cp;
- char ifname[IF_NAMESIZE];
+ /* route and ifwatchd like a msg buf size of 2048 */
+ char msg[2048], *p, *e, *cp, ifname[IF_NAMESIZE];
ssize_t bytes;
struct rt_msghdr *rtm;
struct if_announcemsghdr *ifan;
#endif
for (;;) {
- if (ioctl(fd, FIONREAD, &len) == -1)
- return -1;
- if (link_buflen < len) {
- p = realloc(link_buf, len);
- if (p == NULL)
- return -1;
- link_buf = p;
- link_buflen = len;
- }
- bytes = read(fd, link_buf, link_buflen);
+ bytes = read(fd, msg, sizeof(msg));
if (bytes == -1) {
if (errno == EAGAIN)
return 0;
continue;
return -1;
}
- e = link_buf + bytes;
- for (p = link_buf; p < e; p += rtm->rtm_msglen) {
+ e = msg + bytes;
+ for (p = msg; p < e; p += rtm->rtm_msglen) {
rtm = (struct rt_msghdr *)(void *)p;
// Ignore messages generated by us
if (rtm->rtm_pid == getpid())
#include "ipv6.h"
#include "net.h"
-static int sock_fd;
-static struct sockaddr_nl sock_nl;
-
int
if_init(struct interface *iface)
{
return 0;
}
-void
-if_free(void)
-{
-
- if (sock_fd != -1) {
- close(sock_fd);
- sock_fd = -1;
- }
-}
-
/* XXX work out Virtal Interface Masters */
int
if_vimaster(__unused const char *ifname)
return fd;
}
-int
-open_sockets(void)
-{
- if ((socket_afnet = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- return -1;
- set_cloexec(socket_afnet);
- sock_fd = _open_link_socket(&sock_nl);
- set_cloexec(sock_fd);
- return sock_fd;
-}
-
int
open_link_socket(void)
{
static int
send_netlink(struct nlmsghdr *hdr)
{
- int r;
+ int s, r;
+ struct sockaddr_nl sock_nl;
struct iovec iov;
struct msghdr msg;
static unsigned int seq;
+ if ((s = _open_link_socket(&sock_nl)) == -1)
+ return -1;
memset(&iov, 0, sizeof(iov));
iov.iov_base = hdr;
iov.iov_len = hdr->nlmsg_len;
hdr->nlmsg_flags |= NLM_F_ACK;
hdr->nlmsg_seq = ++seq;
- if (sendmsg(sock_fd, &msg, 0) != -1)
- r = get_netlink(sock_fd, 0, &err_netlink);
+ if (sendmsg(s, &msg, 0) != -1)
+ r = get_netlink(s, 0, &err_netlink);
else
r = -1;
+ close(s);
return r;
}
/*
* dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2013 Roy Marples <roy@marples.name>
+ * Copyright (c) 2006-2014 Roy Marples <roy@marples.name>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
#include "ipv6nd.h"
#include "net.h"
-int socket_afnet = -1;
-
static char hwaddr_buffer[(HWADDR_LEN * 3) + 1 + 1024];
char *
int
carrier_status(struct interface *iface)
{
- int ret;
+ int s, r;
struct ifreq ifr;
#ifdef SIOCGIFMEDIA
struct ifmediareq ifmr;
char *p;
#endif
+ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ return LINK_UNKNOWN;
memset(&ifr, 0, sizeof(ifr));
strlcpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name));
#ifdef __linux__
*p = '\0';
#endif
- if (ioctl(socket_afnet, SIOCGIFFLAGS, &ifr) == -1)
+ if (ioctl(s, SIOCGIFFLAGS, &ifr) == -1) {
+ close(s);
return LINK_UNKNOWN;
+ }
iface->flags = ifr.ifr_flags;
- ret = LINK_UNKNOWN;
+ r = LINK_UNKNOWN;
#ifdef SIOCGIFMEDIA
memset(&ifmr, 0, sizeof(ifmr));
strlcpy(ifmr.ifm_name, iface->name, sizeof(ifmr.ifm_name));
- if (ioctl(socket_afnet, SIOCGIFMEDIA, &ifmr) != -1 &&
+ if (ioctl(s, SIOCGIFMEDIA, &ifmr) != -1 &&
ifmr.ifm_status & IFM_AVALID)
- ret = (ifmr.ifm_status & IFM_ACTIVE) ? LINK_UP : LINK_DOWN;
+ r = (ifmr.ifm_status & IFM_ACTIVE) ? LINK_UP : LINK_DOWN;
#endif
- if (ret == LINK_UNKNOWN)
- ret = (ifr.ifr_flags & IFF_RUNNING) ? LINK_UP : LINK_DOWN;
- return ret;
+ if (r == LINK_UNKNOWN)
+ r = (ifr.ifr_flags & IFF_RUNNING) ? LINK_UP : LINK_DOWN;
+ close(s);
+ return r;
}
-int
+static int
up_interface(struct interface *iface)
{
struct ifreq ifr;
- int retval = -1;
+ int s, r;
#ifdef __linux__
char *p;
#endif
+ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ return -1;
memset(&ifr, 0, sizeof(ifr));
strlcpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name));
#ifdef __linux__
if ((p = strchr(ifr.ifr_name, ':')))
*p = '\0';
#endif
- if (ioctl(socket_afnet, SIOCGIFFLAGS, &ifr) == 0) {
+ r = -1;
+ if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) {
if ((ifr.ifr_flags & IFF_UP))
- retval = 0;
+ r = 0;
else {
ifr.ifr_flags |= IFF_UP;
- if (ioctl(socket_afnet, SIOCSIFFLAGS, &ifr) == 0)
- retval = 0;
+ if (ioctl(s, SIOCSIFFLAGS, &ifr) == 0)
+ r = 0;
}
iface->flags = ifr.ifr_flags;
}
- return retval;
+ close(s);
+ return r;
}
struct if_head *
int
do_mtu(const char *ifname, short int mtu)
{
+ int s, r;
struct ifreq ifr;
- int r;
+ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ return -1;
memset(&ifr, 0, sizeof(ifr));
strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
ifr.ifr_mtu = mtu;
- r = ioctl(socket_afnet, mtu ? SIOCSIFMTU : SIOCGIFMTU, &ifr);
+ r = ioctl(s, mtu ? SIOCSIFMTU : SIOCGIFMTU, &ifr);
+ close(s);
if (r == -1)
return -1;
return ifr.ifr_mtu;