EnzoFerber
(usa FreeBSD)
Enviado em 11/09/2006 - 21:41h
Gente, o négocio é o seguinte.
Eu fiz o ls do *nix em C... Até ai tudo bem, consegui fazer imprimir colorido de acordo com o tipo de arquivo e extensão, etc... Mas me deparei com um problema deparado anteriormente mas ignorado. Uns dias para traz fiz um mapeador de unidades (ele coloca num arquivo txt todos os arquivos e pastas do seu PC na ordem que estão na unidade... Constroi uma arvore em um arquivo, em poucas palavras), mas ele tinha um problema, a partir de um numero, ele parava, sem erros, sem nada.... Só parava. E com o ls acontece a mesma coisa.
Quando faço ./list /dev ele começa a listar os arquivos, mas lá pelas tantas, ele para sem ter acabado de listar o diretorio completo. Qual pode ser o erro? Já fiz checagem de memoria, da função readdir, opendir, das macros para checagem do tipo de arquivo, da função lstat, mas não consigo consertar o erro... Alguem pode me ajudar?
Segue abaixo o codigo:
- Colors.h -
#ifndef COLORS
#define COLORS
#define NORMAL "[0m"
#define GRAY "[1;30m"
#define RED "[1;31m"
#define GREEN "[1;32m"
#define YELLOW "[1;33m"
#define BLUE "[1;34m"
#define PINK "[1;35m"
#define CBLUE "[1;36m"
#define WHITE "[1;37m"
#define BLACKBOLD "[1;38m"
#endif
#ifndef BACK_COLORS
#define BACK_COLORS
#define BBLACK "[1;40m"
#define BRED "[1;41m"
#define BGREEN "[1;42m"
#define BBROWN "[1;43m"
#define BBLUE "[1;44m"
#define BPURPLE "[1;45m"
#define BCYAN "[1;46m"
#define BGRAY "[1;47m"
#endif
#define clear(); system("clear");
#define set(a,b); textcolor(a); textbackground(b);
void textcolor(char *color){
printf("%s", color);
}
void textbackground(char *color){
printf("%s", color);
}
void normal(void){
textcolor(NORMAL);
}
- List.c -
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "colors.h"
#define S_ISEXEC(m) ((((m) & S_IEXEC) == S_IEXEC) != S_ISDIR(m))
char *figs[5]={"gif", "jpg", "jpeg", "png", "bmp"};
char *comp[4]={"bz", "tar", "gz", "zip"};
char *make_dir(char *arg){
int t = strlen(arg);
char *new_str;
if(arg[t]-1 != '/'){
new_str = (char*)malloc((t+1)*sizeof(char));
strcpy(new_str, arg); strcat(new_str, "/");
return new_str;
}else return arg;
}
char *gx(char *s){
register int i = strlen(s) - 1;
while(*(s+i-1)!='.' && i--) ;
return (s + i);
}
int compare(char *a[], char *s, int n){
register int i;
for(i=0;i<n;i++)
if(!strcmp(a[i], s)) return 1;
return 0;
}
int main(int argc, char *argv[]){
struct stat arquivo;
struct dirent *tree;
DIR *dir;
char *name;
char *dirname;
int i = 1;
dirname = make_dir(argv[1]);
dir = opendir(dirname);
while(i++){
free(name);
//printf("i = %d\n", i-1);
sleep(0.5);
textcolor(NORMAL);
tree = readdir(dir);
if(tree == NULL) break;
if(tree->d_name[0] == '.') continue;
name = (char*)malloc((strlen(dirname) + strlen(tree->d_name))*sizeof(char));
if(!name){
printf("Error while requiring memory.\n");
printf("Aborting...\n"); exit(!name);
}
memset(name, 0x0, (strlen(dirname) + strlen(tree->d_name)));
strcpy(name, dirname); strcat(name, tree->d_name);
lstat(name, &arquivo);
if(S_ISDIR(arquivo.st_mode)){
textcolor(BLUE);
printf("%s", tree->d_name); textcolor(NORMAL); printf("/\n");
continue;
}else if(S_ISBLK(arquivo.st_mode)){
textcolor(YELLOW);
printf("%s\n", tree->d_name); textcolor(NORMAL);
continue;
}else if(S_ISLNK(arquivo.st_mode)){
textcolor(CBLUE);
printf("%s", tree->d_name); textcolor(NORMAL); printf("@\n");
continue;
}else if(S_ISEXEC(arquivo.st_mode)){
textcolor(GREEN);
printf("%s", tree->d_name); textcolor(NORMAL); printf("*\n");
continue;
}else if(S_ISREG(arquivo.st_mode)){
if(compare(figs, gx(tree->d_name), 5)){
textcolor(PINK); printf("%s\n", tree->d_name);
continue;
}else if(compare(comp, gx(tree->d_name), 4)){
textcolor(RED); printf("%s\n", tree->d_name);
continue;
}else{
textcolor(NORMAL);
printf("%s\n", tree->d_name);
continue;
}
}
}
free(name);
free(dirname);
return 0;
}
------------------------
É grande, mas quem se aventurar a tentar ajudar, agradeço.
Slackware_10