summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2008-12-28 03:29:31 +0100
committerMarcel Holtmann <marcel@holtmann.org>2008-12-28 03:29:31 +0100
commit1c74d1d740d16d2ede335693052b52342717b5d8 (patch)
treeedab6cc2f890f983ccccc4121195c529a2b47b4f
parent6877247bb62d3492570a4ee4c134f495cb680e92 (diff)
downloadconnman-1c74d1d740d16d2ede335693052b52342717b5d8.tar.gz
connman-1c74d1d740d16d2ede335693052b52342717b5d8.tar.bz2
connman-1c74d1d740d16d2ede335693052b52342717b5d8.zip
Add helpers for ifup and ifdown
-rw-r--r--plugins/inet.c82
-rw-r--r--plugins/inet.h3
2 files changed, 85 insertions, 0 deletions
diff --git a/plugins/inet.c b/plugins/inet.c
index ab0fcdcd..e3fedfb9 100644
--- a/plugins/inet.c
+++ b/plugins/inet.c
@@ -105,3 +105,85 @@ char *inet_index2ident(int index, const char *prefix)
return str;
}
+
+int inet_ifup(int index)
+{
+ struct ifreq ifr;
+ int sk, err;
+
+ sk = socket(PF_INET, SOCK_DGRAM, 0);
+ if (sk < 0)
+ return -errno;
+
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_ifindex = 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;
+ goto done;
+ }
+
+ err = 0;
+
+done:
+ close(sk);
+
+ return err;
+}
+
+int inet_ifdown(int index)
+{
+ struct ifreq ifr;
+ int sk, err;
+
+ sk = socket(PF_INET, SOCK_DGRAM, 0);
+ if (sk < 0)
+ return -errno;
+
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_ifindex = 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;
+}
diff --git a/plugins/inet.h b/plugins/inet.h
index afa80253..3246cc13 100644
--- a/plugins/inet.h
+++ b/plugins/inet.h
@@ -21,3 +21,6 @@
char *inet_index2name(int index);
char *inet_index2ident(int index, const char *prefix);
+
+int inet_ifup(int index);
+int inet_ifdown(int index);