1 /* @(#) $Id: ./src/shared/read-agents.c, 2011/09/08 dcid Exp $
4 /* Copyright (C) 2009 Trend Micro Inc.
7 * This program is a free software; you can redistribute it
8 * and/or modify it under the terms of the GNU General Public
9 * License (version 2) as published by the FSF - Free Software
14 #include "read-agents.h"
15 #include "os_net/os_net.h"
18 /* Free the agent list in memory
20 void free_agents(char **agent_list)
28 if(agent_list[i] == NULL)
42 /* Print syscheck attributes. */
43 #define sk_strchr(x,y,z) z = strchr(x, y); if(z == NULL) return(0); else { *z = '\0'; z++; }
44 int _do_print_attrs_syscheck(char *prev_attrs, char *attrs, int csv_output,
45 int is_win, int number_of_changes)
47 char *p_size, *p_perm, *p_uid, *p_gid, *p_md5, *p_sha1;
48 char *size, *perm, *uid, *gid, *md5, *sha1;
53 /* a deleted file has no attributes */
54 if(strcmp(attrs, "-1") == 0)
56 printf("File deleted.\n");
60 /* Setting each value. */
62 sk_strchr(size, ':', perm);
63 sk_strchr(perm, ':', uid);
64 sk_strchr(uid, ':', gid);
65 sk_strchr(gid, ':', md5);
66 sk_strchr(md5, ':', sha1);
75 if(prev_attrs && (strcmp(prev_attrs, "-1") == 0))
77 printf("File restored. ");
81 printf("File changed. ");
83 sk_strchr(p_size, ':', p_perm);
84 sk_strchr(p_perm, ':', p_uid);
85 sk_strchr(p_uid, ':', p_gid);
86 sk_strchr(p_gid, ':', p_md5);
87 sk_strchr(p_md5, ':', p_sha1);
91 printf("File added to the database. ");
95 /* Fixing number of changes. */
96 if(prev_attrs && !number_of_changes)
98 number_of_changes = 1;
102 if(number_of_changes)
104 switch(number_of_changes)
107 printf("- 1st time modified.\n");
110 printf("- 2nd time modified.\n");
113 printf("- 3rd time modified.\n");
116 printf("- Being ignored (3 or more changes).\n");
127 perm_int = atoi(perm);
128 snprintf(perm_str, 35,
129 "%c%c%c%c%c%c%c%c%c",
130 (perm_int & S_IRUSR)? 'r' : '-',
131 (perm_int & S_IWUSR)? 'w' : '-',
133 (perm_int & S_ISUID)? 's' :
134 (perm_int & S_IXUSR)? 'x' : '-',
137 (perm_int & S_IRGRP)? 'r' : '-',
138 (perm_int & S_IWGRP)? 'w' : '-',
140 (perm_int & S_ISGID)? 's' :
141 (perm_int & S_IXGRP)? 'x' : '-',
144 (perm_int & S_IROTH)? 'r' : '-',
145 (perm_int & S_IWOTH)? 'w' : '-',
146 (perm_int & S_ISVTX)? 't' :
147 (perm_int & S_IXOTH)? 'x' : '-');
150 printf("Integrity checking values:\n");
151 printf(" Size:%s%s\n", (strcmp(size,p_size) == 0)? " ": " >", size);
154 printf(" Perm:%s%s\n", (strcmp(perm,p_perm) == 0)? " ": " >", perm_str);
155 printf(" Uid: %s%s\n", (strcmp(uid,p_uid) == 0)? " ": " >", uid);
156 printf(" Gid: %s%s\n", (strcmp(gid,p_gid) == 0)? " ": " >", gid);
158 printf(" Md5: %s%s\n", (strcmp(md5,p_md5) == 0)? " ": " >", md5);
159 printf(" Sha1:%s%s\n", (strcmp(sha1,p_sha1) == 0)? " ": " >", sha1);
162 /* Fixing entries. */
174 /* Print information about a specific file. */
175 int _do_print_file_syscheck(FILE *fp, char *fname,
176 int update_counter, int csv_output)
181 char read_day[24 +1];
182 char buf[OS_MAXSTR + 1];
189 buf[OS_MAXSTR] = '\0';
193 /* If the compilation failed, we don't need to free anything */
194 if(!OSMatch_Compile(fname, ®, 0))
196 printf("\n** ERROR: Invalid file name: '%s'\n", fname);
201 /* Creating list with files. */
202 files_list = OSStore_Create();
205 OSMatch_FreePattern(®);
210 /* Getting initial position. */
211 if(fgetpos(fp, &init_pos) != 0)
213 printf("\n** ERROR: fgetpos failed.\n");
218 while(fgets(buf, OS_MAXSTR, fp) != NULL)
220 if(buf[0] == '!' || buf[0] == '#' || buf[0] == '+')
222 int number_changes = 0;
223 time_t change_time = 0;
224 char *changed_file_name;
231 fgetpos(fp, &init_pos);
235 /* Removing new line. */
236 buf[strlen(buf) -1] = '\0';
239 /* with update counter, we only modify the last entry. */
240 if(update_counter && buf[0] == '#')
242 fgetpos(fp, &init_pos);
247 /* Checking number of changes. */
255 else if(buf[2] == '?')
261 changed_attrs = buf + 3;
264 changed_file_name = strchr(changed_attrs, '!');
265 if(!changed_file_name)
267 fgetpos(fp, &init_pos);
272 /* Getting time of change. */
273 changed_file_name[-1] = '\0';
275 change_time = (time_t)atoi(changed_file_name);
277 changed_file_name = strchr(changed_file_name, ' ');
281 /* Checking if the name should be printed. */
282 if(!OSMatch_Execute(changed_file_name, strlen(changed_file_name),
285 fgetpos(fp, &init_pos);
293 /* Reset the values. */
296 if(fsetpos(fp, &init_pos) != 0)
298 printf("\n** ERROR: fsetpos failed (unable to update "
303 if(update_counter == 2)
305 if(fprintf(fp, "!!?") <= 0)
307 printf("\n** ERROR: fputs failed (unable to update "
315 if(fprintf(fp, "!++") <= 0)
317 printf("\n** ERROR: fputs failed (unable to update "
323 printf("\n**Counter updated for file '%s'\n\n",
329 tm_time = localtime(&change_time);
330 strftime(read_day, 23, "%Y %h %d %T", tm_time);
333 printf("\n%s,%d - %s\n", read_day, number_changes,
336 printf("%s,%s,%d\n", read_day, changed_file_name,
340 prev_attrs = OSStore_Get(files_list, changed_file_name);
344 os_strdup(changed_attrs, new_attrs);
345 _do_print_attrs_syscheck(prev_attrs, changed_attrs,
347 changed_file_name[0] == '/'?0:1,
350 free(files_list->cur_node->data);
351 files_list->cur_node->data = new_attrs;
358 os_strdup(changed_attrs, new_attrs);
359 os_strdup(changed_file_name, new_name);
360 OSStore_Put(files_list, new_name, new_attrs);
361 _do_print_attrs_syscheck(NULL,
362 changed_attrs, csv_output,
363 changed_file_name[0] == '/'?0:1,
367 fgetpos(fp, &init_pos);
373 printf("\n** No entries found.\n");
375 OSMatch_FreePattern(®);
382 /* Print syscheck db (of modified files. */
383 int _do_print_syscheck(FILE *fp, int all_files, int csv_output)
388 char read_day[24 +1];
389 char saved_read_day[24 +1];
390 char buf[OS_MAXSTR + 1];
392 buf[OS_MAXSTR] = '\0';
394 saved_read_day[0] = '\0';
395 saved_read_day[24] = '\0';
397 while(fgets(buf, OS_MAXSTR, fp) != NULL)
399 if(buf[0] == '!' || buf[0] == '#')
401 int number_changes = 0;
402 time_t change_time = 0;
403 char *changed_file_name;
409 /* Removing new line. */
410 buf[strlen(buf) -1] = '\0';
413 /* Checking number of changes. */
421 else if(buf[2] == '?')
428 changed_file_name = strchr(buf +3, '!');
429 if(!changed_file_name)
436 /* Getting time of change. */
438 change_time = atoi(changed_file_name);
440 changed_file_name = strchr(changed_file_name, ' ');
443 tm_time = localtime(&change_time);
444 strftime(read_day, 23, "%Y %h %d", tm_time);
445 if(strcmp(read_day, saved_read_day) != 0)
448 printf("\nChanges for %s:\n", read_day);
449 strncpy(saved_read_day, read_day, 23);
451 strftime(read_day, 23, "%Y %h %d %T", tm_time);
454 printf("%s,%d - %s\n", read_day, number_changes,
457 printf("%s,%s,%d\n", read_day, changed_file_name,
462 if(!f_found && !csv_output)
464 printf("\n** No entries found.\n");
471 /* Print syscheck db (of modified files. */
472 int print_syscheck(char *sk_name, char *sk_ip, char *fname, int print_registry,
473 int all_files, int csv_output, int update_counter)
478 tmp_file[512] = '\0';
483 /* Printing database */
484 snprintf(tmp_file, 512, "%s/syscheck",
487 fp = fopen(tmp_file, "r+");
490 else if(sk_ip == NULL)
492 /* Printing database */
493 snprintf(tmp_file, 512, "%s/%s->syscheck",SYSCHECK_DIR, sk_name);
495 fp = fopen(tmp_file, "r+");
498 else if(!print_registry)
500 /* Printing database */
501 snprintf(tmp_file, 512, "%s/(%s) %s->syscheck",
506 fp = fopen(tmp_file, "r+");
511 /* Printing database for the windows registry. */
512 snprintf(tmp_file, 512, "%s/(%s) %s->syscheck-registry",
517 fp = fopen(tmp_file, "r+");
525 _do_print_syscheck(fp, all_files, csv_output);
529 _do_print_file_syscheck(fp, fname, update_counter, csv_output);
539 int _do_get_rootcheckscan(FILE *fp)
542 char buf[OS_MAXSTR + 1];
544 while(fgets(buf, OS_MAXSTR, fp) != NULL)
546 tmp_str = strstr(buf, "Starting rootcheck scan");
552 s_time = (time_t)atoi(tmp_str);
558 return((int)time(NULL));
563 /* Print syscheck db (of modified files. */
564 int _do_print_rootcheck(FILE *fp, int resolved, int time_last_scan,
565 int csv_output, int show_last)
570 /* Time from the message. */
576 char read_day[24 +1];
577 char buf[OS_MAXSTR + 1];
581 char *(ig_events[]) = {"Starting rootcheck scan",
582 "Ending rootcheck scan",
583 "Starting syscheck scan",
584 "Ending syscheck scan",
587 char *(ns_events[]) = {"Application Found:",
593 buf[OS_MAXSTR] = '\0';
598 fseek(fp, 0, SEEK_SET);
605 tm_time = localtime((time_t *)&time_last_scan);
606 strftime(read_day, 23, "%Y %h %d %T", tm_time);
608 printf("\nLast scan: %s\n\n", read_day);
611 printf("\nResolved events: \n\n");
613 printf("\nOutstanding events: \n\n");
617 while(fgets(buf, OS_MAXSTR, fp) != NULL)
619 /* Removing first ! */
621 s_time = (time_t)atoi(tmp_str);
624 /* Removing new line. */
625 tmp_str = strchr(buf, '\n');
630 /* Getting initial time. */
631 tmp_str = strchr(buf + 1, '!');
636 i_time = (time_t)atoi(tmp_str);
639 /* Getting the actual message. */
640 tmp_str = strchr(tmp_str, ' ');
647 /* Checking for resolved. */
648 if(time_last_scan > (s_time + 86400))
664 /* Checking events to ignore. */
668 if(strncmp(tmp_str, ig_events[i], strlen(ig_events[i]) -1) == 0)
676 /* Checking events that are not system audit. */
680 if(strncmp(tmp_str, ns_events[i], strlen(ns_events[i]) -1) == 0)
686 tm_time = localtime((time_t *)&s_time);
687 strftime(read_day, 23, "%Y %h %d %T", tm_time);
688 tm_time = localtime((time_t *)&i_time);
689 strftime(old_day, 23, "%Y %h %d %T", tm_time);
695 printf("%s (first time detected: %s)\n", read_day, old_day);
699 printf("%s\n\n", tmp_str);
703 printf("System Audit: %s\n\n", tmp_str);
708 printf("%s,%s,%s,%s%s\n", resolved == 0?"outstanding":"resolved",
710 ns_events[i] != NULL?"":"System Audit: ",
719 if(!f_found && !csv_output)
721 printf("** No entries found.\n");
729 /* Print rootcheck db */
730 int print_rootcheck(char *sk_name, char *sk_ip, char *fname, int resolved,
731 int csv_output, int show_last)
737 tmp_file[512] = '\0';
742 /* Printing database */
743 snprintf(tmp_file, 512, "%s/rootcheck",
746 fp = fopen(tmp_file, "r+");
751 /* Printing database */
752 snprintf(tmp_file, 512, "%s/(%s) %s->rootcheck",
757 fp = fopen(tmp_file, "r+");
763 /* Getting last time of scan. */
764 ltime = _do_get_rootcheckscan(fp);
769 _do_print_rootcheck(fp, 1, ltime, csv_output, 0);
771 else if(resolved == 2)
773 _do_print_rootcheck(fp, 0, ltime, csv_output, show_last);
777 _do_print_rootcheck(fp, 1, ltime, csv_output, 0);
778 _do_print_rootcheck(fp, 0, ltime, csv_output, show_last);
793 /* Delete syscheck db */
794 int delete_syscheck(char *sk_name, char *sk_ip, int full_delete)
799 tmp_file[512] = '\0';
801 /* Deleting related files */
802 snprintf(tmp_file, 512, "%s/(%s) %s->syscheck",
807 fp = fopen(tmp_file, "w");
815 /* Deleting cpt files */
816 snprintf(tmp_file, 512, "%s/.(%s) %s->syscheck.cpt",
821 fp = fopen(tmp_file, "w");
827 /* Deleting registry entries */
828 snprintf(tmp_file, 512, "%s/(%s) %s->syscheck-registry",
833 fp = fopen(tmp_file, "w");
840 /* Deleting cpt files */
841 snprintf(tmp_file, 512, "%s/.(%s) %s->syscheck-registry.cpt",
846 fp = fopen(tmp_file, "w");
856 /* Delete rootcheck db */
857 int delete_rootcheck(char *sk_name, char *sk_ip, int full_delete)
862 tmp_file[512] = '\0';
864 /* Deleting related files */
865 snprintf(tmp_file, 512, "%s/(%s) %s->rootcheck",
870 fp = fopen(tmp_file, "w");
885 int delete_agentinfo(char *name)
891 tmp_file[512] = '\0';
894 /* Deleting agent info */
895 snprintf(tmp_file, 512, "%s/%s", AGENTINFO_DIR, name);
899 /* Deleting syscheck */
901 sk_ip = strrchr(name, '-');
909 /* Deleting syscheck */
910 delete_syscheck(sk_name, sk_ip, 1);
917 /** char *print_agent_status(int status)
918 * Prints the text representation of the agent status.
920 char *print_agent_status(int status)
922 char *status_str = "Never connected";
924 if(status == GA_STATUS_ACTIVE)
926 status_str = "Active";
928 else if(status == GA_STATUS_NACTIVE)
930 status_str = "Disconnected";
937 /* non-windows functions from now on. */
941 /** int send_msg_to_agent(int socket, char *msg)
942 * Sends a message to an agent.
943 * returns -1 on error.
945 int send_msg_to_agent(int msocket, char *msg, char *agt_id, char *exec)
948 char agt_msg[OS_SIZE_1024 +1];
950 agt_msg[OS_SIZE_1024] = '\0';
955 snprintf(agt_msg, OS_SIZE_1024,
958 (agt_id == NULL)?ALL_AGENTS_C:NONE_C,
960 (agt_id != NULL)?SPECIFIC_AGENT_C:NONE_C,
961 agt_id != NULL? agt_id: "(null)",
966 snprintf(agt_msg, OS_SIZE_1024,
967 "%s %c%c%c %s %s - %s (from_the_server) (no_rule_id)",
969 (agt_id == NULL)?ALL_AGENTS_C:NONE_C,
971 (agt_id != NULL)?SPECIFIC_AGENT_C:NONE_C,
972 agt_id != NULL? agt_id: "(null)",
978 if((rc = OS_SendUnix(msocket, agt_msg, 0)) < 0)
980 if(rc == OS_SOCKBUSY)
982 merror("%s: ERROR: Remoted socket busy.", __local_name);
986 merror("%s: ERROR: Remoted socket error.", __local_name);
988 merror("%s: Error communicating with remoted queue (%d).",
999 /** int connect_to_remoted()
1000 * Connects to remoted to be able to send messages to the agents.
1001 * Returns the socket on success or -1 on failure.
1003 int connect_to_remoted()
1007 if((arq = StartMQ(ARQUEUE, WRITE)) < 0)
1009 merror(ARQ_ERROR, __local_name);
1020 /* Internal funtion. Extract last time of scan from rootcheck/syscheck. */
1021 int _get_time_rkscan(char *agent_name, char *agent_ip, agent_info *agt_info)
1027 /* Agent name of null, means it is the server info. */
1028 if(agent_name == NULL)
1030 snprintf(buf, 1024, "%s/rootcheck",
1035 snprintf(buf, 1024, "%s/(%s) %s->rootcheck",
1036 ROOTCHECK_DIR, agent_name, agent_ip);
1040 /* If file is not there, set to unknown. */
1041 fp = fopen(buf, "r");
1044 os_strdup("Unknown", agt_info->rootcheck_time);
1045 os_strdup("Unknown", agt_info->rootcheck_endtime);
1046 os_strdup("Unknown", agt_info->syscheck_time);
1047 os_strdup("Unknown", agt_info->syscheck_endtime);
1052 while(fgets(buf, 1024, fp) != NULL)
1054 char *tmp_str = NULL;
1056 /* Removing new line. */
1057 tmp_str = strchr(buf, '\n');
1062 tmp_str = strstr(buf, "Starting syscheck scan");
1068 s_time = (time_t)atoi(tmp_str);
1070 os_strdup(ctime(&s_time), agt_info->syscheck_time);
1072 /* Removing new line. */
1073 tmp_str = strchr(agt_info->syscheck_time, '\n');
1080 tmp_str = strstr(buf, "Ending syscheck scan");
1086 s_time = (time_t)atoi(tmp_str);
1088 os_strdup(ctime(&s_time), agt_info->syscheck_endtime);
1090 /* Removing new line. */
1091 tmp_str = strchr(agt_info->syscheck_endtime, '\n');
1099 tmp_str = strstr(buf, "Starting rootcheck scan");
1105 s_time = (time_t)atoi(tmp_str);
1107 os_strdup(ctime(&s_time), agt_info->rootcheck_time);
1109 /* Removing new line. */
1110 tmp_str = strchr(agt_info->rootcheck_time, '\n');
1117 tmp_str = strstr(buf, "Ending rootcheck scan");
1123 s_time = (time_t)atoi(tmp_str);
1125 os_strdup(ctime(&s_time), agt_info->rootcheck_endtime);
1127 /* Removing new line. */
1128 tmp_str = strchr(agt_info->rootcheck_endtime, '\n');
1137 /* Setting unknown values. */
1138 if(!agt_info->rootcheck_time)
1139 os_strdup("Unknown", agt_info->rootcheck_time);
1140 if(!agt_info->rootcheck_endtime)
1141 os_strdup("Unknown", agt_info->rootcheck_endtime);
1142 if(!agt_info->syscheck_time)
1143 os_strdup("Unknown", agt_info->syscheck_time);
1144 if(!agt_info->syscheck_endtime)
1145 os_strdup("Unknown", agt_info->syscheck_endtime);
1153 /* Internal funtion. Extract last time of scan from rootcheck/syscheck. */
1154 char *_get_agent_keepalive(char *agent_name, char *agent_ip)
1157 struct stat file_status;
1160 /* No keep alive for the server. */
1163 return(strdup("Not available"));
1166 snprintf(buf, 1024, "%s/%s-%s", AGENTINFO_DIR, agent_name, agent_ip);
1167 if(stat(buf, &file_status) < 0)
1169 return(strdup("Unknown"));
1173 return(strdup(ctime(&file_status.st_mtime)));
1178 /* Internal funtion. Extracts operating system. */
1179 int _get_agent_os(char *agent_name, char *agent_ip, agent_info *agt_info)
1185 /* Getting server info. */
1188 char *ossec_version = NULL;
1189 agt_info->os = getuname();
1190 os_strdup(__ossec_name " " __version, agt_info->version);
1193 /* Removing new line. */
1194 ossec_version = strchr(agt_info->os, '\n');
1196 *ossec_version = '\0';
1199 ossec_version = strstr(agt_info->os, " - ");
1202 *ossec_version = '\0';
1206 if(strlen(agt_info->os) > 55)
1208 agt_info->os[52] = '.';
1209 agt_info->os[53] = '.';
1210 agt_info->os[54] = '\0';
1218 snprintf(buf, 1024, "%s/%s-%s", AGENTINFO_DIR, agent_name, agent_ip);
1219 fp = fopen(buf, "r");
1222 os_strdup("Unknown", agt_info->os);
1223 os_strdup("Unknown", agt_info->version);
1228 if(fgets(buf, 1024, fp))
1230 char *ossec_version = NULL;
1232 /* Removing new line. */
1233 ossec_version = strchr(buf, '\n');
1235 *ossec_version = '\0';
1238 ossec_version = strstr(buf, " - ");
1241 *ossec_version = '\0';
1244 os_calloc(1024 +1, sizeof(char), agt_info->version);
1245 strncpy(agt_info->version, ossec_version, 1024);
1249 if(strlen(buf) > 55)
1256 os_strdup(buf, agt_info->os);
1264 os_strdup("Unknown", agt_info->os);
1265 os_strdup("Unknown", agt_info->version);
1272 /** agent_info *get_agent_info(char *agent_name, char *agent_ip)
1273 * Get information from an agent.
1275 agent_info *get_agent_info(char *agent_name, char *agent_ip)
1277 char *agent_ip_pt = NULL;
1278 char *tmp_str = NULL;
1280 agent_info *agt_info = NULL;
1282 /* Removing the "/", since it is not present on the file. */
1283 if((agent_ip_pt = strchr(agent_ip, '/')))
1285 *agent_ip_pt = '\0';
1289 /* Allocating memory for the info structure. */
1290 agt_info = calloc(1, sizeof(agent_info));
1293 /* Zeroing the values. */
1294 agt_info->rootcheck_time = NULL;
1295 agt_info->rootcheck_endtime = NULL;
1296 agt_info->syscheck_time = NULL;
1297 agt_info->syscheck_endtime = NULL;
1298 agt_info->os = NULL;
1299 agt_info->version = NULL;
1300 agt_info->last_keepalive = NULL;
1303 /* Getting information about the OS. */
1304 _get_agent_os(agent_name, agent_ip, agt_info);
1305 _get_time_rkscan(agent_name, agent_ip, agt_info);
1306 agt_info->last_keepalive = _get_agent_keepalive(agent_name, agent_ip);
1309 /* Removing new line from keep alive. */
1310 tmp_str = strchr(agt_info->last_keepalive, '\n');
1316 /* Setting back the ip address. */
1328 /** int get_agent_status(char *agent_name, char *agent_ip)
1329 * Gets the status of an agent, based on the name/ip.
1331 int get_agent_status(char *agent_name, char *agent_ip)
1334 char *agent_ip_pt = NULL;
1336 struct stat file_status;
1338 tmp_file[512] = '\0';
1342 if(agent_name == NULL)
1344 return(GA_STATUS_ACTIVE);
1348 /* Removing the "/", since it is not present on the file. */
1349 if((agent_ip_pt = strchr(agent_ip, '/')))
1351 *agent_ip_pt = '\0';
1354 snprintf(tmp_file, 512, "%s/%s-%s", AGENTINFO_DIR, agent_name, agent_ip);
1357 /* Setting back the ip address. */
1364 if(stat(tmp_file, &file_status) < 0)
1366 return(GA_STATUS_INV);
1370 if(file_status.st_mtime > (time(0) - (3*NOTIFY_TIME + 30)))
1372 return(GA_STATUS_ACTIVE);
1375 return(GA_STATUS_NACTIVE);
1380 /* List available agents.
1382 char **get_agents(int flag)
1386 char **f_files = NULL;
1389 struct dirent *entry;
1391 /* Opening the directory given */
1392 dp = opendir(AGENTINFO_DIR);
1395 merror("%s: Error opening directory: '%s': %s ",
1403 /* Reading directory */
1404 while((entry = readdir(dp)) != NULL)
1408 tmp_file[512] = '\0';
1410 /* Just ignore . and .. */
1411 if((strcmp(entry->d_name,".") == 0) ||
1412 (strcmp(entry->d_name,"..") == 0))
1415 snprintf(tmp_file, 512, "%s/%s", AGENTINFO_DIR, entry->d_name);
1420 struct stat file_status;
1422 if(stat(tmp_file, &file_status) < 0)
1425 if(file_status.st_mtime > (time(0) - (3*NOTIFY_TIME + 30)))
1428 if(flag == GA_NOTACTIVE)
1433 if(flag == GA_ACTIVE)
1438 f_files = (char **)realloc(f_files, (f_size +2) * sizeof(char *));
1441 ErrorExit(MEM_ERROR, __local_name);
1445 /* Adding agent entry */
1446 if(flag == GA_ALL_WSTATUS)
1450 snprintf(agt_stat, sizeof(agt_stat) -1, "%s %s",
1451 entry->d_name, status == 1?"active":"disconnected");
1453 os_strdup(agt_stat, f_files[f_size]);
1457 os_strdup(entry->d_name, f_files[f_size]);
1460 f_files[f_size +1] = NULL;