summaryrefslogtreecommitdiff
path: root/net/SSLtelnet/files/patch-an
diff options
context:
space:
mode:
Diffstat (limited to 'net/SSLtelnet/files/patch-an')
-rw-r--r--net/SSLtelnet/files/patch-an1320
1 files changed, 1320 insertions, 0 deletions
diff --git a/net/SSLtelnet/files/patch-an b/net/SSLtelnet/files/patch-an
new file mode 100644
index 000000000000..7d2a742426ec
--- /dev/null
+++ b/net/SSLtelnet/files/patch-an
@@ -0,0 +1,1320 @@
+diff -u telnetd.old/authenc.c telnetd/authenc.c
+--- telnetd.old/authenc.c Fri Oct 15 05:47:52 1993
++++ telnetd/authenc.c Fri Aug 2 11:02:09 2002
+@@ -45,8 +45,7 @@
+ int len;
+ {
+ if (nfrontp + len < netobuf + BUFSIZ) {
+- memcpy((void *)nfrontp, (void *)str, len);
+- nfrontp += len;
++ output_datalen(str, len);
+ return(len);
+ }
+ return(0);
+diff -u telnetd.old/ext.h telnetd/ext.h
+--- telnetd.old/ext.h Sat Aug 2 14:55:54 1997
++++ telnetd/ext.h Thu Aug 1 14:56:01 2002
+@@ -74,7 +74,8 @@
+
+ extern char netibuf[BUFSIZ], *netip;
+
+-extern char netobuf[BUFSIZ+NETSLOP], *nfrontp, *nbackp;
++/* extern char netobuf[BUFSIZ+NETSLOP], *nfrontp, *nbackp; */
++extern char netobuf[BUFSIZ], *nfrontp, *nbackp;
+ extern char *neturg; /* one past last bye of urgent data */
+
+ extern int pcc, ncc;
+@@ -183,8 +184,13 @@
+ tty_setsofttab P((int)),
+ tty_tspeed P((int)),
+ willoption P((int)),
+- wontoption P((int)),
+- writenet P((unsigned char *, int));
++ /*wontoption P((int)),
++ writenet P((unsigned char *, int));*/
++ wontoption P((int));
++
++int output_data __P((const char *, ...)) __printflike(1, 2);
++void output_datalen __P((const char *, int));
++
+
+ #if defined(ENCRYPT)
+ extern void (*encrypt_output) P((unsigned char *, int));
+diff -u telnetd.old/slc.c telnetd/slc.c
+--- telnetd.old/slc.c Fri Oct 15 05:48:20 1993
++++ telnetd/slc.c Fri Aug 2 11:03:20 2002
+@@ -172,7 +172,6 @@
+ register unsigned char **bufp;
+ {
+ register int len;
+- void netflush();
+
+ /*
+ * If a change has occured, store the new terminal control
+@@ -200,7 +199,7 @@
+ (void) sprintf((char *)slcptr, "%c%c", IAC, SE);
+ slcptr += 2;
+ len = slcptr - slcbuf;
+- writenet(slcbuf, len);
++ output_datalen(slcbuf, len);
+ netflush(); /* force it out immediately */
+ }
+ }
+diff -u telnetd.old/state.c telnetd/state.c
+--- telnetd.old/state.c Fri Oct 15 05:49:12 1993
++++ telnetd/state.c Fri Aug 2 10:08:59 2002
+@@ -35,6 +35,7 @@
+ static char sccsid[] = "@(#)state.c 5.10 (Berkeley) 3/22/91";
+ #endif /* not lint */
+
++#include <stdarg.h>
+ #include "telnetd.h"
+ #if defined(AUTHENTICATE)
+ #include <libtelnet/auth.h>
+@@ -193,8 +194,7 @@
+ }
+
+ netclear(); /* clear buffer back */
+- *nfrontp++ = IAC;
+- *nfrontp++ = DM;
++ output_data("%c%c", IAC, DM);
+ neturg = nfrontp-1; /* off by one XXX */
+ DIAG(TD_OPTIONS,
+ printoption("td: send IAC", DM));
+@@ -447,8 +447,7 @@
+ set_his_want_state_will(option);
+ do_dont_resp[option]++;
+ }
+- (void) sprintf(nfrontp, doopt, option);
+- nfrontp += sizeof (dont) - 2;
++ output_data((const char *)doopt, option);
+
+ DIAG(TD_OPTIONS, printoption("td: send do", option));
+ }
+@@ -661,8 +660,7 @@
+ set_his_want_state_wont(option);
+ do_dont_resp[option]++;
+ }
+- (void) sprintf(nfrontp, dont, option);
+- nfrontp += sizeof (doopt) - 2;
++ output_data((const char *)dont, option);
+
+ DIAG(TD_OPTIONS, printoption("td: send dont", option));
+ }
+@@ -807,8 +805,7 @@
+ set_my_want_state_will(option);
+ will_wont_resp[option]++;
+ }
+- (void) sprintf(nfrontp, will, option);
+- nfrontp += sizeof (doopt) - 2;
++ output_data((const char *)will, option);
+
+ DIAG(TD_OPTIONS, printoption("td: send will", option));
+ }
+@@ -963,8 +960,7 @@
+ set_my_want_state_wont(option);
+ will_wont_resp[option]++;
+ }
+- (void) sprintf(nfrontp, wont, option);
+- nfrontp += sizeof (wont) - 2;
++ output_data((const char *)wont, option);
+
+ DIAG(TD_OPTIONS, printoption("td: send wont", option));
+ }
+@@ -1435,9 +1431,57 @@
+ ADD(IAC);
+ ADD(SE);
+
+- writenet(statusbuf, ncp - statusbuf);
++ /*writenet(statusbuf, ncp - statusbuf);*/
++ output_datalen(statusbuf, ncp - statusbuf);
+ netflush(); /* Send it on its way */
+
+ DIAG(TD_OPTIONS,
+ {printsub('>', statusbuf, ncp - statusbuf); netflush();});
++}
++
++
++/*
++ * This function appends data to nfrontp and advances nfrontp.
++ * Returns the number of characters written altogether (the
++ * buffer may have been flushed in the process).
++ */
++
++int
++output_data(const char *format, ...)
++{
++ va_list args;
++ int len;
++ char *buf;
++
++ va_start(args, format);
++ if ((len = vasprintf(&buf, format, args)) == -1)
++ return -1;
++ output_datalen(buf, len);
++ va_end(args);
++ free(buf);
++ return (len);
++}
++
++void
++output_datalen(const char *buf, int len)
++{
++ int remaining, copied;
++
++ remaining = BUFSIZ - (nfrontp - netobuf);
++ while (len > 0) {
++ /* Free up enough space if the room is too low*/
++ if ((len > BUFSIZ ? BUFSIZ : len) > remaining) {
++ netflush();
++ remaining = BUFSIZ - (nfrontp - netobuf);
++ }
++
++ /* Copy out as much as will fit */
++ copied = remaining > len ? len : remaining;
++ memmove(nfrontp, buf, copied);
++ nfrontp += copied;
++ len -= copied;
++ remaining -= copied;
++ buf += copied;
++ }
++ return;
+ }
+diff -u telnetd.old/telnetd.c telnetd/telnetd.c
+--- telnetd.old/telnetd.c Fri Aug 2 11:08:49 2002
++++ telnetd/telnetd.c Fri Aug 2 10:14:08 2002
+@@ -704,25 +704,22 @@
+ if (his_state_is_will(TELOPT_TSPEED)) {
+ static char sbbuf[] = { IAC, SB, TELOPT_TSPEED, TELQUAL_SEND, IAC, SE };
+
+- memcpy(nfrontp, sbbuf,sizeof sbbuf);
+- nfrontp += sizeof sbbuf;
++ output_datalen(sbbuf, sizeof sbbuf);
++
+ }
+ if (his_state_is_will(TELOPT_XDISPLOC)) {
+ static char sbbuf[] = { IAC, SB, TELOPT_XDISPLOC, TELQUAL_SEND, IAC, SE };
+
+- memcpy(nfrontp, sbbuf,sizeof sbbuf);
+- nfrontp += sizeof sbbuf;
++ output_datalen(sbbuf, sizeof sbbuf);
+ }
+ if (his_state_is_will(TELOPT_ENVIRON)) {
+ static char sbbuf[] = { IAC, SB, TELOPT_ENVIRON, TELQUAL_SEND, IAC, SE };
+
+- memcpy(nfrontp, sbbuf,sizeof sbbuf);
+- nfrontp += sizeof sbbuf;
++ output_datalen(sbbuf, sizeof sbbuf);
+ }
+ if (his_state_is_will(TELOPT_TTYPE)) {
+
+- memcpy(nfrontp,ttytype_sbbuf, sizeof ttytype_sbbuf);
+- nfrontp += sizeof ttytype_sbbuf;
++ output_datalen(ttytype_sbbuf, sizeof ttytype_sbbuf);
+ }
+ if (his_state_is_will(TELOPT_TSPEED)) {
+ while (sequenceIs(tspeedsubopt, baseline))
+@@ -791,8 +788,7 @@
+ if (his_state_is_wont(TELOPT_TTYPE))
+ return;
+ settimer(baseline);
+- memcpy(nfrontp,ttytype_sbbuf, sizeof ttytype_sbbuf);
+- nfrontp += sizeof ttytype_sbbuf;
++ output_datalen(ttytype_sbbuf, sizeof ttytype_sbbuf);
+ while (sequenceIs(ttypesubopt, baseline))
+ ttloop();
+ }
+@@ -978,7 +974,7 @@
+ char *HE;
+ char *HN;
+ char *IM;
+- void netflush();
++ /*void netflush();*/
+
+ /*
+ * Initialize the slc mapping table.
+@@ -1062,9 +1058,7 @@
+ * mode, which we do not want.
+ */
+ if (his_want_state_is_will(TELOPT_ECHO)) {
+- DIAG(TD_OPTIONS,
+- {sprintf(nfrontp, "td: simulating recv\r\n");
+- nfrontp += strlen(nfrontp);});
++ DIAG(TD_OPTIONS, output_data("td: simulating recv\r\n"));
+ willoption(TELOPT_ECHO);
+ }
+
+@@ -1207,8 +1201,7 @@
+ #endif /* LINEMODE */
+
+ DIAG(TD_REPORT,
+- {sprintf(nfrontp, "td: Entering processing loop\r\n");
+- nfrontp += strlen(nfrontp);});
++ output_data("td: Entering processing loop\r\n"));
+
+ #ifdef convex
+ startslave(host);
+@@ -1346,8 +1339,7 @@
+ netip = netibuf;
+ }
+ DIAG((TD_REPORT | TD_NETDATA),
+- {sprintf(nfrontp, "td: netread %d chars\r\n", ncc);
+- nfrontp += strlen(nfrontp);});
++ output_data("td: netread %d chars\r\n", ncc));
+ DIAG(TD_NETDATA, printdata("nd", netip, ncc));
+ }
+
+@@ -1401,19 +1393,17 @@
+ * royally if we send them urgent
+ * mode data.
+ */
+- *nfrontp++ = IAC;
+- *nfrontp++ = DM;
++ output_data("%c%c", IAC, DM);
+ neturg = nfrontp-1; /* off by one XXX */
+ #endif
+ }
+ if (his_state_is_will(TELOPT_LFLOW) &&
+ (ptyibuf[0] &
+ (TIOCPKT_NOSTOP|TIOCPKT_DOSTOP))) {
+- (void) sprintf(nfrontp, "%c%c%c%c%c%c",
++ output_data("%c%c%c%c%c%c",
+ IAC, SB, TELOPT_LFLOW,
+ ptyibuf[0] & TIOCPKT_DOSTOP ? 1 : 0,
+ IAC, SE);
+- nfrontp += 6;
+ }
+ pcc--;
+ ptyip = ptyibuf+1;
+@@ -1436,19 +1426,19 @@
+ break;
+ c = *ptyip++ & 0377, pcc--;
+ if (c == IAC)
+- *nfrontp++ = c;
++ output_data("%c", c);
+ #if defined(CRAY2) && defined(UNICOS5)
+ else if (c == '\n' &&
+ my_state_is_wont(TELOPT_BINARY) && newmap)
+- *nfrontp++ = '\r';
++ output_data("\r");
+ #endif /* defined(CRAY2) && defined(UNICOS5) */
+- *nfrontp++ = c;
++ output_data("%c", c);
+ if ((c == '\r') && (my_state_is_wont(TELOPT_BINARY))) {
+ if (pcc > 0 && ((*ptyip & 0377) == '\n')) {
+- *nfrontp++ = *ptyip++ & 0377;
++ output_data("%c", *ptyip++ & 0377);
+ pcc--;
+ } else
+- *nfrontp++ = '\0';
++ output_data("%c", '\0');
+ }
+ }
+ #if defined(CRAY2) && defined(UNICOS5)
+@@ -1543,8 +1533,7 @@
+ return;
+ }
+ #endif
+- (void) strcpy(nfrontp, "\r\n[Yes]\r\n");
+- nfrontp += 9;
++ output_data("\r\n[Yes]\r\n");
+ }
+
+ void
+diff -u telnetd.old/termstat.c telnetd/termstat.c
+--- telnetd.old/termstat.c Fri Oct 15 05:54:55 1993
++++ telnetd/termstat.c Fri Aug 2 10:14:53 2002
+@@ -130,7 +130,7 @@
+ void
+ localstat()
+ {
+- void netflush();
++ /*void netflush();*/
+ int need_will_echo = 0;
+
+ #if defined(CRAY2) && defined(UNICOS5)
+@@ -166,9 +166,8 @@
+ if (his_state_is_will(TELOPT_LFLOW)) {
+ if (tty_flowmode() != flowmode) {
+ flowmode = tty_flowmode();
+- (void) sprintf(nfrontp, "%c%c%c%c%c%c", IAC, SB,
++ output_data("%c%c%c%c%c%c",
+ TELOPT_LFLOW, flowmode, IAC, SE);
+- nfrontp += 6;
+ }
+ }
+
+@@ -286,10 +285,9 @@
+ # endif /* KLUDGELINEMODE */
+ send_do(TELOPT_LINEMODE, 1);
+ /* send along edit modes */
+- (void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC, SB,
++ output_data("%c%c%c%c%c%c%c", IAC, SB,
+ TELOPT_LINEMODE, LM_MODE, useeditmode,
+ IAC, SE);
+- nfrontp += 7;
+ editmode = useeditmode;
+ # ifdef KLUDGELINEMODE
+ }
+@@ -315,10 +313,9 @@
+ /*
+ * Send along appropriate edit mode mask.
+ */
+- (void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC, SB,
++ output_data("%c%c%c%c%c%c%c", IAC, SB,
+ TELOPT_LINEMODE, LM_MODE, useeditmode,
+ IAC, SE);
+- nfrontp += 7;
+ editmode = useeditmode;
+ }
+
+@@ -420,10 +417,9 @@
+ useeditmode |= MODE_SOFT_TAB;
+ if (tty_islitecho())
+ useeditmode |= MODE_LIT_ECHO;
+- (void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC,
++ output_data("%c%c%c%c%c%c%c", IAC,
+ SB, TELOPT_LINEMODE, LM_MODE,
+ useeditmode, IAC, SE);
+- nfrontp += 7;
+ editmode = useeditmode;
+ }
+
+@@ -477,11 +473,10 @@
+ set_termbuf();
+
+ if (!ack) {
+- (void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC,
++ output_data("%c%c%c%c%c%c%c", IAC,
+ SB, TELOPT_LINEMODE, LM_MODE,
+ useeditmode|MODE_ACK,
+ IAC, SE);
+- nfrontp += 7;
+ }
+
+ editmode = useeditmode;
+diff -u telnetd.old/utility.c telnetd/utility.c
+--- telnetd.old/utility.c Mon Aug 26 11:06:43 1996
++++ telnetd/utility.c Fri Aug 2 10:01:52 2002
+@@ -54,11 +54,10 @@
+ void
+ ttloop()
+ {
+- void netflush();
++ /*void netflush();*/
+
+- DIAG(TD_REPORT, {sprintf(nfrontp, "td: ttloop\r\n");
+- nfrontp += strlen(nfrontp);});
+- if (nfrontp-nbackp) {
++ DIAG(TD_REPORT, output_data("td: ttloop\r\n"));
++ if (nfrontp - nbackp > 0) {
+ netflush();
+ }
+ #ifdef USE_SSL
+@@ -74,8 +73,7 @@
+ syslog(LOG_INFO, "ttloop: peer died: %m\n");
+ exit(1);
+ }
+- DIAG(TD_REPORT, {sprintf(nfrontp, "td: ttloop read %d chars\r\n", ncc);
+- nfrontp += strlen(nfrontp);});
++ DIAG(TD_REPORT, output_data("td: ttloop read %d chars\r\n", ncc));
+ netip = netibuf;
+ telrcv(); /* state machine */
+ if (ncc > 0) {
+@@ -117,9 +115,8 @@
+ int n;
+
+ if ((n = pfrontp - pbackp) > 0) {
+- DIAG((TD_REPORT | TD_PTYDATA),
+- { sprintf(nfrontp, "td: ptyflush %d chars\r\n", n);
+- nfrontp += strlen(nfrontp); });
++ DIAG(TD_REPORT | TD_PTYDATA,
++ output_data("td: ptyflush %d chars\r\n", n));
+ DIAG(TD_PTYDATA, printdata("pd", pbackp, n));
+ n = write(pty, pbackp, n);
+ }
+@@ -249,12 +246,13 @@
+ int n;
+ extern int not42;
+
+- if ((n = nfrontp - nbackp) > 0) {
+- DIAG(TD_REPORT,
+- { sprintf(nfrontp, "td: netflush %d chars\r\n", n);
+- n += strlen(nfrontp); /* get count first */
+- nfrontp += strlen(nfrontp); /* then move pointer */
+- });
++ while ((n = nfrontp - nbackp) > 0) {
++#if 0
++ /* XXX This causes output_data() to recurse and die */
++ DIAG(TD_REPORT, {
++ n += output_data("td: netflush %d chars\r\n", n);
++ });
++#endif
+ #if defined(ENCRYPT)
+ if (encrypt_output) {
+ char *s = nclearto ? nclearto : nbackp;
+@@ -302,13 +300,33 @@
+ n = send(net, nbackp, n, MSG_OOB); /* URGENT data */
+ }
+ }
++ if (n == -1) {
++ if (errno == EWOULDBLOCK || errno == EINTR)
++ continue;
++ cleanup(0);
++ /* NOTREACHED */
++ }
++ nbackp += n;
++#if defined(ENCRYPT)
++ if (nbackp > nclearto)
++ nclearto = 0;
++#endif
++ if (nbackp >= neturg) {
++ neturg = 0;
++ }
++ if (nbackp == nfrontp) {
++ nbackp = nfrontp = netobuf;
++#if defined(ENCRYPT)
++ nclearto = 0;
++#endif
++ }
+ }
+ if (n < 0) {
+ if (errno == EWOULDBLOCK || errno == EINTR)
+ return;
+ cleanup(0);
+ }
+- nbackp += n;
++/* nbackp += n;
+ #if defined(ENCRYPT)
+ if (nbackp > nclearto)
+ nclearto = 0;
+@@ -321,39 +339,12 @@
+ #if defined(ENCRYPT)
+ nclearto = 0;
+ #endif
+- }
++ }*/
+ return;
+ } /* end of netflush */
+
+
+ /*
+- * writenet
+- *
+- * Just a handy little function to write a bit of raw data to the net.
+- * It will force a transmit of the buffer if necessary
+- *
+- * arguments
+- * ptr - A pointer to a character string to write
+- * len - How many bytes to write
+- */
+- void
+-writenet(ptr, len)
+- register unsigned char *ptr;
+- register int len;
+-{
+- /* flush buffer if no room for new data) */
+- if ((&netobuf[BUFSIZ] - nfrontp) < len) {
+- /* if this fails, don't worry, buffer is a little big */
+- netflush();
+- }
+-
+- memcpy(nfrontp, ptr,len);
+- nfrontp += len;
+-
+-} /* end of writenet */
+-
+-
+-/*
+ * miscellaneous functions doing a variety of little jobs follow ...
+ */
+
+@@ -541,12 +532,11 @@
+ register int option;
+ {
+ if (TELOPT_OK(option))
+- sprintf(nfrontp, "%s %s\r\n", fmt, TELOPT(option));
++ output_data("%s %s\r\n", fmt, TELOPT(option));
+ else if (TELCMD_OK(option))
+- sprintf(nfrontp, "%s %s\r\n", fmt, TELCMD(option));
++ output_data("%s %s\r\n", fmt, TELCMD(option));
+ else
+- sprintf(nfrontp, "%s %d\r\n", fmt, option);
+- nfrontp += strlen(nfrontp);
++ output_data("%s %d\r\n", fmt, option);
+ return;
+ }
+
+@@ -563,9 +553,8 @@
+ return;
+
+ if (direction) {
+- sprintf(nfrontp, "td: %s suboption ",
+- direction == '<' ? "recv" : "send");
+- nfrontp += strlen(nfrontp);
++ output_data("td: %s suboption ",
++ direction == '<' ? "recv" : "send");
+ if (length >= 3) {
+ register int j;
+
+@@ -573,228 +562,195 @@
+ j = pointer[length-1];
+
+ if (i != IAC || j != SE) {
+- sprintf(nfrontp, "(terminated by ");
+- nfrontp += strlen(nfrontp);
++ output_data("(terminated by ");
+ if (TELOPT_OK(i))
+- sprintf(nfrontp, "%s ", TELOPT(i));
++ output_data("%s ", TELOPT(i));
+ else if (TELCMD_OK(i))
+- sprintf(nfrontp, "%s ", TELCMD(i));
++ output_data("%s ", TELCMD(i));
+ else
+- sprintf(nfrontp, "%d ", i);
+- nfrontp += strlen(nfrontp);
++ output_data("%d ", i);
+ if (TELOPT_OK(j))
+- sprintf(nfrontp, "%s", TELOPT(j));
++ output_data("%s", TELOPT(j));
+ else if (TELCMD_OK(j))
+- sprintf(nfrontp, "%s", TELCMD(j));
++ output_data("%s", TELCMD(j));
+ else
+- sprintf(nfrontp, "%d", j);
+- nfrontp += strlen(nfrontp);
+- sprintf(nfrontp, ", not IAC SE!) ");
+- nfrontp += strlen(nfrontp);
++ output_data("%d", j);
++ output_data(", not IAC SE!) ");
+ }
+ }
+ length -= 2;
+ }
+ if (length < 1) {
+- sprintf(nfrontp, "(Empty suboption???)");
+- nfrontp += strlen(nfrontp);
++ output_data("(Empty suboption??\?)");
+ return;
+ }
+ switch (pointer[0]) {
+ case TELOPT_TTYPE:
+- sprintf(nfrontp, "TERMINAL-TYPE ");
+- nfrontp += strlen(nfrontp);
++ output_data("TERMINAL-TYPE ");
+ switch (pointer[1]) {
+ case TELQUAL_IS:
+- sprintf(nfrontp, "IS \"%.*s\"", length-2, (char *)pointer+2);
++ output_data("IS \"%.*s\"", length-2, (char *)pointer+2);
+ break;
+ case TELQUAL_SEND:
+- sprintf(nfrontp, "SEND");
++ output_data("SEND");
+ break;
+ default:
+- sprintf(nfrontp,
+- "- unknown qualifier %d (0x%x).",
++ output_data(
++ "- unknown qualifier %d (0x%x).",
+ pointer[1], pointer[1]);
+ }
+- nfrontp += strlen(nfrontp);
+ break;
+ case TELOPT_TSPEED:
+- sprintf(nfrontp, "TERMINAL-SPEED");
+- nfrontp += strlen(nfrontp);
++ output_data("TERMINAL-SPEED");
+ if (length < 2) {
+- sprintf(nfrontp, " (empty suboption???)");
+- nfrontp += strlen(nfrontp);
++ output_data(" (empty suboption??\?)");
+ break;
+ }
+ switch (pointer[1]) {
+ case TELQUAL_IS:
+- sprintf(nfrontp, " IS %.*s", length-2, (char *)pointer+2);
+- nfrontp += strlen(nfrontp);
++ output_data(" IS %.*s", length-2, (char *)pointer+2);
+ break;
+ default:
+ if (pointer[1] == 1)
+- sprintf(nfrontp, " SEND");
++ output_data(" SEND");
+ else
+- sprintf(nfrontp, " %d (unknown)", pointer[1]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %d (unknown)", pointer[1]);
+ for (i = 2; i < length; i++) {
+- sprintf(nfrontp, " ?%d?", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" ?%d?", pointer[i]);
+ }
+ break;
+ }
+ break;
+
+ case TELOPT_LFLOW:
+- sprintf(nfrontp, "TOGGLE-FLOW-CONTROL");
+- nfrontp += strlen(nfrontp);
++ output_data("TOGGLE-FLOW-CONTROL");
+ if (length < 2) {
+- sprintf(nfrontp, " (empty suboption???)");
+- nfrontp += strlen(nfrontp);
++ output_data(" (empty suboption??\?)");
+ break;
+ }
+ switch (pointer[1]) {
+ case 0:
+- sprintf(nfrontp, " OFF"); break;
++ output_data(" OFF"); break;
+ case 1:
+- sprintf(nfrontp, " ON"); break;
++ output_data(" ON"); break;
++
++ /*
++ case LFLOW_RESTART_ANY:
++ output_data(" RESTART-ANY"); break;
++ case LFLOW_RESTART_XON:
++ output_data(" RESTART-XON"); break;
++ */
+ default:
+- sprintf(nfrontp, " %d (unknown)", pointer[1]);
++ output_data(" %d (unknown)", pointer[1]);
+ }
+- nfrontp += strlen(nfrontp);
+ for (i = 2; i < length; i++) {
+- sprintf(nfrontp, " ?%d?", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" ?%d?", pointer[i]);
+ }
+ break;
+
+ case TELOPT_NAWS:
+- sprintf(nfrontp, "NAWS");
+- nfrontp += strlen(nfrontp);
++ output_data("NAWS");
+ if (length < 2) {
+- sprintf(nfrontp, " (empty suboption???)");
+- nfrontp += strlen(nfrontp);
++ output_data(" (empty suboption??\?)");
+ break;
+ }
+ if (length == 2) {
+- sprintf(nfrontp, " ?%d?", pointer[1]);
+- nfrontp += strlen(nfrontp);
++ output_data(" ?%d?", pointer[1]);
+ break;
+ }
+- sprintf(nfrontp, " %d %d (%d)",
++ output_data(" %d %d (%d)",
+ pointer[1], pointer[2],
+ (int)((((unsigned int)pointer[1])<<8)|((unsigned int)pointer[2])));
+- nfrontp += strlen(nfrontp);
+ if (length == 4) {
+- sprintf(nfrontp, " ?%d?", pointer[3]);
+- nfrontp += strlen(nfrontp);
++ output_data(" ?%d?", pointer[3]);
+ break;
+ }
+- sprintf(nfrontp, " %d %d (%d)",
++ output_data(" %d %d (%d)",
+ pointer[3], pointer[4],
+ (int)((((unsigned int)pointer[3])<<8)|((unsigned int)pointer[4])));
+- nfrontp += strlen(nfrontp);
+ for (i = 5; i < length; i++) {
+- sprintf(nfrontp, " ?%d?", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" ?%d?", pointer[i]);
+ }
+ break;
+
+ case TELOPT_LINEMODE:
+- sprintf(nfrontp, "LINEMODE ");
+- nfrontp += strlen(nfrontp);
++ output_data("LINEMODE ");
+ if (length < 2) {
+- sprintf(nfrontp, " (empty suboption???)");
+- nfrontp += strlen(nfrontp);
++ output_data(" (empty suboption??\?)");
+ break;
+ }
+ switch (pointer[1]) {
+ case WILL:
+- sprintf(nfrontp, "WILL ");
++ output_data("WILL ");
+ goto common;
+ case WONT:
+- sprintf(nfrontp, "WONT ");
++ output_data("WONT ");
+ goto common;
+ case DO:
+- sprintf(nfrontp, "DO ");
++ output_data("DO ");
+ goto common;
+ case DONT:
+- sprintf(nfrontp, "DONT ");
++ output_data("DONT ");
+ common:
+- nfrontp += strlen(nfrontp);
+ if (length < 3) {
+- sprintf(nfrontp, "(no option???)");
+- nfrontp += strlen(nfrontp);
++ output_data("(no option??\?)");
+ break;
+ }
+ switch (pointer[2]) {
+ case LM_FORWARDMASK:
+- sprintf(nfrontp, "Forward Mask");
+- nfrontp += strlen(nfrontp);
++ output_data("Forward Mask");
+ for (i = 3; i < length; i++) {
+- sprintf(nfrontp, " %x", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %x", pointer[i]);
+ }
+ break;
+ default:
+- sprintf(nfrontp, "%d (unknown)", pointer[2]);
+- nfrontp += strlen(nfrontp);
++ output_data("%d (unknown)", pointer[2]);
+ for (i = 3; i < length; i++) {
+- sprintf(nfrontp, " %d", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %d", pointer[i]);
+ }
+ break;
+ }
+ break;
+
+ case LM_SLC:
+- sprintf(nfrontp, "SLC");
+- nfrontp += strlen(nfrontp);
++ output_data("SLC");
+ for (i = 2; i < length - 2; i += 3) {
+ if (SLC_NAME_OK(pointer[i+SLC_FUNC]))
+- sprintf(nfrontp, " %s", SLC_NAME(pointer[i+SLC_FUNC]));
++ output_data(" %s", SLC_NAME(pointer[i+SLC_FUNC]));
+ else
+- sprintf(nfrontp, " %d", pointer[i+SLC_FUNC]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %d", pointer[i+SLC_FUNC]);
+ switch (pointer[i+SLC_FLAGS]&SLC_LEVELBITS) {
+ case SLC_NOSUPPORT:
+- sprintf(nfrontp, " NOSUPPORT"); break;
++ output_data(" NOSUPPORT"); break;
+ case SLC_CANTCHANGE:
+- sprintf(nfrontp, " CANTCHANGE"); break;
++ output_data(" CANTCHANGE"); break;
+ case SLC_VARIABLE:
+- sprintf(nfrontp, " VARIABLE"); break;
++ output_data(" VARIABLE"); break;
+ case SLC_DEFAULT:
+- sprintf(nfrontp, " DEFAULT"); break;
++ output_data(" DEFAULT"); break;
+ }
+- nfrontp += strlen(nfrontp);
+- sprintf(nfrontp, "%s%s%s",
++ output_data("%s%s%s",
+ pointer[i+SLC_FLAGS]&SLC_ACK ? "|ACK" : "",
+ pointer[i+SLC_FLAGS]&SLC_FLUSHIN ? "|FLUSHIN" : "",
+ pointer[i+SLC_FLAGS]&SLC_FLUSHOUT ? "|FLUSHOUT" : "");
+- nfrontp += strlen(nfrontp);
+ if (pointer[i+SLC_FLAGS]& ~(SLC_ACK|SLC_FLUSHIN|
+ SLC_FLUSHOUT| SLC_LEVELBITS)) {
+- sprintf(nfrontp, "(0x%x)", pointer[i+SLC_FLAGS]);
+- nfrontp += strlen(nfrontp);
++ output_data("(0x%x)", pointer[i+SLC_FLAGS]);
+ }
+- sprintf(nfrontp, " %d;", pointer[i+SLC_VALUE]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %d;", pointer[i+SLC_VALUE]);
+ if ((pointer[i+SLC_VALUE] == IAC) &&
+ (pointer[i+SLC_VALUE+1] == IAC))
+ i++;
+ }
+ for (; i < length; i++) {
+- sprintf(nfrontp, " ?%d?", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" ?%d?", pointer[i]);
+ }
+ break;
+
+ case LM_MODE:
+- sprintf(nfrontp, "MODE ");
+- nfrontp += strlen(nfrontp);
++ output_data("MODE ");
+ if (length < 3) {
+- sprintf(nfrontp, "(no mode???)");
+- nfrontp += strlen(nfrontp);
++ output_data("(no mode??\?)");
+ break;
+ }
+ {
+@@ -805,24 +761,19 @@
+ pointer[2]&MODE_SOFT_TAB ? "|SOFT_TAB" : "",
+ pointer[2]&MODE_LIT_ECHO ? "|LIT_ECHO" : "",
+ pointer[2]&MODE_ACK ? "|ACK" : "");
+- sprintf(nfrontp, "%s", tbuf[1] ? &tbuf[1] : "0");
+- nfrontp += strlen(nfrontp);
++ output_data("%s", tbuf[1] ? &tbuf[1] : "0");
+ }
+ if (pointer[2]&~(MODE_EDIT|MODE_TRAPSIG|MODE_ACK)) {
+- sprintf(nfrontp, " (0x%x)", pointer[2]);
+- nfrontp += strlen(nfrontp);
++ output_data(" (0x%x)", pointer[2]);
+ }
+ for (i = 3; i < length; i++) {
+- sprintf(nfrontp, " ?0x%x?", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" ?0x%x?", pointer[i]);
+ }
+ break;
+ default:
+- sprintf(nfrontp, "%d (unknown)", pointer[1]);
+- nfrontp += strlen(nfrontp);
++ output_data("%d (unknown)", pointer[1]);
+ for (i = 2; i < length; i++) {
+- sprintf(nfrontp, " %d", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %d", pointer[i]);
+ }
+ }
+ break;
+@@ -831,24 +782,20 @@
+ register char *cp;
+ register int j, k;
+
+- sprintf(nfrontp, "STATUS");
+- nfrontp += strlen(nfrontp);
++ output_data("STATUS");
+
+ switch (pointer[1]) {
+ default:
+ if (pointer[1] == TELQUAL_SEND)
+- sprintf(nfrontp, " SEND");
++ output_data(" SEND");
+ else
+- sprintf(nfrontp, " %d (unknown)", pointer[1]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %d (unknown)", pointer[1]);
+ for (i = 2; i < length; i++) {
+- sprintf(nfrontp, " ?%d?", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" ?%d?", pointer[i]);
+ }
+ break;
+ case TELQUAL_IS:
+- sprintf(nfrontp, " IS\r\n");
+- nfrontp += strlen(nfrontp);
++ output_data(" IS\r\n");
+
+ for (i = 2; i < length; i++) {
+ switch(pointer[i]) {
+@@ -859,18 +806,15 @@
+ common2:
+ i++;
+ if (TELOPT_OK((int)pointer[i]))
+- sprintf(nfrontp, " %s %s", cp, TELOPT(pointer[i]));
++ output_data(" %s %s", cp, TELOPT(pointer[i]));
+ else
+- sprintf(nfrontp, " %s %d", cp, pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %s %d", cp, pointer[i]);
+
+- sprintf(nfrontp, "\r\n");
+- nfrontp += strlen(nfrontp);
++ output_data("\r\n");
+ break;
+
+ case SB:
+- sprintf(nfrontp, " SB ");
+- nfrontp += strlen(nfrontp);
++ output_data(" SB ");
+ i++;
+ j = k = i;
+ while (j < length) {
+@@ -886,20 +830,17 @@
+ }
+ printsub(0, &pointer[i], k - i);
+ if (i < length) {
+- sprintf(nfrontp, " SE");
+- nfrontp += strlen(nfrontp);
++ output_data(" SE");
+ i = j;
+ } else
+ i = j - 1;
+
+- sprintf(nfrontp, "\r\n");
+- nfrontp += strlen(nfrontp);
++ output_data("\r\n");
+
+ break;
+
+ default:
+- sprintf(nfrontp, " %d", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %d", pointer[i]);
+ break;
+ }
+ }
+@@ -909,36 +850,32 @@
+ }
+
+ case TELOPT_XDISPLOC:
+- sprintf(nfrontp, "X-DISPLAY-LOCATION ");
+- nfrontp += strlen(nfrontp);
++ output_data("X-DISPLAY-LOCATION ");
+ switch (pointer[1]) {
+ case TELQUAL_IS:
+- sprintf(nfrontp, "IS \"%.*s\"", length-2, (char *)pointer+2);
++ output_data("IS \"%.*s\"", length-2, (char *)pointer+2);
+ break;
+ case TELQUAL_SEND:
+- sprintf(nfrontp, "SEND");
++ output_data("SEND");
+ break;
+ default:
+- sprintf(nfrontp, "- unknown qualifier %d (0x%x).",
++ output_data("- unknown qualifier %d (0x%x).",
+ pointer[1], pointer[1]);
+ }
+- nfrontp += strlen(nfrontp);
+ break;
+
+ case TELOPT_ENVIRON:
+- sprintf(nfrontp, "ENVIRON ");
+- nfrontp += strlen(nfrontp);
++ output_data("NEW-ENVIRON ");
+ switch (pointer[1]) {
+ case TELQUAL_IS:
+- sprintf(nfrontp, "IS ");
++ output_data("IS ");
+ goto env_common;
+ case TELQUAL_SEND:
+- sprintf(nfrontp, "SEND ");
++ output_data("SEND ");
+ goto env_common;
+ case TELQUAL_INFO:
+- sprintf(nfrontp, "INFO ");
++ output_data("INFO ");
+ env_common:
+- nfrontp += strlen(nfrontp);
+ {
+ register int noquote = 2;
+ for (i = 2; i < length; i++ ) {
+@@ -946,42 +883,43 @@
+ case ENV_VAR:
+ if (pointer[1] == TELQUAL_SEND)
+ goto def_case;
+- sprintf(nfrontp, "\" VAR " + noquote);
+- nfrontp += strlen(nfrontp);
++ output_data("\" VAR " + noquote);
+ noquote = 2;
+ break;
+
+ case ENV_VALUE:
+- sprintf(nfrontp, "\" VALUE " + noquote);
+- nfrontp += strlen(nfrontp);
++ output_data("\" VALUE " + noquote);
+ noquote = 2;
+ break;
+
+ case ENV_ESC:
+- sprintf(nfrontp, "\" ESC " + noquote);
+- nfrontp += strlen(nfrontp);
++ output_data("\" ESC " + noquote);
+ noquote = 2;
+ break;
+-
++ /*
++ case ENV_USERVAR:
++ output_data("\" USERVAR " + noquote);
++ noquote = 2;
++ break;
++ */
+ default:
+ def_case:
+ if (isprint(pointer[i]) && pointer[i] != '"') {
+ if (noquote) {
+- *nfrontp++ = '"';
++ output_data("\"");
+ noquote = 0;
+ }
+- *nfrontp++ = pointer[i];
++ output_data("%c", pointer[i]);
+ } else {
+- sprintf(nfrontp, "\" %03o " + noquote,
++ output_data("\" %03o " + noquote,
+ pointer[i]);
+- nfrontp += strlen(nfrontp);
+ noquote = 2;
+ }
+ break;
+ }
+ }
+ if (!noquote)
+- *nfrontp++ = '"';
++ output_data("\"");
+ break;
+ }
+ }
+@@ -989,80 +927,66 @@
+
+ #if defined(AUTHENTICATE)
+ case TELOPT_AUTHENTICATION:
+- sprintf(nfrontp, "AUTHENTICATION");
+- nfrontp += strlen(nfrontp);
++ output_data("AUTHENTICATION");
+
+ if (length < 2) {
+- sprintf(nfrontp, " (empty suboption???)");
+- nfrontp += strlen(nfrontp);
++ output_data(" (empty suboption??\?)");
+ break;
+ }
+ switch (pointer[1]) {
+ case TELQUAL_REPLY:
+ case TELQUAL_IS:
+- sprintf(nfrontp, " %s ", (pointer[1] == TELQUAL_IS) ?
++ output_data(" %s ", (pointer[1] == TELQUAL_IS) ?
+ "IS" : "REPLY");
+- nfrontp += strlen(nfrontp);
+ if (AUTHTYPE_NAME_OK(pointer[2]))
+- sprintf(nfrontp, "%s ", AUTHTYPE_NAME(pointer[2]));
++ output_data("%s ", AUTHTYPE_NAME(pointer[2]));
+ else
+- sprintf(nfrontp, "%d ", pointer[2]);
+- nfrontp += strlen(nfrontp);
++ output_data("%d ", pointer[2]);
+ if (length < 3) {
+- sprintf(nfrontp, "(partial suboption???)");
+- nfrontp += strlen(nfrontp);
++ output_data("(partial suboption??\?)");
+ break;
+ }
+- sprintf(nfrontp, "%s|%s",
++ output_data("%s|%s",
+ ((pointer[3] & AUTH_WHO_MASK) == AUTH_WHO_CLIENT) ?
+ "CLIENT" : "SERVER",
+ ((pointer[3] & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) ?
+ "MUTUAL" : "ONE-WAY");
+- nfrontp += strlen(nfrontp);
++ {
++ char buf[512];
+
+ auth_printsub(&pointer[1], length - 1, buf, sizeof(buf));
+- sprintf(nfrontp, "%s", buf);
+- nfrontp += strlen(nfrontp);
++ output_data("%s", buf);
++ }
+ break;
+
+ case TELQUAL_SEND:
+ i = 2;
+- sprintf(nfrontp, " SEND ");
+- nfrontp += strlen(nfrontp);
++ output_data(" SEND ");
+ while (i < length) {
+ if (AUTHTYPE_NAME_OK(pointer[i]))
+- sprintf(nfrontp, "%s ", AUTHTYPE_NAME(pointer[i]));
++ output_data("%s ", AUTHTYPE_NAME(pointer[i]));
+ else
+- sprintf(nfrontp, "%d ", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data("%d ", pointer[i]);
+ if (++i >= length) {
+- sprintf(nfrontp, "(partial suboption???)");
+- nfrontp += strlen(nfrontp);
++ output_data("(partial suboption??\?)");
+ break;
+ }
+- sprintf(nfrontp, "%s|%s ",
++ output_data("%s|%s ",
+ ((pointer[i] & AUTH_WHO_MASK) == AUTH_WHO_CLIENT) ?
+ "CLIENT" : "SERVER",
+ ((pointer[i] & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) ?
+ "MUTUAL" : "ONE-WAY");
+- nfrontp += strlen(nfrontp);
+ ++i;
+ }
+ break;
+
+ case TELQUAL_NAME:
+- i = 2;
+- sprintf(nfrontp, " NAME \"");
+- nfrontp += strlen(nfrontp);
+- while (i < length)
+- *nfrontp += pointer[i++];
+- *nfrontp += '"';
++ output_data(" NAME \"%.*s\"", length - 2, pointer + 2);
+ break;
+
+ default:
+ for (i = 2; i < length; i++) {
+- sprintf(nfrontp, " ?%d?", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" ?%d?", pointer[i]);
+ }
+ break;
+ }
+@@ -1071,86 +995,70 @@
+
+ #if defined(ENCRYPT)
+ case TELOPT_ENCRYPT:
+- sprintf(nfrontp, "ENCRYPT");
+- nfrontp += strlen(nfrontp);
++ output_data("ENCRYPT");
+ if (length < 2) {
+- sprintf(nfrontp, " (empty suboption???)");
+- nfrontp += strlen(nfrontp);
++ output_data(" (empty suboption???)");
+ break;
+ }
+ switch (pointer[1]) {
+ case ENCRYPT_START:
+- sprintf(nfrontp, " START");
+- nfrontp += strlen(nfrontp);
++ output_data(" START");
+ break;
+
+ case ENCRYPT_END:
+- sprintf(nfrontp, " END");
+- nfrontp += strlen(nfrontp);
++ output_data(" END");
+ break;
+
+ case ENCRYPT_REQSTART:
+- sprintf(nfrontp, " REQUEST-START");
+- nfrontp += strlen(nfrontp);
++ output_data(" REQUEST-START");
+ break;
+
+ case ENCRYPT_REQEND:
+- sprintf(nfrontp, " REQUEST-END");
+- nfrontp += strlen(nfrontp);
++ output_data(" REQUEST-END");
+ break;
+
+ case ENCRYPT_IS:
+ case ENCRYPT_REPLY:
+- sprintf(nfrontp, " %s ", (pointer[1] == ENCRYPT_IS) ?
++ output_data(" %s ", (pointer[1] == ENCRYPT_IS) ?
+ "IS" : "REPLY");
+- nfrontp += strlen(nfrontp);
+ if (length < 3) {
+- sprintf(nfrontp, " (partial suboption???)");
+- nfrontp += strlen(nfrontp);
++ output_data(" (partial suboption???)");
+ break;
+ }
+ if (ENCTYPE_NAME_OK(pointer[2]))
+- sprintf(nfrontp, "%s ", ENCTYPE_NAME(pointer[2]));
++ output_data("%s ", ENCTYPE_NAME(pointer[2]));
+ else
+- sprintf(nfrontp, " %d (unknown)", pointer[2]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %d (unknown)", pointer[2]);
+
+ encrypt_printsub(&pointer[1], length - 1, buf, sizeof(buf));
+- sprintf(nfrontp, "%s", buf);
+- nfrontp += strlen(nfrontp);
++ output_data("%s", buf);
+ break;
+
+ case ENCRYPT_SUPPORT:
+ i = 2;
+- sprintf(nfrontp, " SUPPORT ");
+- nfrontp += strlen(nfrontp);
++ output_data(" SUPPORT ");
+ while (i < length) {
+ if (ENCTYPE_NAME_OK(pointer[i]))
+- sprintf(nfrontp, "%s ", ENCTYPE_NAME(pointer[i]));
++ output_data("%s ", ENCTYPE_NAME(pointer[i]));
+ else
+- sprintf(nfrontp, "%d ", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data("%d ", pointer[i]);
+ i++;
+ }
+ break;
+
+ case ENCRYPT_ENC_KEYID:
+- sprintf(nfrontp, " ENC_KEYID %d", pointer[1]);
+- nfrontp += strlen(nfrontp);
++ output_data(" ENC_KEYID %d", pointer[1]);
+ goto encommon;
+
+ case ENCRYPT_DEC_KEYID:
+- sprintf(nfrontp, " DEC_KEYID %d", pointer[1]);
+- nfrontp += strlen(nfrontp);
++ output_data(" DEC_KEYID %d", pointer[1]);
+ goto encommon;
+
+ default:
+- sprintf(nfrontp, " %d (unknown)", pointer[1]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %d (unknown)", pointer[1]);
+ encommon:
+ for (i = 2; i < length; i++) {
+- sprintf(nfrontp, " %d", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %d", pointer[i]);
+ }
+ break;
+ }
+@@ -1159,18 +1067,15 @@
+
+ default:
+ if (TELOPT_OK(pointer[0]))
+- sprintf(nfrontp, "%s (unknown)", TELOPT(pointer[0]));
++ output_data("%s (unknown)", TELOPT(pointer[0]));
+ else
+- sprintf(nfrontp, "%d (unknown)", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data("%d (unknown)", pointer[i]);
+ for (i = 1; i < length; i++) {
+- sprintf(nfrontp, " %d", pointer[i]);
+- nfrontp += strlen(nfrontp);
++ output_data(" %d", pointer[i]);
+ }
+ break;
+ }
+- sprintf(nfrontp, "\r\n");
+- nfrontp += strlen(nfrontp);
++ output_data("\r\n");
+ }
+
+ /*
+@@ -1192,26 +1097,23 @@
+ }
+
+ /* add a line of output */
+- sprintf(nfrontp, "%s: ", tag);
+- nfrontp += strlen(nfrontp);
++ output_data("%s: ", tag);
+ for (i = 0; i < 20 && cnt; i++) {
+- sprintf(nfrontp, "%02x", *ptr);
+- nfrontp += strlen(nfrontp);
++ output_data("%02x", *ptr);
+ if (isprint(*ptr)) {
+ xbuf[i] = *ptr;
+ } else {
+ xbuf[i] = '.';
+ }
+- if (i % 2) {
+- *nfrontp = ' ';
+- nfrontp++;
++ if (i % 2) {
++ output_data(" ");
+ }
+ cnt--;
+ ptr++;
+ }
+ xbuf[i] = '\0';
+- sprintf(nfrontp, " %s\r\n", xbuf );
+- nfrontp += strlen(nfrontp);
++ output_data(" %s\r\n", xbuf );
+ }
+ }
+ #endif /* DIAGNOSTICS */
++/* nfrontp += strlen(nfrontp); */