summaryrefslogtreecommitdiff
path: root/src/iface-inet.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2008-01-14 06:00:15 +0100
committerMarcel Holtmann <marcel@holtmann.org>2008-01-14 06:00:15 +0100
commit6c6a470f8d4b2c5ec4725b13e7bfcf4ca0c04f41 (patch)
tree78050b3194b1c67f009d92fd0646adc3862e5699 /src/iface-inet.c
parent7677b1bdb5df04b2e780d1bacf76f9de3f64d478 (diff)
downloadconnman-6c6a470f8d4b2c5ec4725b13e7bfcf4ca0c04f41.tar.gz
connman-6c6a470f8d4b2c5ec4725b13e7bfcf4ca0c04f41.tar.bz2
connman-6c6a470f8d4b2c5ec4725b13e7bfcf4ca0c04f41.zip
Add generic helpers for device start and shutdown
Diffstat (limited to 'src/iface-inet.c')
-rw-r--r--src/iface-inet.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/iface-inet.c b/src/iface-inet.c
index 664d2980..a09ba312 100644
--- a/src/iface-inet.c
+++ b/src/iface-inet.c
@@ -108,3 +108,87 @@ int __connman_iface_init_via_inet(struct connman_iface *iface)
return 0;
}
+
+int __connman_iface_up(struct connman_iface *iface)
+{
+ struct ifreq ifr;
+ int sk, err;
+
+ DBG("iface %p", iface);
+
+ sk = socket(PF_INET, SOCK_DGRAM, 0);
+ if (sk < 0)
+ return -errno;
+
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_ifindex = iface->index;
+
+ if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
+ err = -errno;
+ goto done;
+ }
+
+ if (ioctl(sk, SIOCGIFFLAGS, &ifr) < 0) {
+ err = -errno;
+ goto done;
+ }
+
+ if (ifr.ifr_flags & IFF_UP) {
+ err = -EALREADY;
+ goto done;
+ }
+
+ ifr.ifr_flags |= IFF_UP;
+
+ if (ioctl(sk, SIOCSIFFLAGS, &ifr) < 0)
+ err = -errno;
+ else
+ err = 0;
+
+done:
+ close(sk);
+
+ return err;
+}
+
+int __connman_iface_down(struct connman_iface *iface)
+{
+ struct ifreq ifr;
+ int sk, err;
+
+ DBG("iface %p", iface);
+
+ sk = socket(PF_INET, SOCK_DGRAM, 0);
+ if (sk < 0)
+ return -errno;
+
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_ifindex = iface->index;
+
+ if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) {
+ err = -errno;
+ goto done;
+ }
+
+ if (ioctl(sk, SIOCGIFFLAGS, &ifr) < 0) {
+ err = -errno;
+ goto done;
+ }
+
+ if (!(ifr.ifr_flags & IFF_UP)) {
+ err = -EALREADY;
+ goto done;
+ }
+
+ ifr.ifr_flags &= ~IFF_UP;
+
+ if (ioctl(sk, SIOCSIFFLAGS, &ifr) < 0)
+ err = -errno;
+ else
+ err = 0;
+
+done:
+ close(sk);
+
+ return err;
+}