Add abstraction for resolver modifications
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 24 Mar 2008 10:02:06 +0000 (11:02 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 24 Mar 2008 10:02:06 +0000 (11:02 +0100)
include/Makefile.am
include/resolver.h [new file with mode: 0644]
src/Makefile.am
src/connman.h
src/iface.c
src/resolver.c [new file with mode: 0644]

index ecca928..4c10f17 100644 (file)
@@ -1,7 +1,7 @@
 
 includedir = @includedir@/connman
 
-noinst_HEADERS = log.h plugin.h iface.h rtnl.h dhcp.h
+noinst_HEADERS = log.h plugin.h iface.h rtnl.h dhcp.h resolver.h
 
 MAINTAINERCLEANFILES = Makefile.in
 
diff --git a/include/resolver.h b/include/resolver.h
new file mode 100644 (file)
index 0000000..3d9f990
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2007  Intel Corporation. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifndef __CONNMAN_RESOLVER_H
+#define __CONNMAN_RESOLVER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <connman/iface.h>
+
+struct connman_resolver_driver {
+       const char *name;
+       int (*append) (struct connman_iface *iface, const char *nameserver);
+       int (*remove) (struct connman_iface *iface);
+};
+
+extern int connman_resolver_register(struct connman_resolver_driver *driver);
+extern void connman_resolver_unregister(struct connman_resolver_driver *driver);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CONNMAN_RESOLVER_H */
index 7faf6a2..f430368 100644 (file)
@@ -13,7 +13,7 @@ sbin_PROGRAMS = connmand
 
 connmand_SOURCES = main.c connman.h log.c manager.c agent.c plugin.c \
                                iface.c iface-storage.c iface-helper.c \
-                                               iface-inet.c rtnl.c dhcp.c
+                                       iface-inet.c rtnl.c dhcp.c resolver.c
 
 connmand_LDADD = @HAL_LIBS@ @GDBUS_LIBS@ @GMODULE_LIBS@
  
index f9416d2..9f1262a 100644 (file)
@@ -94,3 +94,9 @@ int __connman_rtnl_send(const void *buf, size_t len);
 
 int __connman_dhcp_request(struct connman_iface *iface);
 int __connman_dhcp_release(struct connman_iface *iface);
+
+#include <connman/resolver.h>
+
+int __connman_resolver_append(struct connman_iface *iface,
+                                               const char *nameserver);
+int __connman_resolver_remove(struct connman_iface *iface);
index 4a655a1..89763aa 100644 (file)
@@ -431,7 +431,6 @@ int connman_iface_set_ipv4(struct connman_iface *iface,
        struct ifreq ifr;
        struct rtentry rt;
        struct sockaddr_in *addr;
-       char cmd[128];
        int sk, err;
 
        if ((iface->flags & CONNMAN_IFACE_FLAG_RTNL) == 0)
@@ -504,12 +503,7 @@ int connman_iface_set_ipv4(struct connman_iface *iface,
                return -1;
        }
 
-       sprintf(cmd, "echo \"nameserver %s\" | resolvconf -a %s",
-                               inet_ntoa(ipv4->nameserver), ifr.ifr_name);
-
-       DBG("%s", cmd);
-
-       err = system(cmd);
+       __connman_resolver_append(iface, inet_ntoa(ipv4->nameserver));
 
        return 0;
 }
@@ -518,7 +512,6 @@ int connman_iface_clear_ipv4(struct connman_iface *iface)
 {
        struct ifreq ifr;
        struct sockaddr_in *addr;
-       char cmd[128];
        int sk, err;
 
        if ((iface->flags & CONNMAN_IFACE_FLAG_RTNL) == 0)
@@ -554,11 +547,7 @@ int connman_iface_clear_ipv4(struct connman_iface *iface)
                return -1;
        }
 
-       sprintf(cmd, "resolvconf -d %s", ifr.ifr_name);
-
-       DBG("%s", cmd);
-
-       err = system(cmd);
+       __connman_resolver_remove(iface);
 
        return 0;
 }
diff --git a/src/resolver.c b/src/resolver.c
new file mode 100644 (file)
index 0000000..f2443d7
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2007  Intel Corporation. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+
+#include "connman.h"
+
+static GSList *drivers = NULL;
+
+int connman_resolver_register(struct connman_resolver_driver *driver)
+{
+       DBG("driver %p", driver);
+
+       drivers = g_slist_append(drivers, driver);
+
+       return 0;
+}
+
+void connman_resolver_unregister(struct connman_resolver_driver *driver)
+{
+       DBG("driver %p", driver);
+
+       drivers = g_slist_remove(drivers, driver);
+}
+
+int __connman_resolver_append(struct connman_iface *iface,
+                                               const char *nameserver)
+{
+       struct connman_resolver_driver *driver = g_slist_nth_data(drivers, 0);
+
+       if (driver && driver->append)
+               return driver->append(iface, nameserver);
+
+       return -1;
+}
+
+int __connman_resolver_remove(struct connman_iface *iface)
+{
+       struct connman_resolver_driver *driver = g_slist_nth_data(drivers, 0);
+
+       if (driver && driver->remove)
+               return driver->remove(iface);
+
+       return -1;
+}