Citação de access()
página de manual :
The check is done using the calling process's real UID and GID, rather than the effective IDs as is done when actually attempting an operation (e.g., open(2)) on the file. This allows set-user-ID programs to easily determine the invoking user's authority.
O bit set-user-ID torna o UID efetivo igual ao proprietário do arquivo, mas o ID do usuário real permanece inalterado (isto é, permanece como era antes de exec()
).
Você pode usar setreuid()
para modificar o UID efetivo e o UID real do processo ou pode usar open()
para determinar privilégios. Eu recomendo a segunda solução, especialmente porque você já chama open()
de qualquer maneira. Você pode verificar se errno
é igual a EPERM
para descobrir se as permissões insuficientes foram o motivo pelo qual open()
falhou.
A chamada para open()
falha em seu código, porque você usa o valor de retorno de open()
como a condição if. Eu acho que a chamada realmente é bem-sucedida e retorna um descritor de arquivo válido, diferente de zero (zero sendo usado por stdin), fazendo com que o controle entre na ramificação de tratamento de erros. A ramificação de tratamento de erros do if exibe a mensagem de erro EPERM
, pois esse é o último erro que ocorreu devido à chamada access()
. A condição para entrar na ramificação de tratamento de erros deve verificar se open()
retornou -1.