#include #include #include "../RMP/system.h" #include "../RMP/rmp.hxx" /* Routine to convert an unsigned long int IP address into the * decimal dotted representation of the address. */ char *returnTextAddress(unsigned long int addr) { char zero[] = "(not defined)"; struct in_addr temp; if (addr == 0) return zero; temp.s_addr = addr; return inet_ntoa(temp); } /* Print to standard output the group list returned by RMPEvent in */ void printGroupList(RMPEvent *in) { int i; cout << " Group List:" << endl; cout << " Number of Members (" << in->returnNumMembersInList(); cout << ")" << endl; for(i=0;i<(int)in->returnNumMembersInList();i++) { cout << " Entry (" << i << "), Hndlrs ("; cout << hex << in->returnHandlers(i) << "), MCast ("; cout << in->multicastCapable(i) << "), Member ("; cout << in->tokenRingMember(i) << "), IP (" << dec; cout << returnTextAddress(in->returnIPAddress(i)) << "/"; cout << in->returnIPPort(i) << ")" << endl; } } /* Print to standard output the RMPEvent in */ void printMessage(RMPEvent *in) { char tempbuffer[RMP_DATA_SIZE]; cout << "RMPEvent: " << endl; /* Ignore NULL events */ if (in == NULL) { cout << " NULL Event " << endl; return; } /* Print name of group event arrived for */ cout << " Group (" << in->returnRMPGroupForEvent() << ")("; cout << in->returnRMPGroupForEvent()->returnGroupName() << ")" << endl; /* Return the event type */ switch (in->returnRMPEventType()) { case MESSAGE: /* Event is a message, print message, source, and handler */ cout << " Message Length (" << in->returnMessageLength(); cout << "), Handler (0x"; cout << hex << in->returnMessageHandler() << dec << "), QOS ("; cout << (u_long)in->returnMessageQOS() << ")" << endl; cout << " Message Source (" << in->returnMessageSourceIP(); cout << ")(" << returnTextAddress(in->returnMessageSourceIP()); cout << "), Port (" << in->returnMessageSourcePort() << ")" << endl; strncpy(tempbuffer,in->returnData(),in->returnMessageLength()); tempbuffer[in->returnMessageLength()] = 0; cout << " Message: <" << tempbuffer << ">" << endl; break; case SEND_FAILURE: /* Event is a SEND_FAILURE. Print message and release group */ cout << "Send Failure of join request. Leaving Group ..." << endl; in->returnRMPGroupForEvent()->release(); break; case FORMED_OWN_GROUP: /* Event is a FORMED_OWN_GROUP event. Print group list anyway */ cout << " Formed own group." << endl; printGroupList(in); break; case MEMBERSHIP_CHANGE: /* Event is a MEMBERSHIP_CHANGE. Print group list */ cout << " Membership Change." << endl; printGroupList(in); break; case JOINED_GROUP: /* Event is a JOINED_GROUP. Print group list */ cout << " Joined Group." << endl; printGroupList(in); break; case LEFT_GROUP: /* Release groups after LEFT_GROUP message */ cout << " Left group" << endl; in->returnRMPGroupForEvent()->release(); break; case FAILURE_RECOVERY: /* Event is a FAILURE_RECOVERY. Print group list */ cout << " Successful Reformation." << endl; printGroupList(in); break; case ATOMICITY_VIOLATED: /* Event is a ATOMICITY_VIOLATED. Print group list */ cout << " Successful Reformation with Possible Atomicity Violations."; cout << endl; printGroupList(in); exit(1); break; case FAILED_RECOVERY: /* Event is a FAILED_RECOVERY. */ cout << " Failed Reformation. Exiting" << endl; exit(0); break; case FAILURE_ABORT: /* Event is a FAILURE_ABORT. Reformatio is not active */ cout << " Failure detected. Left group." << endl; exit(0); break; default: break; } }