Path: blob/master/tools/perf/builtin-buildid-cache.c
10820 views
/*1* builtin-buildid-cache.c2*3* Builtin buildid-cache command: Manages build-id cache4*5* Copyright (C) 2010, Red Hat Inc.6* Copyright (C) 2010, Arnaldo Carvalho de Melo <[email protected]>7*/8#include "builtin.h"9#include "perf.h"10#include "util/cache.h"11#include "util/debug.h"12#include "util/header.h"13#include "util/parse-options.h"14#include "util/strlist.h"15#include "util/symbol.h"1617static char const *add_name_list_str, *remove_name_list_str;1819static const char * const buildid_cache_usage[] = {20"perf buildid-cache [<options>]",21NULL22};2324static const struct option buildid_cache_options[] = {25OPT_STRING('a', "add", &add_name_list_str,26"file list", "file(s) to add"),27OPT_STRING('r', "remove", &remove_name_list_str, "file list",28"file(s) to remove"),29OPT_INCR('v', "verbose", &verbose, "be more verbose"),30OPT_END()31};3233static int build_id_cache__add_file(const char *filename, const char *debugdir)34{35char sbuild_id[BUILD_ID_SIZE * 2 + 1];36u8 build_id[BUILD_ID_SIZE];37int err;3839if (filename__read_build_id(filename, &build_id, sizeof(build_id)) < 0) {40pr_debug("Couldn't read a build-id in %s\n", filename);41return -1;42}4344build_id__sprintf(build_id, sizeof(build_id), sbuild_id);45err = build_id_cache__add_s(sbuild_id, debugdir, filename, false);46if (verbose)47pr_info("Adding %s %s: %s\n", sbuild_id, filename,48err ? "FAIL" : "Ok");49return err;50}5152static int build_id_cache__remove_file(const char *filename __used,53const char *debugdir __used)54{55u8 build_id[BUILD_ID_SIZE];56char sbuild_id[BUILD_ID_SIZE * 2 + 1];5758int err;5960if (filename__read_build_id(filename, &build_id, sizeof(build_id)) < 0) {61pr_debug("Couldn't read a build-id in %s\n", filename);62return -1;63}6465build_id__sprintf(build_id, sizeof(build_id), sbuild_id);66err = build_id_cache__remove_s(sbuild_id, debugdir);67if (verbose)68pr_info("Removing %s %s: %s\n", sbuild_id, filename,69err ? "FAIL" : "Ok");7071return err;72}7374static int __cmd_buildid_cache(void)75{76struct strlist *list;77struct str_node *pos;78char debugdir[PATH_MAX];7980snprintf(debugdir, sizeof(debugdir), "%s", buildid_dir);8182if (add_name_list_str) {83list = strlist__new(true, add_name_list_str);84if (list) {85strlist__for_each(pos, list)86if (build_id_cache__add_file(pos->s, debugdir)) {87if (errno == EEXIST) {88pr_debug("%s already in the cache\n",89pos->s);90continue;91}92pr_warning("Couldn't add %s: %s\n",93pos->s, strerror(errno));94}9596strlist__delete(list);97}98}99100if (remove_name_list_str) {101list = strlist__new(true, remove_name_list_str);102if (list) {103strlist__for_each(pos, list)104if (build_id_cache__remove_file(pos->s, debugdir)) {105if (errno == ENOENT) {106pr_debug("%s wasn't in the cache\n",107pos->s);108continue;109}110pr_warning("Couldn't remove %s: %s\n",111pos->s, strerror(errno));112}113114strlist__delete(list);115}116}117118return 0;119}120121int cmd_buildid_cache(int argc, const char **argv, const char *prefix __used)122{123argc = parse_options(argc, argv, buildid_cache_options,124buildid_cache_usage, 0);125126if (symbol__init() < 0)127return -1;128129setup_pager();130return __cmd_buildid_cache();131}132133134