Linux - статьи


              

обычное присвоение не сработает. Поэтому


#ifdef DEBUG printk("device_read(%p,%p,%d)\n", file, buffer, length); #endif
/* * Если достигнут конец сообщения -- вернуть 0 * (признак конца файла) */ if (*Message_Ptr == 0) return 0;
/* * Собственно запись данных в буфер */ while (length && *Message_Ptr) {
/* * Поскольку буфер располагается в пространстве пользователя, * обычное присвоение не сработает. Поэтому * для записи данных используется put_user, * которая копирует данные из пространства ядра * в пространство пользователя. */ put_user(*(Message_Ptr++), buffer++); length--; bytes_read++; }
#ifdef DEBUG printk("Read %d bytes, %d left\n", bytes_read, length); #endif
/* * Вернуть количество байт, помещенных в буфер. */ return bytes_read; }
/* * Вызывается при попытке записи в файл устройства */ static ssize_t device_write(struct file *file, const char __user * buffer, size_t length, loff_t * offset) { int i;
#ifdef DEBUG printk("device_write(%p,%s,%d)", file, buffer, length); #endif
for (i = 0; i < length && i < BUF_LEN; i++) get_user(Message[i], buffer + i);
Message_Ptr = Message;
/* * Вернуть количество принятых байт */ return i; }
/* * Вызывается, когда процесс пытается * выполнить операцию ioctl над файлом устройства. * Кроме inode и структуры file функция получает * два дополнительных параметра: * номер ioctl и дополнительные аргументы. * */ int device_ioctl(struct inode *inode, /* см. include/linux/fs.h */ struct file *file, /* то же самое */ unsigned int ioctl_num, /* номер и аргументы ioctl */ unsigned long ioctl_param) { int i; char *temp; char ch;
/* * Реакция на различные команды ioctl */ switch (ioctl_num) { case IOCTL_SET_MSG: /* * Принять указатель на сообщение (в пространстве пользователя) * и переписать в буфер. * Адрес которого задан в дополнительно аргументе. */ temp = (char *)ioctl_param;
/* * Найти длину сообщения */ get_user(ch, temp); for (i = 0; ch && i < BUF_LEN; i++, temp++) get_user(ch, temp);
device_write(file, (char *)ioctl_param, i, 0); break;

Содержание  Назад  Вперед