November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Monday, February 28th, 2005 10:30 pm

Если в ядрёном драйвере обработчик ioctl выглядит так:
int ioctl_hanler(struct inode *inode, 
                  struct file *file, 
                  unsigned int ioctl_num,
                  unsigned long ioctl_param)
{
  unsigned long status;
  switch (ioctl_num) {
    case IOCTL_NUMBER:
      status=internal_function();
      put_user(status, (unsigned long *) ioctl_param);
      rc = 0;
      break;
    ....
  }
  return rc;
}

то правильно ли будет звать его так:
unsigned long bar;
ioctl(fd, IOCTL_NUMBER, &bar);
?
То есть с самими переменными и их адресами тут нигде ничего не напутано?
Tags:
Monday, February 28th, 2005 08:17 pm (UTC)
Наврал дважды:
1. Количество переменных должно быть таким же, как в прототипе.
2. Если функция хочет ulong, не надо подсовывать ей ulong* (указатель на ulong)
Monday, February 28th, 2005 08:35 pm (UTC)
1) садись, два. первая функция в ядреном модуле, вторая - вызов ioctl из userspace.
2) вот это, собственно, меня и интересует. А каким образом тогда из ядра получать данные, если не передавать туда именно адрес переменной (или структуры) ?
объявление ioctl'ного вызова выглядт при этом примерно так:
#define IOCTL_NUMBER _IOW('t', 8, unsigned long)
и на вызов ioctl с последним параметром типа ulong* компиялтор вовсе не ругается.