X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Futil.c;h=8caac7b597fb0f3393c77e1ad2fce3fabdb91bb3;hp=41505b2ca79bac962510704a22c65fbea92ba2df;hb=825c6fe5eb362437aa46faa52b683a62eede9a13;hpb=36fcd77e02cedf300e2f45f2449e7e091ef5a7ab diff --git a/src/shared/util.c b/src/shared/util.c index 41505b2ca..8caac7b59 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -54,6 +54,8 @@ #include #include #include +#include +#include #include "macro.h" #include "util.h" @@ -5738,9 +5740,24 @@ bool is_valid_documentation_url(const char *url) { bool in_initrd(void) { static int saved = -1; + struct statfs s; - if (saved < 0) - saved = access("/etc/initrd-release", F_OK) >= 0; + if (saved >= 0) + return saved; + + /* We make two checks here: + * + * 1. the flag file /etc/initrd-release must exist + * 2. the root file system must be a memory file system + * + * The second check is extra paranoia, since misdetecting an + * initrd can have bad bad consequences due the initrd + * emptying when transititioning to the main systemd. + */ + + saved = access("/etc/initrd-release", F_OK) >= 0 && + statfs("/", &s) >= 0 && + (s.f_type == TMPFS_MAGIC || s.f_type == RAMFS_MAGIC); return saved; }