2008-10-04 23:11:37 +04:00
# include <linux/fs.h>
# include <linux/init.h>
# include <linux/proc_fs.h>
# include <linux/seq_file.h>
static int devinfo_show ( struct seq_file * f , void * v )
{
int i = * ( loff_t * ) v ;
if ( i < CHRDEV_MAJOR_HASH_SIZE ) {
if ( i = = 0 )
2011-01-13 04:00:32 +03:00
seq_puts ( f , " Character devices: \n " ) ;
2008-10-04 23:11:37 +04:00
chrdev_show ( f , i ) ;
}
# ifdef CONFIG_BLOCK
else {
i - = CHRDEV_MAJOR_HASH_SIZE ;
if ( i = = 0 )
2011-01-13 04:00:32 +03:00
seq_puts ( f , " \n Block devices: \n " ) ;
2008-10-04 23:11:37 +04:00
blkdev_show ( f , i ) ;
}
# endif
return 0 ;
}
static void * devinfo_start ( struct seq_file * f , loff_t * pos )
{
if ( * pos < ( BLKDEV_MAJOR_HASH_SIZE + CHRDEV_MAJOR_HASH_SIZE ) )
return pos ;
return NULL ;
}
static void * devinfo_next ( struct seq_file * f , void * v , loff_t * pos )
{
( * pos ) + + ;
if ( * pos > = ( BLKDEV_MAJOR_HASH_SIZE + CHRDEV_MAJOR_HASH_SIZE ) )
return NULL ;
return pos ;
}
static void devinfo_stop ( struct seq_file * f , void * v )
{
/* Nothing to do */
}
static const struct seq_operations devinfo_ops = {
. start = devinfo_start ,
. next = devinfo_next ,
. stop = devinfo_stop ,
. show = devinfo_show
} ;
static int devinfo_open ( struct inode * inode , struct file * filp )
{
return seq_open ( filp , & devinfo_ops ) ;
}
static const struct file_operations proc_devinfo_operations = {
. open = devinfo_open ,
. read = seq_read ,
. llseek = seq_lseek ,
. release = seq_release ,
} ;
static int __init proc_devices_init ( void )
{
proc_create ( " devices " , 0 , NULL , & proc_devinfo_operations ) ;
return 0 ;
}
2014-01-24 03:55:45 +04:00
fs_initcall ( proc_devices_init ) ;