ryantimwilson / rpms / systemd

Forked from rpms/systemd a month ago
Clone
Harald Hoyer a72a35
From f333fbb1efc2f32527f78cbdb003d59bae01aa07 Mon Sep 17 00:00:00 2001
Harald Hoyer a72a35
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Harald Hoyer a72a35
Date: Wed, 17 Apr 2013 14:13:09 -0400
Harald Hoyer a72a35
Subject: [PATCH] nspawn: create empty /etc/resolv.conf if necessary
Harald Hoyer a72a35
Harald Hoyer a72a35
nspawn will overmount resolv.conf if it exists. Since e.g.
Harald Hoyer a72a35
default install with yum doesn't create /etc/resolv.conf,
Harald Hoyer a72a35
a container created with yum will not have network. This
Harald Hoyer a72a35
seems undesirable, and since we overmount the file anyway,
Harald Hoyer a72a35
let's create it too.
Harald Hoyer a72a35
Harald Hoyer a72a35
Also, mounting a read-write /etc/resolv.conf in the container
Harald Hoyer a72a35
is treated as a failure, since it makes it possible to
Harald Hoyer a72a35
modify hosts /etc/resolv.conf from inside the container.
Harald Hoyer a72a35
---
Harald Hoyer a72a35
 src/nspawn/nspawn.c | 17 ++++++++++++-----
Harald Hoyer a72a35
 1 file changed, 12 insertions(+), 5 deletions(-)
Harald Hoyer a72a35
Harald Hoyer a72a35
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
Harald Hoyer a72a35
index f57c75f..5a43d5e 100644
Harald Hoyer a72a35
--- a/src/nspawn/nspawn.c
Harald Hoyer a72a35
+++ b/src/nspawn/nspawn.c
Harald Hoyer a72a35
@@ -492,7 +492,8 @@ static int setup_timezone(const char *dest) {
Harald Hoyer a72a35
 }
Harald Hoyer a72a35
 
Harald Hoyer a72a35
 static int setup_resolv_conf(const char *dest) {
Harald Hoyer a72a35
-        char *where;
Harald Hoyer a72a35
+        char _cleanup_free_ *where = NULL;
Harald Hoyer a72a35
+        _cleanup_close_ int fd = -1;
Harald Hoyer a72a35
 
Harald Hoyer a72a35
         assert(dest);
Harald Hoyer a72a35
 
Harald Hoyer a72a35
@@ -504,12 +505,18 @@ static int setup_resolv_conf(const char *dest) {
Harald Hoyer a72a35
         if (!where)
Harald Hoyer a72a35
                 return log_oom();
Harald Hoyer a72a35
 
Harald Hoyer a72a35
+        fd = open(where, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW, 0644);
Harald Hoyer a72a35
+
Harald Hoyer a72a35
         /* We don't really care for the results of this really. If it
Harald Hoyer a72a35
          * fails, it fails, but meh... */
Harald Hoyer a72a35
-        if (mount("/etc/resolv.conf", where, "bind", MS_BIND, NULL) >= 0)
Harald Hoyer a72a35
-                mount("/etc/resolv.conf", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL);
Harald Hoyer a72a35
-
Harald Hoyer a72a35
-        free(where);
Harald Hoyer a72a35
+        if (mount("/etc/resolv.conf", where, "bind", MS_BIND, NULL) < 0)
Harald Hoyer a72a35
+                log_warning("Failed to bind mount /etc/resolv.conf: %m");
Harald Hoyer a72a35
+        else
Harald Hoyer a72a35
+                if (mount("/etc/resolv.conf", where, "bind",
Harald Hoyer a72a35
+                          MS_BIND|MS_REMOUNT|MS_RDONLY, NULL) < 0) {
Harald Hoyer a72a35
+                        log_error("Failed to remount /etc/resolv.conf readonly: %m");
Harald Hoyer a72a35
+                        return -errno;
Harald Hoyer a72a35
+                }
Harald Hoyer a72a35
 
Harald Hoyer a72a35
         return 0;
Harald Hoyer a72a35
 }
Harald Hoyer a72a35
-- 
Harald Hoyer a72a35
1.8.2
Harald Hoyer a72a35