1c34984b2SArnaldo Carvalho de Melo /* 2c34984b2SArnaldo Carvalho de Melo * builtin-buildid-list.c 3c34984b2SArnaldo Carvalho de Melo * 4c34984b2SArnaldo Carvalho de Melo * Builtin buildid-list command: list buildids in perf.data 5c34984b2SArnaldo Carvalho de Melo * 6c34984b2SArnaldo Carvalho de Melo * Copyright (C) 2009, Red Hat Inc. 7c34984b2SArnaldo Carvalho de Melo * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com> 8c34984b2SArnaldo Carvalho de Melo */ 9c34984b2SArnaldo Carvalho de Melo #include "builtin.h" 10c34984b2SArnaldo Carvalho de Melo #include "perf.h" 11c34984b2SArnaldo Carvalho de Melo #include "util/cache.h" 12c34984b2SArnaldo Carvalho de Melo #include "util/data_map.h" 13c34984b2SArnaldo Carvalho de Melo #include "util/debug.h" 14c34984b2SArnaldo Carvalho de Melo #include "util/header.h" 15c34984b2SArnaldo Carvalho de Melo #include "util/parse-options.h" 16c34984b2SArnaldo Carvalho de Melo #include "util/symbol.h" 17c34984b2SArnaldo Carvalho de Melo 18c34984b2SArnaldo Carvalho de Melo static char const *input_name = "perf.data"; 19c34984b2SArnaldo Carvalho de Melo static int force; 20c34984b2SArnaldo Carvalho de Melo 21c34984b2SArnaldo Carvalho de Melo static const char *const buildid_list_usage[] = { 22c34984b2SArnaldo Carvalho de Melo "perf report [<options>]", 23c34984b2SArnaldo Carvalho de Melo NULL 24c34984b2SArnaldo Carvalho de Melo }; 25c34984b2SArnaldo Carvalho de Melo 26c34984b2SArnaldo Carvalho de Melo static const struct option options[] = { 27c34984b2SArnaldo Carvalho de Melo OPT_STRING('i', "input", &input_name, "file", 28c34984b2SArnaldo Carvalho de Melo "input file name"), 29c34984b2SArnaldo Carvalho de Melo OPT_BOOLEAN('f', "force", &force, "don't complain, do it"), 30c34984b2SArnaldo Carvalho de Melo OPT_BOOLEAN('v', "verbose", &verbose, 31*1124ba73SArnaldo Carvalho de Melo "be more verbose"), 32c34984b2SArnaldo Carvalho de Melo OPT_END() 33c34984b2SArnaldo Carvalho de Melo }; 34c34984b2SArnaldo Carvalho de Melo 35c34984b2SArnaldo Carvalho de Melo static int perf_file_section__process_buildids(struct perf_file_section *self, 36c34984b2SArnaldo Carvalho de Melo int feat, int fd) 37c34984b2SArnaldo Carvalho de Melo { 38c34984b2SArnaldo Carvalho de Melo if (feat != HEADER_BUILD_ID) 39c34984b2SArnaldo Carvalho de Melo return 0; 40c34984b2SArnaldo Carvalho de Melo 41c34984b2SArnaldo Carvalho de Melo if (lseek(fd, self->offset, SEEK_SET) < 0) { 42c34984b2SArnaldo Carvalho de Melo pr_warning("Failed to lseek to %Ld offset for buildids!\n", 43c34984b2SArnaldo Carvalho de Melo self->offset); 44c34984b2SArnaldo Carvalho de Melo return -1; 45c34984b2SArnaldo Carvalho de Melo } 46c34984b2SArnaldo Carvalho de Melo 47c34984b2SArnaldo Carvalho de Melo if (perf_header__read_build_ids(fd, self->offset, self->size)) { 48c34984b2SArnaldo Carvalho de Melo pr_warning("Failed to read buildids!\n"); 49c34984b2SArnaldo Carvalho de Melo return -1; 50c34984b2SArnaldo Carvalho de Melo } 51c34984b2SArnaldo Carvalho de Melo 52c34984b2SArnaldo Carvalho de Melo return 0; 53c34984b2SArnaldo Carvalho de Melo } 54c34984b2SArnaldo Carvalho de Melo 55c34984b2SArnaldo Carvalho de Melo static int __cmd_buildid_list(void) 56c34984b2SArnaldo Carvalho de Melo { 57c34984b2SArnaldo Carvalho de Melo int err = -1; 58c34984b2SArnaldo Carvalho de Melo struct perf_header *header; 59c34984b2SArnaldo Carvalho de Melo struct perf_file_header f_header; 60c34984b2SArnaldo Carvalho de Melo struct stat input_stat; 61c34984b2SArnaldo Carvalho de Melo int input = open(input_name, O_RDONLY); 62c34984b2SArnaldo Carvalho de Melo 63c34984b2SArnaldo Carvalho de Melo if (input < 0) { 64c34984b2SArnaldo Carvalho de Melo pr_err("failed to open file: %s", input_name); 65c34984b2SArnaldo Carvalho de Melo if (!strcmp(input_name, "perf.data")) 66c34984b2SArnaldo Carvalho de Melo pr_err(" (try 'perf record' first)"); 67c34984b2SArnaldo Carvalho de Melo pr_err("\n"); 68c34984b2SArnaldo Carvalho de Melo goto out; 69c34984b2SArnaldo Carvalho de Melo } 70c34984b2SArnaldo Carvalho de Melo 71c34984b2SArnaldo Carvalho de Melo err = fstat(input, &input_stat); 72c34984b2SArnaldo Carvalho de Melo if (err < 0) { 73c34984b2SArnaldo Carvalho de Melo perror("failed to stat file"); 74c34984b2SArnaldo Carvalho de Melo goto out_close; 75c34984b2SArnaldo Carvalho de Melo } 76c34984b2SArnaldo Carvalho de Melo 77c34984b2SArnaldo Carvalho de Melo if (!force && input_stat.st_uid && (input_stat.st_uid != geteuid())) { 78c34984b2SArnaldo Carvalho de Melo pr_err("file %s not owned by current user or root\n", 79c34984b2SArnaldo Carvalho de Melo input_name); 80c34984b2SArnaldo Carvalho de Melo goto out_close; 81c34984b2SArnaldo Carvalho de Melo } 82c34984b2SArnaldo Carvalho de Melo 83c34984b2SArnaldo Carvalho de Melo if (!input_stat.st_size) { 84c34984b2SArnaldo Carvalho de Melo pr_info("zero-sized file, nothing to do!\n"); 85c34984b2SArnaldo Carvalho de Melo goto out_close; 86c34984b2SArnaldo Carvalho de Melo } 87c34984b2SArnaldo Carvalho de Melo 88c34984b2SArnaldo Carvalho de Melo err = -1; 89c34984b2SArnaldo Carvalho de Melo header = perf_header__new(); 90c34984b2SArnaldo Carvalho de Melo if (header == NULL) 91c34984b2SArnaldo Carvalho de Melo goto out_close; 92c34984b2SArnaldo Carvalho de Melo 93c34984b2SArnaldo Carvalho de Melo if (perf_file_header__read(&f_header, header, input) < 0) { 94c34984b2SArnaldo Carvalho de Melo pr_warning("incompatible file format"); 95c34984b2SArnaldo Carvalho de Melo goto out_close; 96c34984b2SArnaldo Carvalho de Melo } 97c34984b2SArnaldo Carvalho de Melo 98c34984b2SArnaldo Carvalho de Melo err = perf_header__process_sections(header, input, 99c34984b2SArnaldo Carvalho de Melo perf_file_section__process_buildids); 100c34984b2SArnaldo Carvalho de Melo 101c34984b2SArnaldo Carvalho de Melo if (err < 0) 102c34984b2SArnaldo Carvalho de Melo goto out_close; 103c34984b2SArnaldo Carvalho de Melo 104c34984b2SArnaldo Carvalho de Melo dsos__fprintf_buildid(stdout); 105c34984b2SArnaldo Carvalho de Melo out_close: 106c34984b2SArnaldo Carvalho de Melo close(input); 107c34984b2SArnaldo Carvalho de Melo out: 108c34984b2SArnaldo Carvalho de Melo return err; 109c34984b2SArnaldo Carvalho de Melo } 110c34984b2SArnaldo Carvalho de Melo 111c34984b2SArnaldo Carvalho de Melo int cmd_buildid_list(int argc, const char **argv, const char *prefix __used) 112c34984b2SArnaldo Carvalho de Melo { 113c34984b2SArnaldo Carvalho de Melo argc = parse_options(argc, argv, options, buildid_list_usage, 0); 114c34984b2SArnaldo Carvalho de Melo setup_pager(); 115c34984b2SArnaldo Carvalho de Melo return __cmd_buildid_list(); 116c34984b2SArnaldo Carvalho de Melo } 117