Advertisement
Guest User

Untitled

a guest
May 26th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.25 KB | None | 0 0
  1. //--------------------------------------------
  2. // NAME:Konstantin Georgiev
  3. // CLASS:XIa
  4. // NUMBER:15
  5. // PROBLEM:#1
  6. // FILE NAME:m.c
  7. // FILE PURPOSE: ls unix function implementation in C
  8. //---------------------------------------------
  9. #include<stdio.h>
  10. #include<dirent.h>
  11. #include<stdlib.h>
  12. #include <sys/types.h>
  13. #include <sys/stat.h>
  14. #include <unistd.h>
  15. #include <string.h>
  16. //--------------------------------------------
  17. // FUNCTION: printNormalContents
  18. // prints a directory's contents
  19. // PARAMETERS:
  20. // char *thing - The name of the directory to be opened
  21. // int hidden - a flag that tells the function if it needs to display hidden files
  22. // int isDirectory - a flag that tells the function if it needs to print the directory name
  23. //--------------------------------------------
  24. void printNormalContents(char *thing, int hidden, int isDirectory, int isDetailed){
  25. if(isDirectory != 1){
  26. printf("%s:\n", thing);
  27. }
  28. DIR*p;
  29. struct dirent *d;
  30. p = opendir(thing);
  31. if(p == NULL){
  32. fprintf(stderr, "ls: cannot access %s: No such file or directory", thing);
  33. return;
  34. }
  35. while(d=readdir(p)){
  36. if(d->d_name[0] != '.' || hidden == 1){
  37. struct stat path_stat;
  38. stat(d->d_name, &path_stat);
  39. if(isDetailed == 1){
  40. if(S_IRUSR(path_stat.st_mode)){printf(" r");}
  41. else{printf(" -");}
  42. if(S_IWUSR(path_stat.st_mode)){printf("w");}
  43. else{printf("-");}
  44. if(S_IXUSR(path_stat.st_mode)){printf("x");}
  45. else{printf("-");}
  46. if(S_IRGRP(path_stat.st_mode)){printf("r");}
  47. else{printf("-");}
  48. if(S_IWGRP(path_stat.st_mode)){printf("w");}
  49. else{printf("-");}
  50. if(S_IXGRP(path_stat.st_mode)){printf("x");}
  51. else{printf("-");}
  52. if(S_IROTH(path_stat.st_mode)){printf("r");}
  53. else{printf("-");}
  54. if(S_IWOTH(path_stat.st_mode)){printf("w");}
  55. else{printf("-");}
  56. if(S_IXOTH(path_stat.st_mode)){printf("x");}
  57. else{printf("-");}
  58. printf("\t%d ", path_stat.st_nlink);
  59. printf("\t%s ", getpwuid(path_stat.st_uid)->pw_name);
  60. printf("\t%s ", getgrgid(path_stat.st_gid)->gr_name);
  61. printf("%zu", path_stat.st_size);
  62. if(S_ISREG(path_stat.st_mode)){ //Checking if regular file
  63. printf(" %s",d->d_name);}
  64. else if(S_ISDIR(path_stat.st_mode)){ //Checking if directory
  65. printf(" %s",d->d_name);}
  66. else if(S_ISCHR(path_stat.st_mode)){ //Checking if character device
  67. printf(" %s",d->d_name);}
  68. else if(S_ISBLK(path_stat.st_mode)){ //Checking if block device
  69. printf(" %s",d->d_name);}
  70. else if(S_ISFIFO(path_stat.st_mode)){ //Checking if program stream
  71. printf(" %s",d->d_name);}
  72. else if(S_ISLNK(path_stat.st_mode)){
  73. printf(" %s",d->d_name);}
  74. else if(S_ISSOCK(path_stat.st_mode)){ //Checking if socket
  75. printf(" %s",d->d_name);}
  76. printf(" %s\n", ctime(&path_stat.st_mtime));
  77. }
  78. else{
  79. if(S_ISREG(path_stat.st_mode)){ //Checking if regular file
  80. printf("- %s\n",d->d_name);}
  81. else if(S_ISDIR(path_stat.st_mode)){ //Checking if directory
  82. printf("d %s\n",d->d_name);}
  83. else if(S_ISCHR(path_stat.st_mode)){ //Checking if character device
  84. printf("c %s\n",d->d_name);}
  85. else if(S_ISBLK(path_stat.st_mode)){ //Checking if block device
  86. printf("b %s\n",d->d_name);}
  87. else if(S_ISFIFO(path_stat.st_mode)){ //Checking if program stream
  88. printf("p %s\n",d->d_name);}
  89. else if(S_ISLNK(path_stat.st_mode)){
  90. printf("l %s\n",d->d_name);}
  91. else if(S_ISSOCK(path_stat.st_mode)){ //Checking if socket
  92. printf("s %s\n",d->d_name);}}
  93. }
  94. }
  95. closedir(p);
  96. }
  97. int main(int argc, char **argv){
  98. int hidden = 0;
  99. int flag = 0;
  100. int dirFlag = 0;
  101. if(argc > 1){
  102. if(argc == 2){dirFlag = 1;}
  103. if(argv[1][0] == '.'){printNormalContents("./", hidden, 1);
  104. return;}
  105. for(int i = 1; i < argc; i++){
  106. if(strstr(argv[i], "-") != NULL && (strstr(argv[i], "a") != NULL || strstr(argv[i], "A") != NULL) ){hidden = 1;
  107. }
  108. }
  109. for(int i = 1; i < argc; i++){
  110. if(strstr(argv[i], "-") == NULL){
  111. if(strstr(argv[i], "/") == NULL){
  112. if(strstr(argv[i], ".") != NULL && argv[i][0] != '.'){
  113. if(access(argv[i], F_OK) != -1){
  114. printf("- %s\n", argv[i]);
  115. }
  116. else{
  117. fprintf(stderr, "ls: cannot access %s: No such file or directory", argv[i]);
  118. }
  119. }
  120. else{
  121. printNormalContents(argv[i], hidden, dirFlag);
  122. if(i != argc - 1 && argv[i+1][0] != '.'){printf("\n");}
  123. }
  124. }
  125. else{
  126. printNormalContents(argv[i], hidden, dirFlag);
  127. if(i != argc - 1 && argv[i+1][0] != '.'){printf("\n");}
  128. }
  129. flag = 1;
  130. }
  131. }
  132. if(flag == 0){
  133. printNormalContents("./", hidden, 1);
  134. }
  135. }
  136. else{
  137. printNormalContents("./", hidden, 1);
  138. }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement