2015-09-02 09:56:34 +02:00
# ifndef _GNU_SOURCE
# define _GNU_SOURCE
# endif
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
2015-09-02 09:56:35 +02:00
# include <errno.h>
# include <unistd.h>
2015-09-02 09:56:43 +02:00
# include "fs.h"
2015-09-02 09:56:34 +02:00
# include "tracing_path.h"
2015-10-05 20:06:01 +02:00
char tracing_mnt [ PATH_MAX ] = " /sys/kernel/debug " ;
char tracing_path [ PATH_MAX ] = " /sys/kernel/debug/tracing " ;
char tracing_events_path [ PATH_MAX ] = " /sys/kernel/debug/tracing/events " ;
2015-09-02 09:56:34 +02:00
static void __tracing_path_set ( const char * tracing , const char * mountpoint )
{
2015-09-19 16:47:07 +02:00
snprintf ( tracing_mnt , sizeof ( tracing_mnt ) , " %s " , mountpoint ) ;
2015-09-02 09:56:34 +02:00
snprintf ( tracing_path , sizeof ( tracing_path ) , " %s/%s " ,
mountpoint , tracing ) ;
snprintf ( tracing_events_path , sizeof ( tracing_events_path ) , " %s/%s%s " ,
mountpoint , tracing , " events " ) ;
}
static const char * tracing_path_tracefs_mount ( void )
{
const char * mnt ;
2015-09-02 09:56:43 +02:00
mnt = tracefs__mount ( ) ;
2015-09-02 09:56:34 +02:00
if ( ! mnt )
return NULL ;
__tracing_path_set ( " " , mnt ) ;
return mnt ;
}
static const char * tracing_path_debugfs_mount ( void )
{
const char * mnt ;
2015-09-02 09:56:43 +02:00
mnt = debugfs__mount ( ) ;
2015-09-02 09:56:34 +02:00
if ( ! mnt )
return NULL ;
__tracing_path_set ( " tracing/ " , mnt ) ;
return mnt ;
}
const char * tracing_path_mount ( void )
{
const char * mnt ;
mnt = tracing_path_tracefs_mount ( ) ;
if ( mnt )
return mnt ;
mnt = tracing_path_debugfs_mount ( ) ;
return mnt ;
}
void tracing_path_set ( const char * mntpt )
{
__tracing_path_set ( " tracing/ " , mntpt ) ;
}
char * get_tracing_file ( const char * name )
{
char * file ;
if ( asprintf ( & file , " %s/%s " , tracing_path , name ) < 0 )
return NULL ;
return file ;
}
void put_tracing_file ( char * file )
{
free ( file ) ;
}
2015-09-02 09:56:35 +02:00
static int strerror_open ( int err , char * buf , size_t size , const char * filename )
{
char sbuf [ 128 ] ;
switch ( err ) {
case ENOENT :
2015-09-02 09:56:36 +02:00
/*
* We will get here if we can ' t find the tracepoint , but one of
* debugfs or tracefs is configured , which means you probably
* want some tracepoint which wasn ' t compiled in your kernel .
* - jirka
*/
2015-09-02 09:56:43 +02:00
if ( debugfs__configured ( ) | | tracefs__configured ( ) ) {
2015-09-02 09:56:35 +02:00
snprintf ( buf , size ,
" Error: \t File %s/%s not found. \n "
" Hint: \t Perhaps this kernel misses some CONFIG_ setting to enable this feature?. \n " ,
2015-09-02 09:56:36 +02:00
tracing_events_path , filename ) ;
2015-09-02 09:56:35 +02:00
break ;
}
snprintf ( buf , size , " %s " ,
2015-09-02 09:56:36 +02:00
" Error: \t Unable to find debugfs/tracefs \n "
" Hint: \t Was your kernel compiled with debugfs/tracefs support? \n "
" Hint: \t Is the debugfs/tracefs filesystem mounted? \n "
2015-09-02 09:56:35 +02:00
" Hint: \t Try 'sudo mount -t debugfs nodev /sys/kernel/debug' " ) ;
break ;
case EACCES : {
snprintf ( buf , size ,
" Error: \t No permissions to read %s/%s \n "
" Hint: \t Try 'sudo mount -o remount,mode=755 %s' \n " ,
2015-09-19 16:47:07 +02:00
tracing_events_path , filename , tracing_mnt ) ;
2015-09-02 09:56:35 +02:00
}
break ;
default :
snprintf ( buf , size , " %s " , strerror_r ( err , sbuf , sizeof ( sbuf ) ) ) ;
break ;
}
return 0 ;
}
int tracing_path__strerror_open_tp ( int err , char * buf , size_t size , const char * sys , const char * name )
{
char path [ PATH_MAX ] ;
2015-09-02 09:56:36 +02:00
snprintf ( path , PATH_MAX , " %s/%s " , sys , name ? : " * " ) ;
2015-09-02 09:56:35 +02:00
return strerror_open ( err , buf , size , path ) ;
}