int count = 0;
int *pid_list = NULL;
char *pid_string = NULL;
+ char *endptr;
if (all && _pid_string) {
ERR("An empty PID string is expected with --all");
while (one_pid_str != NULL) {
unsigned long v;
- v = strtoul(one_pid_str, NULL, 10);
+ errno = 0;
+ v = strtoul(one_pid_str, &endptr, 10);
if ((v == 0 && errno == EINVAL)
- || (v == ULONG_MAX && errno == ERANGE)) {
+ || (v == ULONG_MAX && errno == ERANGE)
+ || (*one_pid_str != '\0' && *endptr != '\0')){
ERR("Error parsing PID %s", one_pid_str);
retval = CMD_ERROR;
goto error;
}
+
if ((long) v > INT_MAX || (int) v < 0) {
ERR("Invalid PID value %ld", (long) v);
retval = CMD_ERROR;
}
static
-int track_untrack_pid(enum cmd_type cmd_type, const char *cmd_str,
+enum cmd_error_code track_untrack_pid(enum cmd_type cmd_type, const char *cmd_str,
const char *session_name, const char *pid_string,
int all, struct mi_writer *writer)
{
- int ret, retval = CMD_SUCCESS, i;
+ int ret, success = 1 , i;
+ enum cmd_error_code retval = CMD_SUCCESS;
int *pid_list = NULL;
int nr_pids;
struct lttng_domain dom;
}
if (writer) {
- /* Open pids element */
- ret = mi_lttng_writer_open_element(writer, config_element_pids);
+ /* Open process element */
+ ret = mi_lttng_targets_open(writer);
if (ret) {
retval = CMD_ERROR;
goto end;
}
}
- /* TODO: MI */
for (i = 0; i < nr_pids; i++) {
DBG("%s PID %d", cmd_str, pid_list[i]);
ret = lib_func(handle, pid_list[i]);
if (ret) {
- retval = CMD_ERROR;
- goto end;
+ switch (-ret) {
+ case LTTNG_ERR_PID_TRACKED:
+ WARN("PID %i already tracked in session %s",
+ pid_list[i], session_name);
+ success = 1;
+ retval = CMD_SUCCESS;
+ break;
+ case LTTNG_ERR_PID_NOT_TRACKED:
+ WARN("PID %i not tracked in session %s",
+ pid_list[i], session_name);
+ success = 1;
+ retval = CMD_SUCCESS;
+ break;
+ default:
+ ERR("%s", lttng_strerror(ret));
+ success = 0;
+ retval = CMD_ERROR;
+ break;
+ }
+ } else {
+ MSG("PID %i %sed in session %s",
+ pid_list[i], cmd_str, session_name);
+ success = 1;
+ }
+
+ /* Mi */
+ if (writer) {
+ ret = mi_lttng_pid_target(writer, pid_list[i], 1);
+ if (ret) {
+ retval = CMD_ERROR;
+ goto end;
+ }
+
+ ret = mi_lttng_writer_write_element_bool(writer,
+ mi_lttng_element_success, success);
+ if (ret) {
+ retval = CMD_ERROR;
+ goto end;
+ }
+
+ ret = mi_lttng_writer_close_element(writer);
+ if (ret) {
+ retval = CMD_ERROR;
+ goto end;
+ }
}
}
if (writer) {
- /* Close pids element */
+ /* Close targets element */
ret = mi_lttng_writer_close_element(writer);
if (ret) {
retval = CMD_ERROR;
}
}
- /* SUCCESS */
end:
if (handle) {
lttng_destroy_handle(handle);
int cmd_track_untrack(enum cmd_type cmd_type, const char *cmd_str,
int argc, const char **argv)
{
- int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS;
+ int opt, ret = 0;
+ enum cmd_error_code command_ret = CMD_SUCCESS;
int success = 1;
static poptContext pc;
char *session_name = NULL;
if (argc < 1) {
usage(stderr, cmd_str);
- ret = CMD_ERROR;
+ command_ret = CMD_ERROR;
goto end;
}
break;
default:
usage(stderr, cmd_str);
- ret = CMD_UNDEFINED;
+ command_ret = CMD_UNDEFINED;
goto end;
}
}
if (!(opt_userspace ^ opt_kernel)) {
ERR("Exactly one of -u or -k needs to be specified.");
usage(stderr, cmd_str);
- ret = CMD_ERROR;
+ command_ret = CMD_ERROR;
goto end;
}
if (!opt_session_name) {
session_name = get_session_name();
if (session_name == NULL) {
- ret = CMD_ERROR;
+ command_ret = CMD_ERROR;
goto end;
}
} else {
if (!opt_pid) {
ERR("Please specify at least one tracker with its expected arguments");
usage(stderr, cmd_str);
- ret = CMD_ERROR;
+ command_ret = CMD_ERROR;
goto end;
}
if (lttng_opt_mi) {
writer = mi_lttng_writer_create(fileno(stdout), lttng_opt_mi);
if (!writer) {
- ret = CMD_ERROR;
+ command_ret = CMD_ERROR;
goto end;
}
}
ret = mi_lttng_writer_command_open(writer,
get_mi_element_command(cmd_type));
if (ret) {
- ret = CMD_ERROR;
+ command_ret = CMD_ERROR;
goto end;
}
ret = mi_lttng_writer_open_element(writer,
mi_lttng_element_command_output);
if (ret) {
- ret = CMD_ERROR;
+ command_ret = CMD_ERROR;
goto end;
}
}
command_ret = track_untrack_pid(cmd_type,
cmd_str, session_name, opt_pid_string,
opt_all, writer);
- if (command_ret) {
+ if (command_ret != CMD_SUCCESS) {
success = 0;
}
/* Close output element */
ret = mi_lttng_writer_close_element(writer);
if (ret) {
- ret = CMD_ERROR;
+ command_ret = CMD_ERROR;
goto end;
}
ret = mi_lttng_writer_write_element_bool(writer,
mi_lttng_element_command_success, success);
if (ret) {
- ret = CMD_ERROR;
+ command_ret = CMD_ERROR;
goto end;
}
/* Command element close */
ret = mi_lttng_writer_command_close(writer);
if (ret) {
- ret = CMD_ERROR;
+ command_ret = CMD_ERROR;
goto end;
}
}
/* Mi clean-up */
if (writer && mi_lttng_writer_destroy(writer)) {
/* Preserve original error code */
- ret = ret ? ret : LTTNG_ERR_MI_IO_FAIL;
+ command_ret = CMD_ERROR;
}
- /* Overwrite ret if an error occurred during track() */
- ret = command_ret ? command_ret : ret;
-
poptFreeContext(pc);
- return ret;
+ return (int) command_ret;
}
int cmd_track(int argc, const char **argv)