From 2f5f53bbdcac6430c72109e0510a46b461a45dd9 Mon Sep 17 00:00:00 2001
From: Lev Kujawski <int21h@mailbox.org>
Date: Wed, 6 Jan 2021 12:24:44 -0700
Subject: [PATCH 6/8] Fix incompatibilites between the Desktop Korn Shell and
 the musl C library:

- Only check for POSIX's termios.h when deciding to use the POSIX terminal interfaces.
- Check for C99's va_copy in addition to __va_copy.
---
 .../ksh93/src/cmd/ksh93/feature/options.sh    |  1 -
 .../ksh93/src/lib/libast/hash/hashalloc.c     | 12 ++++++---
 .../ksh93/src/lib/libast/sfio/sfvprintf.c     | 25 +++++++++++--------
 .../ksh93/src/lib/libast/sfio/sfvscanf.c      | 14 ++++++++---
 .../ksh93/src/lib/libast/string/tokscan.c     | 11 +++++---
 5 files changed, 42 insertions(+), 21 deletions(-)

diff --git a/cde/programs/dtksh/ksh93/src/cmd/ksh93/feature/options.sh b/cde/programs/dtksh/ksh93/src/cmd/ksh93/feature/options.sh
index 9325e5fb..d9801737 100644
--- a/cde/programs/dtksh/ksh93/src/cmd/ksh93/feature/options.sh
+++ b/cde/programs/dtksh/ksh93/src/cmd/ksh93/feature/options.sh
@@ -42,7 +42,6 @@ do	: This could be done with eval, but eval broken in some shells
 	KIA)		j=$KIA;;
 	MULTIBYTE)	j=$MULTIBYTE;;
 	OLDTERMIO)	echo "#include <sys/termios.h>" > /tmp/dummy$$.c
-			echo "#include <sys/termio.h>" >>/tmp/dummy$$.c
 			if	${CC-cc} -E /tmp/dummy$$.c > /dev/null 2>&1
 			then	j=$OLDTERMIO
 			fi
diff --git a/cde/programs/dtksh/ksh93/src/lib/libast/hash/hashalloc.c b/cde/programs/dtksh/ksh93/src/lib/libast/hash/hashalloc.c
index 3f5e0ae8..87c46bee 100644
--- a/cde/programs/dtksh/ksh93/src/lib/libast/hash/hashalloc.c
+++ b/cde/programs/dtksh/ksh93/src/lib/libast/hash/hashalloc.c
@@ -96,6 +96,12 @@ static const char id_hash[] = "\n@(#)hash (AT&T Bell Laboratories) 05/09/95\0\n"
 
 #include "hashlib.h"
 
+#if defined(va_copy)
+#define __VA_COPY__(d,s) va_copy(d,s)
+#else
+#define __VA_COPY__(d,s) __va_copy(d,s)
+#endif
+
 #if _DLL_INDIRECT_DATA && !_DLL
 static Hash_info_t	hash_info_data;
 Hash_info_t		hash_info = &hash_info_data;
@@ -222,10 +228,10 @@ hashalloc __PARAM__((Hash_table_t* ref, ...), (va_alist)) __OTORP__(va_dcl)
 #else
 			if (vp < &va[elementsof(va)])
 			{
-				__va_copy( *vp, ap );
+				__VA_COPY__( *vp, ap );
 				vp++;
 			}
-			__va_copy(ap, va_listval(va_arg(ap, va_listarg)));
+			__VA_COPY__(ap, va_listval(va_arg(ap, va_listarg)));
 #endif
 			break;
 		case 0:
@@ -235,7 +241,7 @@ hashalloc __PARAM__((Hash_table_t* ref, ...), (va_alist)) __OTORP__(va_dcl)
 				ap = *--vp;
 #else
 				vp--;
-				__va_copy( ap, *vp );
+				__VA_COPY__( ap, *vp );
 #endif
 				break;
 			}
diff --git a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvprintf.c b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvprintf.c
index e47c990e..94e17ea6 100644
--- a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvprintf.c
+++ b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvprintf.c
@@ -56,6 +56,12 @@
 #define HIGHBIT		(~(((ulong)~0L) >> 1))
 #endif
 
+#if defined(va_copy)
+#define __VA_COPY__(d,s) va_copy(d,s)
+#elif defined(__va_copy)
+#define __VA_COPY__(d,s) __va_copy(d,s)
+#endif
+
 #define F_LEFT		000001	/* left justification (-)		*/
 #define F_SIGN		000002	/* must set a sign - or +		*/
 #define F_BLANK		000004	/* if not - and +, then prepend a blank */
@@ -92,10 +98,10 @@
 	}
 #define GETARGL(elt,arge,argf,args,etype,type,fmt,t_user,n_user) \
 	{ if(!argf) \
-		__va_copy( elt, va_arg(args,type) ); \
+		__VA_COPY__( *elt, *va_arg(args,type) ); \
 	  else if((*argf)(fmt,(char*)(&arge),t_user,n_user) < 0) \
 		goto pop_fa; \
-	  else	__va_copy( elt, arge ); \
+	  else	__VA_COPY__( *elt, *arge ); \
 	}
 
 #if __STD_C
@@ -301,15 +307,14 @@ loop_fa :
 			GETARG(form,form,argf,args,char*,char*,'1',t_user,n_user);
 			if(!form)
 				form = "";
-#if (defined(CSRG_BASED) && !defined(__LP64__)) || \
-    (defined(__linux__) && !defined(__LP64__)) || defined(sun)
+#if defined(__VA_COPY__)
+			GETARGL(argsp,argsp,argf,args,va_list*,va_list*,'2',t_user,n_user);
+			__VA_COPY__( fa->args, args );
+			__VA_COPY__( args, *argsp );
+#else
 			GETARG(argsp,argsp,argf,args,va_list*,va_list*,'2',t_user,n_user);
 			memcpy((Void_t*)(&(fa->args)), (Void_t*)(&args), sizeof(va_list));
 			memcpy((Void_t*)(&args), (Void_t*)argsp, sizeof(va_list));
-#else
-			GETARGL(argsp,argsp,argf,args,va_list*,va_list*,'2',t_user,n_user);
-			__va_copy( fa->args, args );
-			__va_copy( args, argsp );
 #endif
 			fa->argf.p = argf;
 			fa->extf.p = extf;
@@ -324,7 +329,7 @@ loop_fa :
 				va_list savarg = args;  /* is this portable? */
 #else
 				va_list	savarg; 	/* is this portable?   Sorry .. NO. */
-				__va_copy( savarg, args );
+				__VA_COPY__( savarg, args );
 #endif
 
 				GETARG(sp,astr,argf,args,char*,char*,fmt,t_user,n_user);
@@ -336,7 +341,7 @@ loop_fa :
 #if defined(CSRG_BASED) && !defined(__LP64__)
 				args = savarg;  /* extf failed, treat as if unmatched */
 #else
-				__va_copy( args, savarg ); /* extf failed, treat as if unmatched */
+				__VA_COPY__( args, savarg ); /* extf failed, treat as if unmatched */
 #endif
 			}
 
diff --git a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvscanf.c b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvscanf.c
index 26ec8987..a3a16c13 100644
--- a/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvscanf.c
+++ b/cde/programs/dtksh/ksh93/src/lib/libast/sfio/sfvscanf.c
@@ -61,6 +61,12 @@
 #endif
 #endif
 
+#if defined(va_copy)
+#define __VA_COPY__(d,s) va_copy(d,s)
+#elif defined(__va_copy)
+#define __VA_COPY__(d,s) __va_copy(d,s)
+#endif
+
 #define MAXLENGTH	(int)(((uint)~0)>>1)
 
 #define a2f(s)	strtod(s,NIL(char**))
@@ -236,10 +242,10 @@ loop_fa :
 			fa->form = (char*)form;
 			if(!(form = va_arg(args,char*)))
 				form = "";
-#ifdef __ppc
-			__va_copy( argsp, va_arg(args,va_list*) );
-			__va_copy( fa->args, args );
-			__va_copy( args, argsp );
+#if defined(__VA_COPY__)
+			__VA_COPY__( *argsp, *va_arg(args,va_list*) );
+			__VA_COPY__( fa->args, args );
+			__VA_COPY__( args, *argsp );
 #else
 			argsp = va_arg(args,va_list*);
 			memcpy((Void_t*)(&(fa->args)), (Void_t*)(&args), sizeof(va_list));
diff --git a/cde/programs/dtksh/ksh93/src/lib/libast/string/tokscan.c b/cde/programs/dtksh/ksh93/src/lib/libast/string/tokscan.c
index e669121e..bb28c6e8 100644
--- a/cde/programs/dtksh/ksh93/src/lib/libast/string/tokscan.c
+++ b/cde/programs/dtksh/ksh93/src/lib/libast/string/tokscan.c
@@ -93,6 +93,11 @@
 #define va_listarg		va_list*
 #endif
 #include <ast.h>
+#if defined(va_copy)
+#define __VA_COPY__(d,s) va_copy(d,s)
+#else
+#define __VA_COPY__(d,s) __va_copy(d,s)
+#endif
 
 static char	empty[1];
 
@@ -229,7 +234,7 @@ tokscan __PARAM__((char* s, char** nxt, const char* fmt, ...), (va_alist)) __OTO
 		if (f = prv_f)
 		{
 			prv_f = 0;
-			__va_copy( ap, prv_ap );
+			__VA_COPY__( ap, prv_ap );
 			continue;
 		}
 		goto done;
@@ -258,8 +263,8 @@ tokscan __PARAM__((char* s, char** nxt, const char* fmt, ...), (va_alist)) __OTO
 		case ':':
 			prv_f = f;
 			f = va_arg(ap, char*);
-			__va_copy( prv_ap, ap );
-			__va_copy(ap, va_listval(va_arg(ap, va_listarg)));
+			__VA_COPY__( prv_ap, ap );
+			__VA_COPY__(ap, va_listval(va_arg(ap, va_listarg)));
 			continue;
 		case 'c':
 			p_char = va_arg(ap, char*);
-- 
2.30.0

