Mirror of the lttng-dev mailing list
 help / color / mirror / Atom feed
From: jp_ikaheimonen@mentor.com (JP Ikaheimonen)
Subject: [lttng-dev] [PATCH lttng-tools 24/28] Add a function to check for legal exclusions
Date: Thu,  7 Nov 2013 12:22:03 +0200	[thread overview]
Message-ID: <1383819727-6843-5-git-send-email-jp_ikaheimonen@mentor.com> (raw)
In-Reply-To: <1383819727-6843-1-git-send-email-jp_ikaheimonen@mentor.com>

Add a function check_exclusion_subsets() that checks the event name
against a given list of exclusion names. Report warnings and/or errors
if an exclusion is not a proper subset of the event.

Return a newly allocated list of newly allocated exclusion name strings,
the count of items in that list, and an error code.

Signed-off-by: JP Ikaheimonen <jp_ikaheimonen at mentor.com>
---
 src/bin/lttng/commands/enable_events.c | 88 ++++++++++++++++++++++++++++++++++
 1 file changed, 88 insertions(+)

diff --git a/src/bin/lttng/commands/enable_events.c b/src/bin/lttng/commands/enable_events.c
index a363c3e..f88f53f 100644
--- a/src/bin/lttng/commands/enable_events.c
+++ b/src/bin/lttng/commands/enable_events.c
@@ -337,6 +337,94 @@ const char *print_raw_channel_name(const char *name)
 }
 
 /*
+ * Compare list of exclusions against an event name.
+ * Return a list of legal exclusion names.
+ * Produce an error or a warning about others (depending on the situation)
+ */
+static
+int check_exclusion_subsets(const char *event_name,
+		const char *exclusions,
+		int *exclusion_count_ptr,
+		char ***exclusion_list_ptr)
+{
+	const char *excluder_ptr;
+	const char *event_ptr;
+	const char *next_excluder;
+	int excluder_length;
+	int exclusion_count = 0;
+	char **exclusion_list = NULL;
+	int ret = CMD_SUCCESS;
+
+	if (event_name[strlen(event_name) - 1] != '*') {
+		ERR("Event %s: Excluders can only be used with wildcarded events", event_name);
+		goto error;
+	}
+
+	next_excluder = exclusions;
+	while (*next_excluder != 0) {
+		event_ptr = event_name;
+		excluder_ptr = next_excluder;
+		excluder_length = strcspn(next_excluder, ",");
+
+		/* Scan both the excluder and the event letter by letter */
+		while (1) {
+			char e, x;
+
+			e = *event_ptr;
+			x = *excluder_ptr;
+
+			if (x == '*') {
+				/* Event is a subset of the excluder */
+				ERR("Event %s: %.*s excludes all events from %s",
+						event_name,
+						excluder_length,
+						next_excluder,
+						event_name);
+				goto error;
+			}
+			if (e == '*') {
+				/* Excluder is a proper subset of event */
+				exclusion_count++;
+				exclusion_list = realloc(exclusion_list, sizeof(char **) * exclusion_count);
+				exclusion_list[exclusion_count - 1] = strndup(next_excluder, excluder_length);
+
+				break;
+			}
+			if (x != e) {
+				/* Excluder and event sets have no common elements */
+				WARN("Event %s: %.*s does not exclude any events from %s",
+						event_name,
+						excluder_length,
+						next_excluder,
+						event_name);
+				break;
+			}
+			excluder_ptr++;
+			event_ptr++;
+		}
+		/* next excluder */
+		next_excluder += excluder_length;
+		if (*next_excluder == ',') {
+			next_excluder++;
+		}
+	}
+	goto end;
+error:
+	while (exclusion_count--) {
+		free(exclusion_list[exclusion_count]);
+	}
+	if (exclusion_list != NULL) {
+		free(exclusion_list);
+	}
+	exclusion_list = NULL;
+	exclusion_count = 0;
+	ret = CMD_ERROR;
+end:
+	*exclusion_count_ptr = exclusion_count;
+	*exclusion_list_ptr = exclusion_list;
+	return ret;
+}
+/*
  * Enabling event using the lttng API.
  */
 static int enable_events(char *session_name)
-- 
1.8.1.2




  parent reply	other threads:[~2013-11-07 10:22 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-07 10:21 [lttng-dev] [PATCH lttng-tools 20/28] Send enable-event commands with exclusion data JP Ikaheimonen
2013-11-07 10:22 ` [lttng-dev] [PATCH lttng-tools 21/28] Collate lttng_enable_event* code JP Ikaheimonen
2013-11-07 10:22 ` [lttng-dev] [PATCH lttng-tools 22/28] Add -exclude option to enable-event command JP Ikaheimonen
2013-11-07 10:22 ` [lttng-dev] [PATCH lttng-tools 23/28] Add usage for --exclude option JP Ikaheimonen
2013-11-07 10:22 ` JP Ikaheimonen [this message]
2013-11-07 10:22 ` [lttng-dev] [PATCH lttng-tools 25/28] Parse exclusions and forward them to the control handler JP Ikaheimonen
2013-11-07 10:22 ` [lttng-dev] [PATCH lttng-tools 26/28] Detect and report exclusion option errors JP Ikaheimonen
2013-11-07 10:22 ` [lttng-dev] [PATCH lttng-tools 27/28] Add exclusion names to diagnostic printouts JP Ikaheimonen
2013-11-07 10:22 ` [lttng-dev] [PATCH lttng-tools 28/28] When listing events, show exclusions if they exist JP Ikaheimonen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1383819727-6843-5-git-send-email-jp_ikaheimonen@mentor.com \
    --to=jp_ikaheimonen@mentor.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox