Teste de Permissão de arquivo

Um erro muito comum em códigos de programadores, é deixar de testar permissão de arquivos.

Muitas vezes programadores experientes usam arquivos para troca de dados ou informações.

Essa prática pode ajudar muito, porem há de se tomar alguns cuidados.

Permissão de arquivos e pastas são dados pelo sistema operacional, em alguns casos, o programador, tenta gravar em locais que exige permissão prévia deste local.

É uma boa prática, antes de ler um arquivo, ler as permissões sobre o mesmo.

Em algumas situações, tentamos escrever dados em arquivos, que possuimos permissão apenas para leitura.

Estarei postando aqui um exemplo simples de programa.

GIT do projeto

https://github.com/marcelomaurin/permissao

Explicação das funcionalidades

Criação de um arquivo

Neste fragmento, criamos um arquivo texto, que servirá de referencia ao nosso programa.

int cria_arquivo(char *arquivo){
  FILE *file;
  file = fopen(arquivo,"w");
  if(file==NULL){
      printf("Erro na criacao do arquivo\n");
      return(1);
  } else {
      fwrite("123456",6,1,file);
  }
  fclose(file);
  return 0;
}

A variavel file, é o descritor, que é um ponteiro do arquivo, que será usado como referência, toda véz que uma operação for realizada nele.

O fopen, cria o arquivo, pois tem o parametro “w” que é write, outro parametro util é o “a” de append, que adiciona no final do arquivo.

Lendo a permissão do arquivo

Neste fragmento apresento o processo de leitura da permissão.

char* permissao(char *file, char* modeval){
  struct stat st;

  memset(modeval,'\0',sizemodeval);
  if(stat(file, &st) == 0){
      mode_t perm = st.st_mode;
      modeval[0] = (perm & S_IRUSR) ? 'r' : '-';
      modeval[1] = (perm & S_IWUSR) ? 'w' : '-';
      modeval[2] = (perm & S_IXUSR) ? 'x' : '-';
      modeval[3] = (perm & S_IRGRP) ? 'r' : '-';
      modeval[4] = (perm & S_IWGRP) ? 'w' : '-';
      modeval[5] = (perm & S_IXGRP) ? 'x' : '-';
      modeval[6] = (perm & S_IROTH) ? 'r' : '-';
      modeval[7] = (perm & S_IWOTH) ? 'w' : '-';
      modeval[8] = (perm & S_IXOTH) ? 'x' : '-';
      modeval[9] = '\0';
      return (char*)modeval;
  } else{
     return strerror(errno);
  }
}

O comando stat, permite ler a permissão de um arquivo.

Alem do stat, temos outros:

stat() e fstatat() recuperam informações sobre o arquivo apontado pelo nome do caminho; as diferenças para fstatat() são descritas abaixo.

lstat() é idêntico a stat(), exceto que se pathname for um link simbólico, ele retornará informações sobre o link em si, não o arquivo ao qual o link se refere.

fstat() é idêntico a stat(), exceto que o arquivo sobre o qual a informação deve ser recuperada é especificado pelo descritor de arquivo fd.


fonte: https://man7.org/linux/man-pages/man2/lstat.2.html

Parte do código gerado neste exemplo foi baseado no artigo:

https://stackoverflow.com/questions/8812959/how-to-read-linux-file-permission-programmatically-in-c-c

Outra forma de testar permissão

Outra forma é o comando access, nele é possivel fazer o teste direto da permissão, sem necessidade de enrolação.

if(access("info.txt",R_OK) ==0{
  printf("Permite Leitura\n ");
}
if(access("info.txt",W_OK) ==0{
  printf("Permite Escrita\n ");
}
if(access("info.txt",X_OK) ==0{
  printf("Permite Execução\n ");
}