ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/ihost/ihost.c
(Generate patch)

Comparing projects/cms/source/ihost/ihost.c (file contents):
Revision 1.1 by pajs, Fri May 10 17:11:30 2002 UTC vs.
Revision 1.6 by pajs, Sun May 12 17:33:21 2002 UTC

# Line 8 | Line 8
8   #include <netdb.h>
9   #include <strings.h>
10  
11 + #define RECONFIGURE_RETURN_CODE 2
12 +
13   typedef struct{
14          int fm_port;
15          char *fm_host;
# Line 16 | Line 18 | typedef struct{
18          char *server_fqdn;
19          int server_udp_port;
20          int server_tcp_port;
21 <        long last_modified;
21 >        char *last_modified;
22          char *files_list;
23          char *key;
24          int udp_update_time;
# Line 24 | Line 26 | typedef struct{
26  
27   }ihost_state_t;
28  
29 < char* sock_comm(FILE *f, char* sendString){
29 > char* sock_comm(FILE *f_r, FILE *f_w, char* sendString){
30          char *reply;
31 <
32 <        fprintf(f, sendString);
33 <        fflush(f);
32 <        reply=fpgetline(f);
31 >        fprintf(f_w, "%s", sendString);
32 >        fflush(f_w);
33 >        reply=fpgetline(f_r);
34          /* Returns pointer to static buffer */
35          return reply;
36   }      
# Line 38 | Line 39 | int ihost_configure(ihost_state_t *ihost_state){
39          struct sockaddr_in addr;
40          struct in_addr haddr;
41          int sd;
42 <        FILE *fm_fd;
42 >        FILE *fm_fd_r, *fm_fd_w;
43          char *reply;
44 +        char *reply_ptr;
45  
46 +        /* Check to see if anything needs to be free'd */
47 +        if (ihost_state->my_fqdn!=NULL) free(ihost_state->my_fqdn);
48 +        if (ihost_state->server_fqdn!=NULL) free(ihost_state->server_fqdn);
49 +        if (ihost_state->last_modified!=NULL) free(ihost_state->last_modified);
50 +        if (ihost_state->files_list!=NULL) free(ihost_state->files_list);
51 +
52          if ((sd = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) < 0) {
53                  errf("Can't create AF_INET socket (%m)");
54                  return -1;
# Line 61 | Line 69 | int ihost_configure(ihost_state_t *ihost_state){
69                  return -1;
70          }
71  
72 <        if ((fm_fd=fdopen(sd,"r+")) == NULL){
72 >        /* Need to open 2 files, one for reading one for writing, as it gets confused if we only use 1 :) */
73 >        if ((fm_fd_r=fdopen(sd,"r")) == NULL){
74                  errf("Failed to open stream (%m)");
75                  return -1;
76          }
77 <        
78 <        reply=sock_comm(fm_fd, "STARTCONFIG\n");
77 >
78 >        if ((fm_fd_w=fdopen(dup(sd),"w")) == NULL){
79 >                errf("Failed to open stream (%m)");
80 >                return -1;
81 >        }
82 >
83 >        reply=sock_comm(fm_fd_r, fm_fd_w, "STARTCONFIG\n");
84          if ((reply==NULL) || (strncasecmp(reply, "OK", 2) != 0) ) {
85                  errf("Server error");  
86                  return -1;
87          }
88  
89 <        reply=sock_comm(fm_fd, "LASTMODIFIED\n");
90 <        if((reply== NULL) || (strncasecmp(reply, "ERROR", 5))){
89 >        reply=sock_comm(fm_fd_r, fm_fd_w, "LASTMODIFIED\n");
90 >        if((reply== NULL) || (strncasecmp(reply, "ERROR", 5) ==0)){
91                  errf("Server error (%m)");
92                  return -1;
93          }
94 <        ihost_state->last_modified=atol(reply);
94 >        if((ihost_state->last_modified=malloc((strlen(reply))+1)) == NULL){
95 >                errf("malloc failed (%m)");
96 >                return -1;
97 >        }
98 >        strcpy(ihost_state->last_modified, reply);
99 >        ihost_state->last_modified[(strlen(ihost_state->last_modified))]='\n';
100          
101 <        reply=sock_comm(fm_fd, "FILELIST\n");
102 <        if((reply== NULL) || (strncasecmp(reply, "ERROR", 5))){
101 >        reply=sock_comm(fm_fd_r, fm_fd_w, "FILELIST\n");
102 >        if((reply== NULL) || (strncasecmp(reply, "ERROR", 5) ==0)){
103                  errf("Server error (%m)");
104                  return -1;
105          }
106 <        if((ihost_state->files_list=strdup(reply)) == NULL){
107 <                errf("strdup failed (%m)");
108 <                return -1;
109 <        }
106 >        if((ihost_state->files_list=malloc((strlen(reply))+1)) == NULL){
107 >                errf("malloc failed (%m)");
108 >                return -1;
109 >        }
110 >        strcpy(ihost_state->files_list, reply);
111 >        ihost_state->files_list[(strlen(ihost_state->files_list))]='\n';
112  
113 <        reply=sock_comm(fm_fd, "FQDN\n");
114 <        if((reply== NULL) || (strncasecmp(reply, "ERROR", 5))){
113 >        reply=sock_comm(fm_fd_r, fm_fd_w, "FQDN\n");
114 >        if((reply== NULL) || (strncasecmp(reply, "ERROR", 5)==0)){
115                  errf("Server error (%m)");
116                  return -1;
117          }
# Line 99 | Line 120 | int ihost_configure(ihost_state_t *ihost_state){
120                  return -1;
121          }
122  
123 <        reply=sock_comm(fm_fd, "UDPUpdateTime\n");
123 >        reply=sock_comm(fm_fd_r, fm_fd_w, "UDPUpdateTime\n");
124          if(reply== NULL){
125                  errf("Server error (%m)");
126                  return -1;
# Line 108 | Line 129 | int ihost_configure(ihost_state_t *ihost_state){
129                  ihost_state->udp_update_time=atoi(reply);
130          }
131  
132 <        reply=sock_comm(fm_fd, "TCPUpdateTime\n");
132 >        reply=sock_comm(fm_fd_r, fm_fd_w, "TCPUpdateTime\n");
133          if(reply== NULL){
134                  errf("Server error (%m)");
135                  return -1;
# Line 117 | Line 138 | int ihost_configure(ihost_state_t *ihost_state){
138                  ihost_state->tcp_update_time=atoi(reply);
139          }
140  
141 <        reply=sock_comm(fm_fd, "ENDCONFIG\n");
141 >        reply=sock_comm(fm_fd_r, fm_fd_w, "ENDCONFIG\n");
142          if(reply== NULL){
143                  errf("Server error (%m)");
144                  return -1;
145          }
146  
147 <                
147 >        reply=sock_comm(fm_fd_r, fm_fd_w, "FILTER\n");
148 >        if((reply== NULL) || (strncasecmp(reply, "ERROR", 5)==0)){
149 >                errf("Server error (%m)");
150 >                return -1;
151 >        }
152 >        reply_ptr=strchr(reply,';');
153 >        if (reply_ptr==NULL){
154 >                errf("Incorrect data returned");
155 >                return -1;
156 >        }
157 >        *reply_ptr='\0';
158 >        if((ihost_state->server_fqdn=strdup(reply)) == NULL){
159 >                errf("strdup failed (%m)");
160 >                return -1;
161 >        }
162 >        reply=++reply_ptr;
163 >        reply_ptr=strchr(reply,';');
164 >        if (reply_ptr==NULL){
165 >                errf("Incorrect data returned 2");
166 >                return -1;
167 >        }
168 >        *reply_ptr='\0';
169 >        ihost_state->server_udp_port=atoi(reply);
170 >        reply=++reply_ptr;
171 >        ihost_state->server_tcp_port=atoi(reply);
172 >        if ((ihost_state->server_tcp_port==0) || (ihost_state->server_udp_port==0)){
173 >                errf("Incorrect data returned 3 ");
174 >                return -1;
175 >        }
176  
177 +        reply=sock_comm(fm_fd_r, fm_fd_w, "END\n");
178 +        if((reply== NULL) || (strncasecmp(reply, "ERROR", 5) ==0 )){
179 +                errf("Server error (%m)");
180 +                return -1;
181 +        }
182  
183 +        if(fclose(fm_fd_r) !=0){
184 +                errf("Failed to close FD (%m)");
185 +                return -1;
186 +        }
187 +        if(fclose(fm_fd_w) !=0){
188 +                errf("Failed to close FD (%m)");
189 +                return -1;
190 +        }
191 +
192          return 0;
193 + }
194  
195 + int heartbeat(ihost_state_t *ihost_state){
196 +        struct sockaddr_in addr;
197 +        struct in_addr haddr;
198 +        int sd;
199 +        FILE *fm_fd_r, *fm_fd_w;
200 +        char *reply;
201 +        int exitcode=0;
202 +
203 +        if ((sd = socket(AF_INET, SOCK_STREAM, PF_UNSPEC)) < 0) {
204 +                errf("Can't create AF_INET socket (%m)");
205 +                return -1;
206 +        }
207 +
208 +        if (get_host_addr(ihost_state->server_fqdn, &haddr) != 0){
209 +                errf("Failed to resolve address %s (%m)", ihost_state->fm_host);
210 +                return -1;
211 +        }
212 +
213 +        memset((char *)&addr, 0, sizeof addr);
214 +        addr.sin_family = AF_INET;
215 +        memcpy((char *)&addr.sin_addr, &haddr, sizeof haddr);
216 +        addr.sin_port =  htons(ihost_state->server_tcp_port);
217 +
218 +        if (connect(sd, (struct sockaddr *)&addr, sizeof addr) != 0) {
219 +                errf("Failed to connect to %s on port %d (%m)", ihost_state->fm_host, ihost_state->fm_port);
220 +                return -1;
221 +        }
222 +
223 +        /* Need to open 2 files, one for reading one for writing, as it gets confused if we only use 1 :) */
224 +        if ((fm_fd_r=fdopen(sd,"r")) == NULL){
225 +                errf("Failed to open stream (%m)");
226 +                return -1;
227 +        }
228 +
229 +        if ((fm_fd_w=fdopen(dup(sd),"w")) == NULL){
230 +                errf("Failed to open stream (%m)");
231 +                return -1;
232 +        }
233 +
234 +        reply=sock_comm(fm_fd_r, fm_fd_w, "HEARTBEAT\n");
235 +        if ((reply==NULL) || (strncasecmp(reply, "ERROR", 5) == 0) ) {
236 +                errf("Server error");
237 +                return -1;
238 +        }
239 +        if (ihost_state->fm_host!=NULL) free(ihost_state->fm_host);
240 +        reply=sock_comm(fm_fd_r, fm_fd_w, "CONFIG\n");
241 +        if ((reply==NULL) || (strncasecmp(reply, "ERROR", 5) == 0) ) {
242 +                errf("Server error");
243 +                return -1;
244 +        }
245 +
246 +        printf("filelist %s\n",ihost_state->files_list);
247 +        reply=sock_comm(fm_fd_r, fm_fd_w, ihost_state->files_list);
248 +        if ((reply==NULL) || (strncasecmp(reply, "OK", 2) != 0) ) {
249 +                errf("Server error");
250 +                return -1;
251 +        }
252 +
253 +        reply=sock_comm(fm_fd_r, fm_fd_w, ihost_state->last_modified);
254 +        if (reply==NULL) {
255 +                errf("Server error");
256 +                return -1;
257 +        }
258 +        if (strncasecmp(reply, "ERROR", 5) == 0){
259 +        /* Means the config has changed */
260 +                exitcode=RECONFIGURE_RETURN_CODE;
261 +        }
262 +        reply=sock_comm(fm_fd_r, fm_fd_w, "KEY\n");
263 +        if ((reply==NULL) || (strncasecmp(reply, "ERROR", 5) == 0) ) {
264 +                errf("Server error");
265 +                return -1;
266 +        }
267 +        if (ihost_state->key!=NULL) free(ihost_state->key);
268 +
269 +        if((ihost_state->key=malloc(strlen(reply)+1)) == NULL){
270 +                errf("malloc failed (%m)");
271 +                return -1;
272 +        }
273 +        strcpy(ihost_state->key, reply);
274 +        ihost_state->key[(strlen(ihost_state->key))]='\n';
275 +
276 +        reply=sock_comm(fm_fd_r, fm_fd_w, "ENDHEARTBEAT\n");
277 +        if((reply== NULL) || (strncasecmp(reply, "ERROR", 5) ==0 )){
278 +                errf("Server error (%m)");
279 +                return -1;
280 +        }
281 +
282 +        if(fclose(fm_fd_r) !=0){
283 +                errf("Failed to close FD (%m)");
284 +                return -1;
285 +        }
286 +        if(fclose(fm_fd_w) !=0){
287 +                errf("Failed to close FD (%m)");
288 +                return -1;
289 +        }
290 +
291 +        return exitcode;                
292   }
293  
133 int main(){
294  
295 + int main(int argc, char **argv){
296 +        ihost_state_t ihost_state;
297 +        int heartbeat_exit;
298 +        int counter=0;
299 +
300 +
301 +        /* NULL'ify so i can tell if i need to free it or not */
302 +        ihost_state.fm_host=NULL;
303 +        ihost_state.my_fqdn=NULL;
304 +        ihost_state.server_fqdn=NULL;
305 +        ihost_state.last_modified=NULL;
306 +        ihost_state.files_list=NULL;
307 +        ihost_state.key=NULL;
308 +
309 +        errf_set_progname(argv[0]);
310 +        if(argc!=3){
311 +                errf_usage("<host> <port>");    
312 +                exit(1);
313 +        }
314 +
315 +        ihost_state.fm_host=argv[1];
316 +        ihost_state.fm_port=atoi(argv[2]);
317 +
318 +        if(ihost_configure(&ihost_state)!=0){
319 +                errf("configure failed");
320 +                /* Ok, ideally we prob should have 2 copies of the structure and carry on if this
321 +                happens.. But we dont :) (at the moment) */
322 +                exit(1);
323 +        }
324 +
325 +        while(TRUE){
326 +
327 +                heartbeat_exit=heartbeat(&ihost_state);
328 +                if(heartbeat_exit==RECONFIGURE_RETURN_CODE){
329 +                        errf("heartbeat needs to be reconfigured");
330 +                        ihost_configure(&ihost_state);
331 +                }
332 +                if(heartbeat_exit==-1){
333 +                        errf("ah crap");
334 +                        exit(1);
335 +                }
336 +                printf("Count : %d\n",counter++);
337 +                printf("waiting %d\n",ihost_state.tcp_update_time);
338 +                sleep(ihost_state.tcp_update_time);
339 +        }
340          return 0;
341   }
342  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines