diff options
-rw-r--r-- | dev-tcltk/expect/expect-5.45.4-r5.ebuild | 81 | ||||
-rw-r--r-- | dev-tcltk/expect/files/expect-5.45-warnings.patch | 684 |
2 files changed, 765 insertions, 0 deletions
diff --git a/dev-tcltk/expect/expect-5.45.4-r5.ebuild b/dev-tcltk/expect/expect-5.45.4-r5.ebuild new file mode 100644 index 000000000000..51205dad779f --- /dev/null +++ b/dev-tcltk/expect/expect-5.45.4-r5.ebuild @@ -0,0 +1,81 @@ +# Copyright 1999-2023 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +inherit autotools edo flag-o-matic + +MY_P="${PN}${PV}" +DESCRIPTION="tool for automating interactive applications" +HOMEPAGE="https://core.tcl-lang.org/expect/" +SRC_URI="mirror://sourceforge/${PN}/${MY_P}.tar.gz" +S="${WORKDIR}"/${MY_P} + +LICENSE="BSD" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~x64-macos ~x64-solaris" +IUSE="debug doc test threads" +RESTRICT="!test? ( test )" + +DEPEND=">=dev-lang/tcl-8.2:=[threads?]" +RDEPEND="${DEPEND}" +BDEPEND="test? ( dev-util/dejagnu )" + +PATCHES=( "${FILESDIR}"/${P}-examples.patch ) + +src_prepare() { + default + sed -i "s:/usr/local/bin:${EPREFIX}/usr/bin:" expect.man || die + + eapply "${FILESDIR}"/${PN}-5.45-gfbsd.patch + eapply "${FILESDIR}"/${PN}-5.44.1.15-ldflags.patch + eapply "${FILESDIR}"/${PN}-5.45-headers.patch #337943 + eapply "${FILESDIR}"/${PN}-5.45-format-security.patch + eapply "${FILESDIR}"/${PN}-5.45.4-configure-in.patch + eapply "${FILESDIR}"/${PN}-5.45.4-configure-clang16.patch + eapply "${FILESDIR}"/${PN}-5.45-warnings.patch + + sed -i 's:ifdef HAVE_SYS_WAIT_H:ifndef NO_SYS_WAIT_H:' *.c || die + + # fix install_name on darwin + [[ ${CHOST} == *-darwin* ]] && \ + eapply "${FILESDIR}"/${P}-darwin-install_name.patch + + mv configure.{in,ac} || die + + eautoconf +} + +src_configure() { + # bug #881687 + append-flags -std=gnu89 + + # the 64bit flag is useless ... it only adds 64bit compiler flags + # (like -m64) which the target toolchain should already handle + econf \ + --cache-file="${S}"/config.cache \ + --with-tcl="${EPREFIX}/usr/$(get_libdir)" \ + --disable-64bit \ + --enable-shared \ + $(use_enable threads) \ + $(use_enable debug symbols mem) +} + +expect_make_var() { + touch pkgIndex.tcl-hand || die + printf 'all:;echo $('$1')\ninclude Makefile' | emake --no-print-directory -s -f - + rm -f pkgIndex.tcl-hand || die +} + +src_install() { + default + + if use doc ; then + docinto examples + + edo dodoc \ + example/README \ + $(printf 'example/%s ' $(expect_make_var _SCRIPTS)) \ + $(printf 'example/%s.man ' $(expect_make_var _SCRIPTS_MANPAGES)) + fi +} diff --git a/dev-tcltk/expect/files/expect-5.45-warnings.patch b/dev-tcltk/expect/files/expect-5.45-warnings.patch new file mode 100644 index 000000000000..31c3809be374 --- /dev/null +++ b/dev-tcltk/expect/files/expect-5.45-warnings.patch @@ -0,0 +1,684 @@ +https://bugs.gentoo.org/918972 +https://core.tcl-lang.org/expect/info/35d0b2bdfecd634d +--- a/Dbg.c ++++ b/Dbg.c +@@ -173,12 +173,12 @@ Tcl_Obj *objPtr; + } + } + +-/* return 1 to break, 0 to continue */ ++/* return 1 to break, 0 to continue ++ * cmd: command about to be executed ++ * bp: breakpoint to test ++ */ + static int +-breakpoint_test(interp,cmd,bp) +-Tcl_Interp *interp; +-char *cmd; /* command about to be executed */ +-struct breakpoint *bp; /* breakpoint to test */ ++breakpoint_test(Tcl_Interp *interp,const char *cmd,struct breakpoint *bp) + { + if (bp->re) { + int found = 0; +@@ -239,7 +239,7 @@ TclGetFrame2(interp, origFramePtr, string, framePtrPtr, dir) + { + Interp *iPtr = (Interp *) interp; + int level, result; +- CallFrame *framePtr; /* frame currently being searched */ ++ CallFrame *framePtr = NULL; /* frame currently being searched */ + + CallFrame *curFramePtr = iPtr->varFramePtr; + +@@ -302,7 +302,6 @@ TclGetFrame2(interp, origFramePtr, string, framePtrPtr, dir) + return result; + } + +- + static char *printify(s) + char *s; + { +@@ -658,6 +657,8 @@ debugger_trap(clientData,interp,level,command,commandInfo,objc,objv) + if (goalFramePtr != iPtr->varFramePtr) goto finish; + goto start_interact; + /* DANGER: unhandled cases! none, up, down, where */ ++ default: ++ break; /* Silence compiler warning */ + } + + start_interact: +@@ -716,6 +717,8 @@ end_interact: + case where: + PrintStack(interp,iPtr->varFramePtr,viewFramePtr,objc,objv,level_text); + break; ++ default: ++ break; /* Silence compiler warning */ + } + + /* restore view and restart interactor */ +--- a/exp_chan.c ++++ b/exp_chan.c +@@ -58,17 +58,14 @@ static int ExpGetHandleProc _ANSI_ARGS_((ClientData instanceData, + */ + + Tcl_ChannelType expChannelType = { +- "exp", /* Type name. */ +- ExpBlockModeProc, /* Set blocking/nonblocking mode.*/ +- ExpCloseProc, /* Close proc. */ +- ExpInputProc, /* Input proc. */ +- ExpOutputProc, /* Output proc. */ +- NULL, /* Seek proc. */ +- NULL, /* Set option proc. */ +- NULL, /* Get option proc. */ +- ExpWatchProc, /* Initialize notifier. */ +- ExpGetHandleProc, /* Get OS handles out of channel. */ +- NULL, /* Close2 proc */ ++ .typeName = "exp", /* Type name. */ ++ .version = TCL_CHANNEL_VERSION_2, ++ .blockModeProc = ExpBlockModeProc, /* Set blocking/nonblocking mode.*/ ++ .closeProc = ExpCloseProc, /* Close proc. */ ++ .inputProc = ExpInputProc, /* Input proc. */ ++ .outputProc = ExpOutputProc, /* Output proc. */ ++ .watchProc = ExpWatchProc, /* Initialize notifier. */ ++ .getHandleProc = ExpGetHandleProc /* Get OS handles out of channel. */ + }; + + typedef struct ThreadSpecificData { +@@ -437,10 +434,10 @@ ExpGetHandleProc(instanceData, direction, handlePtr) + ExpState *esPtr = (ExpState *) instanceData; + + if (direction & TCL_WRITABLE) { +- *handlePtr = (ClientData) esPtr->fdin; ++ *handlePtr = (ClientData)(intptr_t)esPtr->fdin; + } + if (direction & TCL_READABLE) { +- *handlePtr = (ClientData) esPtr->fdin; ++ *handlePtr = (ClientData)(intptr_t)esPtr->fdin; + } else { + return TCL_ERROR; + } +--- a/exp_clib.c ++++ b/exp_clib.c +@@ -56,6 +56,10 @@ would appreciate credit if this program or parts of it are used. + # endif + #endif + ++#ifdef HAVE_UNISTD_H ++#include <unistd.h> ++#endif ++ + #include <signal.h> + /*#include <memory.h> - deprecated - ANSI C moves them into string.h */ + #include "string.h" +@@ -122,6 +126,7 @@ extern unsigned long strtoul _ANSI_ARGS_((CONST char *string, + + #include <tcl.h> + #include "expect.h" ++#include "exp_command.h" + #define TclRegError exp_TclRegError + + /* +@@ -1814,6 +1819,13 @@ int fd; + + } + ++/* ultrix (at least 4.1-2) fails to obtain controlling tty if setsid */ ++/* is called. setpgrp works though. */ ++#if defined(POSIX) && !defined(ultrix) || defined(__convex__) ++#define DO_SETSID ++#endif ++ ++#if !defined(DO_SETSID) && (!defined(SYSV3) || defined(CRAY)) /* { */ + static + void + exp_setpgrp() +@@ -1830,6 +1842,7 @@ exp_setpgrp() + (void) setpgrp(0,0); + #endif + } ++#endif /* } */ + + /* returns fd of master side of pty */ + int +@@ -1840,7 +1853,9 @@ char *argv[]; /* some compiler complains about **argv? */ + int cc; + int errorfd; /* place to stash fileno(stderr) in child */ + /* while we're setting up new stderr */ ++#if defined(TIOCNOTTY) && !defined(SYSV3) && !defined(DO_SETSID) + int ttyfd; ++#endif + int sync_fds[2]; + int sync2_fds[2]; + int status_pipe[2]; +@@ -2015,15 +2030,6 @@ when trapping, see below in child half of fork */ + (void) close(exp_pty[0]); + #endif + +-/* ultrix (at least 4.1-2) fails to obtain controlling tty if setsid */ +-/* is called. setpgrp works though. */ +-#if defined(POSIX) && !defined(ultrix) +-#define DO_SETSID +-#endif +-#ifdef __convex__ +-#define DO_SETSID +-#endif +- + #ifdef DO_SETSID + setsid(); + #else +@@ -2451,7 +2457,7 @@ struct exp_case *ecases; + int return_val; + int sys_error = 0; + #define return_normally(x) {return_val = x; goto cleanup;} +-#define return_errno(x) {sys_error = x; goto cleanup;} ++#define return_errno(x) {sys_error = x; return_val = -1; goto cleanup;} + + f = fdfp2f(fd,fp); + if (!f) return_errno(ENOMEM); +@@ -2860,7 +2866,9 @@ char *program; + int + exp_disconnect() + { ++#if defined(TIOCNOTTY) && !defined(SYSV3) && !defined(POSIX) + int ttyfd; ++#endif + + #ifndef EALREADY + #define EALREADY 37 +--- a/exp_command.c ++++ b/exp_command.c +@@ -532,6 +532,13 @@ set_pgrp(int fd) + } + #endif + ++/* ultrix (at least 4.1-2) fails to obtain controlling tty if setsid */ ++/* is called. setpgrp works though. */ ++#if defined(POSIX) && !defined(ultrix) || defined(__convex__) ++#define DO_SETSID ++#endif ++ ++#if !defined(DO_SETSID) && (!defined(SYSV3) || defined(CRAY)) /* { */ + static + void + expSetpgrp() +@@ -548,7 +555,7 @@ expSetpgrp() + (void) setpgrp(0,0); + #endif + } +- ++#endif /* } */ + + /*ARGSUSED*/ + static void +@@ -581,9 +588,7 @@ Exp_SpawnObjCmd( + ExpState *esPtr = 0; + int slave; + int pid; +-#ifdef TIOCNOTTY +- /* tell Saber to ignore non-use of ttyfd */ +- /*SUPPRESS 591*/ ++#if defined(TIOCNOTTY) && !defined(SYSV3) && !defined(DO_SETSID) + int ttyfd; + #endif /* TIOCNOTTY */ + int errorfd; /* place to stash fileno(stderr) in child */ +@@ -903,13 +908,17 @@ Exp_SpawnObjCmd( + if (TCL_ERROR == Tcl_GetChannelHandle(channel, TCL_READABLE, &rfdc)) { + return TCL_ERROR; + } +- rfd = (int)(long) rfdc; ++ rfd = (int)(intptr_t) rfdc; ++ } else { ++ rfd = -1; + } + if (mode & TCL_WRITABLE) { + if (TCL_ERROR == Tcl_GetChannelHandle(channel, TCL_WRITABLE, &wfdc)) { + return TCL_ERROR; + } +- wfd = (int)(long) wfdc; ++ wfd = (int)(intptr_t) wfdc; ++ } else { ++ wfd = -1; + } + master = ((mode & TCL_READABLE)?rfd:wfd); + +@@ -1126,15 +1135,6 @@ Exp_SpawnObjCmd( + (void) close(master); + #endif + +-/* ultrix (at least 4.1-2) fails to obtain controlling tty if setsid */ +-/* is called. setpgrp works though. */ +-#if defined(POSIX) && !defined(ultrix) +-#define DO_SETSID +-#endif +-#ifdef __convex__ +-#define DO_SETSID +-#endif +- + #ifdef DO_SETSID + setsid(); + #else +@@ -1976,7 +1976,7 @@ Exp_SendObjCmd( + #define SEND_STYLE_BREAK 0x20 + int send_style = SEND_STYLE_PLAIN; + int want_cooked = TRUE; +- char *string; /* string to send */ ++ char *string = NULL; /* string to send */ + int len = -1; /* length of string to send */ + int zeros; /* count of how many ascii zeros to send */ + +@@ -3114,9 +3114,7 @@ Exp_DisconnectObjCmd( + { + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + +-#ifdef TIOCNOTTY +- /* tell CenterLine to ignore non-use of ttyfd */ +- /*SUPPRESS 591*/ ++#if defined(TIOCNOTTY) && !defined(SYSV3) && !defined(DO_SETSID) + int ttyfd; + #endif /* TIOCNOTTY */ + +--- a/exp_event.c ++++ b/exp_event.c +@@ -24,6 +24,7 @@ NIST would appreciate credit if this program or parts of it are used. + #include "exp_prog.h" + #include "exp_command.h" /* for ExpState defs */ + #include "exp_event.h" ++#include "exp_log.h" + + typedef struct ThreadSpecificData { + int rr; /* round robin ptr */ +@@ -120,6 +121,9 @@ exp_unblock_background_channelhandler(esPtr) + case disarm_req_while_blocked: + exp_disarm_background_channelhandler_force(esPtr); + break; ++ default: ++ expDiagLog("Unexpected value %d of bg-handler in %s", ++ esPtr->bg_status, __func__); + } + } + +--- a/exp_inter.c ++++ b/exp_inter.c +@@ -404,8 +404,8 @@ intEcho( + int matchBytes) + { + int seenBytes; /* either printed or echoed */ +- int echoBytes; +- int offsetBytes; ++ int echoBytes = 0; ++ int offsetBytes = 0; + + /* write is unlikely to fail, since we just read from same descriptor */ + seenBytes = esPtr->printed + esPtr->echoed; +@@ -706,9 +706,6 @@ inter_updateproc( + + #define finish(x) { status = x; goto done; } + +-static char return_cmd[] = "return"; +-static char interpreter_cmd[] = "interpreter"; +- + /*ARGSUSED*/ + int + Exp_InteractObjCmd( +@@ -1344,15 +1341,15 @@ Exp_InteractObjCmd( + int rc; /* return code from ready. This is further refined by matcher. */ + int cc; /* # of chars from read() */ + struct action *action = 0; +- time_t previous_time; ++ time_t previous_time = 0; + time_t current_time; +- int matchLen; /* # of chars matched */ ++ int matchLen = 0; /* # of chars matched */ + int skip; /* # of chars not involved in match */ + int print; /* # of chars to print */ + int oldprinted; /* old version of u->printed */ + int change; /* if action requires cooked mode */ + int attempt_match = TRUE; +- struct input *soonest_input; ++ struct input *soonest_input = NULL; + int timeout; /* current as opposed to default_timeout */ + Tcl_Time temp_time; + +--- a/exp_log.c ++++ b/exp_log.c +@@ -90,6 +90,8 @@ expWriteBytesAndLogIfTtyU(esPtr,buf,lenChars) + + if (esPtr->valid) + wc = expWriteCharsUni(esPtr,buf,lenChars); ++ else ++ wc = -1; + + if (tsdPtr->logChannel && ((esPtr->fdout == 1) || expDevttyIs(esPtr))) { + Tcl_DString ds; +--- a/exp_pty.c ++++ b/exp_pty.c +@@ -135,7 +135,9 @@ int timeout; + } + + static RETSIGTYPE (*oldAlarmHandler)(); ++#ifndef O_NOCTTY + static RETSIGTYPE (*oldHupHandler)(); ++#endif + static time_t current_time; /* time when testing began */ + + /* if TRUE, begin testing, else end testing */ +--- a/exp_trap.c ++++ b/exp_trap.c +@@ -298,11 +298,10 @@ char *s; + + /*ARGSUSED*/ + int +-Exp_TrapObjCmd(clientData, interp, objc, objv) +-ClientData clientData; +-Tcl_Interp *interp; +-int objc; +-Tcl_Obj *CONST objv[]; ++Exp_TrapObjCmd(ClientData clientData, ++ Tcl_Interp *interp, ++ int objc, ++ Tcl_Obj *CONST objv[]) + { + char *action = 0; + int n; /* number of signals in list */ +@@ -320,7 +319,9 @@ Tcl_Obj *CONST objv[]; + + objc--; objv++; + +- while (objc) { ++ if (objc <= 0) goto usage_error; ++ ++ do { + arg = Tcl_GetString(*objv); + + if (streq(arg,"-code")) { +@@ -339,7 +340,7 @@ Tcl_Obj *CONST objv[]; + objc--; objv++; + show_max = TRUE; + } else break; +- } ++ } while(objc); + + if (show_name || show_number || show_max) { + if (objc > 0) goto usage_error; +--- a/exp_tty.c ++++ b/exp_tty.c +@@ -585,18 +585,20 @@ Exp_SystemCmd( + int total_len = 0, arg_len; + + int stty_args_recognized = TRUE; +- int cmd_is_stty = FALSE; ++ int cmd_is_stty; + int cooked = FALSE; +- int was_raw, was_echo; ++ const char *was_raw = "-raw", *was_echo = "-echo"; + + if (argc == 1) return TCL_OK; + +- if (streq(argv[1],"stty")) { ++ cmd_is_stty = streq(argv[1],"stty"); ++ if (cmd_is_stty) { + expDiagLogU("system stty is deprecated, use stty\r\n"); + +- cmd_is_stty = TRUE; +- was_raw = exp_israw(); +- was_echo = exp_isecho(); ++ if (exp_israw()) ++ was_raw++; ++ if (exp_isecho()) ++ was_echo++; + } + + if (argc > 2 && cmd_is_stty) { +@@ -635,11 +637,7 @@ Exp_SystemCmd( + return(TCL_ERROR); + } + if (cmd_is_stty) { +- char buf [11]; +- sprintf(buf,"%sraw %secho", +- (was_raw?"":"-"), +- (was_echo?"":"-")); +- Tcl_SetResult (interp, buf, TCL_VOLATILE); ++ Tcl_AppendResult (interp, was_raw, " ", was_echo, NULL); + } + return(TCL_OK); + } +@@ -699,11 +697,7 @@ Exp_SystemCmd( + } + + if (cmd_is_stty) { +- char buf [11]; +- sprintf(buf,"%sraw %secho", +- (was_raw?"":"-"), +- (was_echo?"":"-")); +- Tcl_SetResult (interp, buf, TCL_VOLATILE); ++ Tcl_AppendResult (interp, was_raw, " ", was_echo, NULL); + } + + /* following macros stolen from Tcl's tclUnix.h file */ +--- a/exp_win.c ++++ b/exp_win.c +@@ -78,9 +78,9 @@ typedef struct { + static exp_winsize winsize = {0, 0}; + static exp_winsize win2size = {0, 0}; + +-int exp_window_size_set(fd) +-int fd; ++int exp_window_size_set(int fd) + { ++ return + #ifdef TIOCSWINSZ + ioctl(fd,TIOCSWINSZ,&winsize); + #endif +@@ -89,9 +89,9 @@ int fd; + #endif + } + +-int exp_window_size_get(fd) +-int fd; ++int exp_window_size_get(int fd) + { ++ return + #ifdef TIOCGWINSZ + ioctl(fd,TIOCGWINSZ,&winsize); + #endif +@@ -105,8 +105,7 @@ int fd; + } + + void +-exp_win_rows_set(rows) +-char *rows; ++exp_win_rows_set(const char *rows) + { + winsize.rows = atoi(rows); + exp_window_size_set(exp_dev_tty); +@@ -122,8 +121,7 @@ exp_win_rows_get() + } + + void +-exp_win_columns_set(columns) +-char *columns; ++exp_win_columns_set(const char *columns) + { + winsize.columns = atoi(columns); + exp_window_size_set(exp_dev_tty); +@@ -142,8 +140,8 @@ exp_win_columns_get() + * separate copy of everything above - used for handling user stty requests + */ + +-int exp_win2_size_set(fd) +-int fd; ++static void ++exp_win2_size_set(int fd) + { + #ifdef TIOCSWINSZ + ioctl(fd,TIOCSWINSZ,&win2size); +@@ -153,8 +151,8 @@ int fd; + #endif + } + +-int exp_win2_size_get(fd) +-int fd; ++static void ++exp_win2_size_get(int fd) + { + #ifdef TIOCGWINSZ + ioctl(fd,TIOCGWINSZ,&win2size); +@@ -165,9 +163,7 @@ int fd; + } + + void +-exp_win2_rows_set(fd,rows) +-int fd; +-char *rows; ++exp_win2_rows_set(int fd,const char *rows) + { + exp_win2_size_get(fd); + win2size.rows = atoi(rows); +@@ -175,8 +171,7 @@ char *rows; + } + + char* +-exp_win2_rows_get(fd) +-int fd; ++exp_win2_rows_get(int fd) + { + static char rows [20]; + exp_win2_size_get(fd); +@@ -189,9 +184,7 @@ int fd; + } + + void +-exp_win2_columns_set(fd,columns) +-int fd; +-char *columns; ++exp_win2_columns_set(int fd,const char *columns) + { + exp_win2_size_get(fd); + win2size.columns = atoi(columns); +@@ -199,8 +192,7 @@ char *columns; + } + + char* +-exp_win2_columns_get(fd) +-int fd; ++exp_win2_columns_get(int fd) + { + static char columns [20]; + exp_win2_size_get(fd); +--- a/exp_win.h ++++ b/exp_win.h +@@ -11,12 +11,12 @@ would appreciate credit if you use this file or parts of it. + int exp_window_size_set(); + int exp_window_size_get(); + +-void exp_win_rows_set _ANSI_ARGS_ ((char* rows)); ++void exp_win_rows_set _ANSI_ARGS_ ((const char* rows)); + char* exp_win_rows_get _ANSI_ARGS_ ((void)); +-void exp_win_columns_set _ANSI_ARGS_ ((char* columns)); ++void exp_win_columns_set _ANSI_ARGS_ ((const char* columns)); + char* exp_win_columns_get _ANSI_ARGS_ ((void)); + +-void exp_win2_rows_set _ANSI_ARGS_ ((int fd, char* rows)); ++void exp_win2_rows_set _ANSI_ARGS_ ((int fd, const char* rows)); + char* exp_win2_rows_get _ANSI_ARGS_ ((int fd)); +-void exp_win2_columns_set _ANSI_ARGS_ ((int fd, char* columns)); ++void exp_win2_columns_set _ANSI_ARGS_ ((int fd, const char* columns)); + char* exp_win2_columns_get _ANSI_ARGS_ ((int fd)); +--- a/expect.c ++++ b/expect.c +@@ -2537,7 +2537,7 @@ Exp_ExpectObjCmd( + struct exp_state_list *state_list; /* list of ExpStates to watch */ + struct exp_state_list *slPtr; /* temp for interating over state_list */ + ExpState **esPtrs; +- int mcount; /* number of esPtrs to watch */ ++ int mcount = 0; /* number of esPtrs to watch */ + + struct eval_out eo; /* final case of interest */ + +@@ -2546,7 +2546,7 @@ Exp_ExpectObjCmd( + time_t start_time_total; /* time at beginning of this procedure */ + time_t start_time = 0; /* time when restart label hit */ + time_t current_time = 0; /* current time (when we last looked)*/ +- time_t end_time; /* future time at which to give up */ ++ time_t end_time = 0; /* future time at which to give up */ + + ExpState *last_esPtr; /* for differentiating when multiple f's */ + /* to print out better debugging messages */ +@@ -2554,7 +2554,7 @@ Exp_ExpectObjCmd( + int first_time = 1; /* if not "restarted" */ + + int key; /* identify this expect command instance */ +- int configure_count; /* monitor exp_configure_count */ ++ int configure_count = 0; /* monitor exp_configure_count */ + + int timeout; /* seconds */ + int remtime; /* remaining time in timeout */ +@@ -2947,12 +2947,14 @@ process_di ( + } else { + esPtr = expStateFromChannelName(interp,chan,0,0,0,(char*)cmd); + } +- if (!esPtr) return(TCL_ERROR); ++ if (!esPtr) ++ return(TCL_ERROR); ++ ++ *esOut = esPtr; + } + + *at = i; + *Default = def; +- *esOut = esPtr; + return TCL_OK; + } + +--- a/pty_termios.c ++++ b/pty_termios.c +@@ -71,6 +71,14 @@ with openpty which supports 4000 while ptmx supports 60. */ + #endif + #include <sys/types.h> + #include <sys/stat.h> ++#if defined(HAVE_OPENPTY) ++#include <termios.h> ++#if defined(HAVE_LIBUTIL_H) ++#include <libutil.h> ++#else ++#include <pty.h> ++#endif ++#endif + + #ifdef NO_STDLIB_H + #include "../compat/stdlib.h" +@@ -381,11 +389,14 @@ exp_init_pty() + int + exp_getptymaster() + { ++#if !defined(HAVE_CONVEX_GETPTY) && !defined(HAVE_PTYM) && !defined(HAVE_SCO_CLIST_PTYS) && defined(TEST_PTY) + char *hex, *bank; +- struct stat stat_buf; ++#endif + int master = -1; + int slave = -1; ++#ifdef HAVE_SCO_CLIST_PTYS + int num; ++#endif + + exp_pty_error = 0; + +@@ -438,6 +449,7 @@ exp_getptymaster() + master = open("/dev/ptc", O_RDWR); + if (master >= 0) { + int ptynum; ++ struct stat stat_buf; + + if (fstat(master, &stat_buf) < 0) { + close(master); +@@ -644,8 +656,10 @@ exp_getptyslave( + int ttyinit, + CONST char *stty_args) + { +- int slave, slave2; ++ int slave; ++#if defined(HAVE_PTMX_BSD) + char buf[10240]; ++#endif + + if (0 > (slave = open(slave_name, O_RDWR))) { + static char buf[500]; |