Como dar permissões de escrita do atributo Sysfs?

2

Eu quero escrever um driver para passar algumas informações para um dispositivo, e para isso eu fiz uma entrada sysfs. Ele funciona bem, mas o problema é que eu não tenho permissão para gravar, a menos que eu esteja logado como admin. Eu gostaria que ele abrisse as permissões de leitura e gravação.

Do jeito que fui aconselhado a escrever o driver, usei a macro a seguir para configurar o atributo sysfs:

__ATTR(status_vector,0660,status_vector_is_read,status_vector_is_written);

O problema é óbvio, eu usei 660 como a permissão em vez de 666.

No entanto, quando tento colocar a permissão como 666, ou usando o comando S_IWUGO | S_IRUGO, recebo um erro. Eu sou capaz de definir permissões de leitura abertas, mas não escrevo. Aparentemente esta pessoa teve o mesmo problema, mas não vejo nenhuma resposta dada nesse tópico .

Eu poderia sempre apenas definir as permissões usando chmod, mas isso parece desajeitado e chato de uma solução, mas sim aprender a realmente escrever um driver corretamente. Por que não tenho permissão para definir S_IWUGO?

    
por J Amos 14.11.2017 / 00:42

1 resposta

3

A macro __ATTR se expande para o seguinte [1]:

#define __ATTR(_name, _mode, _show, _store) {   \
    .attr = {.name = __stringify(_name),        \
    .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },  \
    .show   = _show,                            \
    .store  = _store,                           \
}

Observe o uso da macro VERIFY_OCTAL_PERMISSIONS . Essa macro se expande para o seguinte [2]:

#define VERIFY_OCTAL_PERMISSIONS(perms)                                 \
    (BUILD_BUG_ON_ZERO((perms) < 0) +                                   \
     BUILD_BUG_ON_ZERO((perms) > 0777) +                                \
     /* USER_READABLE >= GROUP_READABLE >= OTHER_READABLE */            \
     BUILD_BUG_ON_ZERO((((perms) >> 6) & 4) < (((perms) >> 3) & 4)) +   \
     BUILD_BUG_ON_ZERO((((perms) >> 3) & 4) < ((perms) & 4)) +          \
     /* USER_WRITABLE >= GROUP_WRITABLE */                              \
     BUILD_BUG_ON_ZERO((((perms) >> 6) & 2) < (((perms) >> 3) & 2)) +   \
     /* OTHER_WRITABLE?  Generally considered a bad idea. */            \
     BUILD_BUG_ON_ZERO((perms) & 2) +                                   \
     (perms))

Qual versão de BUILD_BUG_ON_ZERO você obtém depende de uma macro que eu não localizei, mas você deve observar o comentário na macro acima: "OTHER_WRITABLE? Geralmente considerada uma má ideia".

Embora eu não tenha rastreado o caminho da chamada, meu palpite é que o código filtra / ignora o+w .

Tudo o que foi dito, por que você deseja que um usuário não privilegiado possa interagir diretamente com um hardware?

[1] link

[2] link

    
por 14.11.2017 / 03:49

Tags