/*
- * Copyright (C) 2011 - David Goulet <david.goulet@polymtl.ca>
+ * Copyright (C) 2011 EfficiOS Inc.
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2 only,
- * as published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
*
- * 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.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE
#define _LGPL_SOURCE
#include <popt.h>
#include <stdio.h>
#include <assert.h>
#include <common/mi-lttng.h>
+#include <lttng/domain-internal.h>
#include "../command.h"
-static char *opt_event_list;
static int opt_kernel;
static char *opt_channel_name;
static char *opt_session_name;
static int opt_python;
static int opt_event_type;
+#ifdef LTTNG_EMBED_HELP
+static const char help_msg[] =
+#include <lttng-disable-event.1.h>
+;
+#endif
+
enum {
OPT_HELP = 1,
OPT_TYPE_SYSCALL,
{0, 0, 0, 0, 0, 0, 0}
};
-/*
- * usage
- */
-static void usage(FILE *ofp)
-{
- fprintf(ofp, "usage: lttng disable-event NAME[,NAME2,...] (-k | -u | -j | -l | -p) [OPTIONS]\n");
- fprintf(ofp, "\n");
- fprintf(ofp, "Options:\n");
- fprintf(ofp, " -h, --help Show this help\n");
- fprintf(ofp, " --list-options Simple listing of options\n");
- fprintf(ofp, " -s, --session NAME Apply to session name\n");
- fprintf(ofp, " -c, --channel NAME Apply to this channel\n");
- fprintf(ofp, " -a, --all-events Disable all tracepoints\n");
- fprintf(ofp, " -k, --kernel Apply to the kernel tracer\n");
- fprintf(ofp, " -u, --userspace Apply to the user-space tracer\n");
- fprintf(ofp, " -j, --jul Apply to Java application using JUL\n");
- fprintf(ofp, " -l, --log4j Apply to Java application using LOG4j\n");
- fprintf(ofp, " -p, --python Apply to Python application using logging\n");
- fprintf(ofp, "\n");
- fprintf(ofp, "Event type options (Only supported with kernel domain):\n");
- fprintf(ofp, " --all All event types (default)\n");
- fprintf(ofp, " --tracepoint Tracepoint event\n");
- fprintf(ofp, " --syscall System call event\n");
- fprintf(ofp, " --probe Probe event\n");
- fprintf(ofp, " --function Function event\n");
- fprintf(ofp, "\n");
-}
-
static
const char *print_channel_name(const char *name)
{
* enabled is 0 or 1
* success is 0 or 1
*/
-static int mi_print_event(char *event_name, int enabled, int success)
+static int mi_print_event(const char *event_name, int enabled, int success)
{
int ret;
*
* Disabling event using the lttng API.
*/
-static int disable_events(char *session_name)
+static int disable_events(char *session_name, char *event_list)
{
int ret = CMD_SUCCESS, warn = 0, command_ret = CMD_SUCCESS;
int enabled = 1, success = 1;
enabled = 0;
success = 1;
MSG("All %s events of type %s are disabled in channel %s",
- get_domain_str(dom.type),
+ lttng_domain_type_str(dom.type),
print_event_type(opt_event_type),
print_channel_name(channel_name));
}
}
} else {
/* Strip event list */
- event_name = strtok(opt_event_list, ",");
+ event_name = strtok(event_list, ",");
while (event_name != NULL) {
DBG("Disabling event %s", event_name);
enabled = 1;
} else {
MSG("%s %s of type %s disabled in channel %s for session %s",
- get_domain_str(dom.type),
+ lttng_domain_type_str(dom.type),
event_name,
print_event_type(opt_event_type),
print_channel_name(channel_name),
int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
static poptContext pc;
char *session_name = NULL;
+ char *event_list = NULL;
+ const char *arg_event_list = NULL;
+ const char *leftover = NULL;
int event_type = -1;
pc = poptGetContext(NULL, argc, argv, long_options, 0);
while ((opt = poptGetNextOpt(pc)) != -1) {
switch (opt) {
case OPT_HELP:
- usage(stdout);
+ SHOW_HELP();
goto end;
case OPT_TYPE_SYSCALL:
opt_event_type = LTTNG_EVENT_SYSCALL;
list_cmd_options(stdout, long_options);
goto end;
default:
- usage(stderr);
ret = CMD_UNDEFINED;
goto end;
}
}
ret = print_missing_or_multiple_domains(
- opt_kernel + opt_userspace + opt_jul + opt_log4j + opt_python);
+ opt_kernel + opt_userspace + opt_jul + opt_log4j +
+ opt_python,
+ true);
if (ret) {
ret = CMD_ERROR;
goto end;
if ((opt_userspace || opt_jul || opt_log4j || opt_python)
&& opt_event_type != LTTNG_EVENT_ALL) {
ERR("Disabling userspace and agent (-j | -l | -p) event(s) based on instrumentation type is not supported.\n");
- usage(stderr);
ret = CMD_ERROR;
goto end;
}
- opt_event_list = (char*) poptGetArg(pc);
- if (opt_event_list == NULL && opt_disable_all == 0) {
+ arg_event_list = poptGetArg(pc);
+ if (arg_event_list == NULL && opt_disable_all == 0) {
ERR("Missing event name(s).\n");
- usage(stderr);
+ ret = CMD_ERROR;
+ goto end;
+ }
+
+ if (opt_disable_all == 0) {
+ event_list = strdup(arg_event_list);
+ if (event_list == NULL) {
+ PERROR("Failed to copy event name(s)");
+ ret = CMD_ERROR;
+ goto end;
+ }
+ }
+
+ leftover = poptGetArg(pc);
+ if (leftover) {
+ ERR("Unknown argument: %s", leftover);
ret = CMD_ERROR;
goto end;
}
}
}
- command_ret = disable_events(session_name);
+ command_ret = disable_events(session_name, event_list);
if (command_ret) {
success = 0;
}
free(session_name);
}
+ free(event_list);
+
/* Mi clean-up */
if (writer && mi_lttng_writer_destroy(writer)) {
/* Preserve original error code */
ret = ret ? ret : LTTNG_ERR_MI_IO_FAIL;
}
- /* Overwrite ret if an error occured in disable_events */
+ /* Overwrite ret if an error occurred in disable_events */
ret = command_ret ? command_ret : ret;
poptFreeContext(pc);