case LTTNG_BUFFER_PER_UID:
{
struct buffer_reg_uid *reg_uid = buffer_reg_uid_find(
- ua_sess->tracing_id, ua_sess->bits_per_long, ua_sess->uid);
+ ua_sess->tracing_id, ua_sess->bits_per_long,
+ ua_sess->real_credentials.uid);
if (!reg_uid) {
goto error;
}
static void shadow_copy_session(struct ust_app_session *ua_sess,
struct ltt_ust_session *usess, struct ust_app *app)
{
- time_t rawtime;
struct tm *timeinfo;
char datetime[16];
int ret;
char tmp_shm_path[PATH_MAX];
- /* Get date and time for unique app path */
- time(&rawtime);
- timeinfo = localtime(&rawtime);
+ timeinfo = localtime(&app->registration_time);
strftime(datetime, sizeof(datetime), "%Y%m%d-%H%M%S", timeinfo);
DBG2("Shadow copy of session handle %d", ua_sess->handle);
ua_sess->tracing_id = usess->id;
ua_sess->id = get_next_session_id();
- ua_sess->uid = app->uid;
- ua_sess->gid = app->gid;
- ua_sess->euid = usess->uid;
- ua_sess->egid = usess->gid;
+ ua_sess->real_credentials.uid = app->uid;
+ ua_sess->real_credentials.gid = app->gid;
+ ua_sess->effective_credentials.uid = usess->uid;
+ ua_sess->effective_credentials.gid = usess->gid;
ua_sess->buffer_type = usess->buffer_type;
ua_sess->bits_per_long = app->bits_per_long;
break;
case LTTNG_BUFFER_PER_UID:
ret = snprintf(ua_sess->path, sizeof(ua_sess->path),
- DEFAULT_UST_TRACE_UID_PATH, ua_sess->uid, app->bits_per_long);
+ DEFAULT_UST_TRACE_UID_PATH,
+ ua_sess->real_credentials.uid,
+ app->bits_per_long);
break;
default:
assert(0);
app->bits_per_long, app->uint8_t_alignment,
app->uint16_t_alignment, app->uint32_t_alignment,
app->uint64_t_alignment, app->long_alignment,
- app->byte_order, app->version.major,
- app->version.minor, reg_pid->root_shm_path,
- reg_pid->shm_path,
- ua_sess->euid, ua_sess->egid);
+ app->byte_order, app->version.major, app->version.minor,
+ reg_pid->root_shm_path, reg_pid->shm_path,
+ ua_sess->effective_credentials.uid,
+ ua_sess->effective_credentials.gid, ua_sess->tracing_id,
+ app->uid);
if (ret < 0) {
/*
* reg_pid->registry->reg.ust is NULL upon error, so we need to
app->uint64_t_alignment, app->long_alignment,
app->byte_order, app->version.major,
app->version.minor, reg_uid->root_shm_path,
- reg_uid->shm_path, usess->uid, usess->gid);
+ reg_uid->shm_path, usess->uid, usess->gid,
+ ua_sess->tracing_id, app->uid);
if (ret < 0) {
/*
* reg_uid->registry->reg.ust is NULL upon error, so we need to
notification_ret = notification_thread_command_add_channel(
notification_thread_handle, session->name,
- ua_sess->euid, ua_sess->egid,
- ua_chan->name,
- ua_chan->key,
- LTTNG_DOMAIN_UST,
+ ua_sess->effective_credentials.uid,
+ ua_sess->effective_credentials.gid, ua_chan->name,
+ ua_chan->key, LTTNG_DOMAIN_UST,
ua_chan->attr.subbuf_size * ua_chan->attr.num_subbuf);
if (notification_ret != LTTNG_OK) {
ret = - (int) notification_ret;
cmd_ret = notification_thread_command_add_channel(
notification_thread_handle, session->name,
- ua_sess->euid, ua_sess->egid,
- ua_chan->name,
- ua_chan->key,
- LTTNG_DOMAIN_UST,
+ ua_sess->effective_credentials.uid,
+ ua_sess->effective_credentials.gid, ua_chan->name,
+ ua_chan->key, LTTNG_DOMAIN_UST,
ua_chan->attr.subbuf_size * ua_chan->attr.num_subbuf);
if (cmd_ret != LTTNG_OK) {
ret = - (int) cmd_ret;
assert(app);
assert(app->notify_sock >= 0);
+ app->registration_time = time(NULL);
+
rcu_read_lock();
/*
*/
enum lttng_error_code ust_app_snapshot_record(
const struct ltt_ust_session *usess,
- const struct snapshot_output *output, int wait,
+ const struct consumer_output *output, int wait,
uint64_t nb_packets_per_stream)
{
int ret = 0;
enum lttng_error_code status = LTTNG_OK;
struct lttng_ht_iter iter;
struct ust_app *app;
- char pathname[PATH_MAX];
assert(usess);
assert(output);
cds_list_for_each_entry(reg, &usess->buffer_reg_uid_list, lnode) {
struct buffer_reg_channel *reg_chan;
struct consumer_socket *socket;
+ char *trace_path = NULL;
+ char pathname[PATH_MAX];
if (!reg->registry->reg.ust->metadata_key) {
/* Skip since no metadata is present */
status = LTTNG_ERR_INVALID;
goto error;
}
-
+ trace_path = setup_channel_trace_path(usess->consumer, pathname);
+ if (!trace_path) {
+ status = LTTNG_ERR_INVALID;
+ goto error;
+ }
/* Add the UST default trace dir to path. */
cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter,
reg_chan, node.node) {
status = consumer_snapshot_channel(socket,
reg_chan->consumer_key,
output, 0, usess->uid,
- usess->gid, pathname, wait,
+ usess->gid, trace_path, wait,
nb_packets_per_stream);
if (status != LTTNG_OK) {
+ free(trace_path);
goto error;
}
}
status = consumer_snapshot_channel(socket,
reg->registry->reg.ust->metadata_key, output, 1,
- usess->uid, usess->gid, pathname, wait, 0);
+ usess->uid, usess->gid, trace_path, wait, 0);
+ free(trace_path);
if (status != LTTNG_OK) {
goto error;
}
struct ust_app_channel *ua_chan;
struct ust_app_session *ua_sess;
struct ust_registry_session *registry;
+ char *trace_path = NULL;
+ char pathname[PATH_MAX];
ua_sess = lookup_session_by_app(usess, app);
if (!ua_sess) {
/* Get the right consumer socket for the application. */
socket = consumer_find_socket_by_bitness(app->bits_per_long,
- output->consumer);
+ output);
if (!socket) {
status = LTTNG_ERR_INVALID;
goto error;
PERROR("snprintf snapshot path");
goto error;
}
-
+ trace_path = setup_channel_trace_path(usess->consumer, pathname);
+ if (!trace_path) {
+ status = LTTNG_ERR_INVALID;
+ goto error;
+ }
cds_lfht_for_each_entry(ua_sess->channels->ht, &chan_iter.iter,
ua_chan, node.node) {
status = consumer_snapshot_channel(socket,
- ua_chan->key, output,
- 0, ua_sess->euid, ua_sess->egid,
- pathname, wait,
+ ua_chan->key, output, 0,
+ ua_sess->effective_credentials
+ .uid,
+ ua_sess->effective_credentials
+ .gid,
+ trace_path, wait,
nb_packets_per_stream);
switch (status) {
case LTTNG_OK:
break;
case LTTNG_ERR_CHAN_NOT_FOUND:
+ free(trace_path);
continue;
default:
+ free(trace_path);
goto error;
}
}
continue;
}
status = consumer_snapshot_channel(socket,
- registry->metadata_key, output,
- 1, ua_sess->euid, ua_sess->egid,
- pathname, wait, 0);
+ registry->metadata_key, output, 1,
+ ua_sess->effective_credentials.uid,
+ ua_sess->effective_credentials.gid,
+ trace_path, wait, 0);
+ free(trace_path);
switch (status) {
case LTTNG_OK:
break;
/* Rotate the data channels. */
cds_lfht_for_each_entry(ua_sess->channels->ht, &chan_iter.iter,
ua_chan, node.node) {
- ret = consumer_rotate_channel(socket, ua_chan->key,
- ua_sess->euid, ua_sess->egid,
+ ret = consumer_rotate_channel(socket,
+ ua_chan->key,
+ ua_sess->effective_credentials
+ .uid,
+ ua_sess->effective_credentials
+ .gid,
ua_sess->consumer,
/* is_metadata_channel */ false);
if (ret < 0) {
/* Rotate the metadata channel. */
(void) push_metadata(registry, usess->consumer);
- ret = consumer_rotate_channel(socket, registry->metadata_key,
- ua_sess->euid, ua_sess->egid,
+ ret = consumer_rotate_channel(socket,
+ registry->metadata_key,
+ ua_sess->effective_credentials.uid,
+ ua_sess->effective_credentials.gid,
ua_sess->consumer,
/* is_metadata_channel */ true);
if (ret < 0) {