Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.61 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dirent.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <unistd.h>
  9. #include <ctype.h>
  10. #include <stdbool.h>
  11. #include <pwd.h>
  12.  
  13. #define BUF_SZ 130000
  14.  
  15. struct Task {
  16. char pid[1000];
  17. char task_name[1000];
  18. char state[500];
  19. char user[500];
  20. char task[500];
  21. };
  22.  
  23. char proc_name[100];
  24. char pid[1000];
  25. char task_name[1000];
  26. char state[500];
  27. char user[500];
  28. char task[500];
  29.  
  30. int tot_tasks;
  31. char interrups[100];
  32. char switches[100];
  33. char forks[100];
  34. int task_list;
  35. int task_tot = 0;
  36.  
  37.  
  38. int is_reg_file(const char *path) {
  39. struct stat path_stat;
  40. stat(path, &path_stat);
  41.  
  42. return S_ISREG(path_stat.st_mode);
  43. }
  44.  
  45. void combining_digits(char *temp, int start, int end, char* var) {
  46. bool seen = false;
  47. for (int j = start; j < end; j++) {
  48. if (isdigit(temp[j]) && seen == false) {
  49. int len = strlen(var);
  50. var[len] = temp[j];
  51. var[len + 1] = '\0';
  52. int holder = j + 1;
  53. if (holder != end) {
  54. for (int k = holder; k < end; k++) {
  55. if (isdigit(temp[k])) {
  56. int len = strlen(var);
  57. var[len] = temp[k];
  58. var[len + 1] = '\0';
  59. } else {
  60. seen = true;
  61. break;
  62. }
  63. }
  64. }
  65. break;
  66. }
  67. }
  68. }
  69.  
  70. void task_info_helper(char *filename) {
  71. int file_d = open(filename, O_RDONLY);
  72. char buff[BUF_SZ];
  73.  
  74. memset(buff, 0, BUF_SZ);
  75. if (file_d == -1) {
  76. printf("There was a problem opening file %s.\n", filename);
  77. } else {
  78. if (strstr(filename, "comm")) {
  79. read(file_d, buff, 10000);
  80. char *char_set = "\n";
  81. int len = strcspn(buff, char_set);
  82. int tracker = 0;
  83.  
  84. for (int i = 0; i < len; i++) {
  85. tracker++;
  86. if (tracker <= 25) {
  87. int tn_len = strlen(task_name);
  88. task_name[tn_len] = buff[i];
  89. task_name[tn_len + 1] = '\0';
  90. } else {
  91. break;
  92. }
  93. }
  94. } else if (strstr(filename, "status")) {
  95. read(file_d, buff, BUF_SZ);
  96. char temp[25000];
  97. memset(temp, 0, 25000);
  98. int tracker = 0;
  99.  
  100. for (int i = 0; i < strlen(buff); i++) {
  101. if (buff[i] != '\n') {
  102. int len = strlen(temp);
  103. temp[len] = buff[i];
  104. temp[len + 1] = '\0';
  105. } else {
  106. if (strlen(state) == 0 || strlen(pid) == 0 || strlen(user) == 0 || strlen(task) == 0) {
  107. if (strstr(temp, "State")) {
  108. char *char_set = "State:";
  109. int start = strspn(temp, char_set);
  110. int end = strcspn(temp, "\n");
  111.  
  112. for (int j = start; j < end; j++) {
  113. if( (temp[j] >= 'a' && temp[j] <= 'z')) {
  114. int s_len = strlen(state);
  115. state[s_len] = temp[j];
  116. state[s_len + 1] = '\0';
  117. }
  118. }
  119. } else if (strstr(temp, "Pid")) {
  120. if (temp[0] == 'P' && temp[1] == 'i' && temp[2] == 'd') {
  121. char *char_set = "Pid:";
  122. int start = strspn(temp, char_set);
  123. int end = strcspn(temp, "\n");
  124.  
  125. for (int j = start; j < end; j++) {
  126. if (isdigit(temp[j])) {
  127. int p_len = strlen(pid);
  128. pid[p_len] = temp[j];
  129. pid[p_len + 1] = '\0';
  130. }
  131. }
  132. }
  133. } else if (strstr(temp, "Uid")) {
  134. tracker++;
  135. if (tracker <= 15) {
  136. char *char_set = "Uid:";
  137. int start = strspn(temp, char_set);
  138. int end = strcspn(temp, "\n");
  139. combining_digits(temp, start, end, user);
  140. }
  141. } else if (strstr(temp, "Threads")) {
  142. char *char_set = "Threads:";
  143. int start = strspn(temp, char_set);
  144. int end = strcspn(temp, "\n");
  145.  
  146. for (int j = start; j < end; j++) {
  147. if (isdigit(temp[j])) {
  148. int t_len = strlen(task);
  149. task[t_len] = temp[j];
  150. task[t_len + 1] = '\0';
  151. }
  152. }
  153. }
  154. }
  155. strcpy(temp, "");
  156. }
  157. }
  158. }
  159. }
  160. close(file_d);
  161. }
  162.  
  163. void task_info(char *filename) {
  164. DIR *dir = opendir(filename);
  165. struct dirent *sub_dir;
  166.  
  167. if (dir != NULL) {
  168. while ((sub_dir = readdir(dir)) != NULL) {
  169. char *new_name = sub_dir->d_name;
  170. char *temp = "/";
  171. char *new_dir = (char *) malloc(1 + strlen(filename) + strlen(new_name));
  172. char *a = (char *) malloc(1 + strlen(filename) + strlen(temp));
  173. strcpy(a, filename);
  174. strcat(a, temp);
  175. strcpy(new_dir, a);
  176. strcat(new_dir, new_name);
  177.  
  178. if (strcmp(sub_dir->d_name, "comm") == 0) {
  179. task_info_helper(new_dir);
  180. } else if (strcmp(sub_dir->d_name, "status") == 0) {
  181. task_info_helper(new_dir);
  182. } else if (strcmp(sub_dir->d_name, ".") == 0 || strcmp(sub_dir->d_name, "..") == 0) {
  183.  
  184. }
  185. }
  186. }
  187. closedir(dir);
  188. }
  189.  
  190. void task_processor(char *filename) {
  191. DIR *dir = opendir(filename);
  192. struct dirent *sub_dir;
  193. int count = 0;
  194. char format[4000];
  195.  
  196. if (dir != NULL) {
  197. while ((sub_dir = readdir(dir)) != NULL) {
  198. char *new_name = sub_dir->d_name;
  199. char *temp = "/";
  200. char *new_dir = (char *) malloc(1 + strlen(filename) + strlen(new_name));
  201. char *a = (char *) malloc(1 + strlen(filename) + strlen(temp));
  202. strcpy(a, filename);
  203. strcat(a, temp);
  204. strcpy(new_dir, a);
  205. strcat(new_dir, new_name);
  206.  
  207. bool is_int = false;
  208. char *temp_str;
  209. temp_str = sub_dir->d_name;
  210.  
  211.  
  212. for (int i = 0; i < strlen(temp_str); i++) {
  213. char c = temp_str[i];
  214. int x = c - '\0';
  215. if (isdigit(x)) {
  216. is_int = true;
  217. } else {
  218. is_int = false;
  219. break;
  220. }
  221. }
  222.  
  223. if (is_int == true) {
  224. count++;
  225. sprintf(format, "task%d", count);
  226. if (is_reg_file(new_dir) == 0) {
  227. task_info(new_dir);
  228. struct Task format;
  229. struct passwd *pwd;
  230.  
  231. pwd = getpwuid(user);
  232. printf("%s\n", pwd);
  233.  
  234. strcpy(format.pid, pid);
  235. strcpy(format.state, state);
  236. strcpy(format.task_name, task_name);
  237. strcpy(format.user, user);
  238. strcpy(format.task, task);
  239.  
  240. task_list++;
  241. task_tot += atoi(task);
  242. printf("%5s | %12s | %25s | %15s | %s \n", format.pid, format.state, format.task_name, format.user, format.task);
  243.  
  244. memset(pid, 0, 1000);
  245. memset(task_name, 0, 1000);
  246. memset(state,0 ,500);
  247. memset(user, 0, 500);
  248. memset(task, 0, 500);
  249. }
  250. }
  251. }
  252. }
  253. closedir(dir);
  254. }
  255.  
  256. void get_count(char *filename) {
  257. DIR *dir = opendir(filename);
  258. struct dirent *sub_dir;
  259. int count = 0;
  260. char format[80];
  261.  
  262. if (dir != NULL) {
  263. while ((sub_dir = readdir(dir)) != NULL) {
  264. char *new_name = sub_dir->d_name;
  265. char *temp = "/";
  266. char *new_dir = (char *) malloc(1 + strlen(filename) + strlen(new_name));
  267. char *a = (char *) malloc(1 + strlen(filename) + strlen(temp));
  268. strcpy(a, filename);
  269. strcat(a, temp);
  270. strcpy(new_dir, a);
  271. strcat(new_dir, new_name);
  272.  
  273. bool is_int = false;
  274. char *temp_str;
  275. temp_str = sub_dir->d_name;
  276.  
  277.  
  278. for (int i = 0; i < strlen(temp_str); i++) {
  279. char c = temp_str[i];
  280. int x = c - '\0';
  281. if (isdigit(x)) {
  282. is_int = true;
  283. } else {
  284. is_int = false;
  285. break;
  286. }
  287. }
  288. if (is_int == true) {
  289. if (is_reg_file(new_dir) == 0) {
  290. count++;
  291. }
  292. }
  293. }
  294. }
  295. tot_tasks = count;
  296. closedir(dir);
  297. }
  298.  
  299. void gather_info_helper(char *filename) {
  300. int file_d = open(filename, O_RDONLY);
  301. char buff[BUF_SZ];
  302.  
  303. memset(buff, 0, BUF_SZ);
  304. if (file_d == -1) {
  305. printf("There was a problem opening file %s.\n", filename);
  306. } else {
  307. read(file_d, buff, BUF_SZ);
  308. char temp[80000];
  309.  
  310. strcpy(temp, "");
  311. for (int i = 0; i < strlen(buff); i++) {
  312. if (buff[i] != '\n') {
  313. int len = strlen(temp);
  314. temp[len] = buff[i];
  315. temp[len + 1] = '\0';
  316. } else {
  317. if (strstr(temp, "intr")) {
  318. char *char_set = "intr";
  319. int start = strspn(temp, char_set);
  320. int end = strcspn(temp, "\n");
  321. combining_digits(temp, start, end, interrups);
  322. } else if (strstr(temp, "ctxt")) {
  323. char *char_set = "ctxt";
  324. int start = strspn(temp, char_set);
  325. int end = strcspn(temp, "\n");
  326. combining_digits(temp, start, end, switches);
  327. } else if (strstr(temp, "processes")) {
  328. char *char_set = "processes";
  329. int start = strspn(temp, char_set);
  330. int end = strcspn(temp, "\n");
  331. combining_digits(temp, start, end, forks);
  332. }
  333. strcpy(temp, "");
  334. }
  335. }
  336. }
  337. close(file_d);
  338. }
  339.  
  340. void gather_info(char *filename) {
  341. DIR *dir = opendir(filename);
  342. struct dirent *sub_dir;
  343.  
  344. if (dir != NULL) {
  345. while ((sub_dir = readdir(dir)) != NULL) {
  346. char *new_name = sub_dir->d_name;
  347. char *temp = "/";
  348. char *new_dir = (char *) malloc(1 + strlen(filename) + strlen(new_name));
  349. char *a = (char *) malloc(1 + strlen(filename) + strlen(temp));
  350. strcpy(a, filename);
  351. strcat(a, temp);
  352. strcpy(new_dir, a);
  353. strcat(new_dir, new_name);
  354.  
  355. if (is_reg_file(new_dir) != 0) {
  356. if (strcmp(proc_name, filename) == 0 && strcmp(sub_dir->d_name, "stat") == 0) {
  357. gather_info_helper(new_dir);
  358. }
  359. }
  360. }
  361. }
  362. closedir(dir);
  363. }
  364.  
  365. // int get_task_list(char *name) {
  366. // get_count(name);
  367. // int numb = tot_tasks + 2;
  368.  
  369. // return numb;
  370. // }
  371.  
  372. void print_task(char *name) {
  373.  
  374. memset(proc_name, 0, 100);
  375. strcpy(proc_name, name);
  376. get_count(name);
  377. gather_info(name);
  378.  
  379. printf("Task Information\n");
  380. printf("----------------\n");
  381. printf("Tasks running: %d\n", tot_tasks);
  382. printf("Since boot:\n");
  383. printf(" Interrupts: %s\n", interrups);
  384. printf(" Context Switches: %s\n", switches);
  385. printf(" Forks: %s\n", forks);
  386. task_list++;
  387. printf("%5s | %12s | %25s | %15s | %s \n",
  388. "PID", "State", "Task Name", "User", "Tasks");
  389. printf("------+--------------+---------------------------+-----------------+-------\n");
  390. task_list++;
  391. task_processor(name);
  392.  
  393. // set_task_list(task_list);
  394. // printf("%d\n", get_task_list());
  395. //
  396. // printf("Task Count: %d\n", task_tot);
  397. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement