LTTNG_HIDDEN
int lttng_check_tracing_group(void)
{
- struct group *grp_tracing; /* no free(). See getgrnam(3) */
- gid_t *grp_list;
+ gid_t *grp_list, tracing_gid;
int grp_list_size, grp_id, i;
int ret = -1;
const char *grp_name = tracing_group;
/* Get GID of group 'tracing' */
- grp_tracing = getgrnam(grp_name);
- if (!grp_tracing) {
+ if (utils_get_group_id(grp_name, false, &tracing_gid)) {
/* If grp_tracing is NULL, the group does not exist. */
goto end;
}
}
for (i = 0; i < grp_list_size; i++) {
- if (grp_list[i] == grp_tracing->gr_gid) {
+ if (grp_list[i] == tracing_gid) {
ret = 1;
break;
}
assert(ev);
/* Don't add filter for the '*' event. */
- if (ev->name[0] != '*') {
+ if (strcmp(ev->name, "*") != 0) {
if (filter) {
err = asprintf(&agent_filter, "(%s) && (logger_name == \"%s\")", filter,
ev->name);
ret = -LTTNG_ERR_FILTER_INVAL;
goto parse_error;
}
+
+ /* Normalize globbing patterns in the expression. */
+ ret = filter_visitor_ir_normalize_glob_patterns(ctx);
+ if (ret) {
+ 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;
}
+
+ /* Validate globbing patterns in the expression. */
+ ret = filter_visitor_ir_validate_globbing(ctx);
+ if (ret) {
+ ret = -LTTNG_ERR_FILTER_INVAL;
+ goto parse_error;
+ }
+
dbg_printf("done\n");
dbg_printf("Generating bytecode... ");
void lttng_channel_set_default_attr(struct lttng_domain *domain,
struct lttng_channel_attr *attr)
{
- struct lttng_channel_extended *extended =
- (struct lttng_channel_extended *) attr->extended.ptr;
+ struct lttng_channel_extended *extended;
/* Safety check */
if (attr == NULL || domain == NULL) {
return;
}
+ extended = (struct lttng_channel_extended *) attr->extended.ptr;
memset(attr, 0, sizeof(struct lttng_channel_attr));
/* Same for all domains. */
if (extended) {
extended->monitor_timer_interval =
DEFAULT_KERNEL_CHANNEL_MONITOR_TIMER;
+ extended->blocking_timeout =
+ DEFAULT_KERNEL_CHANNEL_BLOCKING_TIMEOUT;
}
break;
case LTTNG_DOMAIN_UST:
if (extended) {
extended->monitor_timer_interval =
DEFAULT_UST_UID_CHANNEL_MONITOR_TIMER;
+ extended->blocking_timeout =
+ DEFAULT_UST_UID_CHANNEL_BLOCKING_TIMEOUT;
}
break;
case LTTNG_BUFFER_PER_PID:
if (extended) {
extended->monitor_timer_interval =
DEFAULT_UST_PID_CHANNEL_MONITOR_TIMER;
+ extended->blocking_timeout =
+ DEFAULT_UST_PID_CHANNEL_BLOCKING_TIMEOUT;
}
break;
}
return ret;
}
+int lttng_channel_get_blocking_timeout(struct lttng_channel *chan,
+ int64_t *blocking_timeout)
+{
+ int ret = 0;
+
+ if (!chan || !blocking_timeout) {
+ ret = -LTTNG_ERR_INVALID;
+ goto end;
+ }
+
+ if (!chan->attr.extended.ptr) {
+ ret = -LTTNG_ERR_INVALID;
+ goto end;
+ }
+
+ *blocking_timeout = ((struct lttng_channel_extended *)
+ chan->attr.extended.ptr)->blocking_timeout;
+end:
+ return ret;
+}
+
+int lttng_channel_set_blocking_timeout(struct lttng_channel *chan,
+ int64_t blocking_timeout)
+{
+ int ret = 0;
+ int64_t msec_timeout;
+
+ if (!chan || !chan->attr.extended.ptr) {
+ ret = -LTTNG_ERR_INVALID;
+ goto end;
+ }
+
+ if (blocking_timeout < 0 && blocking_timeout != -1) {
+ ret = -LTTNG_ERR_INVALID;
+ goto end;
+ }
+
+ /*
+ * LTTng-ust's use of poll() to implement this timeout mechanism forces
+ * us to accept a narrower range of values (msecs expressed as a signed
+ * 32-bit integer).
+ */
+ msec_timeout = blocking_timeout / 1000;
+ if (msec_timeout != (int32_t) msec_timeout) {
+ ret = -LTTNG_ERR_INVALID;
+ goto end;
+ }
+
+ ((struct lttng_channel_extended *)
+ chan->attr.extended.ptr)->blocking_timeout =
+ blocking_timeout;
+end:
+ return ret;
+}
+
/*
* Check if session daemon is alive.
*
/* Unexpected payload size */
ret = -LTTNG_ERR_INVALID;
goto end;
+ } else if (!pending) {
+ /* Internal error. */
+ ret = -LTTNG_ERR_UNK;
+ goto end;
}
ret = (int) *pending;
int enabled = 1;
struct lttcomm_session_msg lsm;
size_t nr_pids;
- int32_t *pids;
+ int32_t *pids = NULL;
if (handle == NULL) {
return -LTTNG_ERR_INVALID;
return ret;
}
nr_pids = ret / sizeof(int32_t);
+ if (nr_pids > 0 && !pids) {
+ return -LTTNG_ERR_UNK;
+ }
if (nr_pids == 1 && pids[0] == -1) {
free(pids);
pids = NULL;
}
if (!lttng_trigger_validate(trigger)) {
- ret = -LTTNG_ERR_INVALID;
+ ret = -LTTNG_ERR_INVALID_TRIGGER;
goto end;
}