Based on 571d0134bd464444567cf4eb0d2ed8df40045f36 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 24 Jun 2014 19:37:22 +0200 Subject: [PATCH] fsck: consider a fsck implementation linked to /bin/true non-existant --- src/fsck/fsck.c | 32 ++++++++++++++++++++++---------- src/shared/path-util.c | 26 +++++++++++++++----------- 2 files changed, 37 insertions(+), 21 deletions(-) Index: src/fsck/fsck.c =================================================================== --- src/fsck/fsck.c.orig +++ src/fsck/fsck.c @@ -37,6 +37,7 @@ #include "bus-errors.h" #include "fileio.h" #include "udev-util.h" +#include "path-util.h" static bool arg_skip = false; static bool arg_force = false; @@ -280,16 +281,28 @@ int main(int argc, char *argv[]) { type = udev_device_get_property_value(udev_device, "ID_FS_TYPE"); if (type) { - const char *checker = strappenda("/sbin/fsck.", type); - r = access(checker, X_OK); - if (r < 0) { - if (errno == ENOENT) { - log_info("%s doesn't exist, not checking file system on %s", - checker, device); - return EXIT_SUCCESS; - } else - log_warning("%s cannot be used for %s: %m", - checker, device); + _cleanup_free_ char *p = NULL, *d = NULL; + const char *checker = strappenda("fsck.", type); + r = find_binary(checker, &p); + if (r == -ENOENT) { + log_info("fsck.%s doesn't exist, not checking file system on %s", + type, device); + return EXIT_SUCCESS; + } else if (r < 0) { + log_warning("fsck.%s cannot be used for %s: %m", + type, device); + return r; + } + + /* An fsck that is linked to /bin/true is a non-existant fsck */ + r = readlink_malloc(p, &d); + if (r >= 0 && + (path_equal(d, "/bin/true") || + path_equal(d, "/usr/bin/true") || + path_equal(d, "/dev/null"))) { + log_info("fsck.%s doesn't exist, not checking file system on %s", + type, device); + return EXIT_SUCCESS; } } Index: src/shared/path-util.c =================================================================== --- src/shared/path-util.c.orig +++ src/shared/path-util.c @@ -425,19 +425,21 @@ int path_is_os_tree(const char *path) { int find_binary(const char *name, char **filename) { assert(name); - assert(filename); - if (strchr(name, '/')) { - char *p; + if (is_path(name)) { + if (access(name, X_OK) < 0) + return -errno; + + if (filename) { + char *p; - if (path_is_absolute(name)) - p = strdup(name); - else p = path_make_absolute_cwd(name); - if (!p) - return -ENOMEM; + if (!p) + return -ENOMEM; + + *filename = p; + } - *filename = p; return 0; } else { const char *path; @@ -463,8 +465,10 @@ int find_binary(const char *name, char * continue; } - path_kill_slashes(p); - *filename = p; + if (filename) { + path_kill_slashes(p); + *filename = p; + } return 0; }