[packages/expect] - rel 5; fixes from FC

arekm arekm at pld-linux.org
Thu Jan 28 22:24:15 CET 2016


commit dade3e15ae2813f752d734b38e5bb25c847d214b
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Thu Jan 28 22:24:10 2016 +0100

    - rel 5; fixes from FC

 expect-5.32.2-random.patch                   |  19 +
 expect-5.43.0-log_file.patch                 |  12 +
 expect-5.45-check-telnet.patch               |  29 ++
 expect-5.45-exp-log-buf-overflow.patch       |  39 ++
 expect-5.45-fd-leak.patch                    |  12 +
 expect-5.45-match-gt-numchars-segfault.patch |  17 +
 expect-5.45-mkpasswd-dash.patch              |  13 +
 expect-5.45-passmass-su-full-path.patch      |  12 +
 expect-5.45-re-memleak.patch                 |  14 +
 expect-5.45-segfault-with-stubs.patch        | 553 +++++++++++++++++++++++++++
 expect.spec                                  |  24 +-
 11 files changed, 742 insertions(+), 2 deletions(-)
---
diff --git a/expect.spec b/expect.spec
index 2b6bef7..929f4f9 100644
--- a/expect.spec
+++ b/expect.spec
@@ -12,7 +12,7 @@ Summary(tr.UTF-8):	Programlar arası etkileşimi mümkün kılan Tcl genişletme
 Summary(uk.UTF-8):	Розширення Tcl для керування програмами зі скриптів
 Name:		expect
 Version:	5.45
-Release:	4
+Release:	5
 License:	BSD
 Group:		Development/Languages/Tcl
 Source0:	http://downloads.sourceforge.net/expect/%{name}%{version}.tar.gz
@@ -21,14 +21,24 @@ Patch0:		%{name}-pty.patch
 Patch1:		%{name}-bug7869.patch
 Patch2:		%{name}-soname.patch
 Patch3:		%{name}-format.patch
+Patch4:		%{name}-5.43.0-log_file.patch
+Patch5:		%{name}-5.45-match-gt-numchars-segfault.patch
+Patch6:		%{name}-5.45-re-memleak.patch
+Patch7:		%{name}-5.45-exp-log-buf-overflow.patch
+Patch8:		%{name}-5.45-segfault-with-stubs.patch
+Patch9:		%{name}-5.45-fd-leak.patch
+Patch10:	%{name}-5.32.2-random.patch
+Patch11:	%{name}-5.45-mkpasswd-dash.patch
+Patch12:	%{name}-5.45-check-telnet.patch
+Patch13:	%{name}-5.45-passmass-su-full-path.patch
 URL:		http://expect.nist.gov/
 BuildRequires:	autoconf
 BuildRequires:	automake
 BuildRequires:	tcl-devel >= 8.5.0
 BuildRequires:	tk-devel >= 8.5.0
 BuildRequires:	xorg-lib-libX11-devel
-BuildRequires:	xorg-lib-libXext-devel
 BuildRequires:	xorg-lib-libXScrnSaver-devel
+BuildRequires:	xorg-lib-libXext-devel
 Requires:	tcl >= 8.5.0
 BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)
 
@@ -106,6 +116,16 @@ Pliki nagłówkowe i dokumentacja do rozszerzenia expect języka Tcl.
 %patch1 -p1
 %patch2 -p1
 %patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
+%patch13 -p1
 
 chmod +w {.,testsuite}/configure
 
diff --git a/expect-5.32.2-random.patch b/expect-5.32.2-random.patch
new file mode 100644
index 0000000..0cac294
--- /dev/null
+++ b/expect-5.32.2-random.patch
@@ -0,0 +1,19 @@
+diff -up expect-5.44.1.15/example/mkpasswd.orig expect-5.44.1.15/example/mkpasswd
+--- expect-5.44.1.15/example/mkpasswd.orig	2010-03-08 16:01:05.518378075 +0100
++++ expect-5.44.1.15/example/mkpasswd	2010-03-08 16:01:27.408388162 +0100
+@@ -92,7 +92,14 @@ proc insert {pvar char} {
+ }
+ 
+ proc rand {m} {
+-    expr {int($m*rand())}
++    set device /dev/urandom            ;# /dev/random can block
++    set fileId [open $device r]
++    binary scan [read $fileId 4] i1 number
++    set clipped [expr $number % $m]
++#    puts "number is $number"
++#    puts "clipped is $clipped"
++    close $fileId
++    return $clipped
+ }
+ 
+ # choose left or right starting hand
diff --git a/expect-5.43.0-log_file.patch b/expect-5.43.0-log_file.patch
new file mode 100644
index 0000000..8a2c93d
--- /dev/null
+++ b/expect-5.43.0-log_file.patch
@@ -0,0 +1,12 @@
+diff -up expect-5.44.1.15/exp_log.c.orig expect-5.44.1.15/exp_log.c
+--- expect-5.44.1.15/exp_log.c.orig	2010-03-08 15:45:20.581378309 +0100
++++ expect-5.44.1.15/exp_log.c	2010-03-08 15:45:38.838398279 +0100
+@@ -374,7 +374,7 @@ expDiagChannelOpen(interp,filename)
+ 	Tcl_DStringAppend(&tsdPtr->diagFilename,filename,-1);
+     }
+ 
+-    tsdPtr->diagChannel = Tcl_OpenFileChannel(interp,newfilename,"a",0777);
++    tsdPtr->diagChannel = Tcl_OpenFileChannel(interp,newfilename,"a",0666);
+     if (!tsdPtr->diagChannel) {
+ 	Tcl_DStringFree(&tsdPtr->diagFilename);
+ 	return TCL_ERROR;
diff --git a/expect-5.45-check-telnet.patch b/expect-5.45-check-telnet.patch
new file mode 100644
index 0000000..0b67dc6
--- /dev/null
+++ b/expect-5.45-check-telnet.patch
@@ -0,0 +1,29 @@
+diff -up expect5.45/example/passmass.orig expect5.45/example/passmass
+--- expect5.45/example/passmass.orig	2011-07-27 16:09:31.013843393 +0200
++++ expect5.45/example/passmass	2011-07-27 16:10:55.667843578 +0200
+@@ -107,6 +107,10 @@ for {set i 0} {$i<$argc} {incr i} {
+ 	set login "ssh"
+ 	continue
+     } "-telnet" {
++	if {[file executable /usr/bin/telnet] == 0} {
++		send_user "It seems that telnet is not installed. Please install telnet in order to use the script with this option.\n"
++		exit 1
++	}
+ 	set login "telnet"
+ 	continue
+     } "-program" {
+diff -up expect5.45/example/weather.orig expect5.45/example/weather
+--- expect5.45/example/weather.orig	2011-07-27 15:49:57.878843862 +0200
++++ expect5.45/example/weather	2011-07-27 16:08:48.067843491 +0200
+@@ -33,6 +33,11 @@ set timeout 60
+ 
+ set env(TERM) vt100	;# actual value doesn't matter, just has to be set
+ 
++if {[file executable /usr/bin/telnet] == 0} {
++	send_user "It seems that telnet is not installed. Please install telnet in order to use this script.\n"
++	exit 1
++}
++
+ spawn telnet rainmaker.wunderground.com 3000
+ while {1} {
+ 	expect timeout {
diff --git a/expect-5.45-exp-log-buf-overflow.patch b/expect-5.45-exp-log-buf-overflow.patch
new file mode 100644
index 0000000..162db80
--- /dev/null
+++ b/expect-5.45-exp-log-buf-overflow.patch
@@ -0,0 +1,39 @@
+diff -up expect5.45/exp_log.c.orig expect5.45/exp_log.c
+--- expect5.45/exp_log.c.orig	2013-12-12 12:43:38.527854189 +0100
++++ expect5.45/exp_log.c	2013-12-12 12:49:26.866576387 +0100
+@@ -176,7 +176,7 @@ expStdoutLog TCL_VARARGS_DEF(int,arg1)
+ 
+     if ((!tsdPtr->logUser) && (!force_stdout) && (!tsdPtr->logAll)) return;
+ 
+-    (void) vsprintf(bigbuf,fmt,args);
++    (void) vsnprintf(bigbuf,sizeof(bigbuf),fmt,args);
+     expDiagWriteBytes(bigbuf,-1);
+     if (tsdPtr->logAll || (LOGUSER && tsdPtr->logChannel)) Tcl_WriteChars(tsdPtr->logChannel,bigbuf,-1);
+     if (LOGUSER) fprintf(stdout,"%s",bigbuf);
+@@ -222,7 +222,7 @@ expErrorLog TCL_VARARGS_DEF(char *,arg1)
+     va_list args;
+ 
+     fmt = TCL_VARARGS_START(char *,arg1,args);
+-    (void) vsprintf(bigbuf,fmt,args);
++    (void) vsnprintf(bigbuf,sizeof(bigbuf),fmt,args);
+ 
+     expDiagWriteChars(bigbuf,-1);
+     fprintf(stderr,"%s",bigbuf);
+@@ -264,7 +264,7 @@ expDiagLog TCL_VARARGS_DEF(char *,arg1)
+ 
+     fmt = TCL_VARARGS_START(char *,arg1,args);
+ 
+-    (void) vsprintf(bigbuf,fmt,args);
++    (void) vsnprintf(bigbuf,sizeof(bigbuf),fmt,args);
+ 
+     expDiagWriteBytes(bigbuf,-1);
+     if (tsdPtr->diagToStderr) {
+@@ -307,7 +307,7 @@ expPrintf TCL_VARARGS_DEF(char *,arg1)
+   int len, rc;
+ 
+   fmt = TCL_VARARGS_START(char *,arg1,args);
+-  len = vsprintf(bigbuf,arg1,args);
++  len = vsnprintf(bigbuf,sizeof(bigbuf),arg1,args);
+  retry:
+   rc = write(2,bigbuf,len);
+   if ((rc == -1) && (errno == EAGAIN)) goto retry;
diff --git a/expect-5.45-fd-leak.patch b/expect-5.45-fd-leak.patch
new file mode 100644
index 0000000..459a1f6
--- /dev/null
+++ b/expect-5.45-fd-leak.patch
@@ -0,0 +1,12 @@
+diff -up expect5.45/exp_clib.c.orig expect5.45/exp_clib.c
+--- expect5.45/exp_command.c.orig	2014-09-04 12:12:21.075837835 +0200
++++ expect5.45/exp_command.c	2014-09-04 12:13:39.098593465 +0200
+@@ -1161,7 +1161,7 @@ Exp_SpawnObjCmd(
+     /* if stty finds dev(stderr) != dev(stdout) */
+ 
+     /* save error fd while we're setting up new one */
+-    errorfd = fcntl(2,F_DUPFD,3);
++    errorfd = fcntl(2,F_DUPFD_CLOEXEC,3);
+     /* and here is the macro to restore it */
+ #define restore_error_fd {close(2);fcntl(errorfd,F_DUPFD,2);}
+ 
diff --git a/expect-5.45-match-gt-numchars-segfault.patch b/expect-5.45-match-gt-numchars-segfault.patch
new file mode 100644
index 0000000..1abd424
--- /dev/null
+++ b/expect-5.45-match-gt-numchars-segfault.patch
@@ -0,0 +1,17 @@
+diff -up expect5.45/expect.c.orig expect5.45/expect.c
+--- expect5.45/expect.c.orig	2012-02-06 14:15:13.469490744 +0100
++++ expect5.45/expect.c	2012-02-06 14:16:23.596837896 +0100
+@@ -2363,7 +2363,12 @@ expMatchProcess(
+ 
+ 	/* "!e" means no case matched - transfer by default */
+ 	if (!e || e->transfer) {
+-	    int remainder = numchars-match;
++	    int remainder;
++	    if (match > numchars) {
++		match = numchars;
++		eo->matchlen = match;
++	    }
++	    remainder = numchars-match;
+ 	    /* delete matched chars from input buffer */
+ 	    esPtr->printed -= match;
+ 	    if (numchars != 0) {
diff --git a/expect-5.45-mkpasswd-dash.patch b/expect-5.45-mkpasswd-dash.patch
new file mode 100644
index 0000000..fbdecde
--- /dev/null
+++ b/expect-5.45-mkpasswd-dash.patch
@@ -0,0 +1,13 @@
+diff -up expect5.45/example/mkpasswd.orig expect5.45/example/mkpasswd
+--- expect5.45/example/mkpasswd.orig	2011-03-16 13:23:23.125480017 +0100
++++ expect5.45/example/mkpasswd	2011-03-16 13:24:08.739353139 +0100
+@@ -202,7 +202,8 @@ if {[info exists user]} {
+ 	expect {
+ 		"assword*:" {
+ 			# some systems say "Password (again):"
+-			send "$password\r"
++			send -- "$password\r"
++			# "--" because of passwords beginning with dash
+ 			exp_continue
+ 		}
+ 	}
diff --git a/expect-5.45-passmass-su-full-path.patch b/expect-5.45-passmass-su-full-path.patch
new file mode 100644
index 0000000..6febf94
--- /dev/null
+++ b/expect-5.45-passmass-su-full-path.patch
@@ -0,0 +1,12 @@
+diff -up expect5.45/example/passmass.orig expect5.45/example/passmass
+--- expect5.45/example/passmass.orig	2011-09-06 13:04:41.439875491 +0200
++++ expect5.45/example/passmass	2011-09-06 13:04:54.663874571 +0200
+@@ -178,7 +178,7 @@ for {set i 0} {$i<$argc} {incr i} {
+     }
+ 
+     if ($su) {
+-	send "su -\r"
++	send "/bin/su -\r"
+ 	expect -nocase "password:"
+ 	send "$password(old)\r"
+ 	expect "# "
diff --git a/expect-5.45-re-memleak.patch b/expect-5.45-re-memleak.patch
new file mode 100644
index 0000000..182f596
--- /dev/null
+++ b/expect-5.45-re-memleak.patch
@@ -0,0 +1,14 @@
+diff -up expect5.45/expect.c.orig expect5.45/expect.c
+--- expect5.45/expect.c.orig	2013-10-02 13:16:31.462430482 +0200
++++ expect5.45/expect.c	2013-10-02 13:17:18.420599495 +0200
+@@ -185,9 +185,9 @@ free_ecase(
+ {
+     if (ec->i_list->duration == EXP_PERMANENT) {
+ 	if (ec->pat)  { Tcl_DecrRefCount(ec->pat); }
+-	if (ec->gate) { Tcl_DecrRefCount(ec->gate); }
+ 	if (ec->body) { Tcl_DecrRefCount(ec->body); }
+     }
++    if (ec->gate) { Tcl_DecrRefCount(ec->gate); }
+ 
+     if (free_ilist) {
+ 	ec->i_list->ecount--;
diff --git a/expect-5.45-segfault-with-stubs.patch b/expect-5.45-segfault-with-stubs.patch
new file mode 100644
index 0000000..eb02fe3
--- /dev/null
+++ b/expect-5.45-segfault-with-stubs.patch
@@ -0,0 +1,553 @@
+diff -up expect5.45/exp_clib.c.orig expect5.45/exp_clib.c
+--- expect5.45/exp_clib.c.orig	2010-09-01 00:20:27.000000000 +0200
++++ expect5.45/exp_clib.c	2015-05-19 12:01:22.413349423 +0200
+@@ -84,6 +84,8 @@ would appreciate credit if this program
+ #ifndef _STDLIB
+ #define _STDLIB
+ 
++#include <tcl.h>
++
+ extern void		abort _ANSI_ARGS_((void));
+ extern double		atof _ANSI_ARGS_((CONST char *string));
+ extern int		atoi _ANSI_ARGS_((CONST char *string));
+@@ -114,7 +116,6 @@ extern unsigned long	strtoul _ANSI_ARGS_
+ #include <stdlib.h>		/* for malloc */
+ #endif
+ 
+-#include <tcl.h>
+ #include "expect.h"
+ #define TclRegError exp_TclRegError
+ 
+@@ -1465,6 +1466,467 @@ TclGetRegError()
+  */
+ 
+ /*
++ * following stolen from tcl8.0.4/generic/tclPosixStr.c
++ */
++
++/*
++ *----------------------------------------------------------------------
++ *
++ * Tcl_ErrnoMsg --
++ *
++ *     Return a human-readable message corresponding to a given
++ *     errno value.
++ *
++ * Results:
++ *     The return value is the standard POSIX error message for
++ *     errno.  This procedure is used instead of strerror because
++ *     strerror returns slightly different values on different
++ *     machines (e.g. different capitalizations), which cause
++ *     problems for things such as regression tests.  This procedure
++ *     provides messages for most standard errors, then it calls
++ *     strerror for things it doesn't understand.
++ *
++ * Side effects:
++ *     None.
++ *
++ *----------------------------------------------------------------------
++ */
++
++static
++char *
++Tcl_ErrnoMsg(err)
++    int err;                   /* Error number (such as in errno variable). */
++{
++    switch (err) {
++#ifdef E2BIG
++       case E2BIG: return "argument list too long";
++#endif
++#ifdef EACCES
++       case EACCES: return "permission denied";
++#endif
++#ifdef EADDRINUSE
++       case EADDRINUSE: return "address already in use";
++#endif
++#ifdef EADDRNOTAVAIL
++       case EADDRNOTAVAIL: return "can't assign requested address";
++#endif
++#ifdef EADV
++       case EADV: return "advertise error";
++#endif
++#ifdef EAFNOSUPPORT
++       case EAFNOSUPPORT: return "address family not supported by protocol family";
++#endif
++#ifdef EAGAIN
++       case EAGAIN: return "resource temporarily unavailable";
++#endif
++#ifdef EALIGN
++       case EALIGN: return "EALIGN";
++#endif
++#if defined(EALREADY) && (!defined(EBUSY) || (EALREADY != EBUSY ))
++       case EALREADY: return "operation already in progress";
++#endif
++#ifdef EBADE
++       case EBADE: return "bad exchange descriptor";
++#endif
++#ifdef EBADF
++       case EBADF: return "bad file number";
++#endif
++#ifdef EBADFD
++       case EBADFD: return "file descriptor in bad state";
++#endif
++#ifdef EBADMSG
++       case EBADMSG: return "not a data message";
++#endif
++#ifdef EBADR
++       case EBADR: return "bad request descriptor";
++#endif
++#ifdef EBADRPC
++       case EBADRPC: return "RPC structure is bad";
++#endif
++#ifdef EBADRQC
++       case EBADRQC: return "bad request code";
++#endif
++#ifdef EBADSLT
++       case EBADSLT: return "invalid slot";
++#endif
++#ifdef EBFONT
++       case EBFONT: return "bad font file format";
++#endif
++#ifdef EBUSY
++       case EBUSY: return "file busy";
++#endif
++#ifdef ECHILD
++       case ECHILD: return "no children";
++#endif
++#ifdef ECHRNG
++       case ECHRNG: return "channel number out of range";
++#endif
++#ifdef ECOMM
++       case ECOMM: return "communication error on send";
++#endif
++#ifdef ECONNABORTED
++       case ECONNABORTED: return "software caused connection abort";
++#endif
++#ifdef ECONNREFUSED
++       case ECONNREFUSED: return "connection refused";
++#endif
++#ifdef ECONNRESET
++       case ECONNRESET: return "connection reset by peer";
++#endif
++#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK))
++       case EDEADLK: return "resource deadlock avoided";
++#endif
++#if defined(EDEADLOCK) && (!defined(EDEADLK) || (EDEADLOCK != EDEADLK))
++       case EDEADLOCK: return "resource deadlock avoided";
++#endif
++#ifdef EDESTADDRREQ
++       case EDESTADDRREQ: return "destination address required";
++#endif
++#ifdef EDIRTY
++       case EDIRTY: return "mounting a dirty fs w/o force";
++#endif
++#ifdef EDOM
++       case EDOM: return "math argument out of range";
++#endif
++#ifdef EDOTDOT
++       case EDOTDOT: return "cross mount point";
++#endif
++#ifdef EDQUOT
++       case EDQUOT: return "disk quota exceeded";
++#endif
++#ifdef EDUPPKG
++       case EDUPPKG: return "duplicate package name";
++#endif
++#ifdef EEXIST
++       case EEXIST: return "file already exists";
++#endif
++#ifdef EFAULT
++       case EFAULT: return "bad address in system call argument";
++#endif
++#ifdef EFBIG
++       case EFBIG: return "file too large";
++#endif
++#ifdef EHOSTDOWN
++       case EHOSTDOWN: return "host is down";
++#endif
++#ifdef EHOSTUNREACH
++       case EHOSTUNREACH: return "host is unreachable";
++#endif
++#if defined(EIDRM) && (!defined(EINPROGRESS) || (EIDRM != EINPROGRESS))
++       case EIDRM: return "identifier removed";
++#endif
++#ifdef EINIT
++       case EINIT: return "initialization error";
++#endif
++#ifdef EINPROGRESS
++       case EINPROGRESS: return "operation now in progress";
++#endif
++#ifdef EINTR
++       case EINTR: return "interrupted system call";
++#endif
++#ifdef EINVAL
++       case EINVAL: return "invalid argument";
++#endif
++#ifdef EIO
++       case EIO: return "I/O error";
++#endif
++#ifdef EISCONN
++       case EISCONN: return "socket is already connected";
++#endif
++#ifdef EISDIR
++       case EISDIR: return "illegal operation on a directory";
++#endif
++#ifdef EISNAME
++       case EISNAM: return "is a name file";
++#endif
++#ifdef ELBIN
++       case ELBIN: return "ELBIN";
++#endif
++#ifdef EL2HLT
++       case EL2HLT: return "level 2 halted";
++#endif
++#ifdef EL2NSYNC
++       case EL2NSYNC: return "level 2 not synchronized";
++#endif
++#ifdef EL3HLT
++       case EL3HLT: return "level 3 halted";
++#endif
++#ifdef EL3RST
++       case EL3RST: return "level 3 reset";
++#endif
++#ifdef ELIBACC
++       case ELIBACC: return "can not access a needed shared library";
++#endif
++#ifdef ELIBBAD
++       case ELIBBAD: return "accessing a corrupted shared library";
++#endif
++#ifdef ELIBEXEC
++       case ELIBEXEC: return "can not exec a shared library directly";
++#endif
++#ifdef ELIBMAX
++       case ELIBMAX: return
++               "attempting to link in more shared libraries than system limit";
++#endif
++#ifdef ELIBSCN
++       case ELIBSCN: return ".lib section in a.out corrupted";
++#endif
++#ifdef ELNRNG
++       case ELNRNG: return "link number out of range";
++#endif
++#if defined(ELOOP) && (!defined(ENOENT) || (ELOOP != ENOENT))
++       case ELOOP: return "too many levels of symbolic links";
++#endif
++#ifdef EMFILE
++       case EMFILE: return "too many open files";
++#endif
++#ifdef EMLINK
++       case EMLINK: return "too many links";
++#endif
++#ifdef EMSGSIZE
++       case EMSGSIZE: return "message too long";
++#endif
++#ifdef EMULTIHOP
++       case EMULTIHOP: return "multihop attempted";
++#endif
++#ifdef ENAMETOOLONG
++       case ENAMETOOLONG: return "file name too long";
++#endif
++#ifdef ENAVAIL
++       case ENAVAIL: return "not available";
++#endif
++#ifdef ENET
++       case ENET: return "ENET";
++#endif
++#ifdef ENETDOWN
++       case ENETDOWN: return "network is down";
++#endif
++#ifdef ENETRESET
++       case ENETRESET: return "network dropped connection on reset";
++#endif
++#ifdef ENETUNREACH
++       case ENETUNREACH: return "network is unreachable";
++#endif
++#ifdef ENFILE
++       case ENFILE: return "file table overflow";
++#endif
++#ifdef ENOANO
++       case ENOANO: return "anode table overflow";
++#endif
++#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR))
++       case ENOBUFS: return "no buffer space available";
++#endif
++#ifdef ENOCSI
++       case ENOCSI: return "no CSI structure available";
++#endif
++#if defined(ENODATA) && (!defined(ECONNREFUSED) || (ENODATA != ECONNREFUSED))
++       case ENODATA: return "no data available";
++#endif
++#ifdef ENODEV
++       case ENODEV: return "no such device";
++#endif
++#ifdef ENOENT
++       case ENOENT: return "no such file or directory";
++#endif
++#ifdef ENOEXEC
++       case ENOEXEC: return "exec format error";
++#endif
++#ifdef ENOLCK
++       case ENOLCK: return "no locks available";
++#endif
++#ifdef ENOLINK
++       case ENOLINK: return "link has be severed";
++#endif
++#ifdef ENOMEM
++       case ENOMEM: return "not enough memory";
++#endif
++#ifdef ENOMSG
++       case ENOMSG: return "no message of desired type";
++#endif
++#ifdef ENONET
++       case ENONET: return "machine is not on the network";
++#endif
++#ifdef ENOPKG
++       case ENOPKG: return "package not installed";
++#endif
++#ifdef ENOPROTOOPT
++       case ENOPROTOOPT: return "bad proocol option";
++#endif
++#ifdef ENOSPC
++       case ENOSPC: return "no space left on device";
++#endif
++#if defined(ENOSR) && (!defined(ENAMETOOLONG) || (ENAMETOOLONG != ENOSR))
++       case ENOSR: return "out of stream resources";
++#endif
++#if defined(ENOSTR) && (!defined(ENOTTY) || (ENOTTY != ENOSTR))
++       case ENOSTR: return "not a stream device";
++#endif
++#ifdef ENOSYM
++       case ENOSYM: return "unresolved symbol name";
++#endif
++#ifdef ENOSYS
++       case ENOSYS: return "function not implemented";
++#endif
++#ifdef ENOTBLK
++       case ENOTBLK: return "block device required";
++#endif
++#ifdef ENOTCONN
++       case ENOTCONN: return "socket is not connected";
++#endif
++#ifdef ENOTDIR
++       case ENOTDIR: return "not a directory";
++#endif
++#if defined(ENOTEMPTY) && (!defined(EEXIST) || (ENOTEMPTY != EEXIST))
++       case ENOTEMPTY: return "directory not empty";
++#endif
++#ifdef ENOTNAM
++       case ENOTNAM: return "not a name file";
++#endif
++#ifdef ENOTSOCK
++       case ENOTSOCK: return "socket operation on non-socket";
++#endif
++#ifdef ENOTSUP
++       case ENOTSUP: return "operation not supported";
++#endif
++#ifdef ENOTTY
++       case ENOTTY: return "inappropriate device for ioctl";
++#endif
++#ifdef ENOTUNIQ
++       case ENOTUNIQ: return "name not unique on network";
++#endif
++#ifdef ENXIO
++       case ENXIO: return "no such device or address";
++#endif
++#if defined(EOPNOTSUPP) &&  (!defined(ENOTSUP) || (ENOTSUP != EOPNOTSUPP))
++       case EOPNOTSUPP: return "operation not supported on socket";
++#endif
++#ifdef EPERM
++       case EPERM: return "not owner";
++#endif
++#if defined(EPFNOSUPPORT) && (!defined(ENOLCK) || (ENOLCK != EPFNOSUPPORT))
++       case EPFNOSUPPORT: return "protocol family not supported";
++#endif
++#ifdef EPIPE
++       case EPIPE: return "broken pipe";
++#endif
++#ifdef EPROCLIM
++       case EPROCLIM: return "too many processes";
++#endif
++#ifdef EPROCUNAVAIL
++       case EPROCUNAVAIL: return "bad procedure for program";
++#endif
++#ifdef EPROGMISMATCH
++       case EPROGMISMATCH: return "program version wrong";
++#endif
++#ifdef EPROGUNAVAIL
++       case EPROGUNAVAIL: return "RPC program not available";
++#endif
++#ifdef EPROTO
++       case EPROTO: return "protocol error";
++#endif
++#ifdef EPROTONOSUPPORT
++       case EPROTONOSUPPORT: return "protocol not suppored";
++#endif
++#ifdef EPROTOTYPE
++       case EPROTOTYPE: return "protocol wrong type for socket";
++#endif
++#ifdef ERANGE
++       case ERANGE: return "math result unrepresentable";
++#endif
++#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED))
++       case EREFUSED: return "EREFUSED";
++#endif
++#ifdef EREMCHG
++       case EREMCHG: return "remote address changed";
++#endif
++#ifdef EREMDEV
++       case EREMDEV: return "remote device";
++#endif
++#ifdef EREMOTE
++       case EREMOTE: return "pathname hit remote file system";
++#endif
++#ifdef EREMOTEIO
++       case EREMOTEIO: return "remote i/o error";
++#endif
++#ifdef EREMOTERELEASE
++       case EREMOTERELEASE: return "EREMOTERELEASE";
++#endif
++#ifdef EROFS
++       case EROFS: return "read-only file system";
++#endif
++#ifdef ERPCMISMATCH
++       case ERPCMISMATCH: return "RPC version is wrong";
++#endif
++#ifdef ERREMOTE
++       case ERREMOTE: return "object is remote";
++#endif
++#ifdef ESHUTDOWN
++       case ESHUTDOWN: return "can't send afer socket shutdown";
++#endif
++#ifdef ESOCKTNOSUPPORT
++       case ESOCKTNOSUPPORT: return "socket type not supported";
++#endif
++#ifdef ESPIPE
++       case ESPIPE: return "invalid seek";
++#endif
++#ifdef ESRCH
++       case ESRCH: return "no such process";
++#endif
++#ifdef ESRMNT
++       case ESRMNT: return "srmount error";
++#endif
++#ifdef ESTALE
++       case ESTALE: return "stale remote file handle";
++#endif
++#ifdef ESUCCESS
++       case ESUCCESS: return "Error 0";
++#endif
++#if defined(ETIME) && (!defined(ELOOP) || (ETIME != ELOOP))
++       case ETIME: return "timer expired";
++#endif
++#if defined(ETIMEDOUT) && (!defined(ENOSTR) || (ETIMEDOUT != ENOSTR))
++       case ETIMEDOUT: return "connection timed out";
++#endif
++#ifdef ETOOMANYREFS
++       case ETOOMANYREFS: return "too many references: can't splice";
++#endif
++#ifdef ETXTBSY
++       case ETXTBSY: return "text file or pseudo-device busy";
++#endif
++#ifdef EUCLEAN
++       case EUCLEAN: return "structure needs cleaning";
++#endif
++#ifdef EUNATCH
++       case EUNATCH: return "protocol driver not attached";
++#endif
++#ifdef EUSERS
++       case EUSERS: return "too many users";
++#endif
++#ifdef EVERSION
++       case EVERSION: return "version mismatch";
++#endif
++#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
++       case EWOULDBLOCK: return "operation would block";
++#endif
++#ifdef EXDEV
++       case EXDEV: return "cross-domain link";
++#endif
++#ifdef EXFULL
++       case EXFULL: return "message tables full";
++#endif
++       default:
++#ifdef NO_STRERROR
++           return "unknown POSIX error";
++#else
++           return strerror(errno);
++#endif
++    }
++}
++
++/*
++ * end of excerpt from tcl8.0.X/generic/tclPosixStr.c
++ */
++
++/*
+  * stolen from exp_log.c - this function is called from the Expect library
+  * but the one that the library supplies calls Tcl functions.  So we supply
+  * our own.
+diff -up expect5.45/expect.h.orig expect5.45/expect.h
+--- expect5.45/expect.h.orig	2010-09-01 00:20:27.000000000 +0200
++++ expect5.45/expect.h	2015-05-19 12:00:58.674248152 +0200
+@@ -258,6 +258,46 @@ typedef long LONG;
+ typedef struct Tcl_RegExp_ *Tcl_RegExp;
+ 
+ /*
++ * The following declarations either map ckalloc and ckfree to
++ * malloc and free, or they map them to procedures with all sorts
++ * of debugging hooks defined in tclCkalloc.c.
++ */
++
++#ifdef TCL_MEM_DEBUG
++
++#  define Tcl_Alloc(x) Tcl_DbCkalloc(x, __FILE__, __LINE__)
++#  define Tcl_Free(x)  Tcl_DbCkfree(x, __FILE__, __LINE__)
++#  define Tcl_Realloc(x,y) Tcl_DbCkrealloc((x), (y),__FILE__, __LINE__)
++#  define ckalloc(x) Tcl_DbCkalloc(x, __FILE__, __LINE__)
++#  define ckfree(x)  Tcl_DbCkfree(x, __FILE__, __LINE__)
++#  define ckrealloc(x,y) Tcl_DbCkrealloc((x), (y),__FILE__, __LINE__)
++
++#else
++
++/*
++ * If USE_TCLALLOC is true, then we need to call Tcl_Alloc instead of
++ * the native malloc/free.  The only time USE_TCLALLOC should not be
++ * true is when compiling the Tcl/Tk libraries on Unix systems.  In this
++ * case we can safely call the native malloc/free directly as a performance
++ * optimization.
++ */
++
++#  if USE_TCLALLOC
++#     define ckalloc(x) Tcl_Alloc(x)
++#     define ckfree(x) Tcl_Free(x)
++#     define ckrealloc(x,y) Tcl_Realloc(x,y)
++#  else
++#     define ckalloc(x) malloc(x)
++#     define ckfree(x)  free(x)
++#     define ckrealloc(x,y) realloc(x,y)
++#  endif
++#  define Tcl_DumpActiveMemory(x)
++#  define Tcl_ValidateAllMemory(x,y)
++
++#endif /* !TCL_MEM_DEBUG */
++
++
++/*
+  * These function have been renamed. The old names are deprecated, but we
+  * define these macros for backwards compatibilty.
+  */
+@@ -268,6 +308,14 @@ typedef struct Tcl_RegExp_ *Tcl_RegExp;
+ #define Tcl_Return Tcl_SetResult
+ #define Tcl_TildeSubst Tcl_TranslateFileName
+ 
++/*
++ * In later releases, Tcl_Panic will be the correct name to use.  For now
++ * we leave it as panic to avoid breaking existing binaries.
++ */
++
++#define Tcl_Panic panic
++#define Tcl_PanicVA panicVA
++
+ #endif /* RESOURCE_INCLUDED */
+ 
+ #undef TCL_STORAGE_CLASS
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/expect.git/commitdiff/dade3e15ae2813f752d734b38e5bb25c847d214b



More information about the pld-cvs-commit mailing list