int main( int argc, char **argv ) { signal( SIGPIPE, SIG_IGN ); int status; int continueAllFlag = 0; int sleepSec = 1; int rNum = 1; int stdinflags; int verbose = 0; int opt; getXmsgTicketInp_t getXmsgTicketInp; xmsgTicketInfo_t xmsgTicketInfo; xmsgTicketInfo_t *outXmsgTicketInfo; sendXmsgInp_t sendXmsgInp; rcvXmsgInp_t rcvXmsgInp; rcvXmsgOut_t *rcvXmsgOut = NULL; char ubuf[4000]; /* set up signals */ #ifndef _WIN32 signal( SIGINT, signalIdbugExit ); signal( SIGHUP, signalIdbugExit ); signal( SIGTERM, signalIdbugExit ); signal( SIGUSR1, signalIdbugExit ); /* XXXXX switched to SIG_DFL for embedded python. child process * went away. But probably have to call waitpid. * signal(SIGCHLD, SIG_IGN); */ signal( SIGCHLD, SIG_DFL ); #endif while ( ( opt = getopt( argc, argv, "cChv:" ) ) != EOF ) { switch ( opt ) { case 'v': verbose = atoi( optarg ); break; case 'c': continueAllFlag = 1; break; case 'C': continueAllFlag = 2; break; case 'h': printIdbugHelp( argv[0] ); exit( 0 ); break; default: fprintf( stderr, "Error: Unknown Option\n" ); printIdbugHelp( argv[0] ); exit( 1 ); break; } } /* initialize and connect */ snprintf( lastSent, HEADER_TYPE_LEN, "CMSG:BEGIN" ); myHostName[0] = '\0'; gethostname( myHostName, MAX_NAME_LEN ); connectToX(); memset( &xmsgTicketInfo, 0, sizeof( xmsgTicketInfo ) ); memset( &getXmsgTicketInp, 0, sizeof( getXmsgTicketInp ) ); /* get Ticket */ getXmsgTicketInp.flag = 1; status = rcGetXmsgTicket( conn, &getXmsgTicketInp, &outXmsgTicketInfo ); if ( status != 0 ) { fprintf( stderr, "Unable to get Xmsg Ticket. status = %d\n", status ); exit( 8 ); } fprintf( stdout, "Debug XMsg Stream= %i\n", outXmsgTicketInfo->sendTicket ); streamId = outXmsgTicketInfo->sendTicket; /* Send STOP message on newly created Debug XMsg Stream */ if ( continueAllFlag == 0 ) { status = sendIDebugCommand( "discontinue", "CMSG:BEGIN" ); } else if ( continueAllFlag == 1 ) { status = sendIDebugCommand( "continue", "CMSG:BEGIN" ); } else { status = sendIDebugCommand( "Continue", "CMSG:BEGIN" ); } if ( status < 0 ) { fprintf( stderr, "Error sending Message to Debug Stream %i = %d\n", streamId, status ); exit( -1 ); } /* memset (&sendXmsgInp, 0, sizeof (sendXmsgInp)); xmsgTicketInfo.sendTicket = streamId; xmsgTicketInfo.rcvTicket = streamId; xmsgTicketInfo.flag = 1; sendXmsgInp.ticket = xmsgTicketInfo; snprintf(sendXmsgInp.sendAddr, NAME_LEN, "%s:%i", myHostName, getpid ()); sendXmsgInp.sendXmsgInfo.numRcv = 100; sendXmsgInp.sendXmsgInfo.msgNumber = mNum; strcpy(sendXmsgInp.sendXmsgInfo.msgType, "idbug:client"); snprintf(ubuf,3999, "stop"); sendXmsgInp.sendXmsgInfo.msg = ubuf; status = sendIDebugCommand(&sendXmsgInp); mNum++; */ /* Send Startup messages on Stream 4 */ memset( &sendXmsgInp, 0, sizeof( sendXmsgInp ) ); xmsgTicketInfo.sendTicket = 4; xmsgTicketInfo.rcvTicket = 4; xmsgTicketInfo.flag = 1; sendXmsgInp.ticket = xmsgTicketInfo; snprintf( sendXmsgInp.sendAddr, NAME_LEN, "%s:%i", myHostName, getpid() ); sendXmsgInp.sendXmsgInfo.numRcv = 100; sendXmsgInp.sendXmsgInfo.msgNumber = 1; strcpy( sendXmsgInp.sendXmsgInfo.msgType, "STARTDEBUG" ); snprintf( ubuf, 3999, "%i", outXmsgTicketInfo->sendTicket ); sendXmsgInp.sendXmsgInfo.msg = ubuf; status = rcSendXmsg( conn, &sendXmsgInp ); if ( status < 0 ) { fprintf( stderr, "Error sending Message to Stream 4 = %d\n", status ); exit( -1 ); } myMNum = status; /* switch off blocking for stdin */ stdinflags = fcntl( 0, F_GETFL, 0 ); /* get current file status flags */ stdinflags |= O_NONBLOCK;/* turn off blocking flag */ if ( int status = fcntl( 0, F_SETFL, stdinflags ) ) { /* set up non-blocking read */ fprintf( stderr, "fcntl failed with status: %d", status ); } /* print to stdout */ /* printf("idbug> ");*/ while ( 1 ) { /* check for user input */ ubuf[0] = '\0'; if ( fgets( ubuf, 3999, stdin ) == NULL ) { if ( errno != EWOULDBLOCK ) { printf( "Exiting idbug\n" ); cleanUpAndExit(); } } else { /* got some user input */ processUserInput( ubuf ); } /* check for messages */ ubuf[0] = '\0'; memset( &rcvXmsgInp, 0, sizeof( rcvXmsgInp ) ); rcvXmsgInp.rcvTicket = streamId; sprintf( rcvXmsgInp.msgCondition, "(*XSEQNUM >= %d) && (*XADDR != \"%s:%i\") ", rNum, myHostName, getpid() ); status = getIDebugReply( &rcvXmsgInp, &rcvXmsgOut, 0 ); if ( status == 0 ) { if ( verbose == 3 ) { printf( "%s:%s#%i::%s: %s", rcvXmsgOut->sendUserName, rcvXmsgOut->sendAddr, rcvXmsgOut->seqNumber, rcvXmsgOut->msgType, rcvXmsgOut->msg ); } else if ( verbose == 2 ) { printf( "%s#%i::%s: %s", rcvXmsgOut->sendAddr, rcvXmsgOut->seqNumber, rcvXmsgOut->msgType, rcvXmsgOut->msg ); } else if ( verbose == 1 ) { printf( "%i::%s: %s", rcvXmsgOut->seqNumber, rcvXmsgOut->msgType, rcvXmsgOut->msg ); } else { printf( "%s: %s", rcvXmsgOut->msgType, rcvXmsgOut->msg ); } if ( strstr( rcvXmsgOut->msg, "PROCESS BEGIN" ) != NULL ) { /* printf(" FROM %s ", rcvXmsgOut->sendAddr); */ storeSendAddr( rcvXmsgOut->sendAddr ); } if ( strstr( rcvXmsgOut->msg, "PROCESS END" ) != NULL ) { printf( " FROM %s ", rcvXmsgOut->sendAddr ); unstoreSendAddr( rcvXmsgOut->sendAddr ); } if ( rcvXmsgOut->msg[strlen( rcvXmsgOut->msg ) - 1] != '\n' ) { printf( "\n" ); } rNum = rcvXmsgOut->seqNumber + 1; sleepSec = 1; free( rcvXmsgOut->msg ); free( rcvXmsgOut ); rcvXmsgOut = NULL; localStatus = 2; } else { sleep( sleepSec ); sleepSec = 2 * sleepSec; /* if (sleepSec > 10) sleepSec = 10; */ if ( sleepSec > 1 ) { sleepSec = 1; } } } }
int main(int argc, char **argv) { rcComm_t *conn = NULL; int status; int mNum = 0; int tNum = 1; int opt; int sNum = 0; int sleepSec = 1; int rNum = 1; char msgBuf[4000]; char msgHdr[HEADER_TYPE_LEN]; char condStr[NAME_LEN]; char myHostName[MAX_NAME_LEN]; char cmd[10]; getXmsgTicketInp_t getXmsgTicketInp; xmsgTicketInfo_t xmsgTicketInfo; xmsgTicketInfo_t *outXmsgTicketInfo; sendXmsgInp_t sendXmsgInp; rcvXmsgInp_t rcvXmsgInp; rcvXmsgOut_t *rcvXmsgOut = NULL; msgBuf[0] ='\0'; strcpy(msgHdr,"ixmsg");; myHostName[0] = '\0'; condStr[0] ='\0'; if (argc < 2) { printIxmsgHelp(argv[0]); exit(1); } strncpy(cmd,argv[1],9); status = getRodsEnv (&myRodsEnv); if (status < 0) { fprintf (stderr, "getRodsEnv error, status = %d\n", status); exit (1); } while ((opt = getopt(argc, argv, "ht:n:r:H:M:c:s:")) != (char)EOF) { switch(opt) { case 't': tNum = atoi(optarg); break; case 'n': mNum = atoi(optarg); break; case 'r': rNum = atoi(optarg); break; case 's': sNum = atoi(optarg); break; case 'H': strncpy(msgHdr, optarg, HEADER_TYPE_LEN - 1); break; case 'M': strncpy(msgBuf, optarg, 3999); break; case 'c': strncpy(condStr, optarg, NAME_LEN - 1); break; case 'h': printIxmsgHelp(argv[0]); exit(0); break; default: fprintf(stderr,"Error: Unknown Option\n"); exit (1); break; } } gethostname (myHostName, MAX_NAME_LEN); memset (&xmsgTicketInfo, 0, sizeof (xmsgTicketInfo)); if (!strcmp(cmd, "s")) { memset (&sendXmsgInp, 0, sizeof (sendXmsgInp)); xmsgTicketInfo.sendTicket = tNum; xmsgTicketInfo.rcvTicket = tNum; xmsgTicketInfo.flag = 1; sendXmsgInp.ticket = xmsgTicketInfo; snprintf(sendXmsgInp.sendAddr, NAME_LEN, "%s:%i", myHostName, getpid ()); sendXmsgInp.sendXmsgInfo.numRcv = rNum; sendXmsgInp.sendXmsgInfo.msgNumber = mNum; strcpy(sendXmsgInp.sendXmsgInfo.msgType, msgHdr); sendXmsgInp.sendXmsgInfo.msg = msgBuf; if (strlen(msgBuf) > 0) { status = sendIxmsg(&conn, &sendXmsgInp); if (connectFlag == 1) { rcDisconnect(conn); } if (status < 0) exit(8); exit(0); } printf("Message Header : %s\n", msgHdr); printf("Message Address: %s\n",sendXmsgInp.sendAddr); while (fgets (msgBuf, 3999, stdin) != NULL) { if (strstr(msgBuf,"/EOM") == msgBuf) { if (connectFlag == 1) { rcDisconnect(conn); } exit(0); } sendXmsgInp.sendXmsgInfo.msgNumber = mNum; if (mNum != 0) mNum++; sendXmsgInp.sendXmsgInfo.msg = msgBuf; status = sendIxmsg(&conn, &sendXmsgInp); if (status < 0) { if (connectFlag == 1) { rcDisconnect(conn); } exit(8); } } if (connectFlag == 1) { rcDisconnect(conn); } } else if (!strcmp(cmd, "r")) { memset (&rcvXmsgInp, 0, sizeof (rcvXmsgInp)); rcvXmsgInp.rcvTicket = tNum; /* rcvXmsgInp.msgNumber = mNum; */ if (mNum == 0) mNum--; while ( mNum != 0 ) { if (connectFlag == 0) { conn = rcConnectXmsg (&myRodsEnv, &errMsg); if (conn == NULL) { sleep(sleepSec); sleepSec = 2 * sleepSec; if (sleepSec > 10) sleepSec = 10; continue; } status = clientLogin(conn); if (status != 0) { rcDisconnect(conn); sleep(sleepSec); sleepSec = 2 * sleepSec; if (sleepSec > 10) sleepSec = 10; continue; } connectFlag = 1; } if (strlen(condStr) > 0) sprintf(rcvXmsgInp.msgCondition, "(*XSEQNUM >= %d) && (%s)", sNum, condStr); else sprintf(rcvXmsgInp.msgCondition, "*XSEQNUM >= %d ", sNum); status = rcRcvXmsg (conn, &rcvXmsgInp, &rcvXmsgOut); /* rcDisconnect(conn); */ if (status >= 0) { printf ("%s:%s#%i::%s: %s", rcvXmsgOut->sendUserName,rcvXmsgOut->sendAddr, rcvXmsgOut->seqNumber, rcvXmsgOut->msgType, rcvXmsgOut->msg); if (rcvXmsgOut->msg[strlen(rcvXmsgOut->msg)-1] != '\n') printf("\n"); sleepSec = 1; mNum--; sNum = rcvXmsgOut->seqNumber + 1; free(rcvXmsgOut->msg); free(rcvXmsgOut); rcvXmsgOut = NULL; } else { sleep(sleepSec); sleepSec = 2 * sleepSec; if (sleepSec > 10) sleepSec = 10; } } if (connectFlag == 1) { rcDisconnect(conn); } } else if (!strcmp(cmd, "t")) { memset (&getXmsgTicketInp, 0, sizeof (getXmsgTicketInp)); getXmsgTicketInp.flag = 1; conn = rcConnectXmsg (&myRodsEnv, &errMsg); if (conn == NULL) { fprintf (stderr, "rcConnect error\n"); exit (1); } status = clientLogin(conn); if (status != 0) { fprintf (stderr, "clientLogin error\n"); rcDisconnect(conn); exit (7); } status = rcGetXmsgTicket (conn, &getXmsgTicketInp, &outXmsgTicketInfo); rcDisconnect(conn); if (status != 0) { fprintf (stderr, "rcGetXmsgTicket error. status = %d\n", status); exit (8); } printf("Send Ticket Number= %i\n",outXmsgTicketInfo->sendTicket); printf("Recv Ticket Number= %i\n",outXmsgTicketInfo->rcvTicket); printf("Ticket Expiry Time= %i\n",outXmsgTicketInfo->expireTime); printf("Ticket Flag = %i\n",outXmsgTicketInfo->flag); free (outXmsgTicketInfo); } else if (!strcmp(cmd, "c") || !strcmp(cmd, "d") || !strcmp(cmd, "e") ) { memset (&sendXmsgInp, 0, sizeof (sendXmsgInp)); xmsgTicketInfo.sendTicket = tNum; xmsgTicketInfo.rcvTicket = tNum; xmsgTicketInfo.flag = 1; sendXmsgInp.ticket = xmsgTicketInfo; snprintf(sendXmsgInp.sendAddr, NAME_LEN, "%s:%i", myHostName, getpid ()); sendXmsgInp.sendXmsgInfo.numRcv = rNum; if (!strcmp(cmd, "e")) { sendXmsgInp.sendXmsgInfo.msgNumber = sNum; } else { sendXmsgInp.sendXmsgInfo.msgNumber = mNum; } strcpy(sendXmsgInp.sendXmsgInfo.msgType, msgHdr); sendXmsgInp.sendXmsgInfo.msg = msgBuf; if (!strcmp(cmd, "c")) { sendXmsgInp.sendXmsgInfo.miscInfo = strdup("CLEAR_STREAM"); } if (!strcmp(cmd, "e")) { sendXmsgInp.sendXmsgInfo.miscInfo = strdup("ERASE_MESSAGE"); } else { sendXmsgInp.sendXmsgInfo.miscInfo = strdup("DROP_STREAM"); } status = sendIxmsg(&conn, &sendXmsgInp); if (connectFlag == 1) { rcDisconnect(conn); } if (status < 0) exit(8); exit(0); } else { fprintf(stderr,"wrong option. Check with -h\n"); exit(9); } exit (0); }