chiark / gitweb /
gnome-ask-password-agent: fix path to watch
[elogind.git] / src / readahead-replay.c
index ab0c8084c8414c73daded01ca8664565d3937f8a..d2de7ef2887b67620bc9cafc42838929e51bfd13 100644 (file)
@@ -60,9 +60,12 @@ static int unpack_file(FILE *pack) {
         char_array_0(fn);
         truncate_nl(fn);
 
-        if ((fd = open(fn, O_RDONLY|O_CLOEXEC|O_NOATIME|O_NOCTTY|O_NOFOLLOW)) < 0)
-                log_warning("open(%s) failed: %m", fn);
-        else if (file_verify(fd, fn, arg_file_size_max, &st) <= 0) {
+        if ((fd = open(fn, O_RDONLY|O_CLOEXEC|O_NOATIME|O_NOCTTY|O_NOFOLLOW)) < 0) {
+
+                if (errno != ENOENT && errno != EPERM && errno != EACCES)
+                        log_warning("open(%s) failed: %m", fn);
+
+        } else if (file_verify(fd, fn, arg_file_size_max, &st) <= 0) {
                 close_nointr_nofail(fd);
                 fd = -1;
         }
@@ -136,7 +139,7 @@ static int replay(const char *root) {
         }
 
         if ((!(pack = fopen(pack_fn, "re")))) {
-                if (errno == -ENOENT)
+                if (errno == ENOENT)
                         log_debug("No pack file found.");
                 else {
                         log_error("Failed to open pack file: %m");
@@ -189,7 +192,7 @@ static int replay(const char *root) {
 
         log_debug("Replaying...");
 
-        if (access("/dev/.systemd/readahead/noreplay", F_OK) >= 0) {
+        if (access("/dev/.run/systemd/readahead/noreplay", F_OK) >= 0) {
                 log_debug("Got termination request");
                 goto done;
         }
@@ -330,6 +333,7 @@ static int parse_argv(int argc, char *argv[]) {
 
 int main(int argc, char*argv[]) {
         int r;
+        const char *root;
 
         log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
         log_parse_environment();
@@ -338,18 +342,25 @@ int main(int argc, char*argv[]) {
         if ((r = parse_argv(argc, argv)) <= 0)
                 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 
+        root = optind < argc ? argv[optind] : "/";
+
         if (!enough_ram()) {
                 log_info("Disabling readahead replay due to low memory.");
                 return 0;
         }
 
+        if (detect_virtualization(NULL) > 0) {
+                log_info("Disabling readahead replay due to execution in virtualized environment.");
+                return 0;
+        }
+
         if (!(shared = shared_get()))
                 return 1;
 
         shared->replay = getpid();
         __sync_synchronize();
 
-        if (replay(optind < argc ? argv[optind] : "/") < 0)
+        if (replay(root) < 0)
                 return 1;
 
         return 0;