int cleanUpAndExit() { sendXmsgInp_t sendXmsgInp; xmsgTicketInfo_t xmsgTicketInfo; int status; char buf[] = "QUIT"; memset( &xmsgTicketInfo, 0, sizeof( xmsgTicketInfo ) ); 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 = 1; strcpy( sendXmsgInp.sendXmsgInfo.msgType, "QUIT" ); sendXmsgInp.sendXmsgInfo.msg = buf; sendXmsgInp.sendXmsgInfo.msgNumber = myMNum; sendXmsgInp.sendXmsgInfo.miscInfo = strdup( "ERASE_MESSAGE" ); status = rcSendXmsg( conn, &sendXmsgInp ); if ( status < 0 ) { fprintf( stderr, "rsSendXmsg error for 4. status = %d\n", status ); } sendIDebugCommand( "quit", "CMSG:QUIT" ); rcDisconnect( conn ); exit( 0 ); }
int sendIxmsg( rcComm_t **inconn, sendXmsgInp_t *sendXmsgInp){ int status; int sleepSec = 1; rcComm_t *conn; conn = *inconn; while (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); fprintf (stderr, "clientLogin error...Will try again\n"); sleep(sleepSec); sleepSec = 2 * sleepSec; if (sleepSec > 10) sleepSec = 10; continue; } *inconn = conn; connectFlag = 1; } status = rcSendXmsg (conn, sendXmsgInp); /* rcDisconnect(conn); **/ if (status < 0) { fprintf (stderr, "rsSendXmsg error. status = %d\n", status); exit (9); } return(status); }
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 sendIDebugCommand( char *buf, char *hdr ) { int status, ii; static int mNum = 1; sendXmsgInp_t sendXmsgInp; xmsgTicketInfo_t xmsgTicketInfo; memset( &xmsgTicketInfo, 0, sizeof( xmsgTicketInfo ) ); memset( &sendXmsgInp, 0, sizeof( sendXmsgInp ) ); xmsgTicketInfo.sendTicket = streamId; xmsgTicketInfo.rcvTicket = streamId; xmsgTicketInfo.flag = 1; sendXmsgInp.ticket = xmsgTicketInfo; if ( strcmp( buf, "quit" ) == 0 ) { sendXmsgInp.sendXmsgInfo.miscInfo = strdup( "DROP_STREAM" ); } snprintf( sendXmsgInp.sendAddr, NAME_LEN, "%s:%i", myHostName, getpid() ); /*** if (strstr(hdr, "ALL") != NULL) sendXmsgInp.sendXmsgInfo.numRcv = sendAddrInx; else sendXmsgInp.sendXmsgInfo.numRcv = 1; ***/ sendXmsgInp.sendXmsgInfo.numRcv = 1; sendXmsgInp.sendXmsgInfo.msgNumber = mNum; sendXmsgInp.sendXmsgInfo.msg = buf; if ( strstr( hdr, "BEGIN" ) != NULL ) { sendXmsgInp.sendXmsgInfo.numRcv = 0; strcpy( sendXmsgInp.sendXmsgInfo.msgType, "CMSG:ALL" ); /* printf("*** Sending:%s::%s::%i\n",sendXmsgInp.sendXmsgInfo.msgType,sendXmsgInp.sendXmsgInfo.msg,sendXmsgInp.sendXmsgInfo.numRcv);*/ status = rcSendXmsg( conn, &sendXmsgInp ); if ( status < 0 ) { fprintf( stderr, "rsSendXmsg error for %i. status = %d\n", streamId, status ); return status; } mNum++; } else if ( strstr( hdr, "ALL" ) == NULL ) { snprintf( sendXmsgInp.sendXmsgInfo.msgType, sizeof( sendXmsgInp.sendXmsgInfo.msgType ), "%s", hdr ); /* printf("*** Sending:%s::%s::%i\n",sendXmsgInp.sendXmsgInfo.msgType,sendXmsgInp.sendXmsgInfo.msg,sendXmsgInp.sendXmsgInfo.numRcv);*/ status = rcSendXmsg( conn, &sendXmsgInp ); if ( status < 0 ) { fprintf( stderr, "rsSendXmsg error for %i. status = %d\n", streamId, status ); return status; } mNum++; } else { for ( ii = 0; ii < sendAddrInx ; ii++ ) { if ( sendAddr[ii] != NULL ) { snprintf( hdr, HEADER_TYPE_LEN, "CMSG:%s", sendAddr[ii] ); snprintf( sendXmsgInp.sendXmsgInfo.msgType, sizeof( sendXmsgInp.sendXmsgInfo.msgType ), "%s", hdr ); /* printf("*** Sending:%s::%s::%i\n",sendXmsgInp.sendXmsgInfo.msgType,sendXmsgInp.sendXmsgInfo.msg,sendXmsgInp.sendXmsgInfo.numRcv);*/ status = rcSendXmsg( conn, &sendXmsgInp ); if ( status < 0 ) { fprintf( stderr, "rsSendXmsg error for %i. status = %d\n", streamId, status ); return status; } mNum++; } } } return 0; }