Advertisement
Guest User

Untitled

a guest
May 26th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.29 KB | None | 0 0
  1. // printf("[%d]%c%s %ld %s %s %s \n", p - 1, files[p - 1].type, files[p - 1].mode, files[p - 1].hard_links, files[p - 1].group, files[p - 1].owner, files[p - 1].name);
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <dirent.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <ctype.h>
  10. #include <pwd.h>
  11. #include <grp.h>
  12.  
  13. #define REALLOC_SIZE 2
  14. #define MODE_LEN 10
  15.  
  16.  
  17. struct file_t {
  18. char * dir;
  19. char * name;
  20. char * mode;
  21. char * group;
  22. char * owner;
  23. char type;
  24. nlink_t hard_links;
  25. };
  26.  
  27.  
  28. int aflag = 0;
  29. int lflag = 0;
  30. int rflag = 0;
  31.  
  32. int p = 0;
  33.  
  34. char get_file_type(mode_t mode);
  35. char * get_file_group(gid_t gid);
  36. char * get_file_mode(mode_t mode);
  37. char * get_file_owner(uid_t uid);
  38. char * create_path(const char * dirname, const char * filename);
  39.  
  40. int * sort_by_name(struct file_t * files);
  41.  
  42. void add_file(struct file_t * files, char * filename, char* file_mode, char * file_group, char * file_owner, char file_type, nlink_t file_hard_links, const char * dirname);
  43. void add_info_for_dir(int number_files, const char * dirname, struct file_t * files);
  44.  
  45. void print(struct file_t * files);
  46.  
  47. void process(int number_files, char * filenames[], struct file_t * files);
  48.  
  49.  
  50. int main(int argc, char * const* argv) {
  51. int c, i;
  52.  
  53. int element = 0;
  54. char ** dir = malloc(sizeof(char *));
  55.  
  56. while ((c = getopt (argc, argv, "aAlR")) != -1) {
  57. switch (c) {
  58. case 'A':
  59. aflag = 1;
  60. break;
  61. case 'l':
  62. lflag = 1;
  63. break;
  64. case 'R':
  65. rflag = 1;
  66. break;
  67. default:
  68. break;
  69. }
  70. }
  71.  
  72. for(i = 1; i < argc; i++) {
  73. if(argv[i][0] == '-') {
  74. continue;
  75. }
  76. dir = realloc(dir, (element + 1) * sizeof(char *));
  77. dir[element] = malloc(sizeof(char) * (strlen(argv[i]) + 1));
  78. strcpy(dir[element], argv[i]);
  79. element++;
  80. }
  81.  
  82. if(element == 0) {
  83. dir[0] = malloc(sizeof(char) * 2);
  84. dir[0] = ".\0";
  85. element ++;
  86. }
  87.  
  88. struct file_t files[255];
  89. process(element, dir, files);
  90.  
  91. print(files);
  92. // free(files);
  93. return 0;
  94. }
  95.  
  96.  
  97. void process(int number_files, char * filenames[], struct file_t * files) {
  98. int i;
  99. char file_type;
  100. struct stat curr_file_stat;
  101.  
  102. for (i = 0; i < number_files; ++i) {
  103. if(stat(filenames[i], &curr_file_stat)) {
  104. perror(filenames[i]);
  105. }
  106.  
  107. file_type = get_file_type(curr_file_stat.st_mode);
  108.  
  109. if(file_type == 'd') {
  110. add_info_for_dir(number_files, filenames[i], files);
  111. continue;
  112. }
  113.  
  114. add_file(files, filenames[i], get_file_mode(curr_file_stat.st_mode), get_file_group(curr_file_stat.st_gid), get_file_owner(curr_file_stat.st_uid), file_type, curr_file_stat.st_nlink, "");
  115.  
  116. }
  117. }
  118.  
  119.  
  120. void add_info_for_dir(int number_files, const char * dirname, struct file_t * files) {
  121. DIR *dir;
  122. struct dirent * ent;
  123. char * file_path;
  124. char file_type;
  125.  
  126. struct stat curr_stat;
  127.  
  128. dir = opendir(dirname);
  129. if(dir != NULL) {
  130. while((ent=readdir(dir)) != NULL) {
  131. file_path = create_path(dirname, ent->d_name);
  132.  
  133. if(stat(file_path, &curr_stat)) {
  134. perror(file_path);
  135. }
  136.  
  137. file_type = get_file_type(curr_stat.st_mode);
  138.  
  139. if(file_type == 'd' && rflag && (strcmp(ent -> d_name, ".") && strcmp(ent -> d_name, ".."))) {
  140. add_info_for_dir(number_files, file_path, files);
  141. }
  142.  
  143. add_file(files, ent->d_name, get_file_mode(curr_stat.st_mode), get_file_group(curr_stat.st_gid), get_file_owner(curr_stat.st_uid), file_type, curr_stat.st_nlink, dirname);
  144. free(file_path);
  145. }
  146. if(closedir(dir)) {
  147. perror("closedir");
  148. }
  149.  
  150. } else {
  151. perror("opendir");
  152. }
  153. }
  154.  
  155.  
  156. void add_file(struct file_t * files, char * filename, char* file_mode, char * file_group, char * file_owner, char file_type, nlink_t file_hard_links, const char * dirname) {
  157. files[p].dir = malloc(sizeof(char) * strlen(dirname));
  158. strcpy(files[p].dir, dirname);
  159.  
  160. files[p].name = malloc(sizeof(char) * (strlen(filename) + 1));
  161. strcpy(files[p].name, filename);
  162.  
  163. files[p].mode = malloc(sizeof(char) * (strlen(file_mode) + 1));
  164. strcpy(files[p].mode, file_mode);
  165.  
  166. files[p].owner = malloc(sizeof(char) * (strlen(file_owner) + 1));
  167. strcpy(files[p].owner, file_owner);
  168.  
  169. files[p].group = malloc(sizeof(char) * (strlen(file_group) + 1));
  170. strcpy(files[p].group, file_group);
  171.  
  172. files[p].hard_links = file_hard_links;
  173. files[p].type = file_type;
  174. p++;
  175. }
  176.  
  177.  
  178. char * create_path(const char * dirname, const char * filename) {
  179. char * file_path = malloc(sizeof(char) * (strlen(dirname) + strlen(filename) + 2));
  180.  
  181. strcpy(file_path, dirname);
  182.  
  183. if(dirname[strlen(dirname) - 1] != '/') {
  184. strcat(file_path, "/");
  185. }
  186.  
  187. strcat(file_path, filename);
  188.  
  189. return file_path;
  190. }
  191.  
  192. char get_file_type(mode_t mode) {
  193. switch(mode & S_IFMT) {
  194. case S_IFSOCK: return 's';
  195. case S_IFLNK: return 'l';
  196. case S_IFREG: return '-';
  197. case S_IFBLK: return 'b';
  198. case S_IFDIR: return 'd';
  199. case S_IFCHR: return 'c';
  200. case S_IFIFO: return 'p';
  201. default: return 'E';
  202. }
  203. }
  204.  
  205.  
  206. char * get_file_mode(mode_t mode) {
  207. char * file_mode = malloc(sizeof(char) * MODE_LEN);
  208. char curr_mode;
  209. int file_modes[9] = {S_IRUSR, S_IWUSR, S_IXUSR, S_IRGRP, S_IWGRP, S_IXGRP, S_IROTH, S_IWOTH, S_IXOTH};
  210. int i;
  211. for(i = 0; i < 9; i++) {
  212. if(mode & file_modes[i]) {
  213. switch(i % 3) {
  214. case 0: curr_mode = 'r'; break;
  215. case 1: curr_mode = 'w'; break;
  216. case 2: curr_mode = 'x'; break;
  217. }
  218. } else {
  219. curr_mode = '-';
  220. }
  221. file_mode[i] = curr_mode;
  222. }
  223.  
  224. file_mode[9] = '\0';
  225.  
  226. return file_mode;
  227. }
  228.  
  229. char * get_file_group(gid_t gid) {
  230. struct group * gr = getgrgid(gid);
  231. return gr -> gr_name;
  232. }
  233.  
  234.  
  235. char * get_file_owner(uid_t uid) {
  236. struct passwd * passw = getpwuid(uid);
  237. return passw -> pw_name;
  238. }
  239.  
  240.  
  241. void print(struct file_t * files) {
  242. int i;
  243. int pos;
  244. int * ordered_list = sort_by_name(files);
  245. for(i = 0; i < p; i++) {
  246. pos = i;
  247. pos = ordered_list[i];
  248. printf("%c%s %ld %s %s %s %s\n", files[pos].type, files[pos].mode, files[pos].hard_links, files[pos].group, files[pos].owner, files[pos].name, files[pos].dir);
  249.  
  250. }
  251. }
  252.  
  253. int * sort_by_name(struct file_t * files) {
  254. int * result_order = malloc(sizeof(int) * (p + 1));
  255. int i, k, temp;
  256. for(i = 0; i < p; i++) {
  257. result_order[i] = i;
  258. }
  259.  
  260. for(i = 0; i < p; i++) {
  261. printf("%d ",result_order[i]);
  262. }
  263. printf("\n");
  264. result_order[p] = '\0';
  265. for(i = 0; i < p; i ++) {
  266. for( k = i + 1; k < p; k++) {
  267. if(strcmp (files[i].name, files[k].name) > 0) {
  268. temp = result_order[i];
  269. result_order[i] = result_order[k];
  270. result_order[k] = temp;
  271. }
  272. }
  273. }
  274.  
  275. for(i = 0; i < p; i++) {
  276. printf("%d ",result_order[i]);
  277. }
  278. printf("\n");
  279. return result_order;
  280. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement