Энциклопедия разработчика модулей ядра Linux | страница 21
> MOD_INC_USE_COUNT;
> return SUCCESS;
>}
>/* This function is called when a process closes the
>* device file. It doesn't have a return value because
>* it cannot fail. Regardless of what else happens, you
>* should always be able to close a device (in 2.0, a 2.2
>* device file could be impossible to close). */
>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
>static int device_release(struct inode *inode, struct file *file)
>#else
>static void device_release(struct inode *inode, struct file *file)
>#endif
>{
>#ifdef DEBUG
> printk("device_release(%p,%p)\n", inode, file);
>#endif
> /* We're now ready for our next caller */
> Device_Open--;
> MOD_DEC_USE_COUNT;
>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
> return 0;
>#endif
>}
>/* This function is called whenever a process which
>* has already opened the device file attempts to read from it. */
>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
>static ssize_t device_read(
> struct file *file,
> char *buffer, /* The buffer to fill with the data */
> size_t length, /* The length of the buffer */
> loff_t *offset) /* offset to the file */
>#else
>static int device_read(
> struct inode *inode, struct file *file,
> char *buffer, /* The buffer to fill with the data */
> int length) /* The length of the buffer (mustn't write beyond that!) */
>#endif
>{
> /* Number of bytes actually written to the buffer */
> int bytes_read = 0;
>#ifdef DEBUG
> printk("device_read(%p,%p,%d)\n", file, buffer, length);
>#endif
> /* If we're at the end of the message, return 0 (which signifies end of file) */
> if (*Message_Ptr == 0) return 0;
> /* Actually put the data into the buffer */
> while (length && *Message_Ptr) {
> /* Because the buffer is in the user data segment,
> * not the kernel data segment, assignment wouldn't
> * work. Instead, we have to use put_user which
> * copies data from the kernel data segment to the
> * user data segment. */
> put_user(*(Message_Ptr++), buffer++);
> length--;
> bytes_read++;
> }
>#ifdef DEBUG
> printk("Read %d bytes, %d left\n", bytes_read, length);
>#endif
> /* Read functions are supposed to return the number
> * of bytes actually inserted into the buffer */
> return bytes_read;
>}
>/* This function is called when somebody tries to write into our device file. */
>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
>static ssize_t device_write(struct file *file, const char *buffer, size_t length, loff_t *offset)
>#else
>static int device_write(struct inode *inode, struct file *file, const char *buffer, int length)