@ -25,15 +25,8 @@
# include "lsfd.h"
static struct list_head chrdrvs ;
static struct list_head miscdevs ;
struct chrdrv {
struct list_head chrdrvs ;
unsigned long major ;
char * name ;
} ;
struct miscdev {
struct list_head miscdevs ;
unsigned long minor ;
@ -47,7 +40,7 @@ static bool cdev_fill_column(struct proc *proc __attribute__((__unused__)),
size_t column_index )
{
char * str = NULL ;
const char * chr drv;
const char * dev drv;
const char * miscdev ;
switch ( column_id ) {
@ -56,8 +49,8 @@ static bool cdev_fill_column(struct proc *proc __attribute__((__unused__)),
err ( EXIT_FAILURE , _ ( " failed to add output data " ) ) ;
return true ;
case COL_MISCDEV :
chr drv = get_chrdrv ( major ( file - > stat . st_rdev ) ) ;
if ( chr drv & & strcmp ( chr drv, " misc " ) = = 0 ) {
dev drv = get_chrdrv ( major ( file - > stat . st_rdev ) ) ;
if ( dev drv & & strcmp ( dev drv, " misc " ) = = 0 ) {
miscdev = get_miscdev ( minor ( file - > stat . st_rdev ) ) ;
if ( miscdev )
str = strdup ( miscdev ) ;
@ -73,23 +66,23 @@ static bool cdev_fill_column(struct proc *proc __attribute__((__unused__)),
err ( EXIT_FAILURE , _ ( " failed to add output data " ) ) ;
return true ;
case COL_CHRDRV :
chr drv = get_chrdrv ( major ( file - > stat . st_rdev ) ) ;
if ( chr drv)
str = strdup ( chr drv) ;
dev drv = get_chrdrv ( major ( file - > stat . st_rdev ) ) ;
if ( dev drv)
str = strdup ( dev drv) ;
else
xasprintf ( & str , " %u " ,
major ( file - > stat . st_rdev ) ) ;
break ;
case COL_SOURCE :
chr drv = get_chrdrv ( major ( file - > stat . st_rdev ) ) ;
dev drv = get_chrdrv ( major ( file - > stat . st_rdev ) ) ;
miscdev = NULL ;
if ( chr drv & & strcmp ( chr drv, " misc " ) = = 0 )
if ( dev drv & & strcmp ( dev drv, " misc " ) = = 0 )
miscdev = get_miscdev ( minor ( file - > stat . st_rdev ) ) ;
if ( chr drv) {
if ( dev drv) {
if ( miscdev ) {
xasprintf ( & str , " misc:%s " , miscdev ) ;
} else {
xasprintf ( & str , " %s:%u " , chr drv,
xasprintf ( & str , " %s:%u " , dev drv,
minor ( file - > stat . st_rdev ) ) ;
}
break ;
@ -111,45 +104,6 @@ static bool cdev_fill_column(struct proc *proc __attribute__((__unused__)),
return true ;
}
static struct chrdrv * new_chrdrv ( unsigned long major , const char * name )
{
struct chrdrv * chrdrv = xcalloc ( 1 , sizeof ( * chrdrv ) ) ;
INIT_LIST_HEAD ( & chrdrv - > chrdrvs ) ;
chrdrv - > major = major ;
chrdrv - > name = xstrdup ( name ) ;
return chrdrv ;
}
static void free_chrdrv ( struct chrdrv * chrdrv )
{
free ( chrdrv - > name ) ;
free ( chrdrv ) ;
}
static void read_devices ( struct list_head * chrdrvs_list , FILE * devices_fp )
{
unsigned long major ;
char line [ 256 ] ;
char name [ sizeof ( line ) ] ;
while ( fgets ( line , sizeof ( line ) , devices_fp ) ) {
struct chrdrv * chrdrv ;
if ( line [ 0 ] = = ' C ' )
continue ; /* "Character devices:" */
else if ( line [ 0 ] = = ' \n ' )
break ;
if ( sscanf ( line , " %lu %s " , & major , name ) ! = 2 )
continue ;
chrdrv = new_chrdrv ( major , name ) ;
list_add_tail ( & chrdrv - > chrdrvs , chrdrvs_list ) ;
}
}
static struct miscdev * new_miscdev ( unsigned long minor , const char * name )
{
struct miscdev * miscdev = xcalloc ( 1 , sizeof ( * miscdev ) ) ;
@ -187,18 +141,10 @@ static void read_misc(struct list_head *miscdevs_list, FILE *misc_fp)
static void cdev_class_initialize ( void )
{
FILE * devices_fp ;
FILE * misc_fp ;
INIT_LIST_HEAD ( & chrdrvs ) ;
INIT_LIST_HEAD ( & miscdevs ) ;
devices_fp = fopen ( " /proc/devices " , " r " ) ;
if ( devices_fp ) {
read_devices ( & chrdrvs , devices_fp ) ;
fclose ( devices_fp ) ;
}
misc_fp = fopen ( " /proc/misc " , " r " ) ;
if ( misc_fp ) {
read_misc ( & miscdevs , misc_fp ) ;
@ -208,21 +154,9 @@ static void cdev_class_initialize(void)
static void cdev_class_finalize ( void )
{
list_free ( & chrdrvs , struct chrdrv , chrdrvs , free_chrdrv ) ;
list_free ( & miscdevs , struct miscdev , miscdevs , free_miscdev ) ;
}
const char * get_chrdrv ( unsigned long major )
{
struct list_head * c ;
list_for_each ( c , & chrdrvs ) {
struct chrdrv * chrdrv = list_entry ( c , struct chrdrv , chrdrvs ) ;
if ( chrdrv - > major = = major )
return chrdrv - > name ;
}
return NULL ;
}
const char * get_miscdev ( unsigned long minor )
{
struct list_head * c ;