Advertisement
Guest User

Untitled

a guest
Mar 4th, 2015
362
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.11 KB | None | 0 0
  1. // ICS 53 - Lab 8 - Search
  2. // grep -nFHr
  3. // n = print line number
  4. // F = fixed string (search for specific string)
  5. // H = print file name for each match
  6. // r = read files under each directory recursively
  7.  
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <unistd.h>
  14. #include <dirent.h>
  15. #include <errno.h>
  16. #include <pthread.h>
  17.  
  18. #define _FILE 100
  19. #define _DIR 200
  20. #define NUM_THREADS 200
  21.  
  22. struct stat sb;
  23.  
  24.  
  25. /* Functions that will read in files / patterns when user runs the program */
  26. int num_files = 0;
  27. char *pattern;
  28. struct Files
  29. {
  30. char *f_name;
  31. int status; // can = either FILE or DIR
  32. };
  33. struct Files arg_files[200];
  34.  
  35. struct thread_struct
  36. {
  37. char file_name[256];
  38. int thread_id;
  39. };
  40. struct thread_struct thread_array[200];
  41.  
  42. void strip_newline(char *input)
  43. {
  44. int len = strlen(input) - 1;
  45. if(input[len] == '\n')
  46. input[len] = '\0';
  47. }
  48.  
  49. int get_num_files(int *file_num)
  50. {
  51. if(*file_num > 2)
  52. num_files = *file_num - 2;
  53. return num_files;
  54. }
  55.  
  56. void check_args()
  57. {
  58. if(num_files == 0)
  59. {
  60. arg_files[0].f_name = "/home";
  61. return;
  62. }
  63. }
  64.  
  65. void get_pattern(char *argv[])
  66. {
  67. if(argv[1] != NULL)
  68. pattern = argv[1];
  69. else {
  70. printf("No pattern given\n");
  71. exit(1);
  72. }
  73. }
  74.  
  75. void load_names(char *argv[])
  76. {
  77. check_args();
  78. int i;
  79. for(i = 0; i < num_files; ++i)
  80. {
  81. arg_files[i].f_name = argv[i+2];
  82. }
  83. }
  84.  
  85. // determines if the file name passed in is a directory
  86. // returns DIRECTORY if it is, otherwise returns 0
  87. int is_dir(char *file_name)
  88. {
  89. stat(file_name, &sb);
  90. if(S_ISDIR(sb.st_mode))
  91. return _DIR;
  92. return 0;
  93. }
  94.  
  95. // determines if the file name passed in is a regular file
  96. // returns FILE if it is, otherwise returns 0
  97. int is_file(char *file_name)
  98. {
  99. stat(file_name, &sb);
  100. if(S_ISREG(sb.st_mode))
  101. return _FILE;
  102. return 0;
  103. }
  104.  
  105. void load_and_get_pattern(char *argv[])
  106. {
  107. get_pattern(argv);
  108. load_names(argv);
  109. }
  110.  
  111. void get_status()
  112. {
  113. int i;
  114. for(i = 0; i < num_files; ++i) {
  115. if(is_file(arg_files[i].f_name) == _FILE)
  116. arg_files[i].status = _FILE;
  117. else
  118. arg_files[i].status = _DIR;
  119. }
  120. }
  121.  
  122. void load_everything(char *argv[])
  123. {
  124. load_and_get_pattern(argv);
  125. get_status();
  126. }
  127.  
  128. /* Functions that will call system commands */
  129.  
  130. void check_file_for_pattern(char *temp, char *file_name,int ln, int id)
  131. {
  132. char *found = strstr(temp, pattern);
  133. if(found) {
  134. strip_newline(temp);
  135. printf("%d %s %s %d\n",id, file_name, temp, ln);
  136. }
  137. }
  138.  
  139.  
  140. void parse_file(FILE* fp, char *file_name, int id)
  141. {
  142. char temp[1024];
  143. int line_num = 1;
  144. while(fgets(temp, 1024, fp) != NULL) {
  145. check_file_for_pattern(temp, file_name, line_num, id);
  146. ++line_num;
  147. }
  148. }
  149.  
  150. void * grep_file(void * arg)
  151. {
  152. //printf("Thread created\n");
  153. struct thread_struct *thread = arg;
  154. char file_name[256];
  155. strcpy(file_name,thread->file_name);
  156. int id = thread->thread_id;
  157. printf("File name: %s\n", file_name);
  158. /*
  159. FILE* fp = fopen(file_name, "r");
  160. if(!fp) {
  161. printf("Couldn't open file\n");
  162. return NULL; }
  163. parse_file(fp, file_name, id);
  164. fclose(fp);
  165. return NULL;
  166. */
  167. return NULL;
  168. }
  169.  
  170. void create_file_thread(char * file_name, int i)
  171. {
  172. pthread_t threads[NUM_THREADS];
  173. strcpy(thread_array[i].file_name, file_name);
  174. thread_array[i].thread_id = i + 1;
  175. int rc;
  176. printf("thread file: %s\n", thread_array[i].file_name);
  177. if((rc = pthread_create(&threads[i], NULL,
  178. grep_file, &thread_array[i]))) {
  179. fprintf(stderr, "ERROR: Return code from pthread_create() is %d\n", rc);
  180. exit(-1);
  181. }
  182. }
  183.  
  184. void grep_directory(char *dir_name, int id)
  185. {
  186. DIR *p_dir = NULL; // pointer to a directory
  187. struct dirent *p_entry; // pointer to a directory entry
  188. if(!(p_dir = opendir(dir_name)))
  189. {
  190. fprintf(stderr, "Error while opening directory %s: %s\n", dir_name, strerror(errno));
  191. return;
  192. }
  193. while((p_entry = readdir(p_dir)))
  194. {
  195. char entry_path[250];
  196. snprintf(entry_path, 249, "%s/%s", dir_name, p_entry->d_name);
  197. if(is_dir(entry_path) == _DIR) {
  198. if(strcmp(p_entry->d_name, ".") != 0 && strcmp(p_entry->d_name, "..") != 0)
  199. grep_directory(entry_path, id);
  200. } else {
  201. create_file_thread(entry_path, id);
  202. }
  203. }
  204. closedir(p_dir);
  205. }
  206.  
  207.  
  208. void print_results(char *file_name, int i)
  209. {
  210. if(is_dir(file_name) == _DIR)
  211. grep_directory(file_name,i);
  212. else if(is_file(file_name) == _FILE) {
  213. create_file_thread(file_name, i);
  214. }
  215. }
  216.  
  217. void grep_and_print_directories()
  218. {
  219. for(long i = 0; i < num_files; ++i) {
  220. print_results(arg_files[i].f_name, i);
  221. }
  222. }
  223.  
  224.  
  225. int main(int argc, char *argv[])
  226. {
  227. get_num_files(&argc);
  228. load_everything(argv);
  229. grep_and_print_directories();
  230. pthread_exit(NULL);
  231. return 0;
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement