Изменение разрешений по умолчанию на IOctl cdev - PullRequest
0 голосов
/ 04 марта 2020

Я добавляю вызов IOctl из собственной платформы OpenGL на устройстве Android, так что я могу регистрировать информацию о кадрах в ядре через модуль ядра трассировки. В моем модуле ядра я создаю cdev для вызовов IOctl, но у меня проблема в том, что разрешения моего разработчика по умолчанию равны 6000, а поскольку вызовы IOctl пользовательской земли поступают от не root процесса, вызов open не удается открыть файл-дескриптор, необходимый для вызова ioctl.

Мой подход cdev очень стандартный и выглядит следующим образом (примечание devnode - попытка исправить разрешения, см. this ).

static dev_t dev;
static struct cdev c_dev;
static struct class *cl;

static char *device_node(struct device *dev, umode_t *mode) 
{ 
    if(!mode)
        return NULL;
    *mode=0666;
    return kasprintf(GFP_KERNEL, "%s", dev_name(dev));
}

static int IOctlInit(void)
{
    int ret;
    struct device *dev_ret;

    if((ret = alloc_chrdev_region(&dev, FIRST_MINOR, MINOR_CNT, EGL_SYSLOGGER_NAME)))
        return ret;

    cdev_init(&c_dev, &syslog_EGL_fops);

    if((ret = cdev_add(&c_dev, dev, MINOR_CNT)) < 0)
        return ret;

    if(IS_ERR( cl = class_create(THIS_MODULE, EGL_SYSLOGGER_NAME "char")))
    {
        cdev_del(&c_dev);
        unregister_chrdev_region(dev, MINOR_CNT);
        return PTR_ERR(cl);
    }

    cl->devnode = device_node;

    if(IS_ERR(dev_ret = device_create(cl, NULL, dev, NULL, EGL_SYSLOGGER_NAME)))
    {
        class_destroy(cl);
        cdev_del(&c_dev);
        unregister_chrdev_region(dev, MINOR_CNT);
        return PTR_ERR(cl);
    }

    return 0;
}

И, аналогично, используя mis c dev с .mode=0666 У меня та же проблема

static struct miscdevice misc_dev = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = EGL_SYSLOGGER_NAME,
    .fops = &syslog_EGL_fops,
    /** .mode = S_IRWXUGO, */
    .mode = 0666,
};

static `enter code here`int IOctlInit(void)
{
    int ret;

    ret = misc_register(&misc_dev);
    if(ret)
        printk("Unable to register EGL IOctl misc dev\n");
    printk("Misc dev registered\n");

    return 0;
}

Оба подхода работают один раз при запуске chmod 666 /dev/$EGL_SYSLOGGER_NAME, но я в надежде найти решение, которое не нуждается в этом вмешательстве. Согласно этой публикации, подход mis c dev должен решить мою проблему, но я не добился успеха.

Я не уверен, что я пропустил, и буду очень признателен за некоторые советы.

Ура

...