bartoshr

List

Nov 10th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.19 KB | None | 0 0
  1. #include <sys/stat.h>
  2. #include <sys/types.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <dirent.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <pwd.h>
  10. #include <grp.h>
  11. #include <time.h>
  12.  
  13. #define SIZE 1000
  14.  
  15. void print(char dir[]);
  16. void print_detail(char *text, char dir[]);
  17. void print_normal(char *text);
  18. void print_recurrence(char dir[]);
  19.  
  20. int compare_name(const void *a, const void *b);
  21. int compare_time(const void *a, const void *b);
  22.  
  23. void print_time(time_t t);
  24. void print_type(mode_t m);
  25. void print_perm(mode_t m);
  26.  
  27. void print_num(int num);
  28. void print_str(const char *c);
  29.  
  30. int is_dir(struct dirent *d, char * dir);
  31. void createPath(char *dest, char *name);
  32. void shortenPath(char *path);
  33.  
  34. int lflag = 0;
  35. int tflag = 0;
  36. int Rflag = 0;
  37.  
  38. char *separator = "\n";
  39.  
  40. int main(int argc, char **argv){
  41.  
  42.     char *dir = ".";
  43.     int c;
  44.     while((c = getopt(argc, argv, "lRt")) != -1){
  45.         switch(c){
  46.             case 'l':
  47.                 lflag = 1;
  48.                 break;
  49.             case 'R':
  50.                 Rflag = 1;
  51.                 lflag = 1;
  52.                 break;
  53.             case 't':
  54.                 tflag = 1;
  55.                 break;
  56.             default:
  57.                 abort();
  58.         }
  59.     }
  60.  
  61.     if(optind < argc) {
  62.         dir = argv[optind];
  63.     }
  64.    
  65.     if(Rflag) {
  66.         char * next_dir = malloc(SIZE*sizeof(char));
  67.         strcpy(next_dir, dir);
  68.         print_recurrence(next_dir);
  69.     } else {
  70.         print(dir);
  71.     }
  72.  
  73.     return 0;
  74. }
  75.  
  76.  
  77. void print(char dir[]){
  78.      // liczba wskazująca ilość rekordów możliwych do zapisania w liście
  79.     int i = 0;
  80.     int c_list = 10;
  81.     struct dirent **list = calloc(c_list,sizeof(struct dirent*));
  82.    
  83.     DIR * katalog = opendir(dir);
  84.         struct dirent * zawartosc = readdir(katalog);
  85.    
  86.         while(zawartosc != NULL) {
  87.         if(i >= c_list) {
  88.             c_list += 10;
  89.             list = realloc(list, c_list*sizeof(struct dirent *));
  90.         }
  91.         list[i] = zawartosc;
  92.         i++;
  93.                 zawartosc = readdir(katalog);
  94.         }
  95.  
  96.     if(tflag) {
  97.         qsort(list, i, sizeof(struct dirent*), compare_time);
  98.     } else {
  99.         qsort(list, i, sizeof(struct dirent*), compare_name);
  100.     }
  101.  
  102.     struct dirent **tmp = list;
  103.  
  104.     for(i; i>0; i--){
  105.         if(lflag) {
  106.             print_detail((*tmp)->d_name, dir);
  107.         } else {
  108.             print_normal((*tmp)->d_name);
  109.         }
  110.         tmp++;
  111.     }
  112.  
  113.  
  114.     free(list);
  115. }
  116.  
  117.  
  118.  
  119. void print_recurrence(char dir[]){ 
  120.    
  121.     DIR * katalog = opendir(dir);
  122.     struct dirent * zawartosc = readdir(katalog);
  123.    
  124.     print_str(dir);
  125.     print_str("\n");
  126.     print(dir);
  127.     print_str("\n");   
  128.    
  129.         while(zawartosc != NULL) {
  130.         if( strcmp(zawartosc->d_name, ".") != 0 &&
  131.             strcmp(zawartosc->d_name,"..") != 0 && is_dir(zawartosc, dir)) {
  132.  
  133.             createPath(dir, zawartosc->d_name);
  134.             print_recurrence(dir);
  135.             shortenPath(dir);
  136.         }
  137.                 zawartosc = readdir(katalog);
  138.         }
  139. }
  140.  
  141. void print_detail(char *text, char dir[]){
  142.     struct stat buff;
  143.    
  144.     char * temp = (char*) calloc(SIZE,sizeof(char));
  145.     strcat(temp, dir);
  146.     strcat(temp, "/");
  147.     strcat(temp, text);
  148.    
  149.     stat(temp, &buff);
  150.    
  151.     struct passwd* pass = getpwuid(buff.st_uid);
  152.     struct group* g = getgrgid(buff.st_gid);
  153.  
  154.     if(g != NULL) {
  155.         print_type(buff.st_mode);
  156.         print_perm(buff.st_mode);
  157.         print_str(" ");
  158.         print_num(buff.st_nlink);
  159.         print_str(" ");
  160.         print_str(pass->pw_name);  
  161.         print_str(" ");
  162.         print_str(g->gr_name);
  163.         print_str(" ");
  164.         print_num(buff.st_size);
  165.         print_str(" ");
  166.         print_time(buff.st_mtime);
  167.         print_str(" ");
  168.         print_str(text);
  169.         print_str(separator);
  170.     }
  171.    
  172.     free(temp);
  173. }
  174.  
  175. void print_normal(char * text){
  176.     print_str(text);
  177.     print_str(separator);
  178. }
  179.  
  180.  
  181. void print_type(mode_t m){
  182.     switch (m & S_IFMT) {
  183.            case S_IFBLK:  print_str("b");   break;
  184.            case S_IFCHR:  print_str("c");   break;
  185.            case S_IFDIR:  print_str("d");   break;
  186.            case S_IFIFO:  print_str("p");   break;
  187.            case S_IFLNK:  print_str("l");   break;
  188.            case S_IFREG:  print_str("-");   break;
  189.            case S_IFSOCK: print_str("s");   break;
  190.            default:       print_str("u");   break;
  191.            }
  192. }
  193.  
  194. void print_perm(mode_t m){
  195.        
  196.     if((m & S_IRUSR) == S_IRUSR) print_str("r");
  197.     else print_str("-");
  198.     if((m & S_IWUSR) == S_IWUSR) print_str("w");
  199.     else print_str("-");
  200.     if((m & S_IXUSR) == S_IXUSR) print_str("x");
  201.     else print_str("-");
  202.  
  203.  
  204.     if((m & S_IRGRP) == S_IRGRP) print_str("r");
  205.     else print_str("-");
  206.     if((m & S_IWGRP) == S_IWGRP) print_str("w");
  207.     else print_str("-");
  208.     if((m & S_IXGRP) == S_IXGRP) print_str("x");
  209.     else print_str("-");
  210.  
  211.    
  212.     if((m & S_IROTH) == S_IROTH) print_str("r");
  213.     else print_str("-");
  214.     if((m & S_IWOTH) == S_IWOTH) print_str("w");
  215.     else print_str("-");
  216.     if((m & S_IXOTH) == S_IXOTH) print_str("x");
  217.     else print_str("-");
  218. }
  219.  
  220. void print_time(time_t t){
  221.     struct tm * timeinfo;
  222.     timeinfo = localtime(&t);
  223.     print_num(timeinfo->tm_mon);
  224.     print_str("-");
  225.     print_num(timeinfo->tm_mday);
  226.     print_str(" ");
  227.     print_num(timeinfo->tm_hour);
  228.     print_str(":");
  229.     print_num(timeinfo->tm_min);
  230. }
  231.  
  232.  
  233. void print_str(const char *c){
  234.     write(1, c, strlen(c));
  235. }
  236.  
  237. void print_num(int n){
  238.     char cyfra[1];
  239.     if(n > 0) {
  240.         print_num(n/10);
  241.         cyfra[0] = (n%10)+48;
  242.         write(1,cyfra, 1);
  243.     }
  244. }
  245.  
  246. int compare_time(const void *a, const void *b){
  247.     struct dirent * ad = (*(struct dirent **)a);
  248.     struct dirent * bd = (*(struct dirent **)b);
  249.  
  250.     struct stat stat_a;
  251.     stat(ad->d_name, &stat_a);
  252.  
  253.     struct stat stat_b;
  254.     stat(bd->d_name, &stat_b);
  255.    
  256.     return stat_b.st_mtime - stat_a.st_mtime;
  257. }
  258.  
  259. int compare_name(const void *a, const void*b){
  260.     struct dirent * ad = (*(struct dirent **)a);
  261.     struct dirent * bd = (*(struct dirent **)b);
  262.  
  263.     return strcmp(ad->d_name,bd->d_name);
  264. }
  265.  
  266.  
  267.  
  268. void createPath(char *dest, char *name){
  269.         strcat(dest, "/");
  270.         strcat(dest, name);
  271. }
  272.  
  273. void shortenPath(char *path) {
  274.     char * tmp = path;
  275.     while(*tmp != '\0'){
  276.         tmp++;
  277.     }
  278.     while(*tmp != '/'){
  279.         tmp--;
  280.     }  
  281.  
  282.     *tmp = '\0';
  283. }
  284.  
  285. int is_dir(struct dirent *d, char *dir) {
  286.     struct stat m_stat;
  287.     char *name = (char*) calloc(SIZE,sizeof(char));
  288.  
  289.     strcat(name, dir);
  290.     strcat(name, "/");
  291.     strcat(name, d->d_name);   
  292.  
  293.     stat(name, &m_stat);
  294.    
  295.     if(S_ISDIR(m_stat.st_mode))  {
  296.         // print_str("Check true");
  297.         // print_str(name);
  298.         // print_str("\n");
  299.         free(name);
  300.         return 1;
  301.     } else {
  302.         // print_str("Check false");
  303.         // print_str(name);
  304.         // print_str("\n");
  305.         free(name);
  306.         return 0;
  307.     }
  308. }
Add Comment
Please, Sign In to add comment