/* Returns true if the global config root_restrict_files is not defined or if * one of the files in root_restrict_files exists, false otherwise. */ static bool root_check_restrict(const char *watch_path) { uint32_t i; bool enforcing; auto root_restrict_files = cfg_compute_root_files(&enforcing); if (!root_restrict_files) { return true; } if (!enforcing) { return true; } for (i = 0; i < json_array_size(root_restrict_files); i++) { auto obj = json_array_get(root_restrict_files, i); const char *restrict_file = json_string_value(obj); char *restrict_path; bool rv; if (!restrict_file) { w_log(W_LOG_ERR, "resolve_root: global config root_restrict_files " "element %" PRIu32 " should be a string\n", i); continue; } ignore_result(asprintf(&restrict_path, "%s%c%s", watch_path, WATCHMAN_DIR_SEP, restrict_file)); rv = w_path_exists(restrict_path); free(restrict_path); if (rv) return true; } return false; }
SavedStateInterface::SavedStateResult LocalSavedStateInterface::getMostRecentSavedStateImpl( w_string_piece lookupCommitId) const { auto commitIds = scm_->getCommitsPriorToAndIncluding(lookupCommitId, maxCommits_); for (auto& commitId : commitIds) { auto path = getLocalPath(commitId); // We could return a path that no longer exists if the path is removed // (for example by saved state GC) after we check that the path exists // here, but before the client reads the state. We've explicitly chosen to // return the state without additional safety guarantees, and leave it to // the client to ensure GC happens only after states are no longer likely // to be used. if (w_path_exists(path.c_str())) { log(DBG, "Found saved state for commit ", commitId, "\n"); SavedStateInterface::SavedStateResult result; result.commitId = commitId; result.savedStateInfo = json_object({{"local-path", w_string_to_json(path)}, {"commit-id", w_string_to_json(commitId)}}); return result; } } SavedStateInterface::SavedStateResult result; result.commitId = w_string(); result.savedStateInfo = json_object( {{"error", w_string_to_json("No suitable saved state found")}}); return result; }
void cfg_load_global_config_file(void) { json_t *config = NULL; json_error_t err; const char *cfg_file = getenv("WATCHMAN_CONFIG_FILE"); #ifdef WATCHMAN_CONFIG_FILE if (!cfg_file) { cfg_file = WATCHMAN_CONFIG_FILE; } #endif if (!cfg_file || cfg_file[0] == '\0') { return; } if (!w_path_exists(cfg_file)) { return; } config = json_load_file(cfg_file, 0, &err); if (!config) { w_log(W_LOG_ERR, "failed to parse json from %s: %s\n", cfg_file, err.text); return; } global_cfg = config; }
static json_ref load_root_config(const char* path) { char cfgfilename[WATCHMAN_NAME_MAX]; json_error_t err; snprintf(cfgfilename, sizeof(cfgfilename), "%s/.watchmanconfig", path); if (!w_path_exists(cfgfilename)) { if (errno == ENOENT) { return nullptr; } w_log(W_LOG_ERR, "%s is not accessible: %s\n", cfgfilename, strerror(errno)); return nullptr; } auto res = json_load_file(cfgfilename, 0, &err); if (!res) { w_log(W_LOG_ERR, "failed to parse json from %s: %s\n", cfgfilename, err.text); } return res; }