1 /* @(#) $Id: receiver-win.c,v 1.8 2009/12/01 15:40:07 dcid Exp $ */
3 /* Copyright (C) 2009 Trend Micro Inc.
6 * This program is a free software; you can redistribute it
7 * and/or modify it under the terms of the GNU General Public
8 * License (version 3) as published by the FSF - Free Software
15 #include "os_execd/execd.h"
16 #include "os_crypto/md5/md5_op.h"
17 #include "os_net/os_net.h"
23 * Receive events from the server.
25 void *receiver_thread(void *none)
29 char file[OS_SIZE_1024 +1];
30 char buffer[OS_MAXSTR +1];
32 char cleartext[OS_MAXSTR + 1];
38 struct timeval selecttime;
43 /* Setting FP to null, before starting */
46 memset(cleartext, '\0', OS_MAXSTR +1);
47 memset(buffer, '\0', OS_MAXSTR +1);
48 memset(file, '\0', OS_SIZE_1024 +1);
49 memset(file_sum, '\0', 34);
54 /* sock must be set. */
62 FD_SET(logr->sock, &fdset);
65 /* Wait for 30 seconds. */
66 selecttime.tv_sec = 30;
67 selecttime.tv_usec = 0;
70 /* Wait for 120 seconds at a maximum for any descriptor */
71 recv_b = select(0, &fdset, NULL, NULL, &selecttime);
74 merror(SELECT_ERROR, ARGV0);
83 /* Read until no more messages are available */
84 while((recv_b = recv(logr->sock,buffer,OS_SIZE_1024, 0))>0)
86 /* Id of zero -- only one key allowed */
87 tmp_msg = ReadSecMSG(&keys, buffer, cleartext, 0, recv_b -1);
90 merror(MSG_ERROR,ARGV0,logr->rip[logr->rip_id]);
95 /* Check for commands */
96 if(IsValidHeader(tmp_msg))
98 /* This is the only thread that modifies it */
99 available_server = (int)time(NULL);
102 /* Run timeout commands. */
103 if(logr->execdq >= 0)
104 WinTimeoutRun(available_server);
106 /* If it is an active response message */
107 if(strncmp(tmp_msg, EXECD_HEADER, strlen(EXECD_HEADER)) == 0)
109 tmp_msg+=strlen(EXECD_HEADER);
112 /* Run on windows. */
113 if(logr->execdq >= 0)
115 WinExecdRun(tmp_msg);
123 /* Restart syscheck. */
124 else if(strcmp(tmp_msg, HC_SK_RESTART) == 0)
126 os_set_restart_syscheck();
131 /* Ack from server */
132 else if(strcmp(tmp_msg, HC_ACK) == 0)
137 /* Close any open file pointer if it was being written to */
144 /* File update message */
145 if(strncmp(tmp_msg, FILE_UPDATE_HEADER,
146 strlen(FILE_UPDATE_HEADER)) == 0)
149 tmp_msg+=strlen(FILE_UPDATE_HEADER);
151 /* Going to after the file sum */
152 validate_file = strchr(tmp_msg, ' ');
158 *validate_file = '\0';
160 /* copying the file sum */
161 strncpy(file_sum, tmp_msg, 33);
164 /* Setting tmp_msg to the beginning of the file name */
166 tmp_msg = validate_file;
169 if((validate_file = strchr(tmp_msg, '\n')) != NULL)
171 *validate_file = '\0';
174 while((validate_file = strchr(tmp_msg, '/')) != NULL)
176 *validate_file = '-';
179 if(tmp_msg[0] == '.')
183 snprintf(file, OS_SIZE_1024, "%s/%s",
187 fp = fopen(file, "w");
190 merror(FOPEN_ERROR, ARGV0, file);
194 else if(strncmp(tmp_msg, FILE_CLOSE_HEADER,
195 strlen(FILE_CLOSE_HEADER)) == 0)
198 os_md5 currently_md5;
200 /* Making sure to close for the rename to work */
212 else if(OS_MD5_File(file, currently_md5) < 0)
220 if(strcmp(currently_md5, file_sum) != 0)
222 debug1("%s: Failed md5 for: %s -- deleting.",
230 /* Renaming the file to its orignal name */
231 final_file = strrchr(file, '/');
234 if(strcmp(final_file + 1, SHAREDCFG_FILENAME) == 0)
236 UnmergeFiles(file, SHAREDCFG_DIR);
251 merror("%s: WARN: Unknown message received from server.", ARGV0);
257 available_server = (int)time(NULL);
258 fprintf(fp, "%s", tmp_msg);
263 merror("%s: WARN: Unknown message received. No action defined.",