xref: /aosp_15_r20/external/libtracefs/Documentation/libtracefs-instances-file-manip.txt (revision 287e80b3a36113050663245e7f2c00d274188f18)
1*287e80b3SSadaf Ebrahimilibtracefs(3)
2*287e80b3SSadaf Ebrahimi=============
3*287e80b3SSadaf Ebrahimi
4*287e80b3SSadaf EbrahimiNAME
5*287e80b3SSadaf Ebrahimi----
6*287e80b3SSadaf Ebrahimi
7*287e80b3SSadaf Ebrahimitracefs_instance_file_open,
8*287e80b3SSadaf Ebrahimitracefs_instance_file_write, tracefs_instance_file_append, tracefs_instance_file_clear,
9*287e80b3SSadaf Ebrahimitracefs_instance_file_read, tracefs_instance_file_read_number - Work with files in tracing instances.
10*287e80b3SSadaf Ebrahimi
11*287e80b3SSadaf EbrahimiSYNOPSIS
12*287e80b3SSadaf Ebrahimi--------
13*287e80b3SSadaf Ebrahimi[verse]
14*287e80b3SSadaf Ebrahimi--
15*287e80b3SSadaf Ebrahimi*#include <tracefs.h>*
16*287e80b3SSadaf Ebrahimi
17*287e80b3SSadaf Ebrahimiint *tracefs_instance_file_open*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, int _mode_);
18*287e80b3SSadaf Ebrahimiint *tracefs_instance_file_write*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, const char pass:[*]_str_);
19*287e80b3SSadaf Ebrahimiint *tracefs_instance_file_append*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, const char pass:[*]_str_);
20*287e80b3SSadaf Ebrahimiint *tracefs_instance_file_clear*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_);
21*287e80b3SSadaf Ebrahimichar pass:[*]*tracefs_instance_file_read*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, int pass:[*]_psize_);
22*287e80b3SSadaf Ebrahimiint *tracefs_instance_file_read_number*(struct tracefs_instance pass:[*]_instance_, const char pass:[*]_file_, long long int pass:[*]_res_);
23*287e80b3SSadaf Ebrahimi
24*287e80b3SSadaf Ebrahimi--
25*287e80b3SSadaf Ebrahimi
26*287e80b3SSadaf EbrahimiDESCRIPTION
27*287e80b3SSadaf Ebrahimi-----------
28*287e80b3SSadaf EbrahimiThis set of APIs can be used to work with trace files in all trace instances.
29*287e80b3SSadaf EbrahimiEach of these APIs take an _instance_ argument, that can be NULL to act
30*287e80b3SSadaf Ebrahimion the top level instance. Otherwise, it acts on an instance created with
31*287e80b3SSadaf Ebrahimi*tracefs_insance_create*(3)
32*287e80b3SSadaf Ebrahimi
33*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_open()* function opens trace _file_ from given _instance_ and returns
34*287e80b3SSadaf Ebrahimia file descriptor to it. The file access _mode_ can be specified, see *open*(3) for more details.
35*287e80b3SSadaf EbrahimiIf -1 is passed as _mode_, default O_RDWR is used.
36*287e80b3SSadaf Ebrahimi
37*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_write()* function writes a string _str_ in a _file_ from
38*287e80b3SSadaf Ebrahimithe given _instance_, without the terminating NULL character. When opening the file, this function
39*287e80b3SSadaf Ebrahimitries to truncates the size of the file to zero, which clears all previously existing settings.
40*287e80b3SSadaf Ebrahimi
41*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_append()* function writes a string _str_ in a _file_ from
42*287e80b3SSadaf Ebrahimithe given _instance_, without the terminating NULL character.  This function is similar to
43*287e80b3SSadaf Ebrahimi*tracefs_instance_file_write()*, but the existing content of the is not cleared. Thus the
44*287e80b3SSadaf Ebrahiminew settings are appended to the existing ones (if any).
45*287e80b3SSadaf Ebrahimi
46*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_clear()* function tries to truncates the size of the file to zero,
47*287e80b3SSadaf Ebrahimiwhich clears all previously existing settings. If the file has content that does not get
48*287e80b3SSadaf Ebrahimicleared in this way, this will not have any effect.
49*287e80b3SSadaf Ebrahimi
50*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_read()* function reads the content of a _file_ from
51*287e80b3SSadaf Ebrahimithe given _instance_.
52*287e80b3SSadaf Ebrahimi
53*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_read_number()* function reads the content of a _file_ from
54*287e80b3SSadaf Ebrahimithe given _instance_ and converts it to a long long integer, which is stored in _res_.
55*287e80b3SSadaf Ebrahimi
56*287e80b3SSadaf EbrahimiRETURN VALUE
57*287e80b3SSadaf Ebrahimi------------
58*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_open()* function returns a file descriptor to the opened file. It must be
59*287e80b3SSadaf Ebrahimiclosed with *close*(3). In case of an error, -1 is returned.
60*287e80b3SSadaf Ebrahimi
61*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_write()* function returns the number of written bytes,
62*287e80b3SSadaf Ebrahimior -1 in case of an error.
63*287e80b3SSadaf Ebrahimi
64*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_append()* function returns the number of written bytes,
65*287e80b3SSadaf Ebrahimior -1 in case of an error.
66*287e80b3SSadaf Ebrahimi
67*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_clear()* function returns 0 on success, or -1 in case of an error.
68*287e80b3SSadaf Ebrahimi
69*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_read()* function returns a pointer to a NULL terminated
70*287e80b3SSadaf Ebrahimistring, read from the file, or NULL in case of an error. The returned string must
71*287e80b3SSadaf Ebrahimibe freed with free().
72*287e80b3SSadaf Ebrahimi
73*287e80b3SSadaf EbrahimiThe *tracefs_instance_file_read_number()* function returns 0 if a valid integer is read from
74*287e80b3SSadaf Ebrahimithe file and stored in _res_ or -1 in case of an error.
75*287e80b3SSadaf Ebrahimi
76*287e80b3SSadaf EbrahimiEXAMPLE
77*287e80b3SSadaf Ebrahimi-------
78*287e80b3SSadaf Ebrahimi[source,c]
79*287e80b3SSadaf Ebrahimi--
80*287e80b3SSadaf Ebrahimi#include <tracefs.h>
81*287e80b3SSadaf Ebrahimi
82*287e80b3SSadaf Ebrahimistruct tracefs_instance *inst = tracefs_instance_create("foo");
83*287e80b3SSadaf Ebrahimi	if (!inst) {
84*287e80b3SSadaf Ebrahimi		/* Error creating a new trace instance */
85*287e80b3SSadaf Ebrahimi		...
86*287e80b3SSadaf Ebrahimi	}
87*287e80b3SSadaf Ebrahimi
88*287e80b3SSadaf Ebrahimi	if (tracefs_file_exists(inst,"trace_clock")) {
89*287e80b3SSadaf Ebrahimi		/* The instance foo supports trace clock */
90*287e80b3SSadaf Ebrahimi		char *path, *clock;
91*287e80b3SSadaf Ebrahimi		int size;
92*287e80b3SSadaf Ebrahimi
93*287e80b3SSadaf Ebrahimi		path =  = tracefs_instance_get_file(inst, "trace_clock")
94*287e80b3SSadaf Ebrahimi		if (!path) {
95*287e80b3SSadaf Ebrahimi			/* Error getting the path to trace_clock file in instance foo */
96*287e80b3SSadaf Ebrahimi			...
97*287e80b3SSadaf Ebrahimi		}
98*287e80b3SSadaf Ebrahimi		...
99*287e80b3SSadaf Ebrahimi		tracefs_put_tracing_file(path);
100*287e80b3SSadaf Ebrahimi
101*287e80b3SSadaf Ebrahimi		clock = tracefs_instance_file_read(inst, "trace_clock", &size);
102*287e80b3SSadaf Ebrahimi		if (!clock) {
103*287e80b3SSadaf Ebrahimi			/* Failed to read trace_clock file in instance foo */
104*287e80b3SSadaf Ebrahimi			...
105*287e80b3SSadaf Ebrahimi		}
106*287e80b3SSadaf Ebrahimi		...
107*287e80b3SSadaf Ebrahimi		free(clock);
108*287e80b3SSadaf Ebrahimi
109*287e80b3SSadaf Ebrahimi		if (tracefs_instance_file_write(inst, "trace_clock", "global") != strlen("global")) {
110*287e80b3SSadaf Ebrahimi			/* Failed to set gloabl trace clock in instance foo */
111*287e80b3SSadaf Ebrahimi			...
112*287e80b3SSadaf Ebrahimi		}
113*287e80b3SSadaf Ebrahimi	} else {
114*287e80b3SSadaf Ebrahimi		/* The instance foo does not support trace clock */
115*287e80b3SSadaf Ebrahimi	}
116*287e80b3SSadaf Ebrahimi
117*287e80b3SSadaf Ebrahimi	if (tracefs_dir_exists(inst,"options")) {
118*287e80b3SSadaf Ebrahimi		/* The instance foo supports trace options */
119*287e80b3SSadaf Ebrahimi		char *path = tracefs_instance_get_file(inst, "options");
120*287e80b3SSadaf Ebrahimi		if (!path) {
121*287e80b3SSadaf Ebrahimi			/* Error getting the path to options directory in instance foo */
122*287e80b3SSadaf Ebrahimi			...
123*287e80b3SSadaf Ebrahimi		}
124*287e80b3SSadaf Ebrahimi
125*287e80b3SSadaf Ebrahimi		tracefs_put_tracing_file(path);
126*287e80b3SSadaf Ebrahimi	} else {
127*287e80b3SSadaf Ebrahimi		/* The instance foo does not support trace options */
128*287e80b3SSadaf Ebrahimi	}
129*287e80b3SSadaf Ebrahimi
130*287e80b3SSadaf Ebrahimi	...
131*287e80b3SSadaf Ebrahimi
132*287e80b3SSadaf Ebrahimi	if (tracefs_instance_is_new(inst))
133*287e80b3SSadaf Ebrahimi		tracefs_instance_destroy(inst);
134*287e80b3SSadaf Ebrahimi	else
135*287e80b3SSadaf Ebrahimi		tracefs_instance_free(inst);
136*287e80b3SSadaf Ebrahimi	...
137*287e80b3SSadaf Ebrahimi
138*287e80b3SSadaf Ebrahimi	long long int res;
139*287e80b3SSadaf Ebrahimi	if (tracefs_instance_file_read_number(NULL, "tracing_on", &res) == 0) {
140*287e80b3SSadaf Ebrahimi		if (res == 0) {
141*287e80b3SSadaf Ebrahimi			/* tracing is disabled in the top instance */
142*287e80b3SSadaf Ebrahimi		} else if (res == 1) {
143*287e80b3SSadaf Ebrahimi			/* tracing is enabled in the top instance */
144*287e80b3SSadaf Ebrahimi		} else {
145*287e80b3SSadaf Ebrahimi			/* Unknown tracing state of the top instance */
146*287e80b3SSadaf Ebrahimi		}
147*287e80b3SSadaf Ebrahimi	} else {
148*287e80b3SSadaf Ebrahimi		/* Failed to read integer from tracing_on file */
149*287e80b3SSadaf Ebrahimi	}
150*287e80b3SSadaf Ebrahimi
151*287e80b3SSadaf Ebrahimi	...
152*287e80b3SSadaf Ebrahimi
153*287e80b3SSadaf Ebrahimi	int fd;
154*287e80b3SSadaf Ebrahimi	fd = tracefs_instance_file_open(NULL, "tracing_on", O_WRONLY);
155*287e80b3SSadaf Ebrahimi	if (fd >= 0) {
156*287e80b3SSadaf Ebrahimi		/* Got file descriptor to the tracing_on file from the top instance for writing */
157*287e80b3SSadaf Ebrahimi		...
158*287e80b3SSadaf Ebrahimi		close(fd);
159*287e80b3SSadaf Ebrahimi	}
160*287e80b3SSadaf Ebrahimi--
161*287e80b3SSadaf EbrahimiFILES
162*287e80b3SSadaf Ebrahimi-----
163*287e80b3SSadaf Ebrahimi[verse]
164*287e80b3SSadaf Ebrahimi--
165*287e80b3SSadaf Ebrahimi*tracefs.h*
166*287e80b3SSadaf Ebrahimi	Header file to include in order to have access to the library APIs.
167*287e80b3SSadaf Ebrahimi*-ltracefs*
168*287e80b3SSadaf Ebrahimi	Linker switch to add when building a program that uses the library.
169*287e80b3SSadaf Ebrahimi--
170*287e80b3SSadaf Ebrahimi
171*287e80b3SSadaf EbrahimiSEE ALSO
172*287e80b3SSadaf Ebrahimi--------
173*287e80b3SSadaf Ebrahimi*libtracefs*(3),
174*287e80b3SSadaf Ebrahimi*libtraceevent*(3),
175*287e80b3SSadaf Ebrahimi*trace-cmd*(1)
176*287e80b3SSadaf Ebrahimi
177*287e80b3SSadaf EbrahimiAUTHOR
178*287e80b3SSadaf Ebrahimi------
179*287e80b3SSadaf Ebrahimi[verse]
180*287e80b3SSadaf Ebrahimi--
181*287e80b3SSadaf Ebrahimi*Steven Rostedt* <[email protected]>
182*287e80b3SSadaf Ebrahimi*Tzvetomir Stoyanov* <[email protected]>
183*287e80b3SSadaf Ebrahimi--
184*287e80b3SSadaf EbrahimiREPORTING BUGS
185*287e80b3SSadaf Ebrahimi--------------
186*287e80b3SSadaf EbrahimiReport bugs to  <[email protected]>
187*287e80b3SSadaf Ebrahimi
188*287e80b3SSadaf EbrahimiLICENSE
189*287e80b3SSadaf Ebrahimi-------
190*287e80b3SSadaf Ebrahimilibtracefs is Free Software licensed under the GNU LGPL 2.1
191*287e80b3SSadaf Ebrahimi
192*287e80b3SSadaf EbrahimiRESOURCES
193*287e80b3SSadaf Ebrahimi---------
194*287e80b3SSadaf Ebrahimihttps://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/
195*287e80b3SSadaf Ebrahimi
196*287e80b3SSadaf EbrahimiCOPYING
197*287e80b3SSadaf Ebrahimi-------
198*287e80b3SSadaf EbrahimiCopyright \(C) 2020 VMware, Inc. Free use of this software is granted under
199*287e80b3SSadaf Ebrahimithe terms of the GNU Public License (GPL).
200