Пример #1
0
/* initialise the library and sets up the terminal */
int jx_initialise()
{
	if (!(tty = open("/dev/tty", O_RDWR)))
		return JX_ERR_OPEN_TTY;

	if (init_term()) {
		close(tty);
		return JX_ERR_UNSUPPORTED_TERMINAL;
	}

	if (pipe(winch_fds)) {
		close(tty);
		return JX_ERR_PIPE_TRAP_ERROR;
	}

	struct sigaction sa;
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = 0;
	sa.sa_handler = sigwinch_handler;
	sigaction(SIGWINCH, &sa, 0);

	if (tcgetattr(tty, &old_t))
		return JX_ERR_TERMIOS;

	struct termios t = old_t;
	cfmakeraw(&t);
	t.c_cc[VMIN] = 0;
	t.c_cc[VTIME] = 0;
	if (tcsetattr(tty, TCSAFLUSH, &t))
		return JX_ERR_TERMIOS;

	OUT_index = 0; IN_index = 0;

	BUF_PUTE(OUT, TS_CLEAR_SCREEN);
	BUF_PUTE(OUT, TS_ENTER_CA_MODE);
	BUF_PUTE(OUT, TS_KEYPAD_XMIT);
	BUF_PUTE(OUT, TS_CURSOR_INVISIBLE);
	BUF_DEBUG(OUT);
	BUF_FLUSH(OUT);

	/* TODO: check if this is needed */
	int ret;
	sigwinch_handler(0);
	read(winch_fds[0], &ret, sizeof(int));
	read(winch_fds[0], &t_columns, sizeof(unsigned short));
	read(winch_fds[0], &t_lines, sizeof(unsigned short));

	if (ret == -1)
		return JX_ERR_IOCTL;

	/* create first window for the screen */
	window_head = window_tail = calloc(sizeof(jx_window), 1);
	window_head->w = t_columns;
	window_head->h = t_lines;
	window_head->flags = JX_WF_AUTOSIZE | JX_WF_AUTOSIZE;

	initialised = true;

	return JX_SUCCESS;
}
Пример #2
0
void set_signals( void )
  {
#ifdef SIGWINCH
  sigwinch_handler( SIGWINCH );
  if( isatty( 0 ) ) set_signal( SIGWINCH, sigwinch_handler );
#endif
  set_signal( SIGHUP, sighup_handler );
  set_signal( SIGQUIT, SIG_IGN );
  set_signal( SIGINT, sigint_handler );
  }
Пример #3
0
void	signal_handler(int signum)
{
	t_data *data;

	data = NULL;
	data = stock_data(data, 0);
	if(signum == SIGINT)
		sigint_handler(data);
	if(signum == SIGTSTP)
		sigtstp_handler(data);
	if(signum == SIGWINCH)
		sigwinch_handler(data);
	if(signum == SIGCONT)
		sigcont_handler(data);
}
Пример #4
0
int main(int argc, char *argv[])
{
  char *ctrlchnlname = NULL;
  vnode_client_cmdiotype_t iotype = VCMD_IO_FD;
  ev_timer cmdreq;
#ifdef FORWARD_SIGNALS
  int i;
  struct sigaction sig_action = {
    .sa_handler = sighandler,
  };
#endif	/* FORWARD_SIGNALS */

  if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO) &&
      isatty(STDERR_FILENO) && getpgrp() == tcgetpgrp(STDOUT_FILENO))
    iotype = VCMD_IO_PTY;

  /* Parse command line argument list */
  for (;;)
  {
    int opt;

    if ((opt = getopt(argc, argv, "c:hiIqv")) == -1)
      break;

    switch (opt)
    {
    case 'c':
      ctrlchnlname = optarg;
      break;

    case 'i':
      iotype = VCMD_IO_PTY;
      break;

    case 'I':
      iotype = VCMD_IO_FD;
      break;

    case 'q':
      iotype = VCMD_IO_NONE;
      break;

    case 'v':
      verbose++;
      break;

    case 'h':
      /* pass through */
    default:
      usage(0, NULL);
    }
  }

  argc -= optind;
  argv += optind;

  if (ctrlchnlname == NULL)
    usage(1, "no control channel name given");

  if (!argc)
    usage(1, "no command given");

  if (argc >= VNODE_ARGMAX)
    usage(1, "too many command arguments");

  if (atexit(cleanup))
    ERR(1, "atexit() failed");

#ifdef FORWARD_SIGNALS
  for (i = 1; i < _NSIG; i++)
  if (sigaction(i, &sig_action, NULL))
    if (verbose && i != SIGKILL && i != SIGSTOP)
      WARN("sigaction() failed for %d", i);
#endif	/* FORWARD_SIGNALS */

  vcmd.cmdio = vnode_open_clientcmdio(iotype);
  if (!vcmd.cmdio)
    ERR(1, "vnode_open_clientcmdio() failed");

  vcmd.argc = argc;
  vcmd.argv = argv;
  vcmd.cmdstatus = 255;

  switch (vcmd.cmdio->iotype)
  {
  case VCMD_IO_NONE:
    break;

  case VCMD_IO_FD:
    SET_STDIOFD(vcmd.cmdio, STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO);
    break;

  case VCMD_IO_PTY:
    {
      struct sigaction sigwinch_action = {
	.sa_handler = sigwinch_handler,
      };

      if (sigaction(SIGWINCH, &sigwinch_action, NULL))
	WARN("sigaction() failed for SIGWINCH");

      sigwinch_handler(SIGWINCH);

      if (termioraw(STDOUT_FILENO, &saveattr))
	WARNX("termioraw() failed");
      else
	saveattr_set = 1;
    }
    break;

  default:
    ERR(1, "unsupported i/o type: %u", vcmd.cmdio->iotype);
    break;
  }

  vcmd.client = vnode_client(ev_default_loop(0), ctrlchnlname,
			     vcmd_ioerrorcb, &vcmd);
  if (!vcmd.client)
    ERR(1, "vnode_client() failed");

  cmdreq.data = &vcmd;
  ev_timer_init(&cmdreq, vcmd_cmdreqcb, 0, 0);
  ev_timer_start(vcmd.client->loop, &cmdreq);

  ev_loop(vcmd.client->loop, 0);

  vnode_delclient(vcmd.client);

  exit(vcmd.cmdstatus);
}