Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- include <stdlib.h>
- #include <stdio.h>
- #include <dirent.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <grp.h>
- #include <pwd.h>
- #include <time.h>
- int comp (const void *i, const void *j, char *directory) {
- struct stat iStat;
- struct stat jStat;
- char *fileDirectory = (char*)malloc(1000000000);
- if(fileDirectory == NULL){
- perror("");
- exit(0);
- }
- strcat(fileDirectory, directory);
- strcat(fileDirectory, i);
- stat(fileDirectory, &iStat);
- fileDirectory = (char*)realloc(fileDirectory, 1000000000);
- strcat(fileDirectory, directory);
- strcat(fileDirectory, j);
- stat(fileDirectory, &jStat);
- free(fileDirectory);
- return jStat.st_size - iStat.st_size;
- }
- void fill(char *array, struct stat fStat){
- if (fStat.st_mode & S_IRUSR)
- array[0] = 'r';
- if (fStat.st_mode & S_IWUSR)
- array[1] = 'w';
- if (fStat.st_mode & S_IXUSR)
- array[2] = 'x';
- if (fStat.st_mode & S_IRGRP)
- array[3] = 'r';
- if (fStat.st_mode & S_IWGRP)
- array[4] = 'w';
- if (fStat.st_mode & S_IXGRP)
- array[5] = 'x';
- if (fStat.st_mode & S_IROTH)
- array[6] = 'r';
- if (fStat.st_mode & S_IWOTH)
- array[7] = 'w';
- if (fStat.st_mode & S_IXOTH)
- array[8] = 'x';
- }
- void print(struct stat fStat, char* array, char* f){
- if (S_ISDIR(fStat.st_mode)) {
- printf("%c%s%d%s%s%.6s%d\t%s%s\n%s", 'd', array, fStat.st_nlink, getgrgid(fStat.st_gid)->gr_name,
- getpwuid(fStat.st_uid)->pw_name, 4 + ctime(&fStat.st_mtime), fStat.st_size, "\e[1;36m", f, "\x1b[0m");
- }
- else if(S_ISREG(fStat.st_mode)) {
- printf("%c%s%d%s%s%.6s%d\t%s\n", '-', array, fStat.st_nlink, getgrgid(fStat.st_gid)->gr_name,
- getpwuid(fStat.st_uid)->pw_name, 4 + ctime(&fStat.st_mtime), fStat.st_size, f);
- }
- else if(S_ISLNK(fStat.st_mode)) {
- printf("%c%s%d%s%s%.6s%d\t%s\n", 'l', array, fStat.st_nlink, getgrgid(fStat.st_gid)->gr_name,
- getpwuid(fStat.st_uid)->pw_name, 4 + ctime(&fStat.st_mtime), fStat.st_size, f);
- }
- else {
- printf("%c%s%d%s%s%.6s%d\t%s\n", ' ', array, fStat.st_nlink, getgrgid(fStat.st_gid)->gr_name,
- getpwuid(fStat.st_uid)->pw_name, 4 + ctime(&fStat.st_mtime), fStat.st_size, f);
- }
- }
- int countF(DIR *dir){
- int count = 0;
- while(readdir(dir) != NULL){
- ++count;
- }
- rewinddir(dir);
- return count;
- }
- void recursion(char *directoryName){
- DIR *dir = opendir(directoryName);
- if(dir == NULL){
- perror("Error");
- closedir(dir);
- return;
- }
- int countOfFiles = countF(dir);
- if(directoryName[strlen(directoryName) - 1] != '/'){
- directoryName = (char *)realloc(directoryName, strlen(directoryName) + 2);
- strcat(directoryName, "/");
- }
- char* arrayOfFiles[countOfFiles];
- int j, k;
- for(j = 0; j < countOfFiles; ++j){
- arrayOfFiles[j] = (char*)malloc(1000000000);
- if(arrayOfFiles[j] == NULL){
- perror("");
- exit(0);
- }
- for(k = 0; k < strlen(readdir(dir)->d_name); ++k){
- arrayOfFiles[j][k] = readdir(dir)->d_name[k];
- }
- }
- qsort_r(arrayOfFiles, countOfFiles, sizeof(char *), (int (*)(const void *, const void *)) comp, directoryName);
- printf("%s:\n", directoryName);
- for(j = 0; j < countOfFiles; ++j){
- struct stat fStat;
- char *tempDirectory = (char*)malloc(1000000000);
- if(tempDirectory == NULL){
- perror("");
- exit(0);
- }
- int k;
- for(k = 0; k < strlen(directoryName); ++k){
- tempDirectory[k] = directoryName[k];
- }
- strcat(tempDirectory, arrayOfFiles[j]);
- stat(tempDirectory, &fStat);
- char *array = (char *)malloc(10);
- if(array == NULL){
- perror("");
- exit(0);
- }
- for(k = 0; k < 9; ++k){
- array[k] = '-';
- }
- fill(array, fStat);
- print(fStat, array, directoryName);
- free(array);
- free(tempDirectory);
- }
- printf("\n");
- for(k = 0; k < countOfFiles; ++k){
- if(!(strlen(arrayOfFiles[k]) == 1 && arrayOfFiles[k][0] == '.') && !(strlen(arrayOfFiles[k]) == 2 && arrayOfFiles[k][0] == '.' && arrayOfFiles[k][1] == '.')){
- struct stat Stat;
- char *fDir = (char*)malloc(1000000000);
- if(fDir == NULL){
- perror("");
- exit(0);
- }
- for(k = 0; k < strlen(directoryName); ++k){
- fDir[k] = directoryName[k];
- }
- strcat(fDir, arrayOfFiles[k]);
- stat(fDir, &Stat);
- recursion(fDir);
- free(fDir);
- }
- }
- for(j = 0; j < countOfFiles; ++j){
- free(arrayOfFiles[j]);
- }
- free(arrayOfFiles);
- free(directoryName);
- closedir(dir);
- }
- int main(int argc, char **argv) {
- for(int i = 1; i < argc; ++i){
- recursion(argv[i]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement