Valores repetidos para errno na man page

1

Estou vendo a página man da função libc execve no Ubuntu 16.04.

Estou tentando lidar com erros conforme descrito na man page:

RETURN VALUE
On success, execve() does not return, on error -1 is returned, and errno is set appropriately.

Então, confiro abaixo na seção ERROR e vejo:

ERRORS
   ...
   EACCES Search permission is denied on a component of the path prefix of filename or the name of a script interpreter.  (See also path_resolution(7).)

   EACCES The file or a script interpreter is not a regular file.

   EACCES Execute permission is denied for the file or a script or ELF interpreter.

   EACCES The filesystem is mounted noexec.
   ....

Isso significa que EACCES poderia ser qualquer dessas coisas? Ou menos provável todos deles?

Como posso diferenciá-los ao manipular erros de uma instrução switch?

    
por gatoWololo 13.07.2017 / 20:54

1 resposta

2

Does this mean that EACCES could be any of these things? Or less likely all of them?

Qualquer. Quanto a "todos", se houver um erro de caminho percorrido, como o código poderia até mesmo tentar outras coisas, como "é um arquivo regular", se o código não tiver permissão para percorrer o arquivo? Também retornar vários erros não é realmente uma coisa que C faz por padrão (a menos que você tenha escrito alguma estrutura que contenha uma lista de erros e então um ponteiro para aquela estrutura seja de alguma forma retornado ao chamador que precisa ... e não é assim a maioria das chamadas do sistema é gravada.)

How can I tell them apart when handling errors from a switch statement?

strerror(errno) ou o nifty err(3) que, sem dúvida, por sua vez chama strerror é o máximo que você terá:

$ cat sirexecsalot.c
#include <err.h>
#include <string.h>
#include <unistd.h>
extern char **environ;
extern int errno;
int main(int argc, char *argv[])
{
    int ret;
    errno = 0;
    if ((ret = execve("/var/tmp/exectest/hullo", ++argv, environ)) == -1)
        err(1, "nope (strerr=%s)", strerror(errno));
}

$ make sirexecsalot
cc     sirexecsalot.c   -o sirexecsalot
$ cat /var/tmp/exectest/hullo
#!/usr/bin/env expect
puts hi

$ ./sirexecsalot
hi
$ mv /var/tmp/exectest/hullo /var/tmp/exectest/foo
$ mkdir /var/tmp/exectest/hullo
$ ./sirexecsalot              
sirexecsalot: nope (strerr=Permission denied): Permission denied
$ chmod 000 /var/tmp/exectest 
$ ./sirexecsalot             
sirexecsalot: nope (strerr=Permission denied): Permission denied
$ 
    
por 13.07.2017 / 22:39

Tags