+ if (reuse
+ && (termp != 0)
+ && termp->Filedes == Filedes
+ && termp->_termname != 0
+ && !strcmp(termp->_termname, myname)
+ && _nc_name_match(TerminalType(termp).term_names, myname, "|")) {
+ T(("reusing existing terminal information and mode-settings"));
+ code = OK;
+#ifdef USE_TERM_DRIVER
+ TCB = (TERMINAL_CONTROL_BLOCK *) termp;
+#endif
+ } else {
+#ifdef USE_TERM_DRIVER
+ TERMINAL_CONTROL_BLOCK *my_tcb;
+ termp = 0;
+ if ((my_tcb = typeCalloc(TERMINAL_CONTROL_BLOCK, 1)) != 0)
+ termp = &(my_tcb->term);
+#else
+ int status;
+
+ termp = typeCalloc(TERMINAL, 1);
+#endif
+ if (termp == 0) {
+ ret_error1(TGETENT_ERR,
+ "Not enough memory to create terminal structure.\n",
+ myname, free(myname));
+ }
+ ++_nc_globals.terminal_count;
+#if HAVE_SYSCONF
+ {
+ long limit;
+#ifdef LINE_MAX
+ limit = LINE_MAX;
+#else
+ limit = _nc_globals.getstr_limit;
+#endif
+#ifdef _SC_LINE_MAX
+ if (limit < sysconf(_SC_LINE_MAX))
+ limit = sysconf(_SC_LINE_MAX);
+#endif
+ if (_nc_globals.getstr_limit < (int) limit)
+ _nc_globals.getstr_limit = (int) limit;
+ }
+#endif /* HAVE_SYSCONF */
+ T(("using %d for getstr limit", _nc_globals.getstr_limit));
+
+#ifdef USE_TERM_DRIVER
+ INIT_TERM_DRIVER();
+ /*
+ * _nc_get_driver() will call td_CanHandle() for each driver, and win_driver
+ * needs file descriptor to do the test, so set it before calling.
+ */
+ termp->Filedes = (short) Filedes;
+ TCB = (TERMINAL_CONTROL_BLOCK *) termp;
+ code = _nc_globals.term_driver(TCB, myname, errret);
+ if (code == OK) {
+ termp->_termname = strdup(myname);
+ } else {
+ ret_error1(errret ? *errret : TGETENT_ERR,
+ "Could not find any driver to handle terminal.\n",
+ myname, free(myname));
+ }
+#else
+#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP
+ status = _nc_setup_tinfo(myname, &TerminalType(termp));
+ T(("_nc_setup_tinfo returns %d", status));
+#else
+ T(("no database available"));
+ status = TGETENT_NO;
+#endif
+
+ /* try fallback list if entry on disk */
+ if (status != TGETENT_YES) {
+ const TERMTYPE2 *fallback = _nc_fallback2(myname);
+
+ if (fallback) {
+ T(("found fallback entry"));
+ _nc_copy_termtype2(&(TerminalType(termp)), fallback);
+ status = TGETENT_YES;
+ }
+ }
+
+ if (status != TGETENT_YES) {
+ del_curterm(termp);
+ if (status == TGETENT_ERR) {
+ free(myname);
+ ret_error0(status, "terminals database is inaccessible\n");
+ } else if (status == TGETENT_NO) {
+ ret_error1(status, "unknown terminal type.\n",
+ myname, free(myname));
+ } else {
+ free(myname);
+ ret_error0(status, "unexpected return-code\n");
+ }
+ }
+#if NCURSES_EXT_NUMBERS
+ _nc_export_termtype2(&termp->type, &TerminalType(termp));
+#endif
+#if !USE_REENTRANT
+ save_ttytype(termp);
+#endif
+
+ termp->Filedes = (short) Filedes;
+ termp->_termname = strdup(myname);
+
+ set_curterm(termp);
+
+ if (VALID_STRING(command_character))
+ _nc_tinfo_cmdch(termp, UChar(*command_character));
+
+ /*
+ * If an application calls setupterm() rather than initscr() or
+ * newterm(), we will not have the def_prog_mode() call in
+ * _nc_setupscreen(). Do it now anyway, so we can initialize the
+ * baudrate. Also get the shell-mode so that erasechar() works.
+ */
+ if (NC_ISATTY(Filedes)) {
+ NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG);
+ NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG);
+ NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG);
+ }
+ code = OK;
+#endif