Advertisement
Guest User

ls

a guest
Mar 26th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.52 KB | None | 0 0
  1.  
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <dirent.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <grp.h>
  9. #include <pwd.h>
  10. #include <time.h>
  11.  
  12. #define CHAR_SIZE sizeof(char)
  13. #define ANSI_COLOR_BLUE   "\e[1;36m"
  14. #define ANSI_COLOR_RESET  "\x1b[0m"
  15. #define MAX_DIR_NAME_SIZE 8192
  16.  
  17. void get_stat(char *file_name, char *directory, struct stat *stat_var) {
  18.   char file_dir[MAX_DIR_NAME_SIZE] = "";
  19.   strcat(file_dir, directory);
  20.   strcat(file_dir, file_name);
  21.   stat(file_dir, stat_var);
  22. }
  23.  
  24. int cmp(char *first, char *second, char *directory_name) {
  25.   struct stat first_stat;
  26.   struct stat second_stat;
  27.   get_stat(first, directory_name, &first_stat);
  28.   get_stat(second, directory_name, &second_stat);
  29.   return second_stat.st_size - first_stat.st_size;
  30. }
  31.  
  32. void print_info(char *file, char *directory) {
  33.   struct stat file_stat;
  34.   get_stat(file, directory, &file_stat);
  35.  
  36.   if (S_ISREG(file_stat.st_mode))
  37.     printf("-");
  38.   else if (S_ISDIR(file_stat.st_mode))
  39.     printf("d");
  40.   else if (S_ISLNK(file_stat.st_mode))
  41.     printf("l");
  42.   else
  43.     printf(" ");
  44.  
  45.   char mode[10] = "---------";
  46.   if (file_stat.st_mode & S_IRUSR) mode[0] = 'r';
  47.   if (file_stat.st_mode & S_IWUSR) mode[1] = 'w';
  48.   if (file_stat.st_mode & S_IXUSR) mode[2] = 'x';
  49.   if (file_stat.st_mode & S_IRGRP) mode[3] = 'r';
  50.   if (file_stat.st_mode & S_IWGRP) mode[4] = 'w';
  51.   if (file_stat.st_mode & S_IXGRP) mode[5] = 'x';
  52.   if (file_stat.st_mode & S_IROTH) mode[6] = 'r';
  53.   if (file_stat.st_mode & S_IWOTH) mode[7] = 'w';
  54.   if (file_stat.st_mode & S_IXOTH) mode[8] = 'x';
  55.   printf("%s ", mode);
  56.  
  57.   printf("%d ", file_stat.st_nlink);
  58.  
  59.   printf("%s ", getgrgid(file_stat.st_gid)->gr_name);
  60.  
  61.   printf("%s ", getpwuid(file_stat.st_uid)->pw_name);
  62.  
  63.   printf("%.6s ", 4 + ctime(&file_stat.st_mtime));
  64.  
  65.   printf("%d\t", file_stat.st_size);
  66.   if (S_ISDIR(file_stat.st_mode))
  67.     printf(ANSI_COLOR_BLUE "%s\n" ANSI_COLOR_RESET, file);
  68.   else
  69.     printf("%s\n", file);
  70. }
  71.  
  72. void ls(char *dir_name) {
  73.   DIR *dir = opendir(dir_name);
  74.   if(dir == NULL) {
  75.     printf("Can not open directory %s.\n", dir_name);
  76.     closedir(dir);
  77.     return;
  78.   }
  79.   size_t files_in_directory = 0;
  80.   struct dirent *file;
  81.   while ((file = readdir(dir)) != NULL)
  82.     ++files_in_directory;
  83.   rewinddir(dir);
  84.   char files_list[files_in_directory][MAX_DIR_NAME_SIZE];
  85.   for (size_t i = 0; i < files_in_directory; ++i) {
  86.     strcpy(files_list[i], readdir(dir)->d_name);
  87.   }
  88.   char directory_name[MAX_DIR_NAME_SIZE] = "";
  89.   strcat(directory_name, dir_name);
  90.   if(directory_name[strlen(directory_name) - 1] != '/')
  91.     strcat(directory_name, "/");
  92.   qsort_r(files_list,
  93.           files_in_directory,
  94.           sizeof(files_list[0]),
  95.           (int (*)(const void *, const void *)) cmp,
  96.           directory_name);
  97.   printf("%s:\n", directory_name);
  98.   for (size_t i = 0; i < files_in_directory; ++i)
  99.     print_info(files_list[i], directory_name);
  100.   printf("\n");
  101.   for (size_t i = 0; i < files_in_directory; ++i)
  102.     if (strcmp(files_list[i], ".") != 0 && strcmp(files_list[i], "..") != 0) {
  103.       struct stat file_stat;
  104.       get_stat(files_list[i], directory_name, &file_stat);
  105.       if (S_ISDIR(file_stat.st_mode)) {
  106.         char file_dir[MAX_DIR_NAME_SIZE] = "";
  107.         strcat(file_dir, directory_name);
  108.         strcat(file_dir, files_list[i]);
  109.         ls(file_dir);
  110.       }
  111.     }
  112.   closedir(dir);
  113. }
  114.  
  115. int main(int argc, char **argv) {
  116.   if (argc < 2) {
  117.     ls(".");
  118.   }
  119.   for (int i = 1; i < argc; ++i) {
  120.     ls(argv[i]);
  121.   }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement