/* 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; }
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 ); }
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); }
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); }