2014-05-02 16:23:00 +04:00
/*
* Industrial I / O utilities - lsiio . c
*
* Copyright ( c ) 2010 Manuel Stahl < manuel . stahl @ iis . fraunhofer . de >
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation .
*/
# include <string.h>
# include <dirent.h>
# include <stdio.h>
# include <errno.h>
# include <stdint.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <sys/dir.h>
# include "iio_utils.h"
static enum verbosity {
VERBLEVEL_DEFAULT , /* 0 gives lspci behaviour */
VERBLEVEL_SENSORS , /* 1 lists sensors */
} verblevel = VERBLEVEL_DEFAULT ;
const char * type_device = " iio:device " ;
const char * type_trigger = " trigger " ;
static inline int check_prefix ( const char * str , const char * prefix )
{
return strlen ( str ) > strlen ( prefix ) & &
strncmp ( str , prefix , strlen ( prefix ) ) = = 0 ;
}
static inline int check_postfix ( const char * str , const char * postfix )
{
return strlen ( str ) > strlen ( postfix ) & &
strcmp ( str + strlen ( str ) - strlen ( postfix ) , postfix ) = = 0 ;
}
static int dump_channels ( const char * dev_dir_name )
{
DIR * dp ;
const struct dirent * ent ;
2014-10-06 15:33:31 +04:00
2014-05-02 16:23:00 +04:00
dp = opendir ( dev_dir_name ) ;
if ( dp = = NULL )
return - errno ;
while ( ent = readdir ( dp ) , ent ! = NULL )
if ( check_prefix ( ent - > d_name , " in_ " ) & &
check_postfix ( ent - > d_name , " _raw " ) ) {
printf ( " %-10s \n " , ent - > d_name ) ;
}
return 0 ;
}
static int dump_one_device ( const char * dev_dir_name )
{
char name [ IIO_MAX_NAME_LENGTH ] ;
int dev_idx ;
2014-10-06 15:34:43 +04:00
int retval ;
2014-05-02 16:23:00 +04:00
2014-10-06 15:34:43 +04:00
retval = sscanf ( dev_dir_name + strlen ( iio_dir ) + strlen ( type_device ) ,
2014-05-02 16:23:00 +04:00
" %i " , & dev_idx ) ;
2014-10-06 15:34:43 +04:00
if ( retval ! = 1 )
return - EINVAL ;
2014-05-02 16:23:00 +04:00
read_sysfs_string ( " name " , dev_dir_name , name ) ;
printf ( " Device %03d: %s \n " , dev_idx , name ) ;
2014-10-06 15:34:10 +04:00
if ( verblevel > = VERBLEVEL_SENSORS )
return dump_channels ( dev_dir_name ) ;
2014-05-02 16:23:00 +04:00
return 0 ;
}
static int dump_one_trigger ( const char * dev_dir_name )
{
char name [ IIO_MAX_NAME_LENGTH ] ;
int dev_idx ;
2014-10-06 15:34:43 +04:00
int retval ;
2014-05-02 16:23:00 +04:00
2014-10-06 15:34:43 +04:00
retval = sscanf ( dev_dir_name + strlen ( iio_dir ) + strlen ( type_trigger ) ,
2014-05-02 16:23:00 +04:00
" %i " , & dev_idx ) ;
2014-10-06 15:34:43 +04:00
if ( retval ! = 1 )
return - EINVAL ;
2014-05-02 16:23:00 +04:00
read_sysfs_string ( " name " , dev_dir_name , name ) ;
printf ( " Trigger %03d: %s \n " , dev_idx , name ) ;
return 0 ;
}
static void dump_devices ( void )
{
const struct dirent * ent ;
int number , numstrlen ;
FILE * nameFile ;
DIR * dp ;
char thisname [ IIO_MAX_NAME_LENGTH ] ;
char * filename ;
dp = opendir ( iio_dir ) ;
if ( dp = = NULL ) {
printf ( " No industrial I/O devices available \n " ) ;
return ;
}
while ( ent = readdir ( dp ) , ent ! = NULL ) {
if ( check_prefix ( ent - > d_name , type_device ) ) {
char * dev_dir_name ;
2014-10-06 15:33:31 +04:00
2014-05-02 16:23:00 +04:00
asprintf ( & dev_dir_name , " %s%s " , iio_dir , ent - > d_name ) ;
dump_one_device ( dev_dir_name ) ;
free ( dev_dir_name ) ;
if ( verblevel > = VERBLEVEL_SENSORS )
printf ( " \n " ) ;
}
}
rewinddir ( dp ) ;
while ( ent = readdir ( dp ) , ent ! = NULL ) {
if ( check_prefix ( ent - > d_name , type_trigger ) ) {
char * dev_dir_name ;
2014-10-06 15:33:31 +04:00
2014-05-02 16:23:00 +04:00
asprintf ( & dev_dir_name , " %s%s " , iio_dir , ent - > d_name ) ;
dump_one_trigger ( dev_dir_name ) ;
free ( dev_dir_name ) ;
}
}
closedir ( dp ) ;
}
int main ( int argc , char * * argv )
{
int c , err = 0 ;
while ( ( c = getopt ( argc , argv , " d:D:v " ) ) ! = EOF ) {
switch ( c ) {
case ' v ' :
verblevel + + ;
break ;
case ' ? ' :
default :
err + + ;
break ;
}
}
if ( err | | argc > optind ) {
fprintf ( stderr , " Usage: lsiio [options]... \n "
" List industrial I/O devices \n "
" -v, --verbose \n "
" Increase verbosity (may be given multiple times) \n "
) ;
exit ( 1 ) ;
}
dump_devices ( ) ;
return 0 ;
}