예제 #1
0
파일: idbug.cpp 프로젝트: bpow/irods
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;
            }
        }
    }
}
예제 #2
0
파일: ixmsg.c 프로젝트: UPPMAX/irods
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);
}