#include <linux/module.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#define PROCFS_BUF_MAX_SIZE 32
struct proc_dir_entry *my_proc_dir;
struct proc_dir_entry *my_proc_file;
int test_val = 5;
static int proc_file_read(char *page, char **start, off_t offset,
int count, int *eof, void *data)
{
char *p = page;
sprintf(p,"%d\n", test_val);
return sizeof(p);
}
static int proc_file_write(struct file *file, const char __user *buffer,
unsigned long count, void *data)
{
char procfs_buffer[PROCFS_BUF_MAX_SIZE];
unsigned long procfs_buffer_size = count;
if (procfs_buffer_size > PROCFS_BUF_MAX_SIZE) {
procfs_buffer_size = PROCFS_BUF_MAX_SIZE;
}
if (copy_from_user(procfs_buffer, buffer, procfs_buffer_size)) {
return -EFAULT;
}
test_val = simple_strtol(procfs_buffer, NULL, 10);
return procfs_buffer_size;
}
int create_my_proc_file(void)
{
int ret = 0;
my_proc_file = create_proc_entry("my_proc_file", 0666, my_proc_dir);
if (!my_proc_file) {
ret = -1;
return ret;
}
/* read, write operation */
my_proc_file->read_proc = proc_file_read;
my_proc_file->write_proc = proc_file_write;
return 0;
}
void remove_my_proc_file(void)
{
remove_proc_entry("my_proc_file", my_proc_dir);
}
int create_my_proc_dir(void)
{
int ret = 0;
my_proc_dir = proc_mkdir("my_proc_dir", NULL);
if (!my_proc_dir) {
ret = -1;
return ret;
}
return 0;
}
void remove_my_proc_dir(void)
{
remove_proc_entry("my_proc_dir", my_proc_dir);
}
static int __init my_module_init(void)
{
int ret = 0;
printk(KERN_INFO "Module is now loaded.\n");
ret = create_my_proc_dir();
if (ret < 0) {
goto out;
}
ret = create_my_proc_file();
if (ret < 0) {
remove_my_proc_dir();
goto out;
}
return 0;
out:
return ret;
}
static void __exit my_module_cleanup(void)
{
printk(KERN_INFO "Module is now unloaded.\n");
remove_my_proc_file();
remove_my_proc_dir();
return;
}
module_init(my_module_init);
module_exit(my_module_cleanup);
MODULE_LICENSE("GPL");