network: handle DNS config
authorJeremy Kerr <jk@ozlabs.org>
Thu, 8 Aug 2013 07:41:39 +0000 (15:41 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Thu, 8 Aug 2013 08:30:00 +0000 (16:30 +0800)
If we have a dns config option, update resolv.conf

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
discover/network.c
lib/pb-config/pb-config.c
lib/pb-config/storage-powerpc-nvram.c

index 910649eeb742690851a11fd6c51bf17fb9d7c07f..3b01f9f45d0cb261488889ba8637b10db560c30b 100644 (file)
@@ -3,6 +3,7 @@
 #include <stdint.h>
 #include <string.h>
 #include <stdlib.h>
+#include <errno.h>
 #include <sys/socket.h>
 #include <linux/if.h>
 #include <linux/netlink.h>
@@ -15,6 +16,7 @@
 #include <pb-config/pb-config.h>
 #include <system/system.h>
 
+#include "file.h"
 #include "network.h"
 
 #define HWADDR_SIZE    6
@@ -399,6 +401,59 @@ static int network_netlink_process(void *arg)
        return 0;
 }
 
+static void network_init_dns(struct network *network)
+{
+       const struct config *config;
+       int i, rc, len;
+       bool modified;
+       char *buf;
+
+       if (network->dry_run)
+               return;
+
+       config = config_get();
+       if (!config || !config->network.n_dns_servers)
+               return;
+
+       rc = read_file(network, "/etc/resolv.conf", &buf, &len);
+
+       if (rc) {
+               buf = talloc_strdup(network, "");
+               len = 0;
+       }
+
+       modified = false;
+
+       for (i = 0; i < config->network.n_dns_servers; i++) {
+               int dns_conf_len;
+               char *dns_conf;
+
+               dns_conf = talloc_asprintf(network, "server %s\n",
+                               config->network.dns_servers[i]);
+
+               if (strstr(buf, dns_conf)) {
+                       talloc_free(dns_conf);
+                       continue;
+               }
+
+               dns_conf_len = strlen(dns_conf);
+               buf = talloc_realloc(network, buf, char, len + dns_conf_len);
+               memcpy(buf + len, dns_conf, dns_conf_len);
+               len += dns_conf_len;
+               modified = true;
+       }
+
+       if (!modified)
+               return;
+
+       rc = replace_file("/etc/resolv.conf", buf, len);
+       if (rc) {
+               pb_log("error replacing resolv.conf: %s\n", strerror(errno));
+               return;
+       }
+
+}
+
 struct network *network_init(void *ctx, struct waitset *waitset, bool dry_run)
 {
        struct network *network;
@@ -409,6 +464,8 @@ struct network *network_init(void *ctx, struct waitset *waitset, bool dry_run)
        network->manual_config = false;
        network->dry_run = dry_run;
 
+       network_init_dns(network);
+
        rc = network_init_netlink(network);
        if (rc)
                goto err;
index 5cd303b06d257e6292fc49a87f918ba24308db78..315d9905659369ea8224f4ef8318de459138786e 100644 (file)
@@ -26,7 +26,7 @@ static void dump_config(struct config *config)
        pb_log(" autoboot: %s\n",
                        config->autoboot_enabled ? "enabled" : "disabled");
 
-       if (config->n_network_configs > 0)
+       if (config->network.n_interfaces || config->network.n_dns_servers)
                pb_log(" network configuration:\n");
 
        for (i = 0; i < config->network.n_interfaces; i++) {
@@ -53,6 +53,8 @@ static void dump_config(struct config *config)
 
                }
        }
+       for (i = 0; i < config->network.n_dns_servers; i++)
+               pb_log("  dns server %s\n", config->network.dns_servers[i]);
 }
 
 int config_init(void *ctx)
index 734741e2cb08340ab9660745b10423a2725d6359..3ed3c46dbd1b716ec0643381f137698f880cfd97 100644 (file)
@@ -315,7 +315,7 @@ static void populate_network_config(struct powerpc_nvram_storage *nv,
                if (!tok)
                        break;
 
-               if (strncmp(tok, "dns,", strlen("dns,")))
+               if (!strncasecmp(tok, "dns,", strlen("dns,")))
                        parse_one_dns_config(config, tok + strlen("dns,"));
                else
                        parse_one_interface_config(config, tok);