Энциклопедия разработчика модулей ядра Linux
Шрифт:
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)
#endif
{
int i;
#ifdef DEBUG
printk("device_write(%p,%s,%d)", file, buffer, length);
#endif
for(i=0; i<length && i<BUF_LEN; i++)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
get_user(Message[i], buffer+i);
#else
Message[i] = get_user(buffer+i);
#endif
Message_Ptr = Message;
/* Again, return the number of input characters used */
return i;
}
/* This function is called whenever a process tries to
* do an ioctl on our device file. We get two extra
* parameters (additional to the inode and file
* structures, which all device functions get): the number
* of the ioctl called and the parameter given to the ioctl function.
*
* If the ioctl is write or read/write (meaning output
* is returned to the calling process), the ioctl call
* returns the output of this function. */
int device_ioctl(struct inode *inode, struct file *file,
unsigned int ioctl_num, /* The number of the ioctl */
unsigned long ioctl_param) /* The parameter to it */
{
int i;
char *temp;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
char ch;
#endif
/* Switch according to the ioctl called */
switch (ioctl_num) {
case IOCTL_SET_MSG:
/* Receive a pointer to a message (in user space)
* and set that to be the device's message. */
/* Get the parameter given to ioctl by the process */
temp = (char*)ioctl_param;
/* Find the length of the message */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
get_user(ch, temp);
for (i=0; ch && i<BUF_LEN; i++, temp++) get_user(ch, temp);
#else
for (i=0; get_user(temp) && i<BUF_LEN; i++, temp++) ;
#endif
/* Don't reinvent the wheel - call device_write */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
device_write(file, (char*)ioctl_param, i, 0);
#else
device_write(inode, file, (char*)ioctl_param, i);
#endif
break;
case IOCTL_GET_MSG:
/* Give the current message to the calling
* process - the parameter we got is a pointer, fill it. */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
i = device_read(file, (char*)ioctl_param, 99, 0);
#else
i = device_read(inode, file, (char*)ioctl_param, 99);
#endif
/* Warning - we assume here the buffer length is
* 100. If it's less than that we might overflow
* the buffer, causing the process to core dump.
*
* The reason we only allow up to 99 characters is
* that the NULL which terminates the string also needs room. */
/* Put a zero at the end of the buffer, so it will be properly terminated */
put_user('\0', (char*)ioctl_param+i);
break;
case IOCTL_GET_NTH_BYTE:
/* This ioctl is both input (ioctl_param) and
* output (the return value of this function) */
return Message[ioctl_param];
break;
}
return SUCCESS;
}
/* Module Declarations *************************** */
/* This structure will hold the functions to be called
* when a process does something to the device we
* created. Since a pointer to this structure is kept in
* the devices table, it can't be local to
* init_module. NULL is for unimplemented functions. */
Поделиться:
Популярные книги
Титан империи 6
6. Титан Империи
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю 2
2. Как я строил магическую империю
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Болотник
1. Болотник
Фантастика:
попаданцы
альтернативная история
6.50
рейтинг книги
Курсант: Назад в СССР 11
11. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
На границе империй. Том 3
3. Фортуна дама переменчивая
Фантастика:
космическая фантастика
5.63
рейтинг книги
Рождение победителя
3. Девятый
Фантастика:
фэнтези
альтернативная история
9.07
рейтинг книги
Сиротка
1. Сиротка
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Совершенный: пробуждение
1. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Начальник милиции 2
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Назад в СССР 5
5. Курсант
Фантастика:
попаданцы
альтернативная история
6.64
рейтинг книги
Месть бывшему. Замуж за босса
3. Власть. Страсть. Любовь
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девяностые приближаются
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Шахта Шепчущих Глубин, Том II
3. Виашерон
Фантастика:
фэнтези
7.19
рейтинг книги
Сердце Дракона. Том 12
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29