/* * Exemplo de proc_fs * * O sistema de arquivo /proc é um sistema de arquivo especial em linux kernel. Ele é * um sistema de arquivo virtual. Não é associado com um block device, ele existe somente * em memória. Os arquivos do /proc existem para permitirem que programas no espaço do usuario * acessem certas informações do kernel (como informações de processos /proc/-9]+/ * Este modulo cria diretório e arquivos dentro do /proc * * Note que os arquivos do /proc/sys são arquivos sysctl. E são gerenciados por uma API diferente. * Para mais informações veja o Kernel API book em Documentation/DocBook/kernel-api na árvore do kernel * * 07/03/2002 */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/proc_fs.h> #include <linux/mm.h> #include <asm/uaccess.h> #define MAX 20 struct proc_dir_entry *arq, *dir, *symlink; char *conteudo="Exemplo de proc_fs"; int le_proc_fs(char *page, char **start, off_t off, int count, int *eof, void *data) { int len; MOD_INC_USE_COUNT; len = sprintf(page, "%s\n", conteudo); MOD_DEC_USE_COUNT; return len; } int escreve_proc_fs(struct file *file, const char *buffer, unsigned long count, void *data) { int len; char *dados=kmalloc(MAX,GFP_KERNEL); MOD_INC_USE_COUNT; len = count > MAX ? MAX : count; if(copy_from_user(dados, buffer, len)) { MOD_DEC_USE_COUNT; return -EFAULT; } dados[len] = '\0'; printk(KERN_ALERT "Dado recebido : %s",dados); kfree(dados); MOD_DEC_USE_COUNT; return len; } int proc_fs_init_module(void) { dir = proc_mkdir("Exemplo_procfs", NULL); if (dir == NULL){ printk(KERN_ALERT "ERRO: Nao pode criar dir no /proc\n"); return 0; } /* * Indica que o proc_fs esta sendo usado dentro do modulo */ dir->owner = THIS_MODULE; arq = create_proc_entry("arquivo", 0644, dir); if (arq != NULL) { arq->owner = THIS_MODULE; arq->read_proc = le_proc_fs; arq->write_proc = escreve_proc_fs; } else printk(KERN_ALERT "ERRO: Nao pode criar arquivo no /proc\n"); symlink = proc_symlink("link", dir, "/dev/null"); if (symlink == NULL) { printk(KERN_ALERT "ERRO: Nao pode criar link no /proc\n"); return 0; } symlink->owner = THIS_MODULE; printk(KERN_ALERT "proc_fs instalado\n"); return 0; } void proc_fs_cleanup_module(void) { remove_proc_entry("arquivo", dir); remove_proc_entry("symlink", dir); remove_proc_entry("Exemplo_procfs", NULL); printk(KERN_ALERT "proc_fs removido\n"); } module_init(proc_fs_init_module); module_exit(proc_fs_cleanup_module); MODULE_DESCRIPTION("Examplo de proc_fs"); MODULE_AUTHOR("Thobias Salazar Trevisan"); #ifndef MODULE_LICENSE #define MODULE_LICENSE(a) #endif MODULE_LICENSE("GPL"); EXPORT_NO_SYMBOLS;