struct lttng_snapshot_output *output)
{
int ret;
- struct snapshot_output *sout;
+ struct snapshot_output *sout = NULL;
assert(session);
assert(output);
- DBG("Cmd snapshot del output id %" PRIu32 " for session %s", output->id,
- session->name);
-
rcu_read_lock();
/*
goto error;
}
- sout = snapshot_find_output_by_id(output->id, &session->snapshot);
+ if (output->id) {
+ DBG("Cmd snapshot del output id %" PRIu32 " for session %s", output->id,
+ session->name);
+ sout = snapshot_find_output_by_id(output->id, &session->snapshot);
+ } else if (*output->name != '\0') {
+ DBG("Cmd snapshot del output name %s for session %s", output->name,
+ session->name);
+ sout = snapshot_find_output_by_name(output->name, &session->snapshot);
+ }
if (!sout) {
ret = LTTNG_ERR_INVALID;
goto error;
free(obj);
}
+/*
+ * RCU read side lock MUST be acquired before calling this since the returned
+ * pointer is in a RCU hash table.
+ *
+ * Return the reference on success or else NULL.
+ */
+struct snapshot_output *snapshot_find_output_by_name(const char *name,
+ struct snapshot *snapshot)
+{
+ struct lttng_ht_iter iter;
+ struct snapshot_output *output = NULL;
+
+ assert(snapshot);
+ assert(name);
+
+ cds_lfht_for_each_entry(snapshot->output_ht->ht, &iter.iter, output,
+ node.node) {
+ if (!strncmp(output->name, name, strlen(name))) {
+ return output;
+ }
+ }
+
+ /* Not found */
+ return NULL;
+}
+
/*
* RCU read side lock MUST be acquired before calling this since the returned
* pointer is in a RCU hash table.
struct snapshot *snapshot);
struct snapshot_output *snapshot_find_output_by_id(uint32_t id,
struct snapshot *snapshot);
+struct snapshot_output *snapshot_find_output_by_name(const char *name,
+ struct snapshot *snapshot);
#endif /* SNAPSHOT_H */
/*
* Delete output by ID.
*/
-static int del_output(uint32_t id)
+static int del_output(uint32_t id, const char *name)
{
int ret;
struct lttng_snapshot_output *output = NULL;
goto error;
}
- ret = lttng_snapshot_output_set_id(id, output);
+ if (name) {
+ ret = lttng_snapshot_output_set_name(name, output);
+ } else if (id != UINT32_MAX) {
+ ret = lttng_snapshot_output_set_id(id, output);
+ } else {
+ ret = CMD_ERROR;
+ goto error;
+ }
if (ret < 0) {
ret = CMD_FATAL;
goto error;
goto error;
}
- MSG("Snapshot output id %" PRIu32 " successfully deleted for session %s",
- id, current_session_name);
+ if (id != UINT32_MAX) {
+ MSG("Snapshot output id %" PRIu32 " successfully deleted for session %s",
+ id, current_session_name);
+ } else {
+ MSG("Snapshot output %s successfully deleted for session %s",
+ name, current_session_name);
+ }
error:
lttng_snapshot_output_destroy(output);
static int cmd_del_output(int argc, const char **argv)
{
int ret = CMD_SUCCESS;
+ char *name;
+ long id;
if (argc < 2) {
usage(stderr);
goto end;
}
- ret = del_output(atoi(argv[1]));
+ errno = 0;
+ id = strtol(argv[1], &name, 10);
+ if (id == 0 && errno == 0) {
+ ret = del_output(UINT32_MAX, name);
+ } else if (errno == 0 && *name == '\0') {
+ ret = del_output(id, NULL);
+ } else {
+ ERR("Argument %s not recognized", argv[1]);
+ ret = -1;
+ goto end;
+ }
end:
return ret;