tools/tracing/rtla/src/actions.c

Source file repositories/reference/linux-study-clean/tools/tracing/rtla/src/actions.c

File Facts

System
Linux kernel
Corpus path
tools/tracing/rtla/src/actions.c
Extension
.c
Size
6022 bytes
Lines
287
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

while (token != NULL) {
			arg_value = extract_arg(token, "num");
			if (arg_value) {
				if (strtoi(arg_value, &signal))
					return -1;
			} else {
				arg_value = extract_arg(token, "pid");
				if (arg_value) {
					if (strncmp_static(arg_value, "parent") == 0)
						pid = -1;
					else if (strtoi(arg_value, &pid))
						return -1;
				} else {
					/* Invalid argument */
					return -1;
				}
			}

			token = strtok(NULL, ",");
		}

		if (!signal || !pid)
			/* Missing argument */
			return -1;

		actions_add_signal(self, signal, pid);
		break;
	case ACTION_SHELL:
		if (token == NULL)
			return -1;
		arg_value = extract_arg(token, "command");
		if (!arg_value)
			return -1;
		actions_add_shell(self, arg_value);
		break;
	case ACTION_CONTINUE:
		/* Takes no argument */
		if (token != NULL)
			return -1;
		actions_add_continue(self);
		break;
	default:
		return -1;
	}

	return 0;
}

/*
 * actions_perform - perform all actions
 */
int
actions_perform(struct actions *self)
{
	int pid, retval;
	const struct action *action;

	self->continue_flag = false;

	for_each_action(self, action) {
		switch (action->type) {
		case ACTION_TRACE_OUTPUT:
			retval = save_trace_to_file(self->trace_output_inst, action->trace_output);
			if (retval) {
				err_msg("Error saving trace\n");
				return retval;
			}
			break;
		case ACTION_SIGNAL:
			if (action->pid == -1)
				pid = getppid();
			else
				pid = action->pid;
			retval = kill(pid, action->signal);
			if (retval) {
				err_msg("Error sending signal\n");
				return retval;
			}
			break;
		case ACTION_SHELL:
			retval = system(action->command);
			if (retval)
				return retval;
			break;
		case ACTION_CONTINUE:
			self->continue_flag = true;
			return 0;
		default:
			break;
		}

Annotation

Implementation Notes