Энциклопедия разработчика модулей ядра Linux | страница 35



>* 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,/* called when the /proc file is opened */

>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

> NULL, /* flush */

>#endif

> module_close /* called when it's classed */

>};


>/* Inode operations for our proc file. We need it so

>* we'll have somewhere to specify the file operations

>* structure we want to use, and the function we use for

>* permissions. It's also possible to specify functions

>* to be called for anything else which could be done to an

>* inode (although we don't bother, we just put NULL). */

>static struct inode_operations Inode_Ops_4_Our_Proc_File = {

> &File_Ops_4_Our_Proc_File,

> NULL, /* create */

> NULL, /* lookup */

> NULL, /* link */

> NULL, /* unlink */

> NULL, /* symlink */

> NULL, /* mkdir */

> NULL, /* rmdir */

> NULL, /* mknod */

> NULL, /* rename */

> NULL, /* readlink */

> NULL, /* follow_link */

> NULL, /* readpage */

> NULL, /* writepage */

> NULL, /* bmap */

> NULL, /* truncate */

> module_permission /* check for permissions */

>};


>/* Directory entry */

>static struct proc_dir_entry Our_Proc_File = {

> 0, /* Inode number - ignore, it will be filled by proc_register[_dynamic] */

> 5, /* Length of the file name */

> "sleep", /* The file name */

> S_IFREG | S_IRUGO | S_IWUSR,

>  /* File mode - this is a regular file which

>  * can be read by its owner, its group, and everybody

>  * else. Also, its owner can write to it.

>  *

>  * Actually, this field is just for reference, it's

>  * module_permission that does the actual check. It

>  * could use this field, but in our implementation it

>  * doesn't, for simplicity. */

> 1, /* Number of links (directories where the file is referenced) */

> 0, 0, /* The uid and gid for the file - we give it to root */

> 80, /* The size of the file reported by ls. */

> &Inode_Ops_4_Our_Proc_File,

>  /* A pointer to the inode structure for

>  * the file, if we need it. In our case we

>  * do, because we need a write function. */

> NULL

>  /* The read function for the file.

>  * Irrelevant, because we put it

>  * in the inode structure above */

>};


> /* Module initialization and cleanup **************** */

>/* Initialize the module - register the proc file */