Linux - статьи


Глава 6. Работа с файлами устройств - часть 3


#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;




Начало  Назад  Вперед