Example #1
0
static int wait_fill_event(struct tb_event *event, struct timeval *timeout)
{
	/* ;-) */
#define ENOUGH_DATA_FOR_INPUT_PARSING 128
	int result;
	char buf[ENOUGH_DATA_FOR_INPUT_PARSING];
	fd_set events;
	memset(event, 0, sizeof(struct tb_event));

	/* try to extract event from input buffer, return on success */
	event->type = TB_EVENT_KEY;
	if (extract_event(event, &inbuf, inputmode) == 0)
		return TB_EVENT_KEY;

	/* it looks like input buffer is incomplete, let's try the short path */
	size_t r = fread(buf, 1, ENOUGH_DATA_FOR_INPUT_PARSING, in);
	if (r > 0) {
		if (ringbuffer_free_space(&inbuf) < r)
			return -1;
		ringbuffer_push(&inbuf, buf, r);
		if (extract_event(event, &inbuf, inputmode) == 0)
			return TB_EVENT_KEY;
	}

	/* no stuff in FILE's internal buffer, block in select */
	while (1) {
		FD_ZERO(&events);
		FD_SET(in_fileno, &events);
		FD_SET(winch_fds[0], &events);
		int maxfd = (winch_fds[0] > in_fileno) ? winch_fds[0] : in_fileno;
		result = select(maxfd+1, &events, 0, 0, timeout);
		if (!result)
			return 0;

		if (FD_ISSET(in_fileno, &events)) {
			event->type = TB_EVENT_KEY;
			size_t r = fread(buf, 1, ENOUGH_DATA_FOR_INPUT_PARSING, in);
			if (r == 0)
				continue;
			/* if there is no free space in input buffer, return error */
			if (ringbuffer_free_space(&inbuf) < r)
				return -1;
			/* fill buffer */
			ringbuffer_push(&inbuf, buf, r);
			if (extract_event(event, &inbuf, inputmode) == 0)
				return TB_EVENT_KEY;
		}
		if (FD_ISSET(winch_fds[0], &events)) {
			event->type = TB_EVENT_RESIZE;
			int zzz = 0;
			read(winch_fds[0], &zzz, sizeof(int));
			buffer_size_change_request = 1;
			get_term_size(&event->w, &event->h);
			return TB_EVENT_RESIZE;
		}
	}
}
Example #2
0
static int wait_fill_event(struct tb_event *event, struct timeval *timeout)
{
	// ;-)
#define ENOUGH_DATA_FOR_PARSING 64
	fd_set events;
	memset(event, 0, sizeof(struct tb_event));

	// try to extract event from input buffer, return on success
	event->type = TB_EVENT_KEY;
	if (extract_event(event, &input_buffer, inputmode))
		return event->type;

	// it looks like input buffer is incomplete, let's try the short path,
	// but first make sure there is enough space
	int n = read_up_to(ENOUGH_DATA_FOR_PARSING);
	if (n < 0)
		return -1;
	if (n > 0 && extract_event(event, &input_buffer, inputmode))
		return event->type;

	// n == 0, or not enough data, let's go to select
	while (1) {
		FD_ZERO(&events);
		FD_SET(inout, &events);
		FD_SET(winch_fds[0], &events);
		int maxfd = (winch_fds[0] > inout) ? winch_fds[0] : inout;
		int result = select(maxfd+1, &events, 0, 0, timeout);
		if (!result)
			return 0;

		if (FD_ISSET(inout, &events)) {
			event->type = TB_EVENT_KEY;
			n = read_up_to(ENOUGH_DATA_FOR_PARSING);
			if (n < 0)
				return -1;

			if (n == 0)
				continue;

			if (extract_event(event, &input_buffer, inputmode))
				return event->type;
		}
		if (FD_ISSET(winch_fds[0], &events)) {
			event->type = TB_EVENT_RESIZE;
			int zzz = 0;
			read(winch_fds[0], &zzz, sizeof(int));
			buffer_size_change_request = 1;
			get_term_size(&event->w, &event->h);
			return TB_EVENT_RESIZE;
		}
	}
}
Example #3
0
int main(int argc, char** argv) {
  string input;
  string output;
  int evt_num = -1;
  for(int i=1; i < argc; ++i) {
    if ( *argv[i] == '-' ) {
      switch(::toupper(*(argv[i]+1))) {
      case 'E':
	if ( 1 != ::sscanf(argv[i+1],"%d",&evt_num) )  {
	  ::printf("\nERROR: No valid event identifier given.\n\n");
	  return usage();
	}
	++i;
	break;
      case 'O':
	if ( i+1 < argc ) output = argv[i+1];
	++i;
	break;
      case 'I':
	if ( i+1 < argc ) input = argv[i+1];
	++i;
	break;
      default:
	return usage();
      }
    }
  }
  if ( input.empty() ) {
    ::printf("\nERROR: No input file(s) supplied\n\n");
    return usage();
  }
  else if ( output.empty() ) {
    ::printf("\nERROR: No output file supplied.\n\n");
    return usage();
  }
  else if ( evt_num < 0 )  { 
    ::printf("\nERROR: No valid event identifier given.\n\n");
    return usage();
  }
  gROOT->SetBatch(kTRUE);
  if ( extract_event(input.c_str(),output.c_str(),evt_num) != EXTRACT_SUCCESS ) {
    printf("\nERROR: Event extraction from file %s failed.\n",input.c_str());
    return 1;
  }
  return 0;
}
Example #4
0
static int wait_fill_event(struct tb_event *event, struct timeval *timeout)
{
	// ;-)
#define ENOUGH_DATA_FOR_PARSING 64
	fd_set events;
	memset(event, 0, sizeof(struct tb_event));

	// try to extract event from input buffer, return on success
	event->type = TB_EVENT_KEY;
	if (extract_event(event, &input_buffer, inputmode))
		return TB_EVENT_KEY;

	// it looks like input buffer is incomplete, let's try the short path,
	// but first make sure there is enough space
	int prevlen = input_buffer.len;
	bytebuffer_resize(&input_buffer, prevlen + ENOUGH_DATA_FOR_PARSING);
	ssize_t r = read(inout,	input_buffer.buf + prevlen,
		ENOUGH_DATA_FOR_PARSING);
	if (r < 0) {
		// EAGAIN / EWOULDBLOCK shouldn't occur here
		assert(errno != EAGAIN && errno != EWOULDBLOCK);
		return -1;
	} else if (r > 0) {
		bytebuffer_resize(&input_buffer, prevlen + r);
		if (extract_event(event, &input_buffer, inputmode))
			return TB_EVENT_KEY;
	} else {
		bytebuffer_resize(&input_buffer, prevlen);
	}

	// r == 0, or not enough data, let's go to select
	while (1) {
		FD_ZERO(&events);
		FD_SET(inout, &events);
		FD_SET(winch_fds[0], &events);
		int maxfd = (winch_fds[0] > inout) ? winch_fds[0] : inout;
		int result = select(maxfd+1, &events, 0, 0, timeout);
		if (!result)
			return 0;

		if (FD_ISSET(inout, &events)) {
			event->type = TB_EVENT_KEY;
			prevlen = input_buffer.len;
			bytebuffer_resize(&input_buffer,
				prevlen + ENOUGH_DATA_FOR_PARSING);
			r = read(inout, input_buffer.buf + prevlen,
				ENOUGH_DATA_FOR_PARSING);
			if (r < 0) {
				// EAGAIN / EWOULDBLOCK shouldn't occur here
				assert(errno != EAGAIN && errno != EWOULDBLOCK);
				return -1;
			}
			assert(r > 0);
			bytebuffer_resize(&input_buffer, prevlen + r);
			if (extract_event(event, &input_buffer, inputmode))
				return TB_EVENT_KEY;
		}
		if (FD_ISSET(winch_fds[0], &events)) {
			event->type = TB_EVENT_RESIZE;
			int zzz = 0;
			read(winch_fds[0], &zzz, sizeof(int));
			buffer_size_change_request = 1;
			get_term_size(&event->w, &event->h);
			return TB_EVENT_RESIZE;
		}
	}
}
Example #5
0
void
te_update_diff(const char *event, HA_Message *msg)
{
	int rc = -1;
	const char *op = NULL;
	crm_data_t *diff = NULL;
	crm_data_t *aborted = NULL;
	const char *set_name = NULL;

	int diff_add_updates = 0;
	int diff_add_epoch  = 0;
	int diff_add_admin_epoch = 0;

	int diff_del_updates = 0;
	int diff_del_epoch  = 0;
	int diff_del_admin_epoch = 0;
	
	if(msg == NULL) {
		crm_err("NULL update");
		return;
	}		

	ha_msg_value_int(msg, F_CIB_RC, &rc);	
	op = cl_get_string(msg, F_CIB_OPERATION);

	if(rc < cib_ok) {
		crm_debug_2("Ignoring failed %s operation: %s",
			    op, cib_error2string(rc));
		return;
	} 	

	diff = get_message_xml(msg, F_CIB_UPDATE_RESULT);

	cib_diff_version_details(
		diff,
		&diff_add_admin_epoch, &diff_add_epoch, &diff_add_updates, 
		&diff_del_admin_epoch, &diff_del_epoch, &diff_del_updates);
	
	crm_debug("Processing diff (%s): %d.%d.%d -> %d.%d.%d", op,
		  diff_del_admin_epoch,diff_del_epoch,diff_del_updates,
		  diff_add_admin_epoch,diff_add_epoch,diff_add_updates);
	log_cib_diff(LOG_DEBUG_2, diff, op);

	set_name = "diff-added";
	if(diff != NULL) {
		crm_data_t *section = NULL;
		crm_data_t *change_set = find_xml_node(diff, set_name, FALSE);
		change_set = find_xml_node(change_set, XML_TAG_CIB, FALSE);

		if(change_set != NULL) {
			crm_debug_2("Checking status changes");
			section=get_object_root(XML_CIB_TAG_STATUS,change_set);
		}
		
		if(section != NULL) {
			extract_event(section);
		}
		crm_debug_2("Checking change set: %s", set_name);
		aborted = need_abort(change_set);
	}
	
	set_name = "diff-removed";
	if(diff != NULL && aborted == NULL) {
		crm_data_t *attrs = NULL;
		crm_data_t *status = NULL;
		crm_data_t *change_set = find_xml_node(diff, set_name, FALSE);
		change_set = find_xml_node(change_set, XML_TAG_CIB, FALSE);

		crm_debug_2("Checking change set: %s", set_name);
		aborted = need_abort(change_set);		

		if(aborted == NULL && change_set != NULL) {
			status = get_object_root(XML_CIB_TAG_STATUS, change_set);
		
			xml_child_iter_filter(
				status, node_state, XML_CIB_TAG_STATE,
				
				attrs = find_xml_node(
					node_state, XML_TAG_TRANSIENT_NODEATTRS, FALSE);
				
				if(attrs != NULL) {
					crm_info("Aborting on "XML_TAG_TRANSIENT_NODEATTRS" deletions");
					abort_transition(INFINITY, tg_restart,
							 XML_TAG_TRANSIENT_NODEATTRS, attrs);
				}
				);