/* Copyright (C) 2006 Renaissance Technologies Corp. main developer: HP Wei Copyright (C) 2005 Renaissance Technologies Corp. Copyright (C) 2001 Renaissance Technologies Corp. main developer: HP Wei codes in this file are extracted and modified from complaints.c Copyright (C) 2000 Aaron Hillegass This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "rttmain.h" #include /* buffer for receiving complaints */ char flow_buff[FLOW_BUFFSIZE]; int *code_ptr; /* What's wrong? */ int *page_ptr; /* Which page */ /* receive socket */ int complaint_fd; #ifndef IPV6 struct sockaddr_in complaint_addr; #else struct sockaddr_in6 complaint_addr; #endif extern int my_FLOW_PORT; /* status */ char *missing_page_flag=NULL; /* arrary of size nPages -- dep on the files */ int total_missing_page = 0; char machine_status = NOT_READY; int nMachines = 1; int nPages; char *machine_list_file; extern char * machine; extern int remote_pid; extern char * reshell; /* init_complaints initializes our buffers to receive complaint information from the catchers */ void init_complaints () { if (verbose) fprintf(stderr, "in init_complaints with FLOW_BUFFSIZE = %d\n", FLOW_BUFFSIZE); /* Buffer */ code_ptr = (int *)flow_buff; page_ptr = (int *)(code_ptr + 1); /* Receive socket */ if (verbose) printf("set up receive socket for complaints\n"); complaint_fd = rec_socket(&complaint_addr, my_FLOW_PORT); } void init_missing_page_flag(int n) { int i; nPages = n; if ((missing_page_flag = malloc(n * sizeof(char)))==NULL) { fprintf(stderr, "Cannot malloc(%d * sizeof(char))\n", n); perror("error = "); exit(-1); } for(i=0; i nPages) return 1; /* *page_ptr = page # (1 origin) */ ++(total_missing_page); missing_page_flag[(page_v)-1] = MISSING; return 1; case LAST_MISSING : if (page_v > nPages) return 1; ++(total_missing_page); missing_page_flag[page_v-1] = MISSING; machine_status = MACHINE_OK; return 1; default : printf("Unknown complaint: %d\n", code_v); return 0; } /* end of switch */ } /* end of if(readable) */ return 0; } int all_machine_ok() { return (machine_status == NOT_READY ) ? 0 : 1; } void wait_for_ok(int code) { int i, count; time_t tloc; time_t rtime0, rtime1; rtime0 = time(&tloc); /* reference time */ count = 0; while (!all_machine_ok()) { if (read_handle_complaint()==1) { /* if there is a complaint handled */ rtime0 = time(&tloc); /* reset the reference time */ continue; } /* no complaints handled */ rtime1 = time(&tloc); /* time since last complaints */ if ((rtime1-rtime0) >= ACK_WAIT_PERIOD) { ++count; if (count < ACK_WAIT_TIMES) { fprintf(stderr, "%d: resend cmd(%d) to machines:[ ", count, code); for(i=0; i 0) { kill_pid(); } exit(-1); }