*
* Connection Manager
*
- * Copyright (C) 2007 Intel Corporation. All rights reserved.
+ * Copyright (C) 2007-2008 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 <unistd.h>
#include <stdlib.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <net/if.h>
#include <connman/plugin.h>
-#include <connman/resolver.h>
+#include <connman/driver.h>
#include <connman/log.h>
-static int resolvconf_append(struct connman_iface *iface, const char *nameserver)
+#include "inet.h"
+
+#define RESOLVCONF "/sbin/resolvconf"
+
+static int resolvconf_probe(struct connman_element *element)
{
- struct ifreq ifr;
- char cmd[128];
- int sk, err;
+ const char *nameserver = NULL;
+ struct connman_element *internet;
+ gchar *cmd, *name;
+ int err;
- sk = socket(PF_INET, SOCK_DGRAM, 0);
- if (sk < 0)
- return -1;
+ DBG("element %p name %s", element, element->name);
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_ifindex = iface->index;
+ if (access(RESOLVCONF, X_OK) < 0)
+ return -errno;
- err = ioctl(sk, SIOCGIFNAME, &ifr);
+ connman_element_get_value(element,
+ CONNMAN_PROPERTY_ID_IPV4_NAMESERVER, &nameserver);
- close(sk);
+ if (nameserver == NULL)
+ return -EINVAL;
- if (err < 0)
- return -1;
+ name = inet_index2name(element->index);
- DBG("ifname %s", ifr.ifr_name);
+ cmd = g_strdup_printf("echo \"nameserver %s\" | %s -a %s",
+ nameserver, RESOLVCONF, name);
- snprintf(cmd, sizeof(cmd), "echo \"nameserver %s\" | resolvconf -a %s",
- nameserver, ifr.ifr_name);
+ g_free(name);
DBG("%s", cmd);
- err = system(cmd);
+ //err = system(cmd);
+ err = 0;
- return 0;
-}
+ g_free(cmd);
-static int resolvconf_remove(struct connman_iface *iface)
-{
- struct ifreq ifr;
- char cmd[128];
- int sk, err;
+ internet = connman_element_create(NULL);
- sk = socket(PF_INET, SOCK_DGRAM, 0);
- if (sk < 0)
- return -1;
+ internet->type = CONNMAN_ELEMENT_TYPE_CONNECTION;
- memset(&ifr, 0, sizeof(ifr));
- ifr.ifr_ifindex = iface->index;
+ connman_element_register(internet, element);
- err = ioctl(sk, SIOCGIFNAME, &ifr);
+ return 0;
+}
- close(sk);
+static void resolvconf_remove(struct connman_element *element)
+{
+ gchar *cmd, *name;
+ int err;
- if (err < 0)
- return -1;
+ DBG("element %p name %s", element, element->name);
- DBG("ifname %s", ifr.ifr_name);
+ name = inet_index2name(element->index);
- snprintf(cmd, sizeof(cmd), "resolvconf -d %s", ifr.ifr_name);
+ cmd = g_strdup_printf("%s -d %s", RESOLVCONF, name);
+
+ g_free(name);
DBG("%s", cmd);
- err = system(cmd);
+ //err = system(cmd);
+ err = 0;
- return 0;
+ g_free(cmd);
}
-static struct connman_resolver_driver resolvconf_driver = {
+static struct connman_driver resolvconf_driver = {
.name = "resolvconf",
- .append = resolvconf_append,
+ .type = CONNMAN_ELEMENT_TYPE_RESOLVER,
+ .priority = CONNMAN_DRIVER_PRIORITY_HIGH,
+ .probe = resolvconf_probe,
.remove = resolvconf_remove,
};
static int resolvconf_init(void)
{
- return connman_resolver_register(&resolvconf_driver);
+ return connman_driver_register(&resolvconf_driver);
}
static void resolvconf_exit(void)
{
- connman_resolver_unregister(&resolvconf_driver);
+ connman_driver_unregister(&resolvconf_driver);
}
CONNMAN_PLUGIN_DEFINE("resolvconf", "Name resolver plugin", VERSION,