2005-04-16 15:20:36 -07:00
/*
* linux / fs / proc / kmsg . c
*
* Copyright ( C ) 1992 by Linus Torvalds
*
*/
# include <linux/types.h>
# include <linux/errno.h>
# include <linux/time.h>
# include <linux/kernel.h>
# include <linux/poll.h>
2008-10-04 14:39:12 +04:00
# include <linux/proc_fs.h>
2005-04-16 15:20:36 -07:00
# include <linux/fs.h>
2010-02-03 15:36:43 -08:00
# include <linux/syslog.h>
2005-04-16 15:20:36 -07:00
# include <asm/uaccess.h>
# include <asm/io.h>
extern wait_queue_head_t log_wait ;
static int kmsg_open ( struct inode * inode , struct file * file )
{
2010-02-03 15:37:13 -08:00
return do_syslog ( SYSLOG_ACTION_OPEN , NULL , 0 , SYSLOG_FROM_FILE ) ;
2005-04-16 15:20:36 -07:00
}
static int kmsg_release ( struct inode * inode , struct file * file )
{
2010-02-03 15:37:13 -08:00
( void ) do_syslog ( SYSLOG_ACTION_CLOSE , NULL , 0 , SYSLOG_FROM_FILE ) ;
2005-04-16 15:20:36 -07:00
return 0 ;
}
static ssize_t kmsg_read ( struct file * file , char __user * buf ,
size_t count , loff_t * ppos )
{
2010-02-03 15:36:43 -08:00
if ( ( file - > f_flags & O_NONBLOCK ) & &
2010-02-03 15:37:13 -08:00
! do_syslog ( SYSLOG_ACTION_SIZE_UNREAD , NULL , 0 , SYSLOG_FROM_FILE ) )
2005-04-16 15:20:36 -07:00
return - EAGAIN ;
2010-02-03 15:37:13 -08:00
return do_syslog ( SYSLOG_ACTION_READ , buf , count , SYSLOG_FROM_FILE ) ;
2005-04-16 15:20:36 -07:00
}
static unsigned int kmsg_poll ( struct file * file , poll_table * wait )
{
poll_wait ( file , & log_wait , wait ) ;
2010-02-03 15:37:13 -08:00
if ( do_syslog ( SYSLOG_ACTION_SIZE_UNREAD , NULL , 0 , SYSLOG_FROM_FILE ) )
2005-04-16 15:20:36 -07:00
return POLLIN | POLLRDNORM ;
return 0 ;
}
2008-10-04 14:39:12 +04:00
static const struct file_operations proc_kmsg_operations = {
2005-04-16 15:20:36 -07:00
. read = kmsg_read ,
. poll = kmsg_poll ,
. open = kmsg_open ,
. release = kmsg_release ,
2010-03-30 02:24:54 +02:00
. llseek = generic_file_llseek ,
2005-04-16 15:20:36 -07:00
} ;
2008-10-04 14:39:12 +04:00
static int __init proc_kmsg_init ( void )
{
proc_create ( " kmsg " , S_IRUSR , NULL , & proc_kmsg_operations ) ;
return 0 ;
}
module_init ( proc_kmsg_init ) ;