in_tgroup = lttng_check_tracing_group();
}
- if ((uid == 0) || in_tgroup) {
+ if ((uid == 0) || in_tgroup == 1) {
const int ret = lttng_strncpy(sessiond_sock_path,
DEFAULT_GLOBAL_CLIENT_UNIX_SOCK,
sizeof(sessiond_sock_path));
for (i = 0; i < exclusion_count; i++) {
size_t exclusion_len;
- exclusion_len = lttng_strnlen(*(exclusion_list + i),
+ exclusion_len = lttng_strnlen(exclusion_list[i],
LTTNG_SYMBOL_NAME_LEN);
if (exclusion_len == LTTNG_SYMBOL_NAME_LEN) {
/* Exclusion is not NULL-terminated. */
}
ret = lttng_dynamic_buffer_append(&payload.buffer,
- *(exclusion_list + i), LTTNG_SYMBOL_NAME_LEN);
+ exclusion_list[i], exclusion_len);
+ if (ret) {
+ goto mem_error;
+ }
+
+ /*
+ * Padding the rest of the entry with zeros. Every exclusion
+ * entries take LTTNG_SYMBOL_NAME_LEN bytes in the buffer.
+ */
+ ret = lttng_dynamic_buffer_set_size(&payload.buffer,
+ LTTNG_SYMBOL_NAME_LEN * (i + 1));
if (ret) {
goto mem_error;
}
return ret;
}
-int lttng_register_trigger(struct lttng_trigger *trigger)
+static
+int _lttng_register_trigger(struct lttng_trigger *trigger, const char *name,
+ bool generate_name)
{
int ret;
struct lttcomm_session_msg lsm = {
.cmd_type = LTTNG_REGISTER_TRIGGER,
+ .u.trigger.is_trigger_anonymous = !name && !generate_name,
};
struct lttcomm_session_msg *message_lsm;
struct lttng_payload message;
.uid = LTTNG_OPTIONAL_INIT_VALUE(geteuid()),
.gid = LTTNG_OPTIONAL_INIT_UNSET,
};
+ const char *unused_trigger_name = NULL;
+ enum lttng_trigger_status trigger_status;
lttng_payload_init(&message);
lttng_payload_init(&reply);
goto end;
}
+ trigger_status = lttng_trigger_get_name(trigger, &unused_trigger_name);
+ if (trigger_status != LTTNG_TRIGGER_STATUS_UNSET) {
+ /* Re-using already registered trigger. */
+ ret = -LTTNG_ERR_INVALID;
+ goto end;
+ }
+
+ if (name) {
+ trigger_status = lttng_trigger_set_name(trigger, name);
+ if (trigger_status != LTTNG_TRIGGER_STATUS_OK) {
+ ret = -LTTNG_ERR_NOMEM;
+ goto end;
+ }
+ }
+
if (!trigger->creds.uid.is_set) {
/* Use the client's credentials as the trigger credentials. */
lttng_trigger_set_credentials(trigger, &user_creds);
if (!lttng_credentials_is_equal_uid(trigger_creds, &user_creds)) {
if (lttng_credentials_get_uid(&user_creds) != 0) {
ret = -LTTNG_ERR_EPERM;
- goto end;
+ goto end_unset_name;
}
}
}
if (!lttng_trigger_validate(trigger)) {
ret = -LTTNG_ERR_INVALID_TRIGGER;
- goto end;
+ goto end_unset_name;
}
domain_type = lttng_trigger_get_underlying_domain_type_restriction(
ret = lttng_dynamic_buffer_append(&message.buffer, &lsm, sizeof(lsm));
if (ret) {
ret = -LTTNG_ERR_NOMEM;
- goto end;
+ goto end_unset_name;
}
ret = lttng_trigger_serialize(trigger, &message);
if (ret < 0) {
ret = -LTTNG_ERR_UNK;
- goto end;
+ goto end_unset_name;
}
/*
&message_view);
ret = lttng_ctl_ask_sessiond_payload(&message_view, &reply);
if (ret < 0) {
- goto end;
+ goto end_unset_name;
}
}
ret = lttng_trigger_create_from_payload(
&reply_view, &reply_trigger);
if (ret < 0) {
- ret = -LTTNG_ERR_FATAL;
- goto end;
+ ret = -LTTNG_ERR_INVALID_PROTOCOL;
+ goto end_unset_name;
}
}
- ret = lttng_trigger_assign_name(trigger, reply_trigger);
- if (ret < 0) {
- ret = -LTTNG_ERR_FATAL;
- goto end;
+ if (name || generate_name) {
+ ret = lttng_trigger_assign_name(trigger, reply_trigger);
+ if (ret < 0) {
+ ret = -LTTNG_ERR_NOMEM;
+ goto end;
+ }
}
ret = 0;
+ goto end;
+
+end_unset_name:
+ trigger_status = lttng_trigger_set_name(trigger, NULL);
+ if (trigger_status != LTTNG_TRIGGER_STATUS_OK) {
+ ret = -LTTNG_ERR_UNK;
+ }
end:
lttng_payload_reset(&message);
lttng_payload_reset(&reply);
return ret;
}
+int lttng_register_trigger(struct lttng_trigger *trigger)
+{
+ /* Register an anonymous trigger. */
+ return _lttng_register_trigger(trigger, NULL, false);
+}
+
+enum lttng_error_code lttng_register_trigger_with_name(
+ struct lttng_trigger *trigger, const char *name)
+{
+ const int ret = _lttng_register_trigger(trigger, name, false);
+
+ return ret == 0 ? LTTNG_OK : (enum lttng_error_code) -ret;
+}
+
+enum lttng_error_code lttng_register_trigger_with_automatic_name(
+ struct lttng_trigger *trigger)
+{
+ const int ret = _lttng_register_trigger(trigger, false, true);
+
+ return ret == 0 ? LTTNG_OK : (enum lttng_error_code) -ret;
+}
+
enum lttng_error_code lttng_error_query_execute(
const struct lttng_error_query *query,
const struct lttng_endpoint *endpoint,