Lines Matching +full:can +full:- +full:fd
1 // SPDX-License-Identifier: GPL-2.0-only
24 #include "trace-event.h"
42 /* unfortunately, you can not stat debugfs or proc files for size */
48 int r, fd; in record_file() local
49 int err = -EIO; in record_file()
51 fd = open(file, O_RDONLY); in record_file()
52 if (fd < 0) { in record_file()
53 pr_debug("Can't read '%s'", file); in record_file()
54 return -errno; in record_file()
64 r = read(fd, buf, BUFSIZ); in record_file()
72 /* ugh, handle big-endian hdr_size == 4 */ in record_file()
75 sizep += sizeof(u64) - hdr_sz; in record_file()
84 close(fd); in record_file()
92 int err = -EIO; in record_header_files()
95 pr_debug("can't get tracing/events/header_page"); in record_header_files()
96 return -ENOMEM; in record_header_files()
100 pr_debug("can't read '%s'", path); in record_header_files()
105 pr_debug("can't write header_page\n"); in record_header_files()
110 pr_debug("can't record header_page file\n"); in record_header_files()
118 pr_debug("can't get tracing/events/header_event"); in record_header_files()
119 err = -ENOMEM; in record_header_files()
124 pr_debug("can't read '%s'", path); in record_header_files()
129 pr_debug("can't write header_event\n"); in record_header_files()
134 pr_debug("can't record header_event file\n"); in record_header_files()
147 if (!strcmp(sys, tps->name)) in name_in_tp_list()
149 tps = tps->next; in name_in_tp_list()
157 if (dent->d_type == DT_DIR && \
158 (strcmp(dent->d_name, ".")) && \
159 (strcmp(dent->d_name, ".."))) \
173 pr_debug("can't read directory '%s'", sys); in copy_event_system()
174 return -errno; in copy_event_system()
178 if (!name_in_tp_list(dent->d_name, tps)) in copy_event_system()
181 if (asprintf(&format, "%s/%s/format", sys, dent->d_name) < 0) { in copy_event_system()
182 err = -ENOMEM; in copy_event_system()
193 err = -EIO; in copy_event_system()
194 pr_debug("can't write count\n"); in copy_event_system()
200 if (!name_in_tp_list(dent->d_name, tps)) in copy_event_system()
203 if (asprintf(&format, "%s/%s/format", sys, dent->d_name) < 0) { in copy_event_system()
204 err = -ENOMEM; in copy_event_system()
231 pr_debug("can't get tracing/events/ftrace"); in record_ftrace_files()
232 return -ENOMEM; in record_ftrace_files()
245 if (!strcmp(sys, tps->system)) in system_in_tp_list()
247 tps = tps->next; in system_in_tp_list()
266 pr_debug("can't get tracing/events"); in record_event_files()
267 return -ENOMEM; in record_event_files()
272 err = -errno; in record_event_files()
273 pr_debug("can't read directory '%s'", path); in record_event_files()
278 if (strcmp(dent->d_name, "ftrace") == 0 || in record_event_files()
279 !system_in_tp_list(dent->d_name, tps)) in record_event_files()
286 err = -EIO; in record_event_files()
287 pr_debug("can't write count\n"); in record_event_files()
293 if (strcmp(dent->d_name, "ftrace") == 0 || in record_event_files()
294 !system_in_tp_list(dent->d_name, tps)) in record_event_files()
297 if (asprintf(&sys, "%s/%s", path, dent->d_name) < 0) { in record_event_files()
298 err = -ENOMEM; in record_event_files()
303 ssize_t size = strlen(dent->d_name) + 1; in record_event_files()
305 if (write(output_fd, dent->d_name, size) != size || in record_event_files()
307 err = -EIO; in record_event_files()
329 * /proc/kallsyms (or something specified via --kallsyms, in a in record_proc_kallsyms()
332 return write(output_fd, &size, 4) != 4 ? -EIO : 0; in record_proc_kallsyms()
344 pr_debug("can't get tracing/printk_formats"); in record_ftrace_printk()
345 return -ENOMEM; in record_ftrace_printk()
353 err = -EIO; in record_ftrace_printk()
372 pr_debug("can't get tracing/saved_cmdline"); in record_saved_cmdline()
373 return -ENOMEM; in record_saved_cmdline()
381 err = -EIO; in record_saved_cmdline()
397 tps = tps->next; in put_tracepoints_path()
398 zfree(&t->name); in put_tracepoints_path()
399 zfree(&t->system); in put_tracepoints_path()
410 int fd; in tracepoint_id_to_path() local
420 dir_path = get_events_file(sys_dirent->d_name); in tracepoint_id_to_path()
430 evt_dirent->d_name); in tracepoint_id_to_path()
431 fd = open(evt_path, O_RDONLY); in tracepoint_id_to_path()
432 if (fd < 0) in tracepoint_id_to_path()
434 if (read(fd, id_buf, sizeof(id_buf)) < 0) { in tracepoint_id_to_path()
435 close(fd); in tracepoint_id_to_path()
438 close(fd); in tracepoint_id_to_path()
447 if (asprintf(&path->system, "%.*s", in tracepoint_id_to_path()
448 MAX_EVENT_LENGTH, sys_dirent->d_name) < 0) { in tracepoint_id_to_path()
452 if (asprintf(&path->name, "%.*s", in tracepoint_id_to_path()
453 MAX_EVENT_LENGTH, evt_dirent->d_name) < 0) { in tracepoint_id_to_path()
454 zfree(&path->system); in tracepoint_id_to_path()
475 if (path && asprintf(&buf, "%s:%s", path->system, path->name) < 0) in tracepoint_id_to_name()
492 path->system = strndup(name, str - name); in tracepoint_name_to_path()
493 path->name = strdup(str+1); in tracepoint_name_to_path()
495 if (path->system == NULL || path->name == NULL) { in tracepoint_name_to_path()
496 zfree(&path->system); in tracepoint_name_to_path()
497 zfree(&path->name); in tracepoint_name_to_path()
512 if (pos->core.attr.type != PERF_TYPE_TRACEPOINT) in get_tracepoints_path()
516 if (pos->name) { in get_tracepoints_path()
517 ppath->next = tracepoint_name_to_path(pos->name); in get_tracepoints_path()
518 if (ppath->next) in get_tracepoints_path()
521 if (strchr(pos->name, ':') == NULL) in get_tracepoints_path()
528 ppath->next = tracepoint_id_to_path(pos->core.attr.config); in get_tracepoints_path()
529 if (!ppath->next) { in get_tracepoints_path()
536 ppath = ppath->next; in get_tracepoints_path()
547 if (pos->core.attr.type == PERF_TYPE_TRACEPOINT) in have_tracepoints()
565 return -1; in tracing_data_header()
569 return -1; in tracing_data_header()
578 return -1; in tracing_data_header()
583 return -1; in tracing_data_header()
587 return -1; in tracing_data_header()
593 int fd, bool temp) in tracing_data_get() argument
599 output_fd = fd; in tracing_data_get()
609 tdata->temp = temp; in tracing_data_get()
610 tdata->size = 0; in tracing_data_get()
615 snprintf(tdata->temp_file, sizeof(tdata->temp_file), in tracing_data_get()
616 "/tmp/perf-XXXXXX"); in tracing_data_get()
617 if (!mkstemp(tdata->temp_file)) { in tracing_data_get()
618 pr_debug("Can't make temp file"); in tracing_data_get()
623 temp_fd = open(tdata->temp_file, O_RDWR); in tracing_data_get()
625 pr_debug("Can't read '%s'", tdata->temp_file); in tracing_data_get()
659 * All tracing data are stored by now, we can restore in tracing_data_get()
663 tdata->size = lseek(output_fd, 0, SEEK_CUR); in tracing_data_get()
665 output_fd = fd; in tracing_data_get()
679 if (tdata->temp) { in tracing_data_put()
680 err = record_file(tdata->temp_file, 0); in tracing_data_put()
681 unlink(tdata->temp_file); in tracing_data_put()
688 int read_tracing_data(int fd, struct list_head *pattrs) in read_tracing_data() argument
694 * We work over the real file, so we can write data in read_tracing_data()
697 tdata = tracing_data_get(pattrs, fd, false); in read_tracing_data()
699 return -ENOMEM; in read_tracing_data()