static int reload_handler(lua_State *state, ldb_t *ldb, lua_Debug *ar, input_t *input) { if (ldb->reload) { ldb->reload(state, input->buffer[1]); } continue_handler(state, ldb, ar, input); return 0; }
/****** tty_to_commlib() ******************************************************* * NAME * tty_to_commlib() -- tty_to_commlib thread entry point and main loop * * SYNOPSIS * void* tty_to_commlib(void *t_conf) * * FUNCTION * Entry point and main loop of the tty_to_commlib thread. * Reads data from the tty and writes it to the commlib. * * INPUTS * void *t_conf - pointer to cl_thread_settings_t struct of the thread * * RESULT * void* - always NULL * * NOTES * MT-NOTE: tty_to_commlib is MT-safe ? * * SEE ALSO *******************************************************************************/ void* tty_to_commlib(void *t_conf) { char *pbuf; fd_set read_fds; struct timeval timeout; dstring err_msg = DSTRING_INIT; dstring dbuf = DSTRING_INIT; int do_exit = 0; int ret, nread = 0; DENTER(TOP_LAYER, "tty_to_commlib"); thread_func_startup(t_conf); /* * allocate working buffer */ pbuf = (char*)malloc(BUFSIZE); if (pbuf == NULL) { DPRINTF(("tty_to_commlib can't allocate working buffer: %s (%d)\n", strerror(errno), errno)); do_exit = 1; } while (do_exit == 0) { FD_ZERO(&read_fds); if (g_nostdin == 0) { /* wait for input on tty */ FD_SET(STDIN_FILENO, &read_fds); } timeout.tv_sec = 1; timeout.tv_usec = 0; if (received_signal == SIGCONT) { received_signal = 0; if (continue_handler (g_comm_handle, g_hostname) == 1) { do_exit = 1; continue; } if (g_raw_mode_state == 1) { /* restore raw-mode after SIGCONT */ if (terminal_enter_raw_mode () != 0) { DPRINTF(("tty_to_commlib: couldn't enter raw mode for pty\n")); do_exit = 1; continue; } } } DPRINTF(("tty_to_commlib: Waiting in select() for data\n")); ret = select(STDIN_FILENO+1, &read_fds, NULL, NULL, &timeout); thread_testcancel(t_conf); client_check_window_change(g_comm_handle); if (received_signal == SIGHUP || received_signal == SIGINT || received_signal == SIGQUIT || received_signal == SIGTERM) { /* If we receive one of these signals, we must terminate */ do_exit = 1; continue; } if (ret > 0) { if (g_nostdin == 1) { /* We should never get here if STDIN is closed */ DPRINTF(("tty_to_commlib: STDIN ready to read while it should be closed!!!\n")); } DPRINTF(("tty_to_commlib: trying to read() from stdin\n")); nread = read(STDIN_FILENO, pbuf, BUFSIZE-1); pbuf[nread] = '\0'; sge_dstring_append (&dbuf, pbuf); DPRINTF(("tty_to_commlib: nread = %d\n", nread)); if (nread < 0 && (errno == EINTR || errno == EAGAIN)) { DPRINTF(("tty_to_commlib: EINTR or EAGAIN\n")); /* do nothing */ } else if (nread <= 0) { do_exit = 1; } else { DPRINTF(("tty_to_commlib: writing to commlib: %d bytes\n", nread)); if (suspend_handler(g_comm_handle, g_hostname, g_is_rsh, g_suspend_remote, g_pid, &dbuf) == 1) { if (comm_write_message(g_comm_handle, g_hostname, COMM_CLIENT, 1, (unsigned char*)pbuf, (unsigned long)nread, STDIN_DATA_MSG, &err_msg) != nread) { DPRINTF(("tty_to_commlib: couldn't write all data\n")); } else { DPRINTF(("tty_to_commlib: data successfully written\n")); } } comm_flush_write_messages(g_comm_handle, &err_msg); } } else { /* * We got either a select timeout or a select error. In both cases, * it's a good chance to check if our client is still alive. */ DPRINTF(("tty_to_commlib: Checking if client is still alive\n")); if (comm_get_connection_count(g_comm_handle, &err_msg) == 0) { DPRINTF(("tty_to_commlib: Client is not alive! -> exiting.\n")); do_exit = 1; } else { DPRINTF(("tty_to_commlib: Client is still alive\n")); } } } /* while (do_exit == 0) */ /* clean up */ sge_dstring_free(&dbuf); sge_free(&pbuf); thread_func_cleanup(t_conf); sge_dstring_free(&err_msg); DPRINTF(("tty_to_commlib: exiting tty_to_commlib thread!\n")); DEXIT; return NULL; }