1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
/* Copyright 2012-present Facebook, Inc.
* Licensed under the Apache License, Version 2.0 */
#include "watchman.h"
#include "InMemoryView.h"
#include "watchman_error_category.h"
void handle_open_errno(
const std::shared_ptr<w_root_t>& root,
struct watchman_dir* dir,
struct timeval now,
const char* syscall,
const std::error_code& err) {
auto dir_name = dir->getFullPath();
bool log_warning = true;
bool transient = false;
if (err == watchman::error_code::no_such_file_or_directory ||
err == watchman::error_code::not_a_directory ||
err == watchman::error_code::too_many_symbolic_link_levels) {
log_warning = false;
transient = false;
} else if (err == watchman::error_code::permission_denied) {
log_warning = true;
transient = false;
} else if (err == watchman::error_code::system_limits_exceeded) {
set_poison_state(dir_name, now, syscall, err);
return;
} else {
log_warning = true;
transient = true;
}
if (w_string_equal(dir_name, root->root_path)) {
if (!transient) {
watchman::log(
watchman::ERR,
syscall,
"(",
dir_name,
") -> ",
err.message(),
". Root was deleted; cancelling watch\n");
root->cancel();
return;
}
}
auto warn = w_string::build(
syscall,
"(",
dir_name,
") -> ",
err.message(),
". Marking this portion of the tree deleted");
watchman::log(
err == watchman::error_code::no_such_file_or_directory ? watchman::DBG
: watchman::ERR,
warn,
"\n");
if (log_warning) {
root->recrawlInfo.wlock()->warning = warn;
}
}
/* vim:ts=2:sw=2:et:
*/
|