f3e6c7
diff -up netkit-telnet-0.17/telnetd/ext.h.sa-01-49 netkit-telnet-0.17/telnetd/ext.h
f3e6c7
--- netkit-telnet-0.17/telnetd/ext.h.sa-01-49	1999-12-12 15:59:44.000000000 +0100
f3e6c7
+++ netkit-telnet-0.17/telnetd/ext.h	2011-01-20 22:39:54.000000000 +0100
f3e6c7
@@ -86,7 +86,10 @@ extern char *neturg;		/* one past last b
f3e6c7
 extern int pcc, ncc;
f3e6c7
 
f3e6c7
 /* printf into netobuf */
f3e6c7
-void netoprintf(const char *fmt, ...) __attribute((format (printf, 1, 2))); 
f3e6c7
+/* void netoprintf(const char *fmt, ...) __attribute((format (printf, 1, 2))); */
f3e6c7
+#define netoprintf output_data
f3e6c7
+int	output_data(const char *, ...) __attribute((format (printf, 1, 2))); 
f3e6c7
+void	output_datalen(const char *, int);
f3e6c7
 
f3e6c7
 extern int pty, net;
f3e6c7
 extern char *line;
f3e6c7
@@ -182,7 +185,10 @@ void tty_setsofttab(int);
f3e6c7
 void tty_tspeed(int);
f3e6c7
 void willoption(int);
f3e6c7
 void wontoption(int);
f3e6c7
+
f3e6c7
+#if 0
f3e6c7
 void writenet(unsigned char *, int);
f3e6c7
+#endif
f3e6c7
 
f3e6c7
 #if defined(ENCRYPT)
f3e6c7
 extern void (*encrypt_output)(unsigned char *, int);
f3e6c7
diff -up netkit-telnet-0.17/telnetd/slc.c.sa-01-49 netkit-telnet-0.17/telnetd/slc.c
f3e6c7
--- netkit-telnet-0.17/telnetd/slc.c.sa-01-49	1999-12-12 15:59:44.000000000 +0100
f3e6c7
+++ netkit-telnet-0.17/telnetd/slc.c	2011-01-20 22:39:54.000000000 +0100
f3e6c7
@@ -183,7 +183,7 @@ int end_slc(unsigned char **bufp) {
f3e6c7
 	else {
f3e6c7
 	    snprintf(slcbuf+slcoff, sizeof(slcbuf)-slcoff, "%c%c", IAC, SE);
f3e6c7
 	    slcoff += 2;
f3e6c7
-	    writenet(slcbuf, slcoff);
f3e6c7
+	    output_datalen(slcbuf, slcoff);
f3e6c7
 	    netflush();  /* force it out immediately */
f3e6c7
 	}
f3e6c7
     }
f3e6c7
diff -up netkit-telnet-0.17/telnetd/state.c.sa-01-49 netkit-telnet-0.17/telnetd/state.c
f3e6c7
--- netkit-telnet-0.17/telnetd/state.c.sa-01-49	1999-12-12 20:41:44.000000000 +0100
f3e6c7
+++ netkit-telnet-0.17/telnetd/state.c	2011-01-20 22:43:34.000000000 +0100
f3e6c7
@@ -37,6 +37,7 @@
f3e6c7
 char state_rcsid[] = 
f3e6c7
   "$Id: state.c,v 1.12 1999/12/12 19:41:44 dholland Exp $";
f3e6c7
 
f3e6c7
+#include <stdarg.h>
f3e6c7
 #include "telnetd.h"
f3e6c7
 
f3e6c7
 int not42 = 1;
f3e6c7
@@ -1365,7 +1366,7 @@ void send_status(void) {
f3e6c7
     ADD(IAC);
f3e6c7
     ADD(SE);
f3e6c7
 
f3e6c7
-    writenet(statusbuf, ncp - statusbuf);
f3e6c7
+    output_datalen(statusbuf, ncp - statusbuf);
f3e6c7
     netflush();	/* Send it on its way */
f3e6c7
 
f3e6c7
     DIAG(TD_OPTIONS, {printsub('>', statusbuf, ncp - statusbuf); netflush();});
f3e6c7
diff -up netkit-telnet-0.17/telnetd/termstat.c.sa-01-49 netkit-telnet-0.17/telnetd/termstat.c
f3e6c7
--- netkit-telnet-0.17/telnetd/termstat.c.sa-01-49	1999-12-12 15:59:45.000000000 +0100
f3e6c7
+++ netkit-telnet-0.17/telnetd/termstat.c	2011-01-20 22:39:54.000000000 +0100
f3e6c7
@@ -128,7 +128,6 @@ static int _terminit = 0;
f3e6c7
 	void
f3e6c7
 localstat()
f3e6c7
 {
f3e6c7
-	void netflush();
f3e6c7
 	int need_will_echo = 0;
f3e6c7
 
f3e6c7
 	/*
f3e6c7
diff -up netkit-telnet-0.17/telnetd/utility.c.sa-01-49 netkit-telnet-0.17/telnetd/utility.c
f3e6c7
--- netkit-telnet-0.17/telnetd/utility.c.sa-01-49	2011-01-20 22:39:54.000000000 +0100
f3e6c7
+++ netkit-telnet-0.17/telnetd/utility.c	2011-01-20 22:48:02.000000000 +0100
f3e6c7
@@ -38,8 +38,10 @@ char util_rcsid[] = 
f3e6c7
   "$Id: utility.c,v 1.11 1999/12/12 14:59:45 dholland Exp $";
f3e6c7
 
f3e6c7
 #define PRINTOPTIONS
f3e6c7
+#define _GNU_SOURCE
f3e6c7
 
f3e6c7
 #include <stdarg.h>
f3e6c7
+#include <stdio.h>
f3e6c7
 #include <sys/utsname.h>
f3e6c7
 
f3e6c7
 #ifdef AUTHENTICATE
f3e6c7
@@ -52,6 +54,53 @@ char util_rcsid[] = 
f3e6c7
  * utility functions performing io related tasks
f3e6c7
  */
f3e6c7
 
f3e6c7
+/*
f3e6c7
+ * This function appends data to nfrontp and advances nfrontp.
f3e6c7
+ * Returns the number of characters written altogether (the
f3e6c7
+ * buffer may have been flushed in the process).
f3e6c7
+ */
f3e6c7
+
f3e6c7
+int
f3e6c7
+output_data(const char *format, ...)
f3e6c7
+{
f3e6c7
+	va_list args;
f3e6c7
+	int len;
f3e6c7
+	char *buf;
f3e6c7
+
f3e6c7
+	va_start(args, format);
f3e6c7
+	if ((len = vasprintf(&buf, format, args)) == -1)
f3e6c7
+		return -1;
f3e6c7
+	output_datalen(buf, len);
f3e6c7
+	va_end(args);
f3e6c7
+	free(buf);
f3e6c7
+	return (len);
f3e6c7
+}
f3e6c7
+
f3e6c7
+void
f3e6c7
+output_datalen(const char *buf, int len)
f3e6c7
+{
f3e6c7
+	int remaining, copied;
f3e6c7
+	
f3e6c7
+	remaining = BUFSIZ - (nfrontp - netobuf);
f3e6c7
+	while (len > 0) {
f3e6c7
+		/* Free up enough space if the room is too low*/
f3e6c7
+		if ((len > BUFSIZ ? BUFSIZ : len) > remaining) {
f3e6c7
+			netflush();
f3e6c7
+			remaining = BUFSIZ - (nfrontp - netobuf);
f3e6c7
+		}
f3e6c7
+
f3e6c7
+		/* Copy out as much as will fit */
f3e6c7
+		copied = remaining > len ? len : remaining;
f3e6c7
+		memmove(nfrontp, buf, copied);
f3e6c7
+		nfrontp += copied;
f3e6c7
+		len -= copied;
f3e6c7
+		remaining -= copied;
f3e6c7
+		buf += copied;
f3e6c7
+	}
f3e6c7
+	return;
f3e6c7
+}
f3e6c7
+
f3e6c7
+/**
f3e6c7
 void
f3e6c7
 netoprintf(const char *fmt, ...)
f3e6c7
 {
f3e6c7
@@ -67,7 +116,7 @@ netoprintf(const char *fmt, ...)
f3e6c7
       va_end(ap);
f3e6c7
 
f3e6c7
       if (len<0 || len==maxsize) {
f3e6c7
-	 /* didn't fit */
f3e6c7
+		/ * did not fit * /
f3e6c7
 	 netflush();
f3e6c7
       }
f3e6c7
       else {
f3e6c7
@@ -76,6 +125,7 @@ netoprintf(const char *fmt, ...)
f3e6c7
    }
f3e6c7
    nfrontp += len;
f3e6c7
 }
f3e6c7
+*/
f3e6c7
 
f3e6c7
 /*
f3e6c7
  * ttloop
f3e6c7
@@ -273,10 +323,15 @@ netflush(void)
f3e6c7
     int n;
f3e6c7
 
f3e6c7
     if ((n = nfrontp - nbackp) > 0) {
f3e6c7
+
f3e6c7
+#if 0
f3e6c7
+	/* XXX This causes output_data() to recurse and die */
f3e6c7
 	DIAG(TD_REPORT,
f3e6c7
 	    { netoprintf("td: netflush %d chars\r\n", n);
f3e6c7
 	      n = nfrontp - nbackp;  /* update count */
f3e6c7
 	    });
f3e6c7
+#endif
f3e6c7
+
f3e6c7
 #if	defined(ENCRYPT)
f3e6c7
 	if (encrypt_output) {
f3e6c7
 		char *s = nclearto ? nclearto : nbackp;
f3e6c7
@@ -310,11 +365,14 @@ netflush(void)
f3e6c7
 	    }
f3e6c7
 	}
f3e6c7
     }
f3e6c7
-    if (n < 0) {
f3e6c7
-	if (errno == EWOULDBLOCK || errno == EINTR)
f3e6c7
-		return;
f3e6c7
-	cleanup(0);
f3e6c7
-    }
f3e6c7
+
f3e6c7
+	 if (n == -1) {
f3e6c7
+		if (errno == EWOULDBLOCK || errno == EINTR)
f3e6c7
+		  return;
f3e6c7
+		cleanup(0);
f3e6c7
+		/* NOTREACHED */
f3e6c7
+	 }
f3e6c7
+
f3e6c7
     nbackp += n;
f3e6c7
 #if	defined(ENCRYPT)
f3e6c7
     if (nbackp > nclearto)
f3e6c7
@@ -332,7 +390,7 @@ netflush(void)
f3e6c7
     return;
f3e6c7
 }  /* end of netflush */
f3e6c7
 
f3e6c7
-
f3e6c7
+#if 0
f3e6c7
 /*
f3e6c7
  * writenet
f3e6c7
  *
f3e6c7
@@ -355,7 +413,7 @@ void writenet(register unsigned char *pt
f3e6c7
 	nfrontp += len;
f3e6c7
 
f3e6c7
 }  /* end of writenet */
f3e6c7
-
f3e6c7
+#endif
f3e6c7
 
f3e6c7
 /*
f3e6c7
  * miscellaneous functions doing a variety of little jobs follow ...