typedef struct proc_private_data_s {
void *data;
unsigned char type;
} proc_private_data_t;
enum {
INT_TYPE,
STRING_TYPE,
MAX_TYPE
};
void proc_show_int_private_data(struct seq_file *m, proc_private_data_t * private_data)
{
seq_printf(m, "%d\n", *((int*)private_data->data));
}
void proc_show_str_private_data(struct seq_file *m, proc_private_data_t * private_data)
{
seq_printf(m, "%s\n", (char *)private_data->data);
}
typedef void (*proc_show_func)(struct seq_file *m, proc_private_data_t *private_data);
proc_show_func proc_show_arrays[] = {
proc_show_int_private_data, /*INT_TYPE*/
proc_show_str_private_data /*STRING_TYPE*/
};
static int proc_seq_show(struct seq_file *m, void *v)
{
proc_private_data_t *private_data = (proc_private_data_t *)m->private;
if (private_data->type < MAX_TYPE)
proc_show_arrays[private_data->type](m, private_data);
return 0; //!! must be 0, or will show nothing T.T
}
static int proc_seq_open(struct inode *inode, struct file *file)
{
return single_open(file, proc_seq_show, PDE_DATA(inode));
}
static struct file_operations proc_file_ops =
{
.owner = THIS_MODULE,
.open = proc_seq_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
int register_proc_file(struct proc_dir_entry *parent, const char *proc_file, proc_private_data_t *data)
{
struct proc_dir_entry *file;
file = proc_create_data(proc_file, 0, parent, &proc_file_ops, data);
if (file == NULL) {
printk("Can't create proc file %s\n", proc_file);
return -1;
}
return 0;
}
EXPORT_SYMBOL(register_proc_file);
自动注册/proc文件
最新推荐文章于 2023-02-22 14:02:29 发布