*
* Connection Manager
*
- * Copyright (C) 2007 Intel Corporation. All rights reserved.
+ * Copyright (C) 2007-2009 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
#include <config.h>
#endif
-#include <stdio.h>
+#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <net/if.h>
+#define CONNMAN_API_SUBJECT_TO_CHANGE
#include <connman/plugin.h>
#include <connman/resolver.h>
#include <connman/log.h>
-static int resolvconf_append(struct connman_iface *iface, const char *nameserver)
-{
- struct ifreq ifr;
- char cmd[128];
- int sk, err;
-
- sk = socket(PF_INET, SOCK_DGRAM, 0);
- if (sk < 0)
- return -1;
-
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_ifindex = iface->index;
+#include <glib.h>
- err = ioctl(sk, SIOCGIFNAME, &ifr);
-
- close(sk);
+static int resolvconf_append(const char *interface, const char *domain,
+ const char *server)
+{
+ char *cmd;
+ int err;
- if (err < 0)
- return -1;
+ DBG("interface %s server %s", interface, server);
- DBG("ifname %s", ifr.ifr_name);
+ if (access(RESOLVCONF, X_OK) < 0)
+ return -errno;
- snprintf(cmd, sizeof(cmd), "echo \"nameserver %s\" | resolvconf -a %s",
- nameserver, ifr.ifr_name);
+ cmd = g_strdup_printf("echo \"nameserver %s\" | %s -a %s",
+ server, RESOLVCONF, interface);
DBG("%s", cmd);
err = system(cmd);
- return 0;
+ g_free(cmd);
+
+ return err;
}
-static int resolvconf_remove(struct connman_iface *iface)
+static int resolvconf_remove(const char *interface, const char *domain,
+ const char *server)
{
- struct ifreq ifr;
- char cmd[128];
- int sk, err;
+ char *cmd;
+ int err;
- sk = socket(PF_INET, SOCK_DGRAM, 0);
- if (sk < 0)
- return -1;
+ DBG("interface %s server %s", interface, server);
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_ifindex = iface->index;
-
- err = ioctl(sk, SIOCGIFNAME, &ifr);
-
- close(sk);
-
- if (err < 0)
- return -1;
-
- DBG("ifname %s", ifr.ifr_name);
-
- snprintf(cmd, sizeof(cmd), "resolvconf -d %s", ifr.ifr_name);
+ cmd = g_strdup_printf("%s -d %s", RESOLVCONF, interface);
DBG("%s", cmd);
err = system(cmd);
- return 0;
+ g_free(cmd);
+
+ return err;
}
-static struct connman_resolver_driver resolvconf_driver = {
+static struct connman_resolver resolvconf_resolver = {
.name = "resolvconf",
+ .priority = CONNMAN_RESOLVER_PRIORITY_DEFAULT,
.append = resolvconf_append,
.remove = resolvconf_remove,
};
static int resolvconf_init(void)
{
- return connman_resolver_register(&resolvconf_driver);
+ return connman_resolver_register(&resolvconf_resolver);
}
static void resolvconf_exit(void)
{
- connman_resolver_unregister(&resolvconf_driver);
+ connman_resolver_unregister(&resolvconf_resolver);
}
-CONNMAN_PLUGIN_DEFINE("resolvconf", "Name resolver plugin", VERSION,
- resolvconf_init, resolvconf_exit)
+CONNMAN_PLUGIN_DEFINE(resolvconf, "Name resolver plugin", VERSION,
+ CONNMAN_PLUGIN_PRIORITY_DEFAULT, resolvconf_init, resolvconf_exit)