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