Support lttng-modules syscall filtering in enable-event
[lttng-tools.git] / src / lib / lttng-ctl / lttng-ctl.c
index a385d1b9a0a540f589d843b11a78325975cc4aa9..cacae13bb84da3e4033a016c244cbfa970d7172c 100644 (file)
@@ -74,6 +74,7 @@ static int connected;
  */
 int lttng_opt_quiet;
 int lttng_opt_verbose;
+int lttng_opt_mi;
 
 /*
  * Copy string from src to dst and enforce null terminated byte.
@@ -104,6 +105,7 @@ void lttng_ctl_copy_lttng_domain(struct lttng_domain *dst,
                case LTTNG_DOMAIN_KERNEL:
                case LTTNG_DOMAIN_UST:
                case LTTNG_DOMAIN_JUL:
+               case LTTNG_DOMAIN_LOG4J:
                        memcpy(dst, src, sizeof(struct lttng_domain));
                        break;
                default:
@@ -703,7 +705,7 @@ static char *set_jul_filter(const char *filter, struct lttng_event *ev)
        /* Don't add filter for the '*' event. */
        if (ev->name[0] != '*') {
                if (filter) {
-                       err = asprintf(&jul_filter, "%s && logger_name == \"%s\"", filter,
+                       err = asprintf(&jul_filter, "(%s) && (logger_name == \"%s\")", filter,
                                        ev->name);
                } else {
                        err = asprintf(&jul_filter, "logger_name == \"%s\"", ev->name);
@@ -727,7 +729,7 @@ static char *set_jul_filter(const char *filter, struct lttng_event *ev)
                if (filter || jul_filter) {
                        char *new_filter;
 
-                       err = asprintf(&new_filter, "%s && int_loglevel %s %d",
+                       err = asprintf(&new_filter, "(%s) && (int_loglevel %s %d)",
                                        jul_filter ? jul_filter : filter, op,
                                        ev->loglevel);
                        if (jul_filter) {
@@ -824,6 +826,12 @@ static int generate_filter(char *filter_expression,
                ret = -LTTNG_ERR_FILTER_INVAL;
                goto parse_error;
        }
+       /* Validate strings used as literals in the expression */
+       ret = filter_visitor_ir_validate_string(ctx);
+       if (ret) {
+               ret = -LTTNG_ERR_FILTER_INVAL;
+               goto parse_error;
+       }
        dbg_printf("done\n");
 
        dbg_printf("Generating bytecode... ");
@@ -931,7 +939,8 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle,
         * filtering by logger name.
         */
        if (exclusion_count == 0 && filter_expression == NULL &&
-                       handle->domain.type != LTTNG_DOMAIN_JUL) {
+                       (handle->domain.type != LTTNG_DOMAIN_JUL &&
+                               handle->domain.type != LTTNG_DOMAIN_LOG4J)) {
                goto ask_sessiond;
        }
 
@@ -941,8 +950,10 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle,
         */
 
        /* Parse filter expression */
-       if (filter_expression != NULL || handle->domain.type == LTTNG_DOMAIN_JUL) {
-               if (handle->domain.type == LTTNG_DOMAIN_JUL) {
+       if (filter_expression != NULL || handle->domain.type == LTTNG_DOMAIN_JUL
+                       || handle->domain.type == LTTNG_DOMAIN_LOG4J) {
+               if (handle->domain.type == LTTNG_DOMAIN_JUL ||
+                               handle->domain.type == LTTNG_DOMAIN_LOG4J) {
                        char *jul_filter;
 
                        /* Setup JUL filter if needed. */
@@ -973,7 +984,7 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle,
                        + LTTNG_SYMBOL_NAME_LEN * exclusion_count);
        if (!varlen_data) {
                ret = -LTTNG_ERR_EXCLUSION_NOMEM;
-               goto filter_error;
+               goto mem_error;
        }
 
        /* Put exclusion names first in the data */
@@ -1002,19 +1013,19 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle,
                        lsm.u.enable.bytecode_len + lsm.u.enable.expression_len, NULL);
        free(varlen_data);
 
-filter_error:
-       if (filter_expression) {
+mem_error:
+       if (filter_expression && ctx) {
                filter_bytecode_free(ctx);
                filter_ir_free(ctx);
                filter_parser_ctx_free(ctx);
-               if (free_filter_expression) {
-                       /*
-                        * The filter expression has been replaced and must be
-                        * freed as it is not the original filter expression
-                        * received as a parameter.
-                        */
-                       free(filter_expression);
-               }
+       }
+filter_error:
+       if (free_filter_expression) {
+               /*
+                * The filter expression has been replaced and must be freed as it is
+                * not the original filter expression received as a parameter.
+                */
+               free(filter_expression);
        }
 error:
        /*
@@ -1056,7 +1067,7 @@ int lttng_disable_event(struct lttng_handle *handle, const char *name,
 
        lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
 
-       if (name != NULL) {
+       if (name != NULL && *name != '*') {
                lttng_ctl_copy_string(lsm.u.disable.name, name,
                                sizeof(lsm.u.disable.name));
                lsm.cmd_type = LTTNG_DISABLE_EVENT;
This page took 0.026797 seconds and 4 git commands to generate.