Энциклопедия разработчика модулей ядра Linux | страница 17
> /* We need to return the number of input characters used */
> return i;
>}
>/* This function decides whether to allow an operation
>* (return zero) or not allow it (return a non-zero
>* which indicates why it is not allowed).
>*
>* The operation can be one of the following values:
>* 0 - Execute (run the "file" - meaningless in our case)
>* 2 - Write (input to the kernel module)
>* 4 - Read (output from the kernel module)
>*
>* This is the real function that checks file
>* permissions. The permissions returned by ls -l are
>* for reference only, and can be overridden here. */
>static int module_permission(struct inode *inode, int op) {
> /* We allow everybody to read from our module, but only root (uid 0) may write to it */
> if (op == 4 || (op == 2 && current->euid == 0)) return 0;
> /* If it's anything else, access is denied */
> return -EACCES;
>}
>/* The file is opened - we don't really care about
>* that, but it does mean we need to increment the
>* module's reference count. */
>int module_open(struct inode *inode, struct file *file) {
> MOD_INC_USE_COUNT;
> return 0;
>}
>/* The file is closed - again, interesting only because of the reference count. */
>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
>int module_close(struct inode *inode, struct file *file)
>#else
>void module_close(struct inode *inode, struct file *file)
>#endif
>{
> MOD_DEC_USE_COUNT;
>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
> return 0; /* success */
>#endif
>}
>/* Structures to register as the /proc file, with
>* pointers to all the relevant functions. ********** */
>/* File operations for our proc file. This is where we
>* place pointers to all the functions called when
>* somebody tries to do something to our file. NULL
>* means we don't want to deal with something. */
>static struct file_operations File_Ops_4_Our_Proc_File = {
> NULL, /* lseek */
> module_output, /* "read" from the file */
> module_input, /* "write" to the file */
> NULL, /* readdir */
> NULL, /* select */
> NULL, /* ioctl */
> NULL, /* mmap */
> module_open, /* Somebody opened the file */
> #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
> NULL, /* flush, added here in version 2.2 */
>#endif
> module_close, /* Somebody closed the file */
> /* etc. etc. etc. (they are all given in
> * /usr/include/linux/fs.h). Since we don't put
> * anything here, the system will keep the default
> * data, which in Unix is zeros (NULLs when taken as pointers). */
>};
>/* Inode operations for our proc file. We need it so