funcao_pra_abrir_um_arquivo_de_diretorio(){
DIR *dirIn = {0};
struct dirent *dirInEnt = {0};
char fileNameIn[DTHCFG_PATH_SIZE + 1] = "/tmp", fullPathFile[512] = {0};
struct stat currFileReaded = {0};
dirIn = opendir((const char *)fileNameIn);
if(dirIn == NULL){
printf("Problema em abrir diretorio de entrada! [%s]", strerror(errno));
return(DTH_ERRO);
}
/* readdir() retorna NULL em 2 casos: fim de leitura do diretorio (E nao muda o valor
* de errno!) e quando houve erro, setando um valor diferente de 0 para errno. Com isso,
* iremos diferenciar os dois retornos NULLs possiveis.
*/
errno = 0;
/* Lendo o conteudo do diretorio, iremos descartar arquivos ".", ".." e diretorios */
while((dirInEnt = readdir(dirIn)) != NULL){
memset(fullPathFile, 0, 512);
strcpy((char *)fullPathFile, (const char *)fileNameIn);
strcat((char *)fullPathFile, dirInEnt->d_name);
if(stat((char *)fullPathFile, &currFileReaded) == -1){
printf("Erro em pegar status do aruqivo [%s]: [%s].", fullPathFile, strerror(errno));
}
if((strcmp((const char *)dirInEnt->d_name, ".") == 0) || (strcmp((const char *)dirInEnt->d_name, "..") == 0)){
continue;
}
if((S_ISDIR(currFileReaded.st_mode) == 0) && (S_ISREG(currFileReaded.st_mode) != 0)){
break;
}
}
if((dirInEnt == NULL) && (errno != 0)){ /* Problema com readdir() */
printf("Impossivel abrir arquivo no path [%s]: [%s].", fileNameIn, strerror(errno));
memset(fileNameIn, 0, DTHCFG_PATH_SIZE);
closedir(dirIn);
return(DTH_ERRO);
}
if(dirInEnt == NULL){ /* readdir() chegou no fim e nao informou existencia de arquivo */
printf("Nao foi localizado arquivo de Demanda no path [%s].", fileNameIn);
memset(fileNameIn, 0, DTHCFG_PATH_SIZE);
closedir(dirIn);
return(DTH_ERRO);
}
strncat((char *)fileNameIn, (const char *)dirInEnt->d_name, DTHCFG_PATH_SIZE-strlen((const char *)fileNameIn));
if(access((char *)fileNameIn, R_OK|F_OK) == -1){
printf("Acesso ao arquivo [%s] nao eh possivel: [%s].",
fileNameIn, strerror(EACCES));
/* free(dirInEnt); ??? */
memset(fileNameIn, 0, DTHCFG_PATH_SIZE); /* Evita exclusao */
closedir(dirIn);
return(DTH_ERRO);
}
if((*fdIn = open((const char *)fileNameIn, O_RDONLY|O_CREAT|O_LARGEFILE)) == -1){
printf("Erro em abrir arquivo [%s] IGNORADA! Motivo: [%s]." fileNameIn, strerror(errno));
/* free(dirInEnt); ??? */
memset(fileNameIn, 0, DTHCFG_PATH_SIZE); /* Evita exclusao */
closedir(dirIn);
return(DTH_ERRO);
}
printf("Abrindo arquivo de Demanda [%s] aberto." fileNameIn);
/* free(dirInEnt); ??? */
closedir(dirIn);
return(DTH_OK);
}