*
* 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
#include <unistd.h>
#include "lttngerr.h"
-#include "ltt-sessiond.h"
#include "libkernelctl.h"
#include "kernel-ctl.h"
DBG("Adding context to channel %s", chan->channel->name);
ret = kernctl_add_context(chan->fd, ctx);
if (ret < 0) {
- perror("add context ioctl");
+ if (errno != EEXIST) {
+ perror("add context ioctl");
+ } else {
+ /* If EEXIST, we just ignore the error */
+ ret = 0;
+ }
goto error;
}
lks->kconsumer_fds_sent = 0;
session->kernel_session = lks;
- session->kern_session_count++;
DBG("Kernel session created (fd: %d)", lks->fd);
/* 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;
ret = kernctl_enable(event->fd);
if (ret < 0) {
perror("enable event ioctl");
+ if (errno == EEXIST) {
+ ret = -EEXIST;
+ }
goto error;
}
}
}
+/*
+ * kernel_calibrate
+ */
+int kernel_calibrate(int fd, struct lttng_kernel_calibrate *calibrate)
+{
+ int ret;
+
+ ret = kernctl_calibrate(fd, calibrate);
+ if (ret < 0) {
+ perror("calibrate ioctl");
+ return -1;
+ }
+
+ return 0;
+}
+
+
/*
* kernel_metadata_flush_buffer
*
}
/*
- * 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) {
* 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) {
- DBG("Reallocating event list from %zd to %zd bytes", nbmem,
- total + size + KERNEL_EVENT_LIST_SIZE);
+ while ((size = fscanf(fp, "event { name = %m[^;]; };%n\n", &event, &pos)) == 1) {
+ if (count > nbmem) {
+ DBG("Reallocating event list from %zu to %zu bytes", nbmem,
+ 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, LTTNG_SYMBOL_NAME_LEN);
+ elist[count].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
+ count++;
}
- *list = buf;
+ *events = elist;
- DBG("Kernel list events done");
+ DBG("Kernel list events done (%zu events)", count);
- return total;
+ return count;
error:
return -1;