From 8e68d1c8b15ef989f1abac8a241827013a5d4623 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Thu, 30 Jun 2011 12:20:03 -0400 Subject: [PATCH] Add utils.c and recursive mkdir function This fixes the channel path that was wrong. Each channel has now it's own trace name file using the channel name. Signed-off-by: David Goulet --- ltt-sessiond/Makefile.am | 2 +- ltt-sessiond/kernel-ctl.c | 4 +-- ltt-sessiond/main.c | 7 ++-- ltt-sessiond/utils.c | 74 +++++++++++++++++++++++++++++++++++++++ ltt-sessiond/utils.h | 24 +++++++++++++ 5 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 ltt-sessiond/utils.c create mode 100644 ltt-sessiond/utils.h diff --git a/ltt-sessiond/Makefile.am b/ltt-sessiond/Makefile.am index b655380d3..6242325d0 100644 --- a/ltt-sessiond/Makefile.am +++ b/ltt-sessiond/Makefile.am @@ -5,7 +5,7 @@ AM_CFLAGS = -fno-strict-aliasing bin_PROGRAMS = ltt-sessiond -ltt_sessiond_SOURCES = trace.c session.c traceable-app.c ust-ctl.c kernel-ctl.c main.c +ltt_sessiond_SOURCES = utils.c trace.c session.c traceable-app.c ust-ctl.c kernel-ctl.c main.c ltt_sessiond_LDADD = \ $(top_builddir)/liblttsessiondcomm/liblttsessiondcomm.la \ diff --git a/ltt-sessiond/kernel-ctl.c b/ltt-sessiond/kernel-ctl.c index 95463aa50..02b01414a 100644 --- a/ltt-sessiond/kernel-ctl.c +++ b/ltt-sessiond/kernel-ctl.c @@ -491,8 +491,8 @@ int kernel_open_channel_stream(struct ltt_kernel_channel *channel) perror("fcntl session fd"); } - ret = asprintf(&lks->pathname, "%s/trace_%d", - channel->pathname, channel->stream_count); + ret = asprintf(&lks->pathname, "%s/%s_%d", + channel->pathname, channel->channel->name, channel->stream_count); if (ret < 0) { perror("asprintf kernel create stream"); goto error; diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 2fcd923a1..b0848eb45 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -48,6 +48,7 @@ #include "traceable-app.h" #include "lttng-kconsumerd.h" #include "libustctl.h" +#include "utils.h" /* * TODO: @@ -282,12 +283,10 @@ static int create_trace_dir(struct ltt_kernel_session *session) /* Create all channel directories */ cds_list_for_each_entry(chan, &session->channel_list.head, list) { DBG("Creating trace directory at %s", chan->pathname); - // TODO: recursive create dir - ret = mkdir(chan->pathname, S_IRWXU | S_IRWXG ); + ret = mkdir_recursive(chan->pathname, S_IRWXU | S_IRWXG ); if (ret < 0) { if (ret != EEXIST) { - perror("mkdir trace path"); - ret = -errno; + ERR("Trace directory creation error"); goto error; } } diff --git a/ltt-sessiond/utils.c b/ltt-sessiond/utils.c new file mode 100644 index 000000000..936d3e1b8 --- /dev/null +++ b/ltt-sessiond/utils.c @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2011 - David Goulet + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" + +int mkdir_recursive(const char *path, mode_t mode) +{ + int ret; + char *p, tmp[PATH_MAX]; + size_t len; + mode_t old_umask; + + ret = snprintf(tmp, sizeof(tmp), "%s", path); + if (ret < 0) { + perror("snprintf mkdir"); + goto error; + } + + len = ret; + if (tmp[len - 1] == '/') { + tmp[len - 1] = 0; + } + + old_umask = umask(0); + for (p = tmp + 1; *p; p++) { + if (*p == '/') { + *p = 0; + ret = mkdir(tmp, mode); + if (ret < 0) { + if (!(errno == EEXIST)) { + perror("mkdir recursive"); + ret = errno; + goto umask_error; + } + } + *p = '/'; + } + } + + ret = mkdir(tmp, mode); + if (ret < 0) { + ret = errno; + } + +umask_error: + umask(old_umask); +error: + return ret; +} diff --git a/ltt-sessiond/utils.h b/ltt-sessiond/utils.h new file mode 100644 index 000000000..564017df6 --- /dev/null +++ b/ltt-sessiond/utils.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2011 - David Goulet + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _LTT_UTILS_H +#define _LTT_UTILS_H + +int mkdir_recursive(const char *path, mode_t mode); + +#endif /* _LTT_UTILS_H */ -- 2.34.1