1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * builtin-buildid-cache.c 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Builtin buildid-cache command: Manages build-id cache 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2010, Red Hat Inc. 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2010, Arnaldo Carvalho de Melo <acme@redhat.com> 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "builtin.h" 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "perf.h" 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/cache.h" 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/debug.h" 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/header.h" 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/parse-options.h" 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/strlist.h" 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/build-id.h" 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/session.h" 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/symbol.h" 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int build_id_cache__add_file(const char *filename, const char *debugdir) 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char sbuild_id[BUILD_ID_SIZE * 2 + 1]; 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u8 build_id[BUILD_ID_SIZE]; 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int err; 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (filename__read_build_id(filename, &build_id, sizeof(build_id)) < 0) { 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("Couldn't read a build-id in %s\n", filename); 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng build_id__sprintf(build_id, sizeof(build_id), sbuild_id); 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = build_id_cache__add_s(sbuild_id, debugdir, filename, 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng false, false); 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (verbose) 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_info("Adding %s %s: %s\n", sbuild_id, filename, 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err ? "FAIL" : "Ok"); 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return err; 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int build_id_cache__remove_file(const char *filename, 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *debugdir) 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u8 build_id[BUILD_ID_SIZE]; 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char sbuild_id[BUILD_ID_SIZE * 2 + 1]; 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int err; 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (filename__read_build_id(filename, &build_id, sizeof(build_id)) < 0) { 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("Couldn't read a build-id in %s\n", filename); 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng build_id__sprintf(build_id, sizeof(build_id), sbuild_id); 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = build_id_cache__remove_s(sbuild_id, debugdir); 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (verbose) 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_info("Removing %s %s: %s\n", sbuild_id, filename, 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err ? "FAIL" : "Ok"); 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return err; 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic bool dso__missing_buildid_cache(struct dso *dso, int parm __maybe_unused) 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char filename[PATH_MAX]; 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u8 build_id[BUILD_ID_SIZE]; 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (dso__build_id_filename(dso, filename, sizeof(filename)) && 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng filename__read_build_id(filename, build_id, 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sizeof(build_id)) != sizeof(build_id)) { 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (errno == ENOENT) 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return false; 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_warning("Problems with %s file, consider removing it from the cache\n", 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng filename); 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } else if (memcmp(dso->build_id, build_id, sizeof(dso->build_id))) { 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_warning("Problems with %s file, consider removing it from the cache\n", 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng filename); 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return true; 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int build_id_cache__fprintf_missing(const char *filename, bool force, FILE *fp) 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_session *session = perf_session__new(filename, O_RDONLY, 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng force, false, NULL); 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (session == NULL) 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_session__fprintf_dsos_buildid(session, fp, dso__missing_buildid_cache, 0); 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_session__delete(session); 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int build_id_cache__update_file(const char *filename, 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *debugdir) 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u8 build_id[BUILD_ID_SIZE]; 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char sbuild_id[BUILD_ID_SIZE * 2 + 1]; 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int err; 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (filename__read_build_id(filename, &build_id, sizeof(build_id)) < 0) { 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("Couldn't read a build-id in %s\n", filename); 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng build_id__sprintf(build_id, sizeof(build_id), sbuild_id); 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = build_id_cache__remove_s(sbuild_id, debugdir); 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!err) { 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = build_id_cache__add_s(sbuild_id, debugdir, filename, 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng false, false); 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (verbose) 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_info("Updating %s %s: %s\n", sbuild_id, filename, 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err ? "FAIL" : "Ok"); 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return err; 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint cmd_buildid_cache(int argc, const char **argv, 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *prefix __maybe_unused) 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct strlist *list; 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct str_node *pos; 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int ret = 0; 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool force = false; 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char debugdir[PATH_MAX]; 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char const *add_name_list_str = NULL, 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *remove_name_list_str = NULL, 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *missing_filename = NULL, 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *update_name_list_str = NULL; 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const struct option buildid_cache_options[] = { 136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_STRING('a', "add", &add_name_list_str, 137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng "file list", "file(s) to add"), 138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_STRING('r', "remove", &remove_name_list_str, "file list", 139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng "file(s) to remove"), 140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_STRING('M', "missing", &missing_filename, "file", 141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng "to find missing build ids in the cache"), 142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_BOOLEAN('f', "force", &force, "don't complain, do it"), 143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_STRING('u', "update", &update_name_list_str, "file list", 144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng "file(s) to update"), 145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_INCR('v', "verbose", &verbose, "be more verbose"), 146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_END() 147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }; 148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char * const buildid_cache_usage[] = { 149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng "perf buildid-cache [<options>]", 150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng NULL 151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }; 152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng argc = parse_options(argc, argv, buildid_cache_options, 154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng buildid_cache_usage, 0); 155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (symbol__init() < 0) 157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng setup_pager(); 160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng snprintf(debugdir, sizeof(debugdir), "%s", buildid_dir); 162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (add_name_list_str) { 164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng list = strlist__new(true, add_name_list_str); 165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (list) { 166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng strlist__for_each(pos, list) 167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (build_id_cache__add_file(pos->s, debugdir)) { 168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (errno == EEXIST) { 169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("%s already in the cache\n", 170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pos->s); 171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_warning("Couldn't add %s: %s\n", 174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pos->s, strerror(errno)); 175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng strlist__delete(list); 178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (remove_name_list_str) { 182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng list = strlist__new(true, remove_name_list_str); 183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (list) { 184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng strlist__for_each(pos, list) 185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (build_id_cache__remove_file(pos->s, debugdir)) { 186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (errno == ENOENT) { 187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("%s wasn't in the cache\n", 188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pos->s); 189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_warning("Couldn't remove %s: %s\n", 192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pos->s, strerror(errno)); 193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng strlist__delete(list); 196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (missing_filename) 200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret = build_id_cache__fprintf_missing(missing_filename, force, stdout); 201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (update_name_list_str) { 203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng list = strlist__new(true, update_name_list_str); 204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (list) { 205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng strlist__for_each(pos, list) 206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (build_id_cache__update_file(pos->s, debugdir)) { 207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (errno == ENOENT) { 208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("%s wasn't in the cache\n", 209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pos->s); 210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_warning("Couldn't update %s: %s\n", 213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pos->s, strerror(errno)); 214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng strlist__delete(list); 217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return ret; 221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 222