diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-09-21 16:54:54 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-09-21 16:54:54 +0200 |
commit | d40361453be0525a0455d549b2b863931b069358 (patch) | |
tree | 8aea1095f822cca7d02aa7becd899d28c2ba83d8 /src/nspawn/nspawn.c | |
parent | 4eeebf70aa5ac9825899f5a063431329904d37e5 (diff) |
nspawn: we can't overmount /etc/localtime anymore since it's usually a symlink now
Create the right symlink if possible for /etc/localtime
Diffstat (limited to 'src/nspawn/nspawn.c')
-rw-r--r-- | src/nspawn/nspawn.c | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index ab7a239ed5..d181e3b338 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -332,28 +332,61 @@ static int mount_all(const char *dest) { } static int setup_timezone(const char *dest) { - char *where; + _cleanup_free_ char *where = NULL, *p = NULL, *q = NULL, *check = NULL, *what = NULL; + char *z, *y; + int r; assert(dest); /* Fix the timezone, if possible */ + r = readlink_malloc("/etc/localtime", &p); + if (r < 0) { + log_warning("/etc/localtime is not a symlink, not updating container timezone."); + return 0; + } + + z = path_startswith(p, "../usr/share/zoneinfo/"); + if (!z) + z = path_startswith(p, "/usr/share/zoneinfo/"); + if (!z) { + log_warning("/etc/localtime does not point into /usr/share/zoneinfo/, not updating container timezone."); + return 0; + } + where = strappend(dest, "/etc/localtime"); if (!where) return log_oom(); - if (mount("/etc/localtime", where, "bind", MS_BIND, NULL) >= 0) - mount("/etc/localtime", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL); + r = readlink_malloc(where, &q); + if (r >= 0) { + y = path_startswith(q, "../usr/share/zoneinfo/"); + if (!y) + y = path_startswith(q, "/usr/share/zoneinfo/"); - free(where); - where = strappend(dest, "/etc/timezone"); - if (!where) + /* Already pointing to the right place? Then do nothing .. */ + if (y && streq(y, z)) + return 0; + } + + check = strjoin(dest, "/usr/share/zoneinfo/", z, NULL); + if (!check) return log_oom(); - if (mount("/etc/timezone", where, "bind", MS_BIND, NULL) >= 0) - mount("/etc/timezone", where, "bind", MS_BIND|MS_REMOUNT|MS_RDONLY, NULL); + if (access(check, F_OK) < 0) { + log_warning("Timezone %s does not exist in container, not updating container timezone.", z); + return 0; + } - free(where); + what = strappend("../usr/share/zoneinfo/", z); + if (!what) + return log_oom(); + + unlink(where); + if (symlink(what, where) < 0) { + log_error("Failed to correct timezone of container: %m"); + return 0; + } return 0; } |