1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef _PERF_TARGET_H
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define _PERF_TARGET_H
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdbool.h>
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/types.h>
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_target {
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const char   *pid;
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const char   *tid;
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const char   *cpu_list;
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	const char   *uid_str;
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	uid_t	     uid;
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bool	     system_wide;
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bool	     uses_mmap;
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_target_errno {
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_ERRNO_TARGET__SUCCESS		= 0,
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/*
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * Choose an arbitrary negative big number not to clash with standard
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * errno since SUS requires the errno has distinct positive values.
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * See 'Issue 6' in the link below.
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 *
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	 */
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__PERF_ERRNO_TARGET__START		= -10000,
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/* for perf_target__validate() */
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_ERRNO_TARGET__PID_OVERRIDE_CPU	= __PERF_ERRNO_TARGET__START,
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_ERRNO_TARGET__PID_OVERRIDE_UID,
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_ERRNO_TARGET__UID_OVERRIDE_CPU,
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_ERRNO_TARGET__PID_OVERRIDE_SYSTEM,
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_ERRNO_TARGET__UID_OVERRIDE_SYSTEM,
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	/* for perf_target__parse_uid() */
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_ERRNO_TARGET__INVALID_UID,
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	PERF_ERRNO_TARGET__USER_NOT_FOUND,
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	__PERF_ERRNO_TARGET__END,
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_target_errno perf_target__validate(struct perf_target *target);
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum perf_target_errno perf_target__parse_uid(struct perf_target *target);
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_target__strerror(struct perf_target *target, int errnum, char *buf,
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			  size_t buflen);
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline bool perf_target__has_task(struct perf_target *target)
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return target->tid || target->pid || target->uid_str;
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline bool perf_target__has_cpu(struct perf_target *target)
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return target->system_wide || target->cpu_list;
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline bool perf_target__none(struct perf_target *target)
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return !perf_target__has_task(target) && !perf_target__has_cpu(target);
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* _PERF_TARGET_H */
66