X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=ltt-sessiond%2Fkernel-ctl.c;h=09a3763eb835c30aaaa25fca4081f27d34aeb881;hp=168bce1f3d3eb9ea89566da7cb65995fe8bb9c20;hb=4b2221858653255be812d5a4e55c2ec05ec1819e;hpb=b082db07f0c522527fc95fc97f3e99eb0579c0cc diff --git a/ltt-sessiond/kernel-ctl.c b/ltt-sessiond/kernel-ctl.c index 168bce1f3..09a3763eb 100644 --- a/ltt-sessiond/kernel-ctl.c +++ b/ltt-sessiond/kernel-ctl.c @@ -3,8 +3,8 @@ * * 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. + * as published by the Free Software Foundation; only version 2 + * of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -25,7 +25,6 @@ #include #include "lttngerr.h" -#include "ltt-sessiond.h" #include "libkernelctl.h" #include "kernel-ctl.h" @@ -125,7 +124,6 @@ int kernel_create_session(struct ltt_session *session, int tracer_fd) lks->kconsumer_fds_sent = 0; session->kernel_session = lks; - session->kern_session_count++; DBG("Kernel session created (fd: %d)", lks->fd); @@ -211,6 +209,8 @@ int kernel_create_event(struct lttng_event *ev, struct ltt_kernel_channel *chann /* Add event to event list */ cds_list_add(&event->list, &channel->events_list.head); + channel->event_count++; + DBG("Event %s created (fd: %d)", ev->name, event->fd); return 0; @@ -283,6 +283,9 @@ int kernel_enable_event(struct ltt_kernel_event *event) ret = kernctl_enable(event->fd); if (ret < 0) { perror("enable event ioctl"); + if (errno == EEXIST) { + ret = -EEXIST; + } goto error; } @@ -325,13 +328,13 @@ error: * Create kernel metadata, open from the kernel tracer and add it to the * kernel session. */ -int kernel_open_metadata(struct ltt_kernel_session *session) +int kernel_open_metadata(struct ltt_kernel_session *session, char *path) { int ret; struct ltt_kernel_metadata *lkm; /* Allocate kernel metadata */ - lkm = trace_create_kernel_metadata(); + lkm = trace_create_kernel_metadata(path); if (lkm == NULL) { goto error; } @@ -542,18 +545,16 @@ error: } /* - * kernel_list_events - * - * Get the event list from the kernel tracer and return that list in the CTF - * format. + * Get the event list from the kernel tracer and return the number of elements. */ -ssize_t kernel_list_events(int tracer_fd, char **list) +ssize_t kernel_list_events(int tracer_fd, struct lttng_event **events) { - int fd; - char *buf, *line = NULL; - size_t nb, nbmem, total = 0; + int fd, pos; + char *event; + size_t nbmem, count = 0; ssize_t size; FILE *fp; + struct lttng_event *elist; fd = kernctl_tracepoint_list(tracer_fd); if (fd < 0) { @@ -572,29 +573,29 @@ ssize_t kernel_list_events(int tracer_fd, char **list) * See kernel-ctl.h for explanation of this value */ nbmem = KERNEL_EVENT_LIST_SIZE; - buf = malloc(nbmem); + elist = malloc(sizeof(struct lttng_event) * nbmem); - while ((size = getline(&line, &nb, fp)) != -1) { - if (total + size > nbmem) { + while ((size = fscanf(fp, "event { name = %m[^;]; };%n\n", &event, &pos)) == 1) { + if (count > nbmem) { DBG("Reallocating event list from %zd to %zd bytes", nbmem, - total + size + KERNEL_EVENT_LIST_SIZE); + nbmem + KERNEL_EVENT_LIST_SIZE); /* Adding the default size again */ - nbmem = total + size + KERNEL_EVENT_LIST_SIZE; - buf = realloc(buf, nbmem); - if (buf == NULL) { + nbmem += KERNEL_EVENT_LIST_SIZE; + elist = realloc(elist, nbmem); + if (elist == NULL) { perror("realloc list events"); goto error; } } - memcpy(buf + total, line, size); - total += size; + strncpy(elist[count].name, event, strlen(event)); + count++; } - *list = buf; + *events = elist; - DBG("Kernel list events done"); + DBG("Kernel list events done (%ld events)", count); - return total; + return count; error: return -1;