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