$NetBSD: patch-ae,v 1.5 2014/09/22 11:56:39 joerg Exp $

- avoid union wait
- force termios on all modern systems
- declare void functions void
- avoid implicit int
- don't declare own errno
- fix os conditionals (apparently with respect to VMS)
- call execl() and execlp() correctly
- don't synthesize vsprintf with fake arguments
- use ctype.h functions correctly

--- main.c.orig	2002-01-09 00:41:11.000000000 +0000
+++ main.c
@@ -63,15 +63,7 @@ SOFTWARE.
 #include <X11/Xaw/SimpleMenu.h>
 #include <pwd.h>
 #include <ctype.h>
-#ifdef linux
-#ifdef	__GLIBC__
-#if	__GLIBC_MINOR__<1
-#include <termbits.h>
-#else
 #include <termios.h>
-#endif	/* __GLIBC_MINOR__ */
-#endif	/* __GLIBC__ */
-#endif
 
 #ifdef DGUX /* dkim@surecom.com */
 /* DGUX is SVR4 but its SYSV side of TTY has bugs in it */
@@ -239,8 +231,18 @@ static Bool IsPts = False;
 #ifdef SVR4
 #define USE_POSIX_WAIT
 #endif
+#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || \
+    defined(__DragonFly__) || defined(__linux__)
+#ifndef USE_POSIX_WAIT
+#define USE_POSIX_WAIT
+#endif
+#ifndef USE_TERMIOS
+#define USE_TERMIOS
+#endif
+#endif
 
 #include <stdio.h>
+#include <stdarg.h>
 #include <errno.h>
 #include <setjmp.h>
 
@@ -391,6 +393,9 @@ extern char *ptsname();
 extern char *strindex ();
 extern void HandlePopupMenu();
 
+static void get_terminal (void);
+static void resize(TScreen *screen, char *TermName, char *oldtc, char *newtc);
+
 int switchfb[] = {0, 2, 1, 3};
 
 static SIGNAL_T reapchild ();
@@ -583,6 +588,8 @@ static int tslot;
 #endif	/* USE_SYSV_UTMP */
 static jmp_buf env;
 
+static void spawn (void);
+
 char *ProgramName;
 Boolean sunFunctionKeys;
 
@@ -805,9 +812,9 @@ static char *message[] = {
 "will be started.  Options that start with a plus sign (+) restore the default.",
 NULL};
 
-#ifndef USE_TERMIOS
-static remove_termcap_entry ();
-#endif
+/*#ifndef USE_TERMIOS*/
+static void remove_termcap_entry (char *, const char *);
+/*#endif*/
 
 static int abbrev (tst, cmp)
   char *tst, *cmp;
@@ -816,7 +823,7 @@ static int abbrev (tst, cmp)
     return ((len >= 2) && (!strncmp(tst, cmp, len)));
 }
 
-static Syntax (badOption)
+static void Syntax (badOption)
     char *badOption;
 {
     struct _options *opt;
@@ -842,13 +849,13 @@ static Syntax (badOption)
     exit (1);
 }
 
-static Version ()
+static void Version ()
 {
     printf("%s %s %s %s\n", HANTERM_PRODUCT, HANTERM_VERSION,
 	    HANTERM_RELEASE, HANTERM_RELEASEDATE);
     exit (0);
 }
-static Help ()
+static void Help ()
 {
     struct _options *opt;
     char **cpp;
@@ -960,6 +967,7 @@ XtActionsRec actionProcs[] = {
 
 Atom wm_delete_window;
 
+int
 main (argc, argv)
 int argc;
 char **argv;
@@ -1527,7 +1535,8 @@ char **argv;
 	if (ioctl (pty, FIONBIO, (char *)&mode) == -1) SysError (ERROR_FIONBIO);
 #endif	/* USE_SYSV_TERMIO */
 	
-#if defined(linux)||defined(SVR4)||(defined(hpux)&&OSMAJORVERSION>=10)
+
+#ifndef VMS
 	pty_mask = pty;
 	X_mask = Xsocket;
 	FD_ZERO(&Select_mask);
@@ -1566,6 +1575,7 @@ char *name;
  * has problems, we can re-enter this function and get another one.
  */
 
+int
 get_pty (pty)
     int *pty;
 {
@@ -1730,6 +1740,7 @@ int pty_search(pty)
     return 1;
 }
 
+static void
 get_terminal ()
 /* 
  * sets up X and initializes the terminal structure except for term.buf.fildes.
@@ -1854,7 +1865,7 @@ void first_map_occurred ()
 #endif /* USE_HANDSHAKE else !USE_HANDSHAKE */
 
 
-spawn ()
+static void spawn (void)
 /* 
  *  Inits pty and tty and forks a login process.
  *  Does not close fd Xsocket.
@@ -2983,10 +2994,10 @@ spawn ()
 
 #ifdef USE_LOGIN_DASH_P
 		if (term->misc.login_shell && pw && added_utmp_entry)
-		  execl (bin_login, "login", "-p", "-f", pw->pw_name, 0);
+		  execl (bin_login, "login", "-p", "-f", pw->pw_name, (void *)NULL);
 #endif
 		execlp (ptr, (term->misc.login_shell ? shname_minus : shname),
-			0);
+			(void *)NULL);
 
 		/* Exec failed. */
 		fprintf (stderr, "%s: Could not exec %s!\n", xterm_name, ptr);
@@ -3235,10 +3246,8 @@ Exit(n)
 }
 
 /* ARGSUSED */
-resize(screen, TermName, oldtc, newtc)
-TScreen *screen;
-char *TermName;
-register char *oldtc, *newtc;
+static void
+resize(TScreen *screen, char *TermName, char *oldtc, char *newtc)
 {
 #ifndef USE_SYSV_ENVVARS
 	register char *ptr1, *ptr2;
@@ -3329,18 +3338,20 @@ static SIGNAL_T reapchild (n)
 }
 
 /* VARARGS1 */
-consolepr(fmt,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)
-char *fmt;
+void
+consolepr(const char *fmt, ...)
 {
-	extern int errno;
 	extern char *SysErrorMsg();
 	int oerrno;
 	int f;
  	char buf[ BUFSIZ ];
+	va_list ap;
 
 	oerrno = errno;
  	strcpy(buf, "hanterm: ");
- 	sprintf(buf+strlen(buf), fmt, x0,x1,x2,x3,x4,x5,x6,x7,x8,x9);
+	va_start(ap, fmt);
+ 	vsnprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), fmt, ap);
+	va_end(ap);
  	strcat(buf, ": ");
  	strcat(buf, SysErrorMsg (oerrno));
  	strcat(buf, "\n");	
@@ -3356,10 +3367,8 @@ char *fmt;
 }
 
 
-#ifndef USE_TERMIOS
-static remove_termcap_entry (buf, str)
-    char *buf;
-    char *str;
+/*#ifndef USE_TERMIOS*/
+static void remove_termcap_entry (char *buf, const char *str)
 {
     register char *strinbuf;
 
@@ -3377,7 +3386,7 @@ static remove_termcap_entry (buf, str)
     }
     return;
 }
-#endif
+/*#endif*/
 
 /*
  * parse_tty_modes accepts lines of the following form:
@@ -3396,7 +3405,8 @@ static int parse_tty_modes (s, modelist)
     int count = 0;
 
     while (1) {
-	while (*s && isascii(*s) && isspace(*s)) s++;
+	while (*s && isascii((unsigned char)*s) && isspace((unsigned char)*s))
+	    s++;
 	if (!*s) return count;
 
 	for (mp = modelist; mp->name; mp++) {
