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
--- /dev/null
+/*
+ *
+ * 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 */
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@
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);
struct ifreq ifr;
struct rtentry rt;
struct sockaddr_in *addr;
- char cmd[128];
int sk, err;
if ((iface->flags & CONNMAN_IFACE_FLAG_RTNL) == 0)
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;
}
{
struct ifreq ifr;
struct sockaddr_in *addr;
- char cmd[128];
int sk, err;
if ((iface->flags & CONNMAN_IFACE_FLAG_RTNL) == 0)
return -1;
}
- sprintf(cmd, "resolvconf -d %s", ifr.ifr_name);
-
- DBG("%s", cmd);
-
- err = system(cmd);
+ __connman_resolver_remove(iface);
return 0;
}
--- /dev/null
+/*
+ *
+ * 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;
+}