Witam, piszę tutaj ponieważ mam pewien problem. Piszę własnego "el-esa", program listujący dany katalog. Moja wersja ma działać na takiej zasadzie, że jeśli napotka na plik to wyświetla jego szczegóły, jeśli to folder to przechodzi dalej listując go i robiąc to samo z elementami tego folderu. Coś na zasadzie windowsowego tree, lecz ze szczegółami dla plików. Niby wszystko napisałem, jest funkcja rekurencyjna lecz nie działa poprawnie. Po przejściu do danego folderu funkcja nie radzi sobie z jego elementami. Liczyłem ilość wykonań tej funkcji, testowałem dla różnych sytuacji lecz nie mogę samodzielnie dojść do źródła problemu. Może wynika to ze zbyt małej wiedzy o samych funkcjach jakie używam, nie wiem, proszę o pomoc.
#include<sys/stat.h>
#include<stdio.h>
#include<dirent.h>
void permissions(mode_t tryby){
if(tryby & S_IRUSR) printf("r");else printf("-");
if(tryby & S_IWUSR) printf("w");else printf("-");
if(tryby & S_IXUSR) printf("x");else printf("-");
if(tryby & S_IRGRP) printf("r");else printf("-");
if(tryby & S_IWGRP) printf("w");else printf("-");
if(tryby & S_IXGRP) printf("x");else printf("-");
if(tryby & S_IROTH) printf("r");else printf("-");
if(tryby & S_IWOTH) printf("w");else printf("-");
if(tryby & S_IXOTH) printf("x");else printf("-");
}
void type(mode_t tryby){
if(S_ISDIR(tryby))printf("folder");
if(S_ISREG(tryby))printf("zwykly plik");
if(S_ISLNK(tryby))printf("dowiazanie symboliczne");
if(S_ISFIFO(tryby))printf("fifo");
}
void file_info(struct stat file, mode_t tryby, char *filename){
printf("\n\t Plik %s:\n\n", filename);
printf("Uprawnienia_____: ");
permissions(tryby);
printf("\nTyp pliku_______: ");
type(tryby);
printf("\nData utworzenia_: %d", file.st_ctime);
printf("\nData modyfikacji: %d", file.st_mtime);
printf("\nWlasciciel______: %d", file.st_uid);
printf("\nRozmiar pliku___: %d bajtow\n", file.st_size);
}
void tree(char *filename){
struct stat file;
struct dirent *dr;
DIR *directory;
mode_t tryby;
if(lstat(filename,&file)==-1)
return;
if((directory=opendir(filename))==NULL){
tryby=file.st_mode;
file_info(file,tryby,filename);
}
else{
printf("\n In directory -> %s\n", filename);
while(dr=readdir(directory)){
if(dr->d_ino != 0)
if(dr->d_name[0]!='.' && dr->d_name[1]!='.')
tree(dr->d_name);
}
}
}
int main(int argc, char *argv[]){
if(argc < 2){
printf("Podaj sciezke do pliku/katalogu\n\n");
return 0;
}
tree(argv[1]);
return 0;
}