#define _GNU_SOURCE
#include <errno.h>
+#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
}
lks->fd = ret;
+ /* Prevent fd duplication after execlp() */
+ ret = fcntl(lks->fd, F_SETFD, FD_CLOEXEC);
+ if (ret < 0) {
+ perror("fcntl session fd");
+ }
+
lks->kconsumer_fds_sent = 0;
session->kernel_session = lks;
session->kern_session_count++;
/* Setup the channel fd */
lkc->fd = ret;
+ /* Prevent fd duplication after execlp() */
+ ret = fcntl(lkc->fd, F_SETFD, FD_CLOEXEC);
+ if (ret < 0) {
+ perror("fcntl session fd");
+ }
+
/* Add channel to session */
cds_list_add(&lkc->list, &session->channel_list.head);
session->channel_count++;
ret = kernctl_create_event(channel->fd, event->event);
if (ret < 0) {
- ERR("Unable to enable event %s for channel %s", ev->name, channel->channel->name);
- goto error;
+ perror("create event ioctl");
+ goto free_event;
}
event->fd = ret;
+ event->enabled = 1;
+ /* Prevent fd duplication after execlp() */
+ ret = fcntl(event->fd, F_SETFD, FD_CLOEXEC);
+ if (ret < 0) {
+ perror("fcntl session fd");
+ }
+
/* Add event to event list */
cds_list_add(&event->list, &channel->events_list.head);
- DBG("Event %s enabled (fd: %d)", ev->name, event->fd);
+ DBG("Event %s created (fd: %d)", ev->name, event->fd);
+
+ return 0;
+
+free_event:
+ free(event);
+error:
+ return -1;
+}
+
+/*
+ * kernel_disable_event
+ *
+ * Disable a kernel event for a specific channel.
+ */
+int kernel_disable_event(char *event_name, struct ltt_kernel_channel *channel)
+{
+ int ret;
+ struct ltt_kernel_event *iter;
+
+ cds_list_for_each_entry(iter, &channel->events_list.head, list) {
+ if (strcmp(iter->event->name, event_name) == 0) {
+ ret = kernctl_disable(iter->fd);
+ if (ret < 0) {
+ perror("disable event ioctl");
+ goto error;
+ }
+
+ iter->enabled = 0;
+ DBG("Kernel event %s disabled (fd: %d)", iter->event->name, iter->fd);
+ break;
+ }
+ }
return 0;
}
lkm->fd = ret;
+ /* Prevent fd duplication after execlp() */
+ ret = fcntl(lkm->fd, F_SETFD, FD_CLOEXEC);
+ if (ret < 0) {
+ perror("fcntl session fd");
+ }
+
session->metadata = lkm;
DBG("Kernel metadata opened (fd: %d and path: %s)", lkm->fd, lkm->pathname);
}
lks->fd = ret;
+ /* Prevent fd duplication after execlp() */
+ ret = fcntl(lks->fd, F_SETFD, FD_CLOEXEC);
+ if (ret < 0) {
+ perror("fcntl session fd");
+ }
+
ret = asprintf(&lks->pathname, "%s/trace_%d",
channel->pathname, channel->stream_count);
if (ret < 0) {
DBG("Kernel metadata stream created (fd: %d)", ret);
session->metadata_stream_fd = ret;
+ /* Prevent fd duplication after execlp() */
+ ret = fcntl(session->metadata_stream_fd, F_SETFD, FD_CLOEXEC);
+ if (ret < 0) {
+ perror("fcntl session fd");
+ }
return 0;