src/ls.c
/**
 * Sposob dzialania:
 * 1. Wczytuje ilosc plikow za pomoca metody file_amount_in_path
 * - jezeli ilosc rowna 2 przerywa dzialanie (lista z [".", ".."])
 * 2. Alokuje tablice struktur file o rozmiarze wczytanym
 * 3. Iteruje do konca plikow w danym katalogu
 * -jezeli plik jest dostepny wpisuje go do struktury oraz zwieksza licznik file_opened (gdyz nie zawsze wszystkie pliki da sie odczytac za pomoca statu)
 * -jezeli plik jest folderem zwieksza licznik ilosci dostepnych folderow
 * 3. Jezeli zaznaczono opcje sortowania to sortuje za pomoca qsort
 * 4. Wypisuje pliki w danym katalogu z zaznaczonymi opcjami
 * 5. Jezeli zaznaczono rekurencje program alokuje tablice samych folderow oraz przepisuje je z tablicy plikow, w innym wypadku zwalnia pamiec i zakoncza prace.
 * 6. Zwalnia liste wszystkich plikow oraz zostawia tablice z folderami.
 * 7. Uruchamia te metode dla sciezek katalogow pozostalych
 * 8. Po wykonaniu zwalnia tablice plikow oraz metoda konczy sie 
 * */
Sposob dzialania:
1. Wczytuje ilosc plikow za pomoca metody file_amount_in_path
- jezeli ilosc rowna 2 przerywa dzialanie (lista z [".", ".."])
2. Alokuje tablice struktur file o rozmiarze wczytanym
3. Iteruje do konca plikow w danym katalogu
-jezeli plik jest dostepny wpisuje go do struktury oraz zwieksza licznik file_opened (gdyz nie zawsze wszystkie pliki da sie odczytac za pomoca statu)
-jezeli plik jest folderem zwieksza licznik ilosci dostepnych folderow
3. Jezeli zaznaczono opcje sortowania to sortuje za pomoca qsort
4. Wypisuje pliki w danym katalogu z zaznaczonymi opcjami
5. Jezeli zaznaczono rekurencje program alokuje tablice samych folderow oraz przepisuje je z tablicy plikow, w innym wypadku zwalnia pamiec i zakoncza prace.
6. Zwalnia liste wszystkich plikow oraz zostawia tablice z folderami.
7. Uruchamia te metode dla sciezek katalogow pozostalych
8. Po wykonaniu zwalnia tablice plikow oraz metoda konczy sie
Sposob dzialania : 1 . Wczytuje ilosc plikow za pomoca metody file_amount_in_path - jezeli ilosc rowna 2 przerywa dzialanie ( lista z [ " . " " .. " ] ) 2 . Alokuje tablice struktur file o rozmiarze wczytanym 3 . Iteruje do konca plikow w danym katalogu - jezeli plik jest dostepny wpisuje go do struktury oraz zwieksza licznik file_opened ( gdyz nie zawsze wszystkie pliki da sie odczytac za pomoca statu ) - jezeli plik jest folderem zwieksza licznik ilosci dostepnych folderow 3 . Jezeli zaznaczono opcje sortowania to sortuje za pomoca qsort 4 . Wypisuje pliki w danym katalogu z zaznaczonymi opcjami 5 . Jezeli zaznaczono rekurencje program alokuje tablice samych folderow oraz przepisuje je z tablicy plikow w innym wypadku zwalnia pamiec i zakoncza prace . 6 . Zwalnia liste wszystkich plikow oraz zostawia tablice z folderami . 7 . Uruchamia te metode dla sciezek katalogow pozostalych 8 . Po wykonaniu zwalnia tablice plikow oraz metoda konczy sie
void list_dir(char *path, bool sort, bool human_readable_size, bool detail, bool recursively)
{
    if(recursively)
        printf("\n%s:\n",path);
    DIR *dir;
    struct dirent *dp;
    struct stat stat_buf;
    if((dir = opendir(path)) == NULL)
    {
        perror("Can not open the directory: ");
        return;
    }
    int file_amount = file_amount_in_path(path);
    if(file_amount == 2) return;
    file_struct *file_list = (file_struct*) malloc (sizeof(file_struct) * (file_amount));
    int file_opened = 0;
    int dir_amount = 0;
    int dir_iter = 0;
    int i = 0;
    while((dp = readdir(dir)) != NULL)
    {
        char *full_name = path_generator(path,dp->d_name);
        file_struct *file = file_list+file_opened;
        if(stat(full_name,&stat_buf))
        {
            perror("Cannot open the file!");
            free(full_name);
            continue;
        }
        strcpy(file->name,dp->d_name);
        set_perms(file,&stat_buf);
        file->size = (long)stat_buf.st_size;
        file->user_id = stat_buf.st_uid;
        file->group_id = stat_buf.st_gid;
        file->time = stat_buf.st_mtime;
        file->is_directory = dp->d_type == DT_DIR ? 1 : 0;
        if(file->is_directory == 1) 
            dir_amount++;
        file_opened++;
        free(full_name);
    }    
    if(sort)
        qsort(file_list,file_opened,sizeof(file_struct),cmp_date);
    for(i = 0; i < file_opened; ++i)
        print_file(file_list+i, human_readable_size,detail);
    printf("\n");
    if(dir_amount == 2 || recursively == false)
    {
        free(file_list);
        closedir(dir);
        return;
    }
    file_struct *dir_list = (file_struct*) malloc (sizeof(file_struct) * (dir_amount));
    for(i =  0; i < file_opened; ++i)
    {
        if(file_list[i].is_directory == 1)
        {
            if(strcmp(file_list[i].name,".") == 0 || strcmp(file_list[i].name,"..") == 0) continue;
            dir_list[dir_iter++] = file_list[i];
        }
    }
    free(file_list);           
    closedir(dir);
    for(i = 0; i < dir_iter; ++i)
    {
        char *second_path = path_generator(path, dir_list[i].name);
        list_dir(second_path,sort,human_readable_size,detail,true);
        free(second_path);
    }
    free(dir_list);
}
void list_dir ( char * path , bool sort , bool human_readable_size , bool detail , bool recursively ) { if ( recursively ) printf ( " \n \n " , path ) ; DIR * dir ; struct dirent * dp ; struct stat stat_buf ; if ( ( dir = opendir ( path ) ) == NULL ) { perror ( " " ) ; return ; } int file_amount = file_amount_in_path ( path ) ; if ( file_amount == 2 ) return ; file_struct * file_list = ( file_struct * ) malloc ( sizeof ( file_struct ) * ( file_amount ) ) ; int file_opened = 0 ; int dir_amount = 0 ; int dir_iter = 0 ; int i = 0 ; while ( ( dp = readdir ( dir ) ) != NULL ) { char * full_name = path_generator ( path , dp -> d_name ) ; file_struct * file = file_list + file_opened ; if ( stat ( full_name , & stat_buf ) ) { perror ( " " ) ; free ( full_name ) ; continue ; } strcpy ( file -> name , dp -> d_name ) ; set_perms ( file , & stat_buf ) ; file -> size = ( long ) stat_buf . st_size ; file -> user_id = stat_buf . st_uid ; file -> group_id = stat_buf . st_gid ; file -> time = stat_buf . st_mtime ; file -> is_directory = dp -> d_type == DT_DIR ? 1 : 0 ; if ( file -> is_directory == 1 ) dir_amount ++ ; file_opened ++ ; free ( full_name ) ; } if ( sort ) qsort ( file_list , file_opened , sizeof ( file_struct ) , cmp_date ) ; for ( i = 0 ; i < file_opened ; ++ i ) print_file ( file_list + i , human_readable_size , detail ) ; printf ( " \n " ) ; if ( dir_amount == 2 || recursively == false ) { free ( file_list ) ; closedir ( dir ) ; return ; } file_struct * dir_list = ( file_struct * ) malloc ( sizeof ( file_struct ) * ( dir_amount ) ) ; for ( i = 0 ; i < file_opened ; ++ i ) { if ( file_list [ i ] . is_directory == 1 ) { if ( strcmp ( file_list [ i ] . name , " " ) == 0 || strcmp ( file_list [ i ] . name , " " ) == 0 ) continue ; dir_list [ dir_iter ++ ] = file_list [ i ] ; } } free ( file_list ) ; closedir ( dir ) ; for ( i = 0 ; i < dir_iter ; ++ i ) { char * second_path = path_generator ( path , dir_list [ i ] . name ) ; list_dir ( second_path , sort , human_readable_size , detail , true ) ; free ( second_path ) ; } free ( dir_list ) ; }
Sposob dzialania:
 1.
Sposob dzialania : 1 .