Advertisement
desdemona

ls. nareszcie.

Jan 13th, 2013
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.19 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <dirent.h>
  3. #include <sys/stat.h>
  4. #include <pwd.h>
  5. #include <grp.h>
  6. #include <time.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <fcntl.h>
  10. #include <sys/ioctl.h>
  11. #include <sys/types.h>
  12.  
  13. #define _GNU_SOURCE
  14.  
  15. DIR *folder;
  16. struct dirent  *wpis;  
  17. struct stat    info;
  18. int lopt = 0;
  19. int ropt = 0;
  20. int aopt = 0;
  21. int gbopt=0;
  22. int opt1=0;
  23. char* sciezka_parametr=".";
  24.  
  25.  
  26. char* prawadostepu(int tryb) {
  27.      char *bufor;
  28.      int i;
  29.      bufor=(char *) malloc (19);
  30.      
  31.      bufor[1]=((tryb & S_IRUSR) ? 'r' : '-');
  32.      bufor[2]=((tryb & S_IWUSR) ? 'w' : '-');
  33.      bufor[3]=((tryb & S_IXUSR) ? 'x' : '-');
  34.      bufor[4]=((tryb & S_IRGRP) ? 'r' : '-');
  35.      bufor[5]=((tryb & S_IWGRP) ? 'w' : '-');
  36.      bufor[6]=((tryb & S_IXGRP) ? 'x' : '-');
  37.      bufor[7]=((tryb & S_IROTH) ? 'r' : '-');
  38.      bufor[8]=((tryb & S_IWOTH) ? 'w' : '-');
  39.      bufor[9]=((tryb & S_IXOTH) ? 'x' : '-');
  40.      bufor[10] = 0;
  41.      
  42.      if (S_ISDIR (tryb)) {
  43.          bufor[0] = 'd';
  44.          return bufor;
  45.        }
  46.      if (S_ISBLK (tryb)) {
  47.          bufor[0] = 'b';
  48.          return bufor;
  49.        }
  50.      if (S_ISSOCK (tryb)) {
  51.          bufor[0] = 's';
  52.          return bufor;
  53.       }
  54.      if (S_ISCHR (tryb)) {
  55.          bufor[0] = 'c';
  56.          return bufor;
  57.        }
  58.      if (S_ISFIFO (tryb)) {
  59.          bufor[0] = 'p';
  60.          return bufor;
  61.        }
  62.      if ( S_ISLNK (tryb)) {
  63.          bufor[0] = 'l';
  64.          return bufor;
  65.        }
  66.      bufor[0]='-'; // w przec. wypadku
  67.      return bufor;
  68. }
  69.  
  70. void miesiac(int x)
  71. {
  72.     char* mies= "sty";
  73.     switch(x)
  74.     {
  75.     case 1:
  76.         mies = "sty";
  77.         break;
  78.     case 2:
  79.         mies = "lut";
  80.         break;
  81.     case 3:
  82.         mies = "mar";
  83.         break;
  84.     case 4:
  85.         mies = "kwi";
  86.         break;
  87.     case 5:
  88.         mies = "maj";
  89.         break;
  90.     case 6:
  91.         mies = "cze";
  92.         break;
  93.     case 7:
  94.         mies = "lip";
  95.         break;
  96.     case 8:
  97.         mies = "sie";
  98.         break;
  99.     case 9:
  100.         mies = "wrz";
  101.         break;
  102.     case 10:
  103.         mies = "paz";
  104.         break;
  105.     case 11:
  106.         mies = "lis";
  107.         break;
  108.     case 12:
  109.         mies = "gru";
  110.         break;
  111.     }
  112.     printf(" %s", mies);
  113. }
  114.  
  115. void piszopcjal(struct dirent *jozef)
  116. {
  117.     struct tm      *czas;
  118.     struct passwd  *pw;
  119.     struct group   *gr;
  120.     struct stat    status;
  121.     lstat(jozef->d_name,&status);
  122.     pw=getpwuid(status.st_uid);
  123.     gr=getgrgid(status.st_gid);
  124.     czas=gmtime(&status.st_mtime);
  125.     printf("%s",prawadostepu(status.st_mode));
  126.     printf(" % 10s ", pw->pw_name);
  127.     if(gbopt==0){
  128.     printf("%10s", gr->gr_name);
  129.     }
  130.     printf("%8d ", (int)status.st_size);
  131.     printf("%02d", czas->tm_mday);
  132.     miesiac((czas->tm_mon)+1);
  133.     printf(" %04d %02d:%02d",((czas->tm_year)+1900), czas->tm_hour+2, czas->tm_min);
  134.     if(S_ISDIR(status.st_mode))
  135.     {
  136.         printf("\e[1;34m %s\n\e[0m", jozef->d_name);
  137.     }
  138.     else if((status.st_mode & S_IXUSR) || (status.st_mode & S_IXGRP) || (status.st_mode & S_IXOTH))
  139.     {
  140.         printf("\e[1;32m %s\n\e[0m", jozef->d_name);
  141.     }
  142.     else
  143.     {
  144.         printf("\e[m %s\n\e[0m", jozef->d_name);
  145.     }
  146. }
  147.  
  148. void piszzwyczajnie(struct dirent *jozef)
  149. {
  150. struct stat status;
  151. lstat(jozef->d_name,&status);
  152.     if(S_ISDIR(status.st_mode))
  153.     {
  154.     printf("\e[1;34m %s\t\e[0m",jozef->d_name);
  155.     }
  156.     else if((status.st_mode & S_IXUSR) || (status.st_mode & S_IXGRP) || (status.st_mode & S_IXOTH))
  157.     {
  158.         printf("\e[1;32m %s\t\e[0m",jozef->d_name);
  159.     }
  160.     else
  161.     {
  162.     printf("\e[0m %s\t\e[0m",jozef->d_name);
  163.     }
  164.    
  165.     if(opt1 == 1)
  166.     {
  167.     printf("\n");
  168.     }
  169. }
  170.  
  171. void rekur(char *sciezka)
  172. {  
  173.     DIR *dir;
  174.     struct dirent *makaron;
  175.     struct stat stinfo;
  176.     //sciezka=get_current_dir_name();
  177.     if((dir = opendir(sciezka))==NULL)
  178.     {
  179.         printf("\nBlad odczytu katalogu %s\n", sciezka);
  180.         return;
  181.     }
  182.     chdir(sciezka);
  183.     int razem=0;
  184.    
  185.  
  186.     while ((makaron=readdir(dir))!=NULL) {
  187.         if(aopt == 0 && makaron->d_name[0]=='.')
  188.             continue;
  189.        
  190.         if(lopt == 1)
  191.         {
  192.         piszopcjal(makaron);
  193.         }
  194.         else
  195.         {
  196.         piszzwyczajnie(makaron);
  197.         }
  198.         razem++;
  199.     }
  200.     printf("razem: %d\n", razem);
  201.     rewinddir(dir);
  202.    
  203.     while ((makaron=readdir(dir))!=NULL) {
  204.    
  205.         if(aopt == 0 && makaron->d_name[0]=='.')
  206.             continue;
  207.    
  208.         lstat(makaron->d_name,&stinfo);
  209.         char *prawaWyznaczmy = prawadostepu(stinfo.st_mode);
  210.        
  211.         if (prawaWyznaczmy[0] == 'd')
  212.         {
  213.        
  214.             if((makaron->d_name == "..") || makaron->d_name == ".")
  215.             {
  216.                 continue;
  217.             }
  218.             else if(prawaWyznaczmy[7] != 'r')
  219.             {
  220.                 char *sciez2=get_current_dir_name();
  221.                 printf("\nbrak dostepu do katalogu %s w folderze %s\n", makaron->d_name, sciez2);
  222.             }
  223.             else
  224.             {
  225.                                
  226.                     chdir(makaron->d_name);
  227.                     char *sciez2=get_current_dir_name();
  228.                     printf("\n%s\n", sciez2);
  229.                     rekur(".");
  230.                     chdir("..");
  231.  
  232.                    
  233.                    
  234.                     }
  235.                    
  236.                 }
  237.     }
  238.                         closedir(dir); 
  239. }
  240.  
  241. int main(int argc, char **argv){
  242.  
  243.     int c;
  244.  
  245.  
  246.     while( (c=getopt(argc, argv, "aolGR1")) != -1)
  247.     {
  248.         //int this_option_optind = optind ? optind:1;
  249.         switch(c)
  250.         {
  251.             case '1':
  252.                 opt1=1;
  253.                 break;
  254.            
  255.             case 'l':
  256.                 //printf("option a\n");
  257.                 lopt = 1;
  258.                 break;
  259.             case 'a':
  260.                 aopt =1;
  261.                 break;
  262.             case 'R':
  263.                 ropt=1;
  264.                 break;
  265.             case 'G':
  266.                 gbopt=1;
  267.                 break;
  268.             case 'o':
  269.                 lopt=1;
  270.                 gbopt=1;
  271.                 break;
  272.             case '?':
  273.                 printf("skas zes pan takie opcje wyciagnal?\n");
  274.                 break;
  275.            
  276.         }
  277.  
  278.     }
  279.     int i;
  280.     for(i = optind; i< argc; i++)
  281.         {
  282.             sciezka_parametr = argv[i];
  283.             printf("%s\n", sciezka_parametr);
  284.             //jezeli cos podano po opcjach juz obejrzanych
  285.             //to pewnie jest to sciezka.
  286.         }
  287.        
  288.        
  289.        
  290.     if((folder = opendir(sciezka_parametr))==NULL)
  291.     {
  292.         printf("Blad odczytu katalogu");
  293.         return 0;
  294.     }
  295.     chdir(sciezka_parametr);
  296.     if( lopt == 1 && ropt == 0)
  297.     {
  298.  
  299.           while((wpis=readdir(folder))!=NULL)
  300.             {
  301.                 if(aopt == 0)
  302.                 if(wpis->d_name[0] == '.') continue;
  303.                
  304.                 piszopcjal(wpis);
  305.             }
  306.        
  307.     }
  308.     else if( lopt == 0 && ropt == 0)
  309.     {
  310.             while((wpis=readdir(folder))!=NULL)
  311.             {
  312.                 if(aopt==0 && wpis->d_name[0] == '.')
  313.                     continue;
  314.                
  315.                 piszzwyczajnie(wpis);
  316.             }
  317.        
  318.     }
  319.     else if(ropt == 1)
  320.     {
  321.         chdir(".");
  322.         rekur(".");
  323.     }
  324.  
  325.     printf("\e[0m");
  326.     printf("\e[m");
  327.     return 0;
  328. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement