@ -43,7 +43,6 @@
# define VERSION "0.5"
static const char * output_file = " trace.info " ;
static int output_fd ;
@ -125,8 +124,10 @@ static int record_file(const char *file, ssize_t hdr_sz)
int err = - EIO ;
fd = open ( file , O_RDONLY ) ;
if ( fd < 0 )
die ( " Can't read '%s' " , file ) ;
if ( fd < 0 ) {
pr_debug ( " Can't read '%s' " , file ) ;
return - errno ;
}
/* put in zeros for file size, then fill true size later */
if ( hdr_sz ) {
@ -148,8 +149,10 @@ static int record_file(const char *file, ssize_t hdr_sz)
if ( bigendian ( ) )
sizep + = sizeof ( u64 ) - hdr_sz ;
if ( hdr_sz & & pwrite ( output_fd , sizep , hdr_sz , hdr_pos ) < 0 )
die ( " writing to %s " , output_file ) ;
if ( hdr_sz & & pwrite ( output_fd , sizep , hdr_sz , hdr_pos ) < 0 ) {
pr_debug ( " writing file size failed \n " ) ;
goto out ;
}
err = 0 ;
out :
@ -164,11 +167,15 @@ static int read_header_files(void)
int err = - EIO ;
path = get_tracing_file ( " events/header_page " ) ;
if ( ! path )
die ( " can't get tracing/events/header_page " ) ;
if ( ! path ) {
pr_debug ( " can't get tracing/events/header_page " ) ;
return - ENOMEM ;
}
if ( stat ( path , & st ) < 0 )
die ( " can't read '%s' " , path ) ;
if ( stat ( path , & st ) < 0 ) {
pr_debug ( " can't read '%s' " , path ) ;
goto out ;
}
if ( write ( output_fd , " header_page " , 12 ) ! = 12 ) {
pr_debug ( " can't write header_page \n " ) ;
@ -183,11 +190,16 @@ static int read_header_files(void)
put_tracing_file ( path ) ;
path = get_tracing_file ( " events/header_event " ) ;
if ( ! path )
die ( " can't get tracing/events/header_event " ) ;
if ( ! path ) {
pr_debug ( " can't get tracing/events/header_event " ) ;
err = - ENOMEM ;
goto out ;
}
if ( stat ( path , & st ) < 0 )
die ( " can't read '%s' " , path ) ;
if ( stat ( path , & st ) < 0 ) {
pr_debug ( " can't read '%s' " , path ) ;
goto out ;
}
if ( write ( output_fd , " header_event " , 13 ) ! = 13 ) {
pr_debug ( " can't write header_event \n " ) ;
@ -227,8 +239,10 @@ static int copy_event_system(const char *sys, struct tracepoint_path *tps)
int err ;
dir = opendir ( sys ) ;
if ( ! dir )
die ( " can't read directory '%s' " , sys ) ;
if ( ! dir ) {
pr_debug ( " can't read directory '%s' " , sys ) ;
return - errno ;
}
while ( ( dent = readdir ( dir ) ) ) {
if ( dent - > d_type ! = DT_DIR | |
@ -291,8 +305,10 @@ static int read_ftrace_files(struct tracepoint_path *tps)
int ret ;
path = get_tracing_file ( " events/ftrace " ) ;
if ( ! path )
die ( " can't get tracing/events/ftrace " ) ;
if ( ! path ) {
pr_debug ( " can't get tracing/events/ftrace " ) ;
return - ENOMEM ;
}
ret = copy_event_system ( path , tps ) ;
@ -324,12 +340,17 @@ static int read_event_files(struct tracepoint_path *tps)
int err ;
path = get_tracing_file ( " events " ) ;
if ( ! path )
die ( " can't get tracing/events " ) ;
if ( ! path ) {
pr_debug ( " can't get tracing/events " ) ;
return - ENOMEM ;
}
dir = opendir ( path ) ;
if ( ! dir )
die ( " can't read directory '%s' " , path ) ;
if ( ! dir ) {
err = - errno ;
pr_debug ( " can't read directory '%s' " , path ) ;
goto out ;
}
while ( ( dent = readdir ( dir ) ) ) {
if ( dent - > d_type ! = DT_DIR | |
@ -408,8 +429,10 @@ static int read_ftrace_printk(void)
int ret , err = 0 ;
path = get_tracing_file ( " printk_formats " ) ;
if ( ! path )
die ( " can't get tracing/printk_formats " ) ;
if ( ! path ) {
pr_debug ( " can't get tracing/printk_formats " ) ;
return - ENOMEM ;
}
ret = stat ( path , & st ) ;
if ( ret < 0 ) {
@ -426,6 +449,19 @@ out:
return err ;
}
static void
put_tracepoints_path ( struct tracepoint_path * tps )
{
while ( tps ) {
struct tracepoint_path * t = tps ;
tps = tps - > next ;
free ( t - > name ) ;
free ( t - > system ) ;
free ( t ) ;
}
}
static struct tracepoint_path *
get_tracepoints_path ( struct list_head * pattrs )
{
@ -438,27 +474,17 @@ get_tracepoints_path(struct list_head *pattrs)
continue ;
+ + nr_tracepoints ;
ppath - > next = tracepoint_id_to_path ( pos - > attr . config ) ;
if ( ! ppath - > next )
die ( " %s \n " , " No memory to alloc tracepoints list " ) ;
if ( ! ppath - > next ) {
pr_debug ( " No memory to alloc tracepoints list \n " ) ;
put_tracepoints_path ( & path ) ;
return NULL ;
}
ppath = ppath - > next ;
}
return nr_tracepoints > 0 ? path . next : NULL ;
}
static void
put_tracepoints_path ( struct tracepoint_path * tps )
{
while ( tps ) {
struct tracepoint_path * t = tps ;
tps = tps - > next ;
free ( t - > name ) ;
free ( t - > system ) ;
free ( t ) ;
}
}
bool have_tracepoints ( struct list_head * pattrs )
{
struct perf_evsel * pos ;
@ -536,12 +562,16 @@ struct tracing_data *tracing_data_get(struct list_head *pattrs,
snprintf ( tdata - > temp_file , sizeof ( tdata - > temp_file ) ,
" /tmp/perf-XXXXXX " ) ;
if ( ! mkstemp ( tdata - > temp_file ) )
die ( " Can't make temp file " ) ;
if ( ! mkstemp ( tdata - > temp_file ) ) {
pr_debug ( " Can't make temp file " ) ;
return NULL ;
}
temp_fd = open ( tdata - > temp_file , O_RDWR ) ;
if ( temp_fd < 0 )
die ( " Can't read '%s' " , tdata - > temp_file ) ;
if ( temp_fd < 0 ) {
pr_debug ( " Can't read '%s' " , tdata - > temp_file ) ;
return NULL ;
}
/*
* Set the temp file the default output , so all the