Problemas... :S

1. Problemas... :S

Enzo de Brito Ferber
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 ""
#define GRAY ""
#define RED ""
#define GREEN ""
#define YELLOW ""
#define BLUE ""
#define PINK ""
#define CBLUE ""
#define WHITE ""
#define BLACKBOLD ""
#endif

#ifndef BACK_COLORS
#define BACK_COLORS
#define BBLACK ""
#define BRED ""
#define BGREEN ""
#define BBROWN ""
#define BBLUE ""
#define BPURPLE ""
#define BCYAN ""
#define BGRAY ""
#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


  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts