Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751927AbdHBWTh (ORCPT ); Wed, 2 Aug 2017 18:19:37 -0400 Received: from mx.kolabnow.com ([95.128.36.42]:54482 "EHLO mx.kolabnow.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751168AbdHBWTf (ORCPT ); Wed, 2 Aug 2017 18:19:35 -0400 From: Federico Vaga To: Steven Rostedt Cc: LKML , Federico Vaga Subject: [PATCH V3 1/2] use direname instead of custom code Date: Thu, 3 Aug 2017 00:15:57 +0200 Message-Id: <20170802221558.9684-1-federico.vaga@vaga.pv.it> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3551 Lines: 111 Prefer well known functions like `dirname(3)` instead of custom implementation for the same functionality Signed-off-by: Federico Vaga --- trace-record.c | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/trace-record.c b/trace-record.c index 020a373..79e4fe4 100644 --- a/trace-record.c +++ b/trace-record.c @@ -45,6 +45,7 @@ #include #include #include +#include #include "trace-local.h" #include "trace-msg.h" @@ -2215,12 +2216,24 @@ static void set_max_graph_depth(struct buffer_instance *instance, char *max_grap die("could not write to max_graph_depth"); } + +/** + * create_event - create and event descriptor + * @instance: instance to use + * @path: path to event attribute + * @old_event: event descriptor to use as base + * + * NOTE: the function purpose is to create a data structure to describe + * an ftrace event. During the process it becomes handy to change the + * string `path`. So, do not rely on the content of `path` after you + * invoke this function. + */ static struct event_list * create_event(struct buffer_instance *instance, char *path, struct event_list *old_event) { struct event_list *event; struct stat st; - char *p; + char *p, *path_dirname; int ret; event = malloc(sizeof(*event)); @@ -2234,14 +2247,14 @@ create_event(struct buffer_instance *instance, char *path, struct event_list *ol if (!event->filter_file) die("malloc filter file"); } - for (p = path + strlen(path) - 1; p > path; p--) - if (*p == '/') - break; - *p = '\0'; - p = malloc(strlen(path) + strlen("/enable") + 1); + + path_dirname = dirname(path); + + p = malloc(strlen(path_dirname) + strlen("/enable") + 1); if (!p) die("Failed to allocate enable path for %s", path); - sprintf(p, "%s/enable", path); + sprintf(p, "%s/enable", path_dirname); + ret = stat(p, &st); if (ret >= 0) event->enable_file = p; @@ -2249,10 +2262,11 @@ create_event(struct buffer_instance *instance, char *path, struct event_list *ol free(p); if (event->trigger) { - p = malloc(strlen(path) + strlen("/trigger") + 1); + p = malloc(strlen(path_dirname) + strlen("/trigger") + 1); if (!p) die("Failed to allocate trigger path for %s", path); - sprintf(p, "%s/trigger", path); + sprintf(p, "%s/trigger", path_dirname); + ret = stat(p, &st); if (ret > 0) die("trigger specified but not supported by this kernel"); @@ -2266,8 +2280,7 @@ static void make_sched_event(struct buffer_instance *instance, struct event_list **event, struct event_list *sched, const char *sched_path) { - char *path; - char *p; + char *path, *path_dirname, *sched_filter_file_tmp; /* Do nothing if the event already exists */ if (*event) @@ -2277,11 +2290,13 @@ static void make_sched_event(struct buffer_instance *instance, if (!path) die("Failed to allocate path for %s", sched_path); - sprintf(path, "%s", sched->filter_file); + /* we do not want to corrupt sched->filter_file when using dirname() */ + sched_filter_file_tmp = strdup(sched->filter_file); + if (!sched_filter_file_tmp) + die("Failed to allocate path for %s", sched_path); + path_dirname = dirname(sched_filter_file_tmp); - /* Remove the /filter from filter file */ - p = path + strlen(path) - strlen("filter"); - sprintf(p, "%s/filter", sched_path); + sprintf(path, "%s/%s/filter", path_dirname, sched_path); *event = create_event(instance, path, sched); free(path); -- 2.13.3