summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dev-tcltk/expect/expect-5.45.4-r5.ebuild81
-rw-r--r--dev-tcltk/expect/files/expect-5.45-warnings.patch684
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];