X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Flib%2Flttng-ctl%2Flttng-ctl.c;h=d72250b1e4041a56ea4612f029e00417f6212cbd;hb=a878d96125906e6660e6ef3d1f970c13a4e22fbd;hp=7efc6bd2ebea7ef007c14a164b43cee48ecc3519;hpb=b0a79813263e65e177c2cca7a352c8b364a02b22;p=lttng-tools.git diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c index 7efc6bd2e..d72250b1e 100644 --- a/src/lib/lttng-ctl/lttng-ctl.c +++ b/src/lib/lttng-ctl/lttng-ctl.c @@ -3,7 +3,7 @@ * * Linux Trace Toolkit Control Library * - * Copyright (C) 2011 David Goulet + * Copyright (C) 2011 EfficiOS Inc. * Copyright (C) 2016 Jérémie Galarneau * * SPDX-License-Identifier: LGPL-2.1-only @@ -388,7 +388,7 @@ static int set_session_daemon_path(void) 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)); @@ -1204,7 +1204,7 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle, 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. */ @@ -1213,7 +1213,17 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle, } 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; } @@ -2092,6 +2102,12 @@ int lttng_list_sessions(struct lttng_session **out_sessions) memset(&lsm, 0, sizeof(lsm)); lsm.cmd_type = LTTNG_LIST_SESSIONS; + /* + * Initialize out_sessions to NULL so it is initialized when + * lttng_list_sessions returns 0, thus allowing *out_sessions to + * be subsequently freed. + */ + *out_sessions = NULL; ret = lttng_ctl_ask_sessiond(&lsm, (void**) &sessions); if (ret <= 0) { goto end; @@ -2104,7 +2120,6 @@ int lttng_list_sessions(struct lttng_session **out_sessions) if (ret % session_size) { ret = -LTTNG_ERR_UNK; free(sessions); - *out_sessions = NULL; goto end; } session_count = (size_t) ret / session_size; @@ -2608,14 +2623,19 @@ end: */ int lttng_set_tracing_group(const char *name) { + char *new_group; if (name == NULL) { return -LTTNG_ERR_INVALID; } - if (asprintf(&tracing_group, "%s", name) < 0) { + if (asprintf(&new_group, "%s", name) < 0) { return -LTTNG_ERR_FATAL; } + free(tracing_group); + tracing_group = new_group; + new_group = NULL; + return 0; } @@ -3082,11 +3102,14 @@ end: 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; @@ -3097,6 +3120,8 @@ int lttng_register_trigger(struct lttng_trigger *trigger) .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); @@ -3106,6 +3131,21 @@ int lttng_register_trigger(struct lttng_trigger *trigger) 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); @@ -3126,14 +3166,14 @@ int lttng_register_trigger(struct lttng_trigger *trigger) 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( @@ -3144,13 +3184,13 @@ int lttng_register_trigger(struct lttng_trigger *trigger) 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; } /* @@ -3170,7 +3210,7 @@ int lttng_register_trigger(struct lttng_trigger *trigger) &message_view); ret = lttng_ctl_ask_sessiond_payload(&message_view, &reply); if (ret < 0) { - goto end; + goto end_unset_name; } } @@ -3182,18 +3222,27 @@ int lttng_register_trigger(struct lttng_trigger *trigger) 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); @@ -3201,6 +3250,28 @@ end: 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,