void command_zombtest( struct char_buffer* cbuff ) {
	char str_arg1[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg2[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg3[CONFIG_CLI_MAX_CHARACTERS];
	int block_size = 0;
	int num_blocks = 0;

	if(
		next_token( cbuff, str_arg1 ) == 0 ||
		!str_is_integer( str_arg1 ) ||
		next_token( cbuff, str_arg2 ) == 0 ||
		!str_is_integer( str_arg2 ) ||
		next_token( cbuff, str_arg3 ) != 0 ) {
		CommandOutput( "[ZOMB]\tInvalid Arguments" );
		return;
	}

	block_size = str_atoi( str_arg1 );
	num_blocks = str_atoi( str_arg2 );

	CommandOutput( "[ZOMB] STARTING ZOMBIE RECLEMATION TEST [%d blocks of size %d]", num_blocks, block_size );
	struct two_number_message init_msg;
	int zombtesttid = Create( PRIORITY_TEST_ZOMB, &task_test_zombie_reclaim );
	init_msg.num1 = block_size;
	init_msg.num2 = num_blocks;
	Send( zombtesttid, (char *)&init_msg, sizeof (init_msg), (char *)0, 0 );
}
void command_tr( struct char_buffer* cbuff ) {
	char str_arg1[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg2[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg3[CONFIG_CLI_MAX_CHARACTERS];
	int arg1 = 0;
	int arg2 = 0;

	if(
		next_token( cbuff, str_arg1 ) == 0 ||
		!str_is_integer( str_arg1 ) ||
		next_token( cbuff, str_arg2 ) == 0 ||
		!str_is_integer( str_arg2 ) ||
		next_token( cbuff, str_arg3 ) != 0 ) {
		CommandOutput( "[TR]\tInvalid Arguments" );
		return;
	}

	arg1 = str_atoi( str_arg1 );
	arg2 = str_atoi( str_arg2 );

	if( arg2 < 0 || arg2 > 14 ) {
		CommandOutput( "[TR]\tInvalid Train Speed" );
		return;
	}


	if( SetTrainSpeed( arg1, arg2 ) != -1 ) {
		CommandOutput( "[TR]\tSetting Train %d to Speed %d", arg1, arg2 );
	} else {
		CommandOutput( "[TR]\tERROR: Train %d has not been added", arg1 );
	}
}
Int16 SqlSealogEvent::sendEvent(Int16 eventId, Lng32 slSeverity)
{
  Int32 rc = 0;
#ifndef SP_DIS
  char eventidStr[10]="        ";
  Lng32 eventidLen = 0;
  str_sprintf(eventidStr,"10%d%06d",SQEVL_SQL,eventId);
  str_strip_blanks(eventidStr,eventidLen);
  Lng32 eventIdVal = (Lng32)str_atoi(eventidStr,eventidLen);
   common::event_header * eventHeader = sqlInfoEvent_.mutable_header();
  common::info_header * infoHeader = eventHeader->mutable_header();  

   rc = initAMQPInfoHeader(infoHeader, SQEVL_SQL);
   if (rc)
     //add trace log
     return rc;
  sqlInfoEvent_.mutable_header()->set_event_id(eventIdVal);
  sqlInfoEvent_.mutable_header()->set_event_severity(slSeverity);
  setExperienceLevel("ADVANCED");
  setTarget("LOGONLY");

  AMQPRoutingKey routingKey(SP_EVENT, SP_SQLPACKAGE,  SP_INSTANCE, 
                              SP_PUBLIC,  SP_GPBPROTOCOL,  "info_event"); 
  try {
    rc = sendAMQPMessage(true, sqlInfoEvent_.SerializeAsString(), SP_CONTENT_TYPE_APP, routingKey);
  } catch(...) {
    rc = -1;
  }
#endif
  return rc;
}
void command_st( struct char_buffer* cbuff ) {
	char str_arg1[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg2[CONFIG_CLI_MAX_CHARACTERS];
	int arg1 = 0;

	if(
		next_token( cbuff, str_arg1 ) == 0 ||
		!str_is_integer( str_arg1 ) ||
		next_token( cbuff, str_arg2 ) != 0 ) {
		CommandOutput( "[ST]\tInvalid Arguments" );
		return;
	}

	arg1 = str_atoi( str_arg1 );

	//check the switch number
	if( switch_index( arg1 ) == -1 ) {
		CommandOutput( "[ST]\tInvalid Switch Number" );
		return;
	}

	int status = SwitchStatus( arg1 );
	//display the state that the switch was last switched into
	if( status == SWITCH_CURVED ) {
		CommandOutput( "[ST]\tSwitch %d is Curved", arg1 );
	} else if( status == SWITCH_STRAIGHT ) {
		CommandOutput( "[ST]\tSwitch %d is Straight", arg1 );
	} else if( status == SWITCH_UNKNOWN ) {
		CommandOutput( "[ST]\tSwitch %d is in an Unknown state", arg1 );
	} else {
		CommandOutput( "[ST]\t%d", status );
	}
}
Beispiel #5
0
const unsigned char*
vsf_sysutil_parse_uchar_string_sep(
  const struct mystr* p_str, char sep, unsigned char* p_items,
  unsigned int items)
{
  static struct mystr s_tmp_str;
  unsigned int i;
  str_copy(&s_tmp_str, p_str);
  for (i=0; i<items; i++)
  {
    static struct mystr s_rhs_sep_str;
    int this_number;
    /* This puts a single separator delimited field in tmp_str */
    str_split_char(&s_tmp_str, &s_rhs_sep_str, sep);
    /* Sanity - check for too many or two few dots! */
    if ( (i < (items-1) && str_isempty(&s_rhs_sep_str)) ||
         (i == (items-1) && !str_isempty(&s_rhs_sep_str)))
    {
      return 0;
    }
    this_number = str_atoi(&s_tmp_str);
    if (this_number < 0 || this_number > 255)
    {
      return 0;
    }
    /* If this truncates from int to uchar, we don't care */
    p_items[i] = (unsigned char) this_number;
    /* The right hand side of the comma now becomes the new string to
     * breakdown
     */
    str_copy(&s_tmp_str, &s_rhs_sep_str);
  }
  return p_items;
}
Lng32 AQRInfo::setCQDs(Lng32 numCQDs, char * cqdStr,
		      ContextCli * context)
{
  Lng32 rc = 0;
  if (numCQDs > 0)
    {
      for (Lng32 i = 0; i < numCQDs; i++)
	{
	  // for each entry in the cqdStr, extract the corresponding
	  // entry from cqdInfo array and execute that cqd.
	  // Entries in cqdStr are of the form:
	  //  NN:NN:....NN
	  //  For ex:   numCQDs=2 and cqdStr = 01:03   
	  // would indicate that entries #1 and #3 from the cqdInfo
	  // array need to be executed and set.
	  Int64 v = str_atoi(&cqdStr[i*3], 2);
	  if (v <= 0)
	    return -1;

	  rc = context->holdAndSetCQD(cqdInfo[(v-1)*2].str,
				      cqdInfo[(v-1)*2+1].str);
	  if (rc < 0)
	    return rc;
	}
    }
  
  return 0;
}
void command_sos( struct char_buffer* cbuff ) {
	char str_arg1[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg2[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg3[CONFIG_CLI_MAX_CHARACTERS];

	if(
		next_token( cbuff, str_arg1 ) == 0 ||
		!str_is_integer( str_arg1 ) ||
		next_token( cbuff, str_arg2 ) == 0 ||
		next_token( cbuff, str_arg3 ) != 0 ) {
		CommandOutput( "[SOS]\tInvalid Arguments" );
		return;
	}

	int train_num = str_atoi( str_arg1 );

	int sensor_num = 0;
	if( !sensor_str2num( str_arg2, &sensor_num ) ) {
		CommandOutput( "[SOS]\tInvalid Sensor Name" );
		return;
	}

	if( SOSTrain( train_num, sensor_num ) != -1 ) {
		CommandOutput( "[SOS]\tStopping Train [%d] on Trigger of Sensor [%s] aka [%d]", train_num, str_arg2, sensor_num );
	} else {
		CommandOutput( "[SOS]\tERROR: Train %d has not been added", train_num );
	}
}
void command_route( struct char_buffer* cbuff, struct track_node * track_data ) {
	char str_arg1[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg2[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg3[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg4[CONFIG_CLI_MAX_CHARACTERS];
	int destination = 0, offset = 0;

	int train_num;
	struct train_route_request_message reqmsg;
	struct empty_message rpl;
	int tid = WhoIs( "traindispatch" );


	if(
		next_token( cbuff, str_arg1 ) == 0 ||
		!str_is_integer( str_arg1 ) ||
		next_token( cbuff, str_arg2 ) == 0) {
		CommandOutput( "[ROUTE]\tInvalid Arguments" );
		return;
	}
	if( next_token( cbuff, str_arg3 ) != 0 ) {
		offset = str_atoi( str_arg3 );
	}
	if(	next_token( cbuff, str_arg4 ) != 0 ) {
		CommandOutput( "[ROUTE]\tInvalid Arguments" );
		return;
	}

	train_num = str_atoi( str_arg1 );
	if( !track_str2num( track_data, str_arg2, &destination ) ) {
		CommandOutput( "[ROUTE]\tInvalid Landmark Name" );
		return;
	}


	reqmsg.message_type = TRAIN_ROUTE_REQUEST_MESSAGE;
	reqmsg.train = train_num;
	reqmsg.pos1.node = -1;
	reqmsg.pos1.offset = 0;
	reqmsg.pos2.node = destination;
	reqmsg.pos2.offset = offset;

	Send( tid, (char *)&reqmsg, sizeof (reqmsg), (char *)&rpl, sizeof (rpl) );

	CommandOutput( "[ROUTE] Routing Train %d to %s + %d mm", train_num, track_data[destination].name, offset );

}
Beispiel #9
0
static void
handle_port(struct vsf_session* p_sess)
{
  static struct mystr s_tmp_str;
  unsigned short the_port;
  unsigned char vals[6];
  int i;
  pasv_cleanup(p_sess);
  port_cleanup(p_sess);
  str_copy(&s_tmp_str, &p_sess->ftp_arg_str);
  for (i=0; i<6; i++)
  {
    static struct mystr s_rhs_comma_str;
    int this_number;
    /* This puts a single , delimited field in tmp_str */
    str_split_char(&s_tmp_str, &s_rhs_comma_str, ',');
    /* Sanity - check for too many or two few commas! */
    if ( (i<5 && str_isempty(&s_rhs_comma_str)) ||
         (i==5 && !str_isempty(&s_rhs_comma_str)))
    {
      vsf_cmdio_write(p_sess, FTP_BADCMD, "Illegal PORT command.");
      return;
    }
    this_number = str_atoi(&s_tmp_str);
    if (this_number < 0 || this_number > 255)
    {
      vsf_cmdio_write(p_sess, FTP_BADCMD, "Illegal PORT command.");
      return;
    }
    /* If this truncates from int to uchar, we don't care */
    vals[i] = (unsigned char) this_number;
    /* The right hand side of the comma now becomes the new string to
     * breakdown
     */
    str_copy(&s_tmp_str, &s_rhs_comma_str);
  }
  the_port = vals[4] << 8;
  the_port |= vals[5];
  vsf_sysutil_sockaddr_alloc_ipv4(&p_sess->p_port_sockaddr);
  vsf_sysutil_sockaddr_set_ipv4addr(p_sess->p_port_sockaddr, vals);
  vsf_sysutil_sockaddr_set_port(p_sess->p_port_sockaddr, the_port);
  /* SECURITY:
   * 1) Reject requests not connecting to the control socket IP
   * 2) Reject connects to privileged ports
   */
  if (!tunable_port_promiscuous)
  {
    if (!vsf_sysutil_sockaddr_addr_equal(p_sess->p_remote_addr,
                                         p_sess->p_port_sockaddr) ||
        vsf_sysutil_is_port_reserved(the_port))
    {
      vsf_cmdio_write(p_sess, FTP_BADCMD, "Illegal PORT command.");
      port_cleanup(p_sess);
      return;
    }
  }
  vsf_cmdio_write(p_sess, FTP_PORTOK,
                  "PORT command successful. Consider using PASV.");
}
Lng32 ExpLOBoper::ExpGetLOBnumFromDescName(char * descName, Lng32 descNameLen)
{
  // Desc Name Format: LOBDescHandle_%020Ld_%04d
  char * lobNumPtr = &descName[sizeof(LOB_DESC_HANDLE_PREFIX) + 20 + 1];
  Lng32 lobNum = str_atoi(lobNumPtr, 4);
  
  return lobNum;
}
Lng32 ExpLOBoper::ExpGetLOBnumFromDescName(char * descName, Lng32 descNameLen)
{
  // Desc Name Format: LOBDescHandle_%020Ld_%04d
  char * lobNumPtr = &descName[strlen("LOBDescHandle_") + 20 + 1];
  Lng32 lobNum = str_atoi(lobNumPtr, 4);
  
  return lobNum;
}
void command_tdir( struct char_buffer* cbuff ) {
	char str_arg1[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg2[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg3[CONFIG_CLI_MAX_CHARACTERS];
	int arg1 = 0;
	int arg2 = 0;

	if(
		next_token( cbuff, str_arg1 ) == 0 ||
		!str_is_integer( str_arg1 ) ||
		next_token( cbuff, str_arg2 ) == 0 ||
		str_arg2[0] == '\0' ||
		str_arg2[1] != '\0' ||
		next_token( cbuff, str_arg3 ) != 0 ) {
		CommandOutput( "[TRDIR]\tInvalid Arguments" );
		return;
	}

	arg1 = str_atoi( str_arg1 );

	if( str_arg2[0] != 'f' && str_arg2[0] != 'b' ) {
		CommandOutput( "[TRDIR]\tInvalid Direction" );
		return;
	}

	if( str_arg2[0] == 'f' ) {
		arg2 = DIRECTION_FORWARD;
	} else {
		arg2 = DIRECTION_BACKWARD;
	}

	//TODO: send direction to train


	if( SetTrainDirection( arg1, arg2 ) != -1 ) {
		switch( arg2 ) {
			case DIRECTION_FORWARD:
				CommandOutput( "[TRDIR]\tSetting Train %d to Direction Forward", arg1 );
				break;
			default:
				CommandOutput( "[TRDIR]\tSetting Train %d to Direction Backward", arg1 );
				break;
		}
	} else {
		CommandOutput( "[TR]\tERROR: Train %d has not been added", arg1 );
	}
}
ULng32 NAColumnArray::getMaxTrafHbaseColQualifier() const
{
  NAColumn *column;
  char * colQualPtr;
  Lng32 colQualLen;
  Int64 colQVal;
  ULng32 maxVal = 0;

  for (CollIndex i = 0; i < entries(); i++)
    {
      column = (*this)[i];
      colQualPtr = (char*)column->getHbaseColQual().data();
      colQualLen = column->getHbaseColQual().length();
      colQVal = str_atoi(colQualPtr, colQualLen);
      if (colQVal > maxVal)
	maxVal = colQVal ;
    }
  return maxVal;
}
void command_sw( struct char_buffer* cbuff ) {
	char str_arg1[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg2[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg3[CONFIG_CLI_MAX_CHARACTERS];
	int arg1 = 0;
	char arg2;

	if(
		next_token( cbuff, str_arg1 ) == 0 ||
		!str_is_integer( str_arg1 ) ||
		next_token( cbuff, str_arg2 ) == 0 ||
		str_arg2[0] == '\0' ||
		str_arg2[1] != '\0' ||
		next_token( cbuff, str_arg3 ) != 0 ) {
		CommandOutput( "[SW]\tInvalid Arguments" );
		return;
	}

	arg1 = str_atoi( str_arg1 );

	//check the switch number
	if( switch_index( arg1 ) == -1 ) {
		CommandOutput( "[SW]\tInvalid Switch Number" );
		return;
	}

	//check the switch state
	if( str_arg2[0] != 's' && str_arg2[0] != 'c' ) {
		CommandOutput( "[SW]\tInvalid Switch State" );
		return;
	}

	if( str_arg2[0] == 'c' ) {
		arg2 = (char)SWITCH_CURVED;
		CommandOutput( "[SW]\tSwitching %d To Curved", arg1 );
	} else {
		arg2 = (char)SWITCH_STRAIGHT;
		CommandOutput( "[SW]\tSwitching %d To Straight", arg1 );
	}

	SetSwitch( arg1, arg2 );
}
Lng32 AQRInfo::resetCQDs(Lng32 numCQDs, char * cqdStr,
			  ContextCli * context)
{
  Lng32 rc = 0;
  if (numCQDs > 0)
    {
      for (Lng32 i = 0; i < numCQDs; i++)
	{
	  Int64 v = str_atoi(&cqdStr[i*3], 2);
	  if (v <= 0)
	    return -1;

	  rc = context->restoreCQD(cqdInfo[(v-1)*2].str);
	  if (rc < 0)
	    return rc;
	}
    }

  return rc;
}
void command_delay( struct char_buffer* cbuff ) {
	char str_arg1[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg2[CONFIG_CLI_MAX_CHARACTERS];
	int arg1 = 0;

	if(
		next_token( cbuff, str_arg1 ) == 0 ||
		!str_is_integer( str_arg1 ) ||
		next_token( cbuff, str_arg2 ) != 0 ) {
		CommandOutput( "[DELAY]\tInvalid Arguments" );
		return;
	}

	arg1 = str_atoi( str_arg1 );

	//if(arg1 > 1000){ arg1 = 1000; }

	CommandOutput( "[DELAY]\tDelaying For %d", arg1 );
	Delay( arg1 );
}
void command_rv( struct char_buffer* cbuff ) {
	char str_arg1[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg2[CONFIG_CLI_MAX_CHARACTERS];
	int arg1 = 0;

	if(
		next_token( cbuff, str_arg1 ) == 0 ||
		!str_is_integer( str_arg1 ) ||
		next_token( cbuff, str_arg2 ) != 0 ) {
		CommandOutput( "[RV]\tInvalid Arguments" );
		return;
	}

	arg1 = str_atoi( str_arg1 );

	if( ReverseTrain( arg1 ) != -1 ) {
		CommandOutput( "[RV]\tReversing Train %d", arg1 );
	} else {
		CommandOutput( "[RV]\tERROR: Train %d has not been added", arg1 );
	}


}
void command_add( struct char_buffer* cbuff, int track ) {
	char str_arg1[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg2[CONFIG_CLI_MAX_CHARACTERS];
	int arg1 = 0;

	if(
		next_token( cbuff, str_arg1 ) == 0 ||
		!str_is_integer( str_arg1 ) ||
		next_token( cbuff, str_arg2 ) != 0 ) {
		CommandOutput( "[ADD]\tInvalid Arguments" );
		return;
	}

	arg1 = str_atoi( str_arg1 );

	if( track == TRACK_UNINITIALIZED ) {
		CommandOutput( "[ADD]\tERROR: No track has been selected" );
		return;
	}

	CommandOutput( "[ADD]\tAdding Train %d", arg1 );
	AddTrain( arg1, track );
}
void command_looptest( struct char_buffer* cbuff ) {
	char str_arg1[CONFIG_CLI_MAX_CHARACTERS];
	char str_arg2[CONFIG_CLI_MAX_CHARACTERS];
	int arg1 = 0;

	if(
		next_token( cbuff, str_arg1 ) == 0 ||
		!str_is_integer( str_arg1 ) ||
		next_token( cbuff, str_arg2 ) != 0 ) {
		CommandOutput( "[LOOPTEST]\tInvalid Arguments" );
		return;
	}

	arg1 = str_atoi( str_arg1 );

	//check if priority is valid
	if( arg1 < 0 || arg1 >= PRIORITY_NUM_PRIORITIES ) {
		CommandOutput( "[LOOPTEST]\tInvalid Priority" );
		return;
	}

	CommandOutput( "[LOOPTEST]\tStarting Loop Test" );
	Create( arg1, &task_test_loop_time );
}
 Int32 SQLMXLoggingArea::logSQLMXEventForError( ULng32 sqlcode, 
                                        const char* experienceLevel,
                                        const char* severityLevel,
                                        const char* eventTarget,
					const char *msgTxt,
					const char* sqlId,
					const Lng32 Int0,
					const Lng32 Int1,
					const Lng32 Int2,
					const Lng32 Int3,
					const Lng32 Int4,
				        const char *String0,
					const char * String1,
					const char * String2,
					const char * String3,
					const char * String4,
					const char * serverName,
					const char * connectionName,
					const char * constraintCatalog,
					const char * constraintSchema,
					const char * constraintName,
					const char * triggerCatalog,
					const char * triggerSchema,
					const char *triggerName,
					const char *catalogName,
					const char *schemaName,
					const char *tableName,
					const char *columnName,
					const Int64 currTransid,
					const Lng32 rowNumber,
					const Lng32 platformCode,
					NABoolean isWarning	
					)
{
  Int32 rc = 0;
  // sealog logging of sql error events
  // declare a event stack variable and populate
#ifndef SP_DIS
  bool lockedMutex = lockMutex();

  sql::error_event sql_error_event;
  Int32 qpidNodePort = atoi(getenv("QPID_NODE_PORT"));

  common::event_header * eventHeader = sql_error_event.mutable_header();
  common::info_header * infoHeader = eventHeader->mutable_header();  


  if (!SQLMXLoggingArea::establishedAMQPConnection())
    {
      rc = createAMQPConnection(NULL,-1);
      if (rc)
      {
        if (lockedMutex)
          unlockMutex();
	return rc;
      }
      establishedAMQPConnection_ = TRUE;
    }
 

  char eventidStr[10]="        ";
  Lng32 eventidLen = 0;
  str_sprintf(eventidStr,"10%d%06d",SQEVL_SQL,sqlcode);
  str_strip_blanks(eventidStr,eventidLen);
  Lng32 eventIdVal = (Lng32)str_atoi(eventidStr,eventidLen);
 
  sql_error_event.mutable_header()->set_event_id(eventIdVal);
  sql_error_event.mutable_header()->set_event_severity(sqlToSLSeverity(severityLevel, isWarning));

 
  sql_error_event.set_sqlcode(sqlcode);
  if (sqlId)
    sql_error_event.set_sqlid(sqlId);
  else
    {
      SB_Phandle_Type myphandle;
      XPROCESSHANDLE_GETMINE_(&myphandle);
      char charProcHandle[200];
      char myprocname[30];
      Int32 mycpu,mypin,mynodenumber=0;
      short myproclength = 0;
      XPROCESSHANDLE_DECOMPOSE_(&myphandle, &mycpu, &mypin, &mynodenumber,NULL,100, NULL, myprocname,100, &myproclength); 
      myprocname[myproclength] = '\0';
      str_sprintf(charProcHandle,"%d,%d,%d,%s",mycpu,mypin,mynodenumber,myprocname);
      sql_error_event.set_sqlid(charProcHandle);
    }
  sql_error_event.set_message_text(msgTxt);
  sql_error_event.set_err_experience_level(experienceLevel);
  sql_error_event.set_err_target(eventTarget);
  sql_error_event.set_int0(Int0);
  sql_error_event.set_int1(Int1);
  sql_error_event.set_int2(Int2);
  sql_error_event.set_int3(Int3);
  sql_error_event.set_int4(Int4);

  if (String0)
    sql_error_event.set_string0(String0);
  if (String1)
    sql_error_event.set_string1(String1);
  if (String2)
    sql_error_event.set_string2(String2);
  if (String3)
    sql_error_event.set_string3(String3);
  if (String4)
    sql_error_event.set_string4(String4);
  //LCOV_EXCL_START - unused members of diags are
  if (serverName)
    sql_error_event.set_server_name(serverName);
  if (connectionName)
    sql_error_event.set_connection_name(connectionName);
  //LCOV_EXCL_STOP
  if (constraintCatalog)
    sql_error_event.set_constraint_catalog(constraintCatalog);
  if (constraintSchema)
    sql_error_event.set_constraint_schema(constraintSchema);
  if (constraintName)
    sql_error_event.set_constraint_name(constraintName);
  if (triggerCatalog)
    sql_error_event.set_trigger_catalog(triggerCatalog);
  if (triggerSchema)
    sql_error_event.set_trigger_schema(triggerSchema);
  if (triggerName)
    sql_error_event.set_trigger_name(triggerName);
  
  if (catalogName)
    sql_error_event.set_catalog_name(catalogName);
  if (schemaName)
    sql_error_event.set_schema_name(schemaName);
  if (tableName)
    sql_error_event.set_table_name(tableName);
  if (columnName)
    sql_error_event.set_column_name(columnName);
  
  sql_error_event.set_current_transid(currTransid);
  sql_error_event.set_row_number(rowNumber);  
  sql_error_event.set_platform_error_code(platformCode);

  rc =  initAMQPInfoHeader(infoHeader, SQEVL_SQL);
  if (rc)
    {
      closeAMQPConnection();
      establishedAMQPConnection_ = FALSE;
      if (lockedMutex)
        unlockMutex();
      return rc;
    }
 
  AMQPRoutingKey routingKey(SP_EVENT, SP_SQLPACKAGE,  SP_INSTANCE, 
                              SP_PUBLIC,  SP_GPBPROTOCOL,  "error_event"); 
  try { 
    rc = sendAMQPMessage(true, sql_error_event.SerializeAsString(), 
                         SP_CONTENT_TYPE_APP, routingKey);
    if (rc) throw 1;
  } catch (...) {
    closeAMQPConnection(); 
    establishedAMQPConnection_ = FALSE;
    if (!rc) rc = SP_SEND_FAILED;
    if (lockedMutex)
       unlockMutex();
    return rc;
  }

  if (lockedMutex)
    unlockMutex();
#else
  rc = 0;
#endif

  return rc;

}
Beispiel #21
0
static void
handle_config_setting(struct mystr* p_setting_str, struct mystr* p_value_str)
{
  if (str_isempty(p_value_str))
  {
    die("missing value in config file");
  }
  /* Is it a boolean value? */
  {
    const struct parseconf_bool_setting* p_bool_setting = parseconf_bool_array;
    while (p_bool_setting->p_setting_name != 0)
    {
      if (str_equal_text(p_setting_str, p_bool_setting->p_setting_name))
      {
        /* Got it */
        str_upper(p_value_str);
        if (str_equal_text(p_value_str, "YES") ||
            str_equal_text(p_value_str, "TRUE") ||
            str_equal_text(p_value_str, "1"))
        {
          *(p_bool_setting->p_variable) = 1;
        }
        else if (str_equal_text(p_value_str, "NO") ||
                 str_equal_text(p_value_str, "FALSE") ||
                 str_equal_text(p_value_str, "0"))
        {
          *(p_bool_setting->p_variable) = 0;
        }
        else
        {
          die("bad bool value in config file");
        }
        return;
      }
      p_bool_setting++;
    }
  }
  /* Is it an unsigned integer setting? */
  {
    const struct parseconf_uint_setting* p_uint_setting = parseconf_uint_array;
    while (p_uint_setting->p_setting_name != 0)
    {
      if (str_equal_text(p_setting_str, p_uint_setting->p_setting_name))
      {
        /* Got it */
        /* If the value starts with 0, assume it's an octal value */
        if (!str_isempty(p_value_str) &&
            str_get_char_at(p_value_str, 0) == '0')
        {
          *(p_uint_setting->p_variable) = str_octal_to_uint(p_value_str);
        }
        else
        {
          *(p_uint_setting->p_variable) = str_atoi(p_value_str);
        }
        return;
      }
      p_uint_setting++;
    }
  }
  /* Is it a string setting? */
  {
    const struct parseconf_str_setting* p_str_setting = parseconf_str_array;
    while (p_str_setting->p_setting_name != 0)
    {
      if (str_equal_text(p_setting_str, p_str_setting->p_setting_name))
      {
        /* Got it */
        const char** p_curr_setting = p_str_setting->p_variable;
        if (*p_curr_setting)
        {
          vsf_sysutil_free((char*)*p_curr_setting);
        }
        *p_curr_setting = str_strdup(p_value_str);
        return;
      }
      p_str_setting++;
    }
  }
  die("unrecognised variable in config file");
}
short AQRInfo::setAQREntriesFromInputStr(char * inStr, Lng32 inStrLen)
{
  if ((! inStr) || (inStrLen <= 0))
    return -1;

  char * newStr = new(heap_) char[inStrLen + 1 + 1];
  str_cpy_all(newStr, inStr, inStrLen);
  newStr[inStrLen] = 0;
  Lng32 n = 0;

  Int32 i = 0;
  while (i < inStrLen)
    {
      if ((inStr[i] != '+') &&
	  (inStr[i] != '-') &&
	  (inStr[i] != '.') &&
	  (inStr[i] != ' ') &&
	  (inStr[i] != ',') &&
	  (inStr[i] != '|') &&
	  (NOT ((inStr[i] >= '0') &&
		(inStr[i] <= '9'))))
	return -1;

      if (inStr[i] != ' ')
	{
	  newStr[n] = inStr[i];
	  n++;
	}

      i++;
    }

  if (newStr[n-1] != '|')
    {
      newStr[n] = '|';
      n++;
    }
  newStr[n] = 0;

  i = 0;
  Int32 j = 0;
  Int32 k = 1;
  Lng32 sqlcode = -1;
  Lng32 nskcode = 0;
  Lng32 retries = 1;
  Lng32 delay = 60;
  Lng32 type = 0;
  Lng32 numCQDs = 0;
  char * cqdStr = NULL;
  Lng32 cmpInfo = 0;
  Lng32 intAQR = 0;
  Lng32 task = ComTdbExeUtilAQR::NONE_;
  NABoolean numberSeen = FALSE;
  while (i < n)
    {
      if ((newStr[i] >= '0') &&
	  (newStr[i] <= '9'))
	numberSeen = TRUE;

      if (newStr[i] == '+')
	{
	  if ((numberSeen) ||
	      (task != ComTdbExeUtilAQR::NONE_))
	    return -1;

	  task = ComTdbExeUtilAQR::ADD_;
	  j++;
	}
      else if (newStr[i] == '-')
	{
	  if ((numberSeen) ||
	      (task != ComTdbExeUtilAQR::NONE_))
	    return -1;

	  task = ComTdbExeUtilAQR::DELETE_;
	  j++;
	}
      else if (newStr[i] == '.')
	{
	  if ((numberSeen) ||
	      (task != ComTdbExeUtilAQR::NONE_))
	    return -1;

	  task = ComTdbExeUtilAQR::UPDATE_;
	  j++;
	}

      if ((newStr[i] == ',') ||
	  (newStr[i] == '|'))
	{
	  if (i > j)
	    {
	      Lng32 v = 0;
	      if ((k < 7) || (k == 8) || (k == 9))
		{
		  Int64 bigV = str_atoi(&newStr[j], i-j);
		  if (bigV == -1)
		    return -1;
		  
		  if (bigV > INT_MAX)
		    return -1;

		  v = (Lng32)bigV;
		}

	      switch (k)
		{
		case 1:
		  sqlcode = v;
		  break;
		  
		case 2:
		  nskcode = v;
		  break;
		  
		case 3:
		  retries = v;
		  break;
		  
		case 4:
		  delay = v;
		  break;
		  
		case 5:
		  type = v;
		  break;

		case 6:
		  numCQDs = v;
		  break;

		case 7:
		  cqdStr = new(heap_) char[i-j+1];
		  str_cpy_all(cqdStr, &newStr[j], i-j);
		  cqdStr[i-j] = 0;
		  break;
		  
		case 8:
		  cmpInfo = v;
		  break;

		case 9:
		  intAQR = v;
		  break;

		} // switch
	    }

	  k++;

	  j = i + 1;
	}

      if (newStr[i] == '|')
	{
	  if (task == ComTdbExeUtilAQR::NONE_)
	    task = ComTdbExeUtilAQR::ADD_;

	  if (setAQREntry(task, sqlcode, nskcode, retries, delay, type,
			  numCQDs, cqdStr, cmpInfo, intAQR))
	    return -1;

	  sqlcode = -1;
	  nskcode = 0;
	  retries = 1;
	  delay = 60;
	  type = 0;
	  numCQDs = 0;
	  cqdStr = NULL;
	  cmpInfo = 0;
	  intAQR = 0;

	  numberSeen = FALSE;
	  task = ComTdbExeUtilAQR::NONE_;

	  k = 1;
	  j = i+1;
	}
	
      i++;
    }

  return 0;
}
Beispiel #23
0
void
vsf_parseconf_load_setting(const char* p_setting, int errs_fatal)
{
  static struct mystr s_setting_str;
  static struct mystr s_value_str;
  while (vsf_sysutil_isspace(*p_setting))
  {
    p_setting++;
  }
  str_alloc_text(&s_setting_str, p_setting);
  str_split_char(&s_setting_str, &s_value_str, '=');
  /* Is it a string setting? */
  {
    const struct parseconf_str_setting* p_str_setting = parseconf_str_array;
    while (p_str_setting->p_setting_name != 0)
    {
      if (str_equal_text(&s_setting_str, p_str_setting->p_setting_name))
      {
        /* Got it */
        const char** p_curr_setting = p_str_setting->p_variable;
        if (*p_curr_setting)
        {
          vsf_sysutil_free((char*) *p_curr_setting);
        }
        if (str_isempty(&s_value_str))
        {
          *p_curr_setting = 0;
        }
        else
        {
          *p_curr_setting = str_strdup(&s_value_str);
        }
        return;
      }
      p_str_setting++;
    }
  }
  if (str_isempty(&s_value_str))
  {
    if (errs_fatal)
    {
      die2("missing value in config file for: ", str_getbuf(&s_setting_str));
    }
    else
    {
      return;
    }
  }
  /* Is it a boolean value? */
  {
    const struct parseconf_bool_setting* p_bool_setting = parseconf_bool_array;
    while (p_bool_setting->p_setting_name != 0)
    {
      if (str_equal_text(&s_setting_str, p_bool_setting->p_setting_name))
      {
        /* Got it */
        str_upper(&s_value_str);
        if (str_equal_text(&s_value_str, "YES") ||
            str_equal_text(&s_value_str, "TRUE") ||
            str_equal_text(&s_value_str, "1"))
        {
          *(p_bool_setting->p_variable) = 1;
        }
        else if (str_equal_text(&s_value_str, "NO") ||
                 str_equal_text(&s_value_str, "FALSE") ||
                 str_equal_text(&s_value_str, "0"))
        {
          *(p_bool_setting->p_variable) = 0;
        }
        else if (errs_fatal)
        {
          die2("bad bool value in config file for: ",
               str_getbuf(&s_setting_str));
        }
        return;
      }
      p_bool_setting++;
    }
  }
  /* Is it an unsigned integer setting? */
  {
    const struct parseconf_uint_setting* p_uint_setting = parseconf_uint_array;
    while (p_uint_setting->p_setting_name != 0)
    {
      if (str_equal_text(&s_setting_str, p_uint_setting->p_setting_name))
      {
        /* Got it */
        /* If the value starts with 0, assume it's an octal value */
        if (!str_isempty(&s_value_str) &&
            str_get_char_at(&s_value_str, 0) == '0')
        {
          *(p_uint_setting->p_variable) = str_octal_to_uint(&s_value_str);
        }
        else
        {
          /* TODO: we could reject negatives instead of converting them? */
          *(p_uint_setting->p_variable) = (unsigned int) str_atoi(&s_value_str);
        }
        return;
      }
      p_uint_setting++;
    }
  }
  if (errs_fatal)
  {
    die2("unrecognised variable in config file: ", str_getbuf(&s_setting_str));
  }
}
// Extracts values from the string format of LOB handle 
Lng32 ExpLOBoper::extractFromLOBstring(Int64 &uid, 
				       Lng32 &lobNum,
				       Int64 &descPartnKey,
				       Int64 &descSyskey,
				       Int16 &flags,
				       Lng32 &lobType,
				       short &schNameLen,
				       char * schName,
				       char * handle,
				       Lng32 handleLen)
{
  // opp of:
  ////  // str_sprintf(lobHandleBuf, "LOBH%04d%020Ld%04d%02d%Ld%02d%Ld%03d%s",

  //  str_sprintf(lobHandleBuf, "LOBH%04d%02d%04d%020d%02d%Ld%02d%Ld%03d%s",
  //		  header, flags, lobtype, lobNum, uid, descPartnKey, descSyskey, schNameLen/SchName


  if (handleLen < (4 + 4 + 2 + 4 + 20 + 2))
    return -1;

  Lng32 curPos = 4;
  
  flags = (Lng32)str_atoi(&handle[curPos], 4);
  curPos += 4;

  lobType = (Lng32)str_atoi(&handle[curPos], 2);
  curPos += 2;

  lobNum = (Lng32)str_atoi(&handle[curPos], 4);
  curPos += 4;

  uid = str_atoi(&handle[curPos], 20);
  curPos += 20;

  short len1;
  len1 = (short)str_atoi(&handle[curPos], 2);
  curPos += 2;

  if (handleLen < (curPos + len1 + 2))
    return -1;

  descPartnKey = str_atoi(&handle[curPos], len1);
  curPos += len1;

  short len2;
  len2 = (short)str_atoi(&handle[curPos], 2);
  curPos += 2;

  if (handleLen < (curPos + len2 + 3))
    return -1;
  descSyskey = str_atoi(&handle[curPos], len2);
  curPos += len2;

  schNameLen = (short)str_atoi(&handle[curPos], 3);
  curPos += 3;
  if (handleLen < (curPos + schNameLen))
    return -1;
  
  str_cpy_and_null(schName, &handle[curPos], 
		   schNameLen, '\0', ' ', TRUE);

  //  flags = 0;

  return 0;
}
Beispiel #25
0
SQScratchFile::SQScratchFile(char* path, ScratchSpace *scratchSpace,
            SortError* sorterror, 
            CollHeap* heap, NABoolean breakEnabled,
            Int32 scratchMaxOpens,
            NABoolean asynchReadQueue) :  
  ScratchFile(scratchSpace,
              SCRATCH_FILE_SIZE,
              sorterror,
              heap,
              scratchMaxOpens,
              breakEnabled), 
  vectorSize_(scratchSpace->getScratchIOVectorSize()),
  vector_(NULL)
{
  Int32 error = 0;
  resultFileSize_ = SCRATCH_FILE_SIZE; 
  asynchReadQueue_ = asynchReadQueue;
//------------------------------------------------------------------------
// if the path is a directory and fileSize is bigger than zero, then
// get the name of the temp file and add the FILE_DELETE_ONCLOSE flag.
// Else just copy it in.
//------------------------------------------------------------------------
  if (checkDirectory(path) != SORT_SUCCESS)  
  {

    if (mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH))
    {
        if (checkDirectory(path) == 0)
        {
   // some other process probably created the TdmTmp directory
   // in the meantime so the directory exists.. proceed
   
        }
        else
        {
           error = obtainError();
           sortError_->setErrorInfo( ECreateDir        //sort error
                  ,(short)error      //syserr: the actual FS error
                   ,NULL              //syserrdetail
                   ,"SQScratchFile::SQScratchFile1" //methodname
                   );
            return;
        }
    }
  }

  //Inform overflow mode to STFS layer indicating that overflow
  //file be created on SSD or HDD or MMAP media.
  //Error 0 is success, 1 is unknown overflow type
  //error 2 is specified overflow type not configured.
  switch(scratchSpace_->getScratchOverflowMode())
  {
    case SCRATCH_SSD: 
	  error = STFS_set_overflow(STFS_SSD);
      break;
    
    default:
	case SCRATCH_MMAP:
    case SCRATCH_DISK:
      error = STFS_set_overflow(STFS_HDD);
      break;
  }

  //Error 0 is success, 1 is unknown overflow type
  //error 2 is specified overflow type not configured.
  if(error)
  {
    Int32 errorType = EUnexpectErr;
    switch(error)
    {
      case 1: errorType = EUnKnownOvType;
        break;
      case 2: errorType = EOvTypeNotConfigured;
        break;
      default:errorType = EUnexpectErr;
    }
    sortError_->setErrorInfo( errorType //sort error
                              ,0        //syserr: the actual FS error
                              ,0        //syserrdetail
                              ,"SQScratchFile::SQScratchFile2" //methodname
                              );
    return;
  }

  // XXXXXX is required by mkstemp
  str_sprintf(fileName_, "%s/SCRXXXXXX", path);

  if ((scratchSpace_->getScratchOverflowMode() == SCRATCH_DISK) ||
	 (scratchSpace_->getScratchOverflowMode() == SCRATCH_MMAP))
    {
      fileHandle_[0].fileNum = STFS_mkstemp_instnum(fileName_,scratchSpace_->getEspInstance());
    }
  else
    fileHandle_[0].fileNum = STFS_mkstemp(fileName_);
  if (fileHandle_[0].fileNum == STFS_NULL_FHNDL)
  {
      // mkstemp failed.
      sortError_->setErrorInfo( EUnexpectErr        //sort error
                ,(short)errno      //syserr: the actual FS error
                ,0              //syserrdetail
                ,"SQScratchFile::SQScratchFile 3" //methodname
                );
      return;
  }
  fileNameLen_ = str_len(fileName_);

  if(scratchSpace_->getScratchOverflowMode() != SCRATCH_MMAP)
  {
	  // change to non-blocking I/O
	  Int32 flags = STFS_fcntl(fileHandle_[0].fileNum, F_GETFL);

	  //other flags
	  flags |= O_APPEND;
	  flags |= O_NONBLOCK;
	  flags |= O_NOATIME;

	  //O_DIRECT is ON by default. User has to explicitly define 
	  //SCRATCH_NO_ODIRECT to disable O_DIRECT. Note that this 
	  //flag has significant performance implications.
	  if (!getenv("SCRATCH_NO_ODIRECT"))
		flags |= O_DIRECT;

	  error = STFS_fcntl(fileHandle_[0].fileNum, F_SETFL, flags);

	  if (error)
	  {
		  STFS_close(fileHandle_[0].fileNum);
		  fileHandle_[0].fileNum = STFS_NULL_FHNDL;
		  sortError_->setErrorInfo( EUnexpectErr        //sort error
							,(short)error     //syserr: the actual FS error                        
							,0              //syserrdetail
							,"SQScratchFile::SQScratchFile 4" //methodname
						   );
						return;
	  }    

  } 
 
  if(scratchSpace_->getScratchOverflowMode() == SCRATCH_MMAP)
  {
    off_t ret = STFS_lseek(fileHandle_[0].fileNum, resultFileSize_ -1 , SEEK_SET);
    if (ret < 0)
    {
      STFS_close(fileHandle_[0].fileNum);
      fileHandle_[0].fileNum = STFS_NULL_FHNDL;
      sortError_->setErrorInfo( EUnexpectErr        //sort error
                      ,(short)errno     //syserr: the actual FS error

                      ,0              //syserrdetail
                      ,"SQScratchFile::SQScratchFile(5)" //methodname
                     );
                  return;
    }
    error = write(fileHandle_[0].fileNum, "1", 1);
    if (error < 0)
    {
      STFS_close(fileHandle_[0].fileNum);
      fileHandle_[0].fileNum = STFS_NULL_FHNDL;
      sortError_->setErrorInfo( EUnexpectErr        //sort error
                  ,(short)errno     //syserr: the actual FS error

                  ,0              //syserrdetail
                  ,"SQScratchFile::SQScratchFile(6)" //methodname
                 );
              return;
    }
    fileHandle_[0].mmap = (char*) 
           mmap(0, resultFileSize_, PROT_READ | PROT_WRITE, MAP_SHARED,
           fileHandle_[0].fileNum, 0);

    if(fileHandle_[0].mmap == MAP_FAILED) 
    {
      STFS_close(fileHandle_[0].fileNum);
      fileHandle_[0].fileNum = STFS_NULL_FHNDL;
      sortError_->setErrorInfo( EUnexpectErr        //sort error
                  ,(short)errno     //syserr: the actual FS error

                  ,0              //syserrdetail
                  ,"SQScratchFile::SQScratchFile(7)" //methodname
                 );
              return;
    }
    
  } 
 //Memory allocation failure will result in long jump.
  reset();
  if(vectorSize_ > 0)
  {
    vector_ = (struct iovec *)((NAHeap *)heap_)->allocateAlignedHeapMemory(sizeof(struct iovec) * vectorSize_, 512);
  }
  
  vectorWriteMax_ = 0;
  vectorReadMax_ = 0;
  writemmapCursor_ = 0;
  readmmapCursor_ = 0;

  //Initialize other members of the fileHandle structure.
  fileHandle_[0].IOBuffer = NULL;
  fileHandle_[0].bufferLen = 0;
  fileHandle_[0].blockNum = -1;
  fileHandle_[0].IOPending = FALSE;
  fileHandle_[0].scratchFileConn = NULL;
  fileHandle_[0].associatedAsyncIOBuffer = NULL;
  fileHandle_[0].previousError = SCRATCH_SUCCESS;

#ifdef _DEBUG
    // Regression testing support for simulating IO Pending state.
  	envIOPending_ = getenv("SCRATCH_IO_PENDING");
  	if(envIOPending_)
  		envIOBlockCount_ = (Int32) str_atoi(envIOPending_, str_len(envIOPending_));
  	else
  		envIOBlockCount_ = -1;
#endif
}
Beispiel #26
0
string read_roster_players(string roster_filename, RosterPlayerArray& players_arr)
{
    ifstream rosterfile(roster_filename.c_str());

    if (!rosterfile)
        return format_str("Failed to open roster %s", roster_filename.c_str());

    string line;

    // two dummy reads, to read in the header
    //
    getline(rosterfile, line);
    getline(rosterfile, line);

    // read all players from the roster
    //
    for (int line_num = 3;; ++line_num)
    {
        if (!getline(rosterfile, line))
            break;

        vector<string> columns = tokenize(line);

        // Empty lines are skipped
        //
        if (columns.size() == 0)
            continue;

        // If a non-empty line contains an incorrect amount of columns, it's
        // an error
        //
        if (columns.size() != NUM_COLUMNS_IN_ROSTER)
            return format_str(	"In roster %s, line %d: has %d columns (must be %d)",
								roster_filename.c_str(), line_num, columns.size(), NUM_COLUMNS_IN_ROSTER);
		
		RosterPlayer player;

        // Populate the player's data
        // Not much error checking done, since rosters are all machine-generated, 
        // so str_atoi is used (0 is good enough for wrong numeric columns)
        //
		player.name 		= columns[0];
        player.age 			= str_atoi(columns[1]);
		player.nationality 	= columns[2];
		player.pref_side 	= columns[3];
        player.st 			= str_atoi(columns[4]);
        player.tk 			= str_atoi(columns[5]);
        player.ps 			= str_atoi(columns[6]);
        player.sh 			= str_atoi(columns[7]);
        player.stamina 		= str_atoi(columns[8]);
        player.ag 			= str_atoi(columns[9]);
        player.st_ab 		= str_atoi(columns[10]);
        player.tk_ab 		= str_atoi(columns[11]);
        player.ps_ab 		= str_atoi(columns[12]);
        player.sh_ab 		= str_atoi(columns[13]);
        player.games		= str_atoi(columns[14]);
        player.saves 		= str_atoi(columns[15]);
        player.tackles 		= str_atoi(columns[16]);
        player.keypasses 	= str_atoi(columns[17]);
        player.shots 		= str_atoi(columns[18]);
        player.goals 		= str_atoi(columns[19]);
        player.assists 		= str_atoi(columns[20]);
        player.dp 			= str_atoi(columns[21]);
        player.injury 		= str_atoi(columns[22]);
        player.suspension 	= str_atoi(columns[23]);
        player.fitness 		= str_atoi(columns[24]);
		
		players_arr.push_back(player);
    }

    return "";
}
Beispiel #27
0
static void
handle_eprt(struct vsf_session* p_sess)
{
  static struct mystr s_part1_str;
  static struct mystr s_part2_str;
  int proto;
  int port;
  const unsigned char* p_raw_addr;
  int is_ipv6 = vsf_sysutil_sockaddr_is_ipv6(p_sess->p_local_addr);
  port_cleanup(p_sess);
  pasv_cleanup(p_sess);
  str_copy(&s_part1_str, &p_sess->ftp_arg_str);
  str_split_char(&s_part1_str, &s_part2_str, '|');
  if (!str_isempty(&s_part1_str))
  {
    goto bad_eprt;
  }
  /* Split out the protocol and check it */
  str_split_char(&s_part2_str, &s_part1_str, '|');
  proto = str_atoi(&s_part2_str);
  if (!is_ipv6 || proto != 2)
  {
    vsf_cmdio_write(p_sess, FTP_BADCMD, "Bad EPRT protocol.");
    return;
  }
  /* Split out address and parse it */
  str_split_char(&s_part1_str, &s_part2_str, '|');
  p_raw_addr = vsf_sysutil_parse_ipv6(&s_part1_str);
  if (!p_raw_addr)
  {
    goto bad_eprt;
  }
  /* Split out port and parse it */
  str_split_char(&s_part2_str, &s_part1_str, '|');
  if (!str_isempty(&s_part1_str) || str_isempty(&s_part2_str))
  {
    goto bad_eprt;
  }
  port = str_atoi(&s_part2_str);
  if (port < 0 || port > 65535)
  {
    goto bad_eprt;
  }
  vsf_sysutil_sockaddr_alloc_ipv6(&p_sess->p_port_sockaddr);
  vsf_sysutil_sockaddr_set_ipv6addr(p_sess->p_port_sockaddr, p_raw_addr);
  vsf_sysutil_sockaddr_set_port(p_sess->p_port_sockaddr, (unsigned short)port);
  /* SECURITY:
   * 1) Reject requests not connecting to the control socket IP
   * 2) Reject connects to privileged ports
   */
  if (!tunable_port_promiscuous)
  {
    if (!vsf_sysutil_sockaddr_addr_equal(p_sess->p_remote_addr,
                                         p_sess->p_port_sockaddr) ||
        vsf_sysutil_is_port_reserved(port))
    {
      vsf_cmdio_write(p_sess, FTP_BADCMD, "Illegal EPRT command.");
      port_cleanup(p_sess);
      return;
    }
  }
  vsf_cmdio_write(p_sess, FTP_EPRTOK,
                  "EPRT command successful. Consider using EPSV.");
  return;
bad_eprt:
  vsf_cmdio_write(p_sess, FTP_BADCMD, "Bad EPRT command.");
}
Lng32 ComSqlId::getSqlIdAttr
(Lng32 attr,          // which attr (SqlQueryIDAttr)
 char * queryId,     // query ID
 Lng32 queryIdLen,    // query ID len
 Int64 &value,       // If returned attr is numeric, 
                     //    this field contains the returned value.
                     // If attr is of string type, this value is:
                     //   on input,the max length of the buffer pointed to by stringValue
                     //   on output, the actual length of the string attribute
 char * stringValue) // null terminated string returned here
{
  Lng32 retcode = 0;
  
  Int64 version = str_atoi(&queryId[VERSION_OFFSET], VERSION_LEN);

  switch (attr)
    {
    case SQLQUERYID_VERSION:
      value = version;
      if (value < 0)
         return -CLI_INVALID_ATTR_VALUE;
      break;
    case SQLQUERYID_SEGMENTNUM:
      {
        // on SQ, the SEGMENT_NUM and CPUNUM is the same field - 3 digits
        if (version == NEO_SQL_ID_VERSION)
	  value = str_atoi(&queryId[SEGMENT_OFFSET], NEO_SEGMENT_LEN);
        else
	  value = str_atoi(&queryId[SEGMENT_OFFSET], SEGMENT_LEN);
	if (value < 0)
	  return -CLI_INVALID_ATTR_VALUE;
      }
    break;
    
    case SQLQUERYID_SEGMENTNAME:
      {
	// not implemented yet
        if(stringValue && value)
          stringValue[0] = 0;
      }
    break;

    case SQLQUERYID_CPUNUM:
      {
        // on SQ, the SEGMENT_NUM and CPUNUM is the same field - 3 digits
        if (version == NEO_SQL_ID_VERSION)
	  value = str_atoi(&queryId[NEO_CPU_OFFSET], NEO_CPU_LEN);
        else
	  value = str_atoi(&queryId[CPU_OFFSET], CPU_LEN);
	if (value < 0)
	  return -CLI_INVALID_ATTR_VALUE;
      }
    break;

    case SQLQUERYID_PIN:
      {
        if (version == NEO_SQL_ID_VERSION)
	   value = str_atoi(&queryId[NEO_PIN_OFFSET], NEO_PIN_LEN);
        else
	   value = str_atoi(&queryId[PIN_OFFSET], PIN_LEN);
	if (value < 0)
	  return -CLI_INVALID_ATTR_VALUE;
      }
    break;

    case SQLQUERYID_EXESTARTTIME:
      {
	value = str_atoi(&queryId[STARTTS_OFFSET], STARTTS_LEN);
	if (value < 0)
	  return -CLI_INVALID_ATTR_VALUE;
      }
    break;

    case SQLQUERYID_SESSIONNUM:
      {
	value = str_atoi(&queryId[SESSIONNUM_OFFSET], SESSIONNUM_LEN);
	if (value < 0)
	  return -CLI_INVALID_ATTR_VALUE;
      }
    break;

    case SQLQUERYID_USERNAME:
      {
	Lng32 userNameLen = 
	  (Lng32)str_atoi(&queryId[USERNAMELEN_OFFSET], USERNAMELEN_LEN);
	if (userNameLen < 0)
	  return -CLI_INVALID_ATTR_VALUE;
	if (stringValue && value > userNameLen)
	  {
            strncpy(stringValue, &queryId[USERNAME_OFFSET], userNameLen);
            stringValue[userNameLen] = 0;
	  }
        else
            retcode = -CLI_INVALID_ATTR_VALUE ;

        value = userNameLen;
      }
    break;

    case SQLQUERYID_SESSIONNAME:
      {
	Lng32 userNameLen = 
	  (Lng32)str_atoi(&queryId[USERNAMELEN_OFFSET], USERNAMELEN_LEN);
	if (userNameLen < 0)
	  return -CLI_INVALID_ATTR_VALUE;

	Lng32 sessionNameLenOffset =
	  USERNAMELEN_OFFSET + USERNAMELEN_LEN + userNameLen;
	Lng32 sessionNameLen = 
	  (Lng32)str_atoi(&queryId[sessionNameLenOffset], SESSIONNAMELEN_LEN);
	if (sessionNameLen < 0)
	  return -CLI_INVALID_ATTR_VALUE;
	if (stringValue && value > sessionNameLen )
	  {
	    strncpy(stringValue, 
		    &queryId[sessionNameLenOffset+SESSIONNAMELEN_LEN], 
		    sessionNameLen);

	    stringValue[sessionNameLen] = 0;
          }
        else
            retcode = -CLI_INVALID_ATTR_VALUE;
       
        value = sessionNameLen;
      }
    break;

    case SQLQUERYID_SESSIONID:
      {
        // session Id = qid from start thru SessionName
        
        // set current offset to userNameLen
        Int32 currOffset = USERNAMELEN_OFFSET;
        
        // get userNameLen
        Int32 nameLen = (Int32)str_atoi(&queryId[currOffset], USERNAMELEN_LEN);
        
        // go past Username
        currOffset += USERNAMELEN_LEN + nameLen;
        
        // get sessionName length
        nameLen = (Int32)str_atoi(&queryId[currOffset], SESSIONNAMELEN_LEN);
	if (nameLen < 0)
	  return -CLI_INVALID_ATTR_VALUE;
        
        // go past sessionName
        currOffset += SESSIONNAMELEN_LEN + nameLen; 
	
        // check value for length
        if(stringValue && value > currOffset)
        { 
          // copy sessionId to stringValue
          strncpy(stringValue, queryId, currOffset);
          stringValue[currOffset]=0;
        }
        else
            retcode = -CLI_INVALID_ATTR_VALUE;
         
        value = currOffset;
     }
    break;

    case SQLQUERYID_QUERYNUM:
      {
	Lng32 currOffset = USERNAMELEN_OFFSET;
	Lng32 nameLen = 
	  (Lng32)str_atoi(&queryId[currOffset], USERNAMELEN_LEN);
	if (nameLen < 0)
	  return -CLI_INVALID_ATTR_VALUE;

	// skip user name
	currOffset += USERNAMELEN_LEN + nameLen;

	// skip session name
	nameLen = 
	  (Lng32)str_atoi(&queryId[currOffset], SESSIONNAMELEN_LEN);
	if (nameLen < 0)
	  return -CLI_INVALID_ATTR_VALUE;
	currOffset += SESSIONNAMELEN_LEN + nameLen;

	if (currOffset >= queryIdLen)
	  return -CLI_INVALID_ATTR_VALUE;
	
	if (queryId[currOffset] != '_')
	  return -CLI_INVALID_ATTR_VALUE;

	// skip "_" separator
	currOffset += 1;

	// find the next occurance of "_"
	char * us = str_chr(&queryId[currOffset], '_');
	if (us == NULL)
	  return -CLI_INVALID_ATTR_VALUE;

	if ((currOffset + (us - (char *)(&queryId[currOffset]))) >= queryIdLen)
	  return -CLI_INVALID_ATTR_VALUE;

	value = str_atoi(&queryId[currOffset], 
			 us - (char *)(&queryId[currOffset]));
	if (value < 0)
	  return -CLI_INVALID_ATTR_VALUE;
      }
    break;

    case SQLQUERYID_STMTNAME:
      {
	Lng32 currOffset = USERNAMELEN_OFFSET;
	Lng32 nameLen = 
	  (Lng32)str_atoi(&queryId[currOffset], USERNAMELEN_LEN);
	if (nameLen < 0)
	  return -CLI_INVALID_ATTR_VALUE;

	// skip user name
	currOffset += USERNAMELEN_LEN + nameLen;

	// skip session name
	nameLen = 
	  (Lng32)str_atoi(&queryId[currOffset], SESSIONNAMELEN_LEN);
	if (nameLen < 0)
	  return -CLI_INVALID_ATTR_VALUE;
	currOffset += SESSIONNAMELEN_LEN + nameLen;
	
	if (currOffset >= queryIdLen)
	  return -CLI_INVALID_ATTR_VALUE;
	  
	if (queryId[currOffset] != '_')
	  return -CLI_INVALID_ATTR_VALUE;
	  
	// skip "_" separator
	currOffset += 1;

	// find the next occurance of "_"
	char * us = str_chr(&queryId[currOffset], '_');
	if (us == NULL)
	  return -CLI_INVALID_ATTR_VALUE;

	// skip queryNum
	currOffset += us - (char *)(&queryId[currOffset]);

	if (currOffset >= queryIdLen)
	  return -CLI_INVALID_ATTR_VALUE;

	// skip "_" separator
	currOffset += 1;
        
        //get statementName length as remaining string except trailing blanks
        while (queryIdLen && queryId[queryIdLen-1] == ' ')
          queryIdLen--;

        Int32 qidStatementNameLen = queryIdLen - currOffset;
        
        // check for enough space in StringValue
        if(stringValue && value > qidStatementNameLen )
        {        
	  // copy and null terminate 
          strncpy(stringValue, &queryId[currOffset], qidStatementNameLen);
          stringValue[qidStatementNameLen] = 0;
        }
        else
	  retcode = -CLI_INVALID_ATTR_VALUE;
        
        value = qidStatementNameLen;

      }
    break;

    default:
      {
        retcode = -CLI_INVALID_ATTR_NAME;
      } 

    }

  return retcode;
}
void EspNewIncomingConnectionStream::actOnReceive(IpcConnection *connection)
{
  // check for OS errors
  if (getState() == ERROR_STATE)
  {
    ex_assert(FALSE,"Error while receiving first message from client");
  }

  // check for protocol errors
  bool willPassTheAssertion = 
             (getType() == IPC_MSG_SQLESP_DATA_REQUEST OR
              getType() == IPC_MSG_SQLESP_CANCEL_REQUEST) AND
              getVersion() == CurrEspRequestMessageVersion AND
              moreObjects();
  if (!willPassTheAssertion)
  {
    char *doCatchBugCRx = getenv("ESP_BUGCATCHER_CR_NONUMBER");
    if (!doCatchBugCRx ||
        *doCatchBugCRx != '0')
    {
      connection->dumpAndStopOtherEnd(true, false);
      environment_->getControlConnection()->
        castToGuaReceiveControlConnection()->
        getConnection()->dumpAndStopOtherEnd(true, false);
    }
  }

  ex_assert((getType() == IPC_MSG_SQLESP_DATA_REQUEST OR
             getType() == IPC_MSG_SQLESP_CANCEL_REQUEST) AND
	    getVersion() == CurrEspRequestMessageVersion AND
	    moreObjects(),
	    "Invalid first message from client");

  // take a look at the type of the first object in the message
  IpcMessageObjType nextObjType = getNextObjType();
  switch (nextObjType)
  {
    case ESP_OPEN_HDR:
    case ESP_LATE_CANCEL_HDR:
      {
        ExFragKey key;
        Lng32 remoteInstNum;
        NABoolean isParallelExtract = false; 

        // peek at the message header to see for whom it is
        if (nextObjType == ESP_OPEN_HDR)
        {
          ExEspOpenReqHeader reqHdr((NAMemory *) NULL);
	   
	  *this >> reqHdr;
	  key = reqHdr.key_;
	  remoteInstNum = reqHdr.myInstanceNum_;
	  if (reqHdr.getOpenType() == ExEspOpenReqHeader::PARALLEL_EXTRACT) 
          {
            isParallelExtract = true;
	  }
	}
        else
	{
          // note that the late cancel request may or may not
	  // arrive as the first request (only in the former case
	  // will we reach here)
	  ExEspLateCancelReqHeader reqHdr((NAMemory *) NULL);
	   
	  *this >> reqHdr;
	  key = reqHdr.key_;
	  remoteInstNum = reqHdr.myInstanceNum_;
	}

        if (!isParallelExtract) 
        {
          ExFragInstanceHandle handle =
	    espFragInstanceDir_->findHandle(key);

	  if (handle != NullFragInstanceHandle)
	  {
            // the send bottom node # myInstanceNum of this downloaded fragment
            // is the true recipient of this open request
            ex_split_bottom_tcb * receivingTcb =
              espFragInstanceDir_->getTopTcb(handle);
            ex_send_bottom_tcb *receivingSendTcb =
              receivingTcb->getSendNode(remoteInstNum);

            // Check the connection for a co-located client, and if so,
            // tell the split bottom, because it may prefer this send 
            // bottom when using skew buster uniform distribution.
            if (espFragInstanceDir_->
                  getEnvironment()->
                  getMyOwnProcessId(IPC_DOM_GUA_PHANDLE).match(
                    connection->getOtherEnd().getNodeName(),
                    connection->getOtherEnd().getCpuNum()))
              receivingTcb->setLocalSendBottom(remoteInstNum);

            // Portability note for the code above: we pass IPC_DOM_GUA_PHANDLE
            // for IpcEnvironment::getMyOwnProcessId, even though that method
            // can be called with the default param (IpcNetworkDomain 
            // IPC_DOM_INVALID).  In fact it would  probably be better 
            // to call the object without specifying the IpcNetworkDomain so
            // that it can decide for itself what domain it is using.
            // But there is a problem with the Windows implementation
            // of IpcEnvironment::getMyOwnProcessId, it seems to assume
            // that its domain is IPC_DOM_INTERNET and so this will 
            // cause the botch of an assertion that its control connection 
            // (which is type EspGuaControlConnection) can be cast to a 
            // SockControlConnection.  When this problem is fixed, the 
            // IPC_DOM_GUA_PHANDLE param above can be removed.  Also,
            // when this code is ported to run it a domain other than
            // "guardian", it will be necessary to fix this and to
            // fix IpcEnvironment::getMyOwnProcessId to work properly on
            // windows.

            receivingSendTcb->setClient(connection);
            receivingSendTcb->routeMsg(*this);
          }
	  else
	  {
            connection->dumpAndStopOtherEnd(true, false);
	    ex_assert(FALSE,"entry not found, set diagnostics area and reply");
	  }

        } // normal case, not parallel extract

        else 
        {
          // The OPEN request is from a parallel extract consumer. The
          // incoming request contains a user ID which we will compare
          // against the current user ID for this ESP.

          // NOTE: The user ID for the extract security check is
          // currently sent and compared as a C string. On Linux it is
          // possible to send and compare integers which would lead to
          // simpler code. The code to send/compare strings is still
          // used because it works on all platforms.

          char errorStr[150];

	  // check if next msg is of securityInfo type. 
          ex_assert(moreObjects(), "expected object not received");
          ex_assert(getNextObjType() == ESP_SECURITY_INFO,
	            "received message for unknown message type");
          
	  // unpack security info
	  ExMsgSecurityInfo secInfo(environment_->getHeap());
	  *this >> secInfo;

          // Get the auth ID of this ESP in text form and compare it
          // to the auth ID that arrived in the message. Skip this
          // step in the debug build if an environment variable is
          // set.
          NABoolean doAuthIdCheck = TRUE;
          Int32 status = 0;
#ifdef _DEBUG
          const char *envvar = getenv("NO_EXTRACT_AUTHID_CHECK");
          if (envvar && envvar[0])
            doAuthIdCheck = FALSE;
#endif
          if (doAuthIdCheck)
          {
            // Get user ID from ExMsgSecurityInfo -> (secUserID)
            // the user ID is the integer value made into a string
            // Convert it back into its integer value
            short userIDLen = (short) str_len(secInfo.getAuthID());
            Int32 secUserID = str_atoi(secInfo.getAuthID(), userIDLen);

            // Get the current user ID
            Int32 curUserID = ComUser::getSessionUser(); 

            // Report an error if the user ID is not valid
            if (curUserID == NA_UserIdDefault || secUserID == NA_UserIdDefault)
            {
              str_cpy_c(errorStr,
                        "Producer ESP could not authenticate the consumer, "
                        "no valid current user.");
              status = -1;
            }

            // Make sure user id passed in ExMsgSecurityInfo matches
            // the user id associated with the current session

#if defined(_DEBUG)
            NABoolean doDebug = (getenv("DBUSER_DEBUG") ? TRUE : FALSE);
            if (doDebug)
              printf("[DBUSER:%d] ESP extract user ID: "
                     "local [%d], msg [%d]\n",
                     (int) getpid(), curUserID, secUserID);
#endif

              // Compare user ID, Report an error, if comparison fails
              if (curUserID != secUserID)
              {
                str_cpy_c(errorStr,
                          "Producer ESP could not authenticate the consumer, "
                          "user named passed in ExMsgSecurityInfo is not the "
                          "current user");
                status = -1;
              }

          } // if (doAuthIdCheck)
		   
          // get the split bottom TCB that matches the securityKey
          ex_split_bottom_tcb *receivingTcb = NULL;
          if (status == 0) 
          {
            receivingTcb = espFragInstanceDir_->getExtractTop(secInfo.getSecurityKey());
            if (receivingTcb == NULL) 
            {
              str_cpy_c(errorStr, "Producer ESP could not locate extract node");
              status = -1;
            }
          }

	  // get the sendBottom TCB if not already connected to a client
	  ex_send_bottom_tcb *receivingSendTcb = NULL;
	  if (status == 0)
	  {
	    receivingSendTcb = receivingTcb->getConsumerSendBottom();
	    if (receivingSendTcb == NULL) 
	    {
	      str_cpy_c(errorStr, "Producer ESP already connected to a client");
	      status = -1;
	    }
	  }

          // send the error message to the consumer 
	  if (status != 0) 
	  {
            clearAllObjects();
            setType(IPC_MSG_SQLESP_DATA_REPLY);

            NAMemory *heap = environment_->getHeap();

	    IpcMessageObj* baseObj =
	      new(heap)IpcMessageObj(IPC_SQL_DIAG_AREA, CurrEspReplyMessageVersion);
	    *this << *baseObj;

	    // prepare proper error message
	    char phandle[100];
	    MyGuaProcessHandle myHandle;
            myHandle.toAscii(phandle, 100);

	    ComDiagsArea *diags = ComDiagsArea::allocate(heap);
            *diags << DgSqlCode(-EXE_PARALLEL_EXTRACT_OPEN_ERROR)
                   << DgString0(phandle)
                   << DgString1(errorStr);
	    *this  << *diags;

	    diags->decrRefCount();

            send(TRUE /* TRUE indicates waited */);
          }

          // if everything okay, then make the connection
	  if (status == 0) 
          {
            receivingSendTcb->setClient(connection);
            receivingSendTcb->routeMsg(*this);
          }
        } // parallel extract case
      } // open or cancel header
void runServer(Int32 argc, char **argv)
{
  Int32 shmid;
  jmp_buf sscpJmpBuf;
  StatsGlobals *statsGlobals = NULL;
  void *statsGlobalsAddr;
  NABoolean createStatsGlobals = FALSE;
  CliGlobals *cliGlobals = CliGlobals::createCliGlobals(FALSE);
  char tmbuf[64];
  time_t now;
  struct tm *nowtm;

  long maxSegSize = STATS_MAX_SEG_SIZE;
  char *envSegSize = getenv("MX_RTS_STATS_SEG_SIZE");
  if (envSegSize)
  {
    maxSegSize = (long) str_atoi(envSegSize, str_len(envSegSize));
    if (maxSegSize < 32)
      maxSegSize = 32;
    else if (maxSegSize > 256)
      maxSegSize = 256;
    maxSegSize *= 1024 * 1024;
  }
  long enableHugePages = 0;
  int shmFlag = RMS_SHMFLAGS;
  char *envShmHugePages = getenv("SQ_RMS_ENABLE_HUGEPAGES");
  if (envShmHugePages != NULL)
  {
     enableHugePages = (long) str_atoi(envShmHugePages,
                         str_len(envShmHugePages));
     if (enableHugePages > 0)
       shmFlag =  shmFlag | SHM_HUGETLB;
  }

  now = time(NULL);
  nowtm = localtime(&now);
  strftime(tmbuf, sizeof tmbuf, "%Y-%m-%d %H:%M:%S ", nowtm);

  if ((shmid = shmget((key_t)getStatsSegmentId(),
                         0,  // size doesn't matter unless we are creating.
                         shmFlag)) == -1)
  {
    if (errno == ENOENT)
    {
      // Normal case, segment does not exist yet. Try to create.
      bool didCreate = true;
      if ((shmid = shmget((key_t)getStatsSegmentId(),
                                maxSegSize,
                                shmFlag | IPC_CREAT)) == -1)
      {
        if (enableHugePages > 0)
        {
          enableHugePages = 0;
          // try again withouf hugepages
          shmFlag =  shmFlag & ~SHM_HUGETLB;
          if ((shmid = shmget((key_t)getStatsSegmentId(),
                                    maxSegSize,
                                    shmFlag | IPC_CREAT)) == -1)
            didCreate = false;
        }
        else 
          didCreate = false;
      }

      if (didCreate)
      {
        cout << tmbuf 
             << " RMS Shared segment id = " 
             << shmid << ", key = " 
             << (key_t)getStatsSegmentId() ;
        if (enableHugePages > 0)
          cout << ", created with huge pages support." << endl;
        else
          cout << ", created without huge pages support." << endl;

        createStatsGlobals = TRUE;
      }
      else
      {
        cout << tmbuf
             << " Shmget failed, key = "
             << getStatsSegmentId()
             <<", Error code: "
             << errno
             << " ("
             << strerror(errno)
             << ")" << endl;
        exit(errno);
      }
    } // if ENOENT (i.e., attempting creation.)
  }
  else
  {
     cout << tmbuf << " RMS Shared segment exists, attaching to it, shmid="<< shmid << ", key=" << (key_t)getStatsSegmentId() << "\n";
  }
  if ((statsGlobalsAddr = shmat(shmid, getRmsSharedMemoryAddr(), 0))
		== (void *)-1)
  {
    cout << tmbuf << "Shmat failed, shmid=" <<shmid << ", key=" << (key_t) getStatsSegmentId() << ", Error code : "  << errno << "(" << strerror(errno) << ")\n";
    exit(errno);
  }
  char *statsGlobalsStartAddr = (char *)statsGlobalsAddr;
  if (createStatsGlobals)
  {
     short envType = StatsGlobals::RTS_GLOBAL_ENV;
     statsGlobals = new (statsGlobalsStartAddr)
             StatsGlobals((void *)statsGlobalsAddr, envType, maxSegSize);
     cliGlobals->setSharedMemId(shmid);
     // We really should not squirrel the statsGlobals pointer away like
     // this until the StatsGloblas is initialized, but
     // statsGlobals->init() needs it ......
     cliGlobals->setStatsGlobals(statsGlobals);
     statsGlobals->init();
  }
  else
  {
    statsGlobals = (StatsGlobals *)statsGlobalsAddr;
    cliGlobals->setSharedMemId(shmid);
    cliGlobals->setStatsGlobals(statsGlobals);
  }
  XPROCESSHANDLE_GETMINE_(statsGlobals->getSscpProcHandle());
  NAHeap *sscpHeap = cliGlobals->getExecutorMemory();
  cliGlobals->setJmpBufPtr(&sscpJmpBuf);
  if (setjmp(sscpJmpBuf))
    NAExit(1); // Abend
  IpcEnvironment  *sscpIpcEnv = new (sscpHeap) IpcEnvironment(sscpHeap, cliGlobals->getEventConsumed(),
      FALSE, IPC_SQLSSCP_SERVER, FALSE, TRUE);

  SscpGlobals *sscpGlobals = NULL;

  sscpGlobals = new (sscpHeap) SscpGlobals(sscpHeap, statsGlobals);

  // Currently open $RECEIVE with 256
  SscpGuaReceiveControlConnection *cc =
	 new(sscpHeap) SscpGuaReceiveControlConnection(sscpIpcEnv,
					  sscpGlobals,
                                           256);
  sscpIpcEnv->setControlConnection(cc);
  while (TRUE)
  {
     while (cc->getConnection() == NULL)
      cc->wait(IpcInfiniteTimeout);

#ifdef _DEBUG_RTS
    cerr << "No. of Requesters-1 "  << cc->getNumRequestors() << " \n";
#endif
    while (cc->getNumRequestors() > 0)
    {
      sscpIpcEnv->getAllConnections()->waitOnAll(IpcInfiniteTimeout);
    } // Inner while
  }
}  // runServer