Распечатка 6.2 Пример функции-заглушки пользовательского пространства

Предыдущая  Содержание  Следующая V*D*V

Распечатка 6.2

 

/* kapi-user.c */

 

#include <fcntl.h>

#include "kapi.h"

 

/* Дескриптор файла для “/dev/kapi” */

int dev_fd;

 

#define MAX_SIZE 50

 

int my_kernel_func(int val, char* in_str, char *out_str){

 

  kfunc_t data;

  int ret_val;

 

  /* Общее число аргументов - три */

  data.num = 3;

 

  /*

   * Аргумент 1.

   * Даже аргументы-не указатели должны быть переданы как указатели.

   * Направлением для таких аргументов является DIR_IN

   */

  data.arg[0].val = (void *)&val;

  data.arg[0].size = sizeof(int);

  data.arg[0].dir = DIR_IN;

 

  /* Аргумент 2 */

  data.arg[1].val = (void *)in_str;

  data.arg[1].size = strlen(in_str) + 1;

  data.arg[1].dir = DIR_IN;

 

  /*

   * Аргумент 3. Так как это аргумент для вывода данных, необходимо

   * указать размер приёмного буфера

   */

  data.arg[2].val = (void *)out_str;

  data.arg[2].size = MAX_SIZE;

  data.arg[2].dir = DIR_OUT;

 

  /*

   * Возвращаемое значение функции ядра. Установка поля направления

   * не требуется, так как оно всегда выходное

   */

  data.ret.val = (void *)&ret_val;

  data.ret.size = sizeof(int);

 

  /*

   * Наконец, вызываем ioctl для /dev/kapi. Затем драйвер kapi

   * вызывает функцию ядра my_kernel_func. Она также заполняет

   * data.ret.val возвращаемым значением функции ядра.

   */

  if (ioctl(dev_fd, MY_KERNEL_FUNC, (void *)&data) < 0){

    perror("ioctl failed");

    return -1;

  }

 

  /* Возвращаемое значение функции */

  return ret_val;

}

 

Предыдущая  Содержание  Следующая