* Copyright (c) 1988 Regents of the University of California.
* %sccs.include.redist.c%
static char sccsid
[] = "@(#)utilities.c 5.6 (Berkeley) %G%";
FILE *NetTrace
= 0; /* Not in bss, since needs to stay */
* Upcase (in place) the argument.
while ((c
= *argument
) != 0) {
* Compensate for differences in 4.2 and 4.3 systems.
SetSockOpt(fd
, level
, option
, yesno
)
int fd
, level
, option
, yesno
;
return setsockopt(fd
, level
, option
,
(char *)&yesno
, sizeof yesno
);
if (yesno
== 0) { /* Can't do that in 4.2! */
fprintf(stderr
, "Error: attempt to turn off an option 0x%x.\n",
return setsockopt(fd
, level
, option
, 0, 0);
* The following are routines used to print out debugging information.
unsigned char NetTraceFile
[256] = "(standard output)";
if (NetTrace
&& NetTrace
!= stdout
)
if (file
&& (strcmp(file
, "-") != 0)) {
NetTrace
= fopen(file
, "w");
strcpy((char *)NetTraceFile
, file
);
fprintf(stderr
, "Cannot open %s.\n", file
);
strcpy((char *)NetTraceFile
, "(standard output)");
Dump(direction
, buffer
, length
)
# define BYTES_PER_LINE 32
# define min(x,y) ((x<y)? x:y)
fprintf(NetTrace
, "%c 0x%x\t", direction
, offset
);
buffer
= buffer
+ min(length
, BYTES_PER_LINE
/2);
fprintf(NetTrace
, "%c%.2x",
(((*pThis
)&0xff) == 0xff) ? '*' : ' ',
length
-= BYTES_PER_LINE
/2;
offset
+= BYTES_PER_LINE
/2;
buffer
= buffer
+ min(length
, BYTES_PER_LINE
);
fprintf(NetTrace
, "%.2x", (*pThis
)&0xff);
length
-= BYTES_PER_LINE
;
offset
+= BYTES_PER_LINE
;
if (NetTrace
== stdout
) {
fprintf(NetTrace
, "\r\n");
/* find next unique line */
printoption(direction
, cmd
, option
)
fprintf(NetTrace
, "%s IAC %s", direction
, TELCMD(option
));
fprintf(NetTrace
, "%s IAC %d", direction
, option
);
fmt
= (cmd
== WILL
) ? "WILL" : (cmd
== WONT
) ? "WONT" :
(cmd
== DO
) ? "DO" : (cmd
== DONT
) ? "DONT" : 0;
fprintf(NetTrace
, "%s %s ", direction
, fmt
);
fprintf(NetTrace
, "%s", TELOPT(option
));
else if (option
== TELOPT_EXOPL
)
fprintf(NetTrace
, "EXOPL");
fprintf(NetTrace
, "%d", option
);
fprintf(NetTrace
, "%s %d %d", direction
, cmd
, option
);
fprintf(NetTrace
, "\r\n");
extern char will_wont_resp
[], do_dont_resp
[];
for (i
= 0; i
< 256; i
++) {
printf("resp DO_DONT %s: %d\n", TELOPT(i
), do_dont_resp
[i
]);
printf("resp DO_DONT %s: %d\n", TELCMD(i
), do_dont_resp
[i
]);
printf("resp DO_DONT %d: %d\n", i
,
if (my_want_state_is_do(i
)) {
printf("want DO %s\n", TELOPT(i
));
printf("want DO %s\n", TELCMD(i
));
printf("want DO %d\n", i
);
printf("want DONT %s\n", TELOPT(i
));
printf("want DONT %s\n", TELCMD(i
));
printf("want DONT %d\n", i
);
printf(" DO %s\n", TELOPT(i
));
printf(" DO %s\n", TELCMD(i
));
printf("resp WILL_WONT %s: %d\n", TELOPT(i
), will_wont_resp
[i
]);
printf("resp WILL_WONT %s: %d\n", TELCMD(i
), will_wont_resp
[i
]);
printf("resp WILL_WONT %d: %d\n",
if (my_want_state_is_will(i
)) {
printf("want WILL %s\n", TELOPT(i
));
printf("want WILL %s\n", TELCMD(i
));
printf("want WILL %d\n", i
);
printf("want WONT %s\n", TELOPT(i
));
printf("want WONT %s\n", TELCMD(i
));
printf("want WONT %d\n", i
);
if (my_state_is_will(i
)) {
printf(" WILL %s\n", TELOPT(i
));
printf(" WILL %s\n", TELCMD(i
));
printsub(direction
, pointer
, length
)
char direction
; /* '<' or '>' */
unsigned char *pointer
; /* where suboption data sits */
int length
; /* length of suboption data */
extern int want_status_response
;
if (showoptions
|| direction
== 0 ||
(want_status_response
&& (pointer
[0] == TELOPT_STATUS
))) {
fprintf(NetTrace
, "%s IAC SB ",
(direction
== '<')? "RCVD":"SENT");
if (i
!= IAC
|| j
!= SE
) {
fprintf(NetTrace
, "(terminated by ");
fprintf(NetTrace
, "%s ", TELOPT(i
));
fprintf(NetTrace
, "%s ", TELCMD(i
));
fprintf(NetTrace
, "%d ", i
);
fprintf(NetTrace
, "%s", TELOPT(j
));
fprintf(NetTrace
, "%s", TELCMD(j
));
fprintf(NetTrace
, "%d", j
);
fprintf(NetTrace
, ", not IAC SE!) ");
fprintf(NetTrace
, "(Empty suboption???)");
fprintf(NetTrace
, "TERMINAL-TYPE ");
fprintf(NetTrace
, "IS \"%.*s\"", length
-2, (char *)pointer
+2);
fprintf(NetTrace
, "SEND");
"- unknown qualifier %d (0x%x).",
fprintf(NetTrace
, "TERMINAL-SPEED");
fprintf(NetTrace
, " (empty suboption???)");
fprintf(NetTrace
, " IS ");
fprintf(NetTrace
, "%.*s", length
-2, (char *)pointer
+2);
fprintf(NetTrace
, " SEND");
fprintf(NetTrace
, " %d (unknown)", pointer
[1]);
for (i
= 2; i
< length
; i
++)
fprintf(NetTrace
, " ?%d?", pointer
[i
]);
fprintf(NetTrace
, "TOGGLE-FLOW-CONTROL");
fprintf(NetTrace
, " (empty suboption???)");
fprintf(NetTrace
, " OFF"); break;
fprintf(NetTrace
, " ON"); break;
fprintf(NetTrace
, " RESTART-ANY"); break;
fprintf(NetTrace
, " RESTART-XON"); break;
fprintf(NetTrace
, " %d (unknown)", pointer
[1]);
for (i
= 2; i
< length
; i
++)
fprintf(NetTrace
, " ?%d?", pointer
[i
]);
fprintf(NetTrace
, "NAWS");
fprintf(NetTrace
, " (empty suboption???)");
fprintf(NetTrace
, " ?%d?", pointer
[1]);
fprintf(NetTrace
, " %d %d (%d)",
(int)((((unsigned int)pointer
[1])<<8)|((unsigned int)pointer
[2])));
fprintf(NetTrace
, " ?%d?", pointer
[3]);
fprintf(NetTrace
, " %d %d (%d)",
(int)((((unsigned int)pointer
[3])<<8)|((unsigned int)pointer
[4])));
for (i
= 5; i
< length
; i
++)
fprintf(NetTrace
, " ?%d?", pointer
[i
]);
#if defined(AUTHENTICATION)
case TELOPT_AUTHENTICATION
:
fprintf(NetTrace
, "AUTHENTICATION");
fprintf(NetTrace
, " (empty suboption???)");
fprintf(NetTrace
, " %s ", (pointer
[1] == TELQUAL_IS
) ?
if (AUTHTYPE_NAME_OK(pointer
[2]))
fprintf(NetTrace
, "%s ", AUTHTYPE_NAME(pointer
[2]));
fprintf(NetTrace
, "%d ", pointer
[2]);
fprintf(NetTrace
, "(partial suboption???)");
fprintf(NetTrace
, "%s|%s",
((pointer
[3] & AUTH_WHO_MASK
) == AUTH_WHO_CLIENT
) ?
((pointer
[3] & AUTH_HOW_MASK
) == AUTH_HOW_MUTUAL
) ?
auth_printsub(&pointer
[1], length
- 1, buf
, sizeof(buf
));
fprintf(NetTrace
, "%s", buf
);
fprintf(NetTrace
, " SEND ");
if (AUTHTYPE_NAME_OK(pointer
[i
]))
fprintf(NetTrace
, "%s ", AUTHTYPE_NAME(pointer
[i
]));
fprintf(NetTrace
, "%d ", pointer
[i
]);
fprintf(NetTrace
, "(partial suboption???)");
fprintf(NetTrace
, "%s|%s ",
((pointer
[i
] & AUTH_WHO_MASK
) == AUTH_WHO_CLIENT
) ?
((pointer
[i
] & AUTH_HOW_MASK
) == AUTH_HOW_MUTUAL
) ?
fprintf(NetTrace
, " NAME \"");
putc(pointer
[i
++], NetTrace
);
for (i
= 2; i
< length
; i
++)
fprintf(NetTrace
, " ?%d?", pointer
[i
]);
fprintf(NetTrace
, "ENCRYPT");
fprintf(NetTrace
, " (empty suboption???)");
fprintf(NetTrace
, " START");
fprintf(NetTrace
, " END");
fprintf(NetTrace
, " REQUEST-START");
fprintf(NetTrace
, " REQUEST-END");
fprintf(NetTrace
, " %s ", (pointer
[1] == ENCRYPT_IS
) ?
fprintf(NetTrace
, " (partial suboption???)");
if (ENCTYPE_NAME_OK(pointer
[2]))
fprintf(NetTrace
, "%s ", ENCTYPE_NAME(pointer
[2]));
fprintf(NetTrace
, " %d (unknown)", pointer
[2]);
encrypt_printsub(&pointer
[1], length
- 1, buf
, sizeof(buf
));
fprintf(NetTrace
, "%s", buf
);
fprintf(NetTrace
, " SUPPORT ");
if (ENCTYPE_NAME_OK(pointer
[i
]))
fprintf(NetTrace
, "%s ", ENCTYPE_NAME(pointer
[i
]));
fprintf(NetTrace
, "%d ", pointer
[i
]);
fprintf(NetTrace
, " ENC_KEYID ");
fprintf(NetTrace
, " DEC_KEYID ");
fprintf(NetTrace
, " %d (unknown)", pointer
[1]);
for (i
= 2; i
< length
; i
++)
fprintf(NetTrace
, " %d", pointer
[i
]);
fprintf(NetTrace
, "LINEMODE ");
fprintf(NetTrace
, " (empty suboption???)");
fprintf(NetTrace
, "WILL ");
fprintf(NetTrace
, "WONT ");
fprintf(NetTrace
, "DO ");
fprintf(NetTrace
, "DONT ");
fprintf(NetTrace
, "(no option???)");
fprintf(NetTrace
, "Forward Mask");
for (i
= 3; i
< length
; i
++)
fprintf(NetTrace
, " %x", pointer
[i
]);
fprintf(NetTrace
, "%d (unknown)", pointer
[2]);
for (i
= 3; i
< length
; i
++)
fprintf(NetTrace
, " %d", pointer
[i
]);
fprintf(NetTrace
, "SLC");
for (i
= 2; i
< length
- 2; i
+= 3) {
if (SLC_NAME_OK(pointer
[i
+SLC_FUNC
]))
fprintf(NetTrace
, " %s", SLC_NAME(pointer
[i
+SLC_FUNC
]));
fprintf(NetTrace
, " %d", pointer
[i
+SLC_FUNC
]);
switch (pointer
[i
+SLC_FLAGS
]&SLC_LEVELBITS
) {
fprintf(NetTrace
, " NOSUPPORT"); break;
fprintf(NetTrace
, " CANTCHANGE"); break;
fprintf(NetTrace
, " VARIABLE"); break;
fprintf(NetTrace
, " DEFAULT"); break;
fprintf(NetTrace
, "%s%s%s",
pointer
[i
+SLC_FLAGS
]&SLC_ACK
? "|ACK" : "",
pointer
[i
+SLC_FLAGS
]&SLC_FLUSHIN
? "|FLUSHIN" : "",
pointer
[i
+SLC_FLAGS
]&SLC_FLUSHOUT
? "|FLUSHOUT" : "");
if (pointer
[i
+SLC_FLAGS
]& ~(SLC_ACK
|SLC_FLUSHIN
|
SLC_FLUSHOUT
| SLC_LEVELBITS
))
fprintf(NetTrace
, "(0x%x)", pointer
[i
+SLC_FLAGS
]);
fprintf(NetTrace
, " %d;", pointer
[i
+SLC_VALUE
]);
if ((pointer
[i
+SLC_VALUE
] == IAC
) &&
(pointer
[i
+SLC_VALUE
+1] == IAC
))
fprintf(NetTrace
, " ?%d?", pointer
[i
]);
fprintf(NetTrace
, "MODE ");
fprintf(NetTrace
, "(no mode???)");
sprintf(tbuf
, "%s%s%s%s%s",
pointer
[2]&MODE_EDIT
? "|EDIT" : "",
pointer
[2]&MODE_TRAPSIG
? "|TRAPSIG" : "",
pointer
[2]&MODE_SOFT_TAB
? "|SOFT_TAB" : "",
pointer
[2]&MODE_LIT_ECHO
? "|LIT_ECHO" : "",
pointer
[2]&MODE_ACK
? "|ACK" : "");
fprintf(NetTrace
, "%s", tbuf
[1] ? &tbuf
[1] : "0");
if (pointer
[2]&~(MODE_MASK
))
fprintf(NetTrace
, " (0x%x)", pointer
[2]);
for (i
= 3; i
< length
; i
++)
fprintf(NetTrace
, " ?0x%x?", pointer
[i
]);
fprintf(NetTrace
, "%d (unknown)", pointer
[1]);
for (i
= 2; i
< length
; i
++)
fprintf(NetTrace
, " %d", pointer
[i
]);
fprintf(NetTrace
, "STATUS");
if (pointer
[1] == TELQUAL_SEND
)
fprintf(NetTrace
, " SEND");
fprintf(NetTrace
, " %d (unknown)", pointer
[1]);
for (i
= 2; i
< length
; i
++)
fprintf(NetTrace
, " ?%d?", pointer
[i
]);
if (--want_status_response
< 0)
want_status_response
= 0;
fprintf(NetTrace
, " IS\r\n");
fprintf(NetTrace
, " IS\n");
for (i
= 2; i
< length
; i
++) {
case DO
: cp
= "DO"; goto common2
;
case DONT
: cp
= "DONT"; goto common2
;
case WILL
: cp
= "WILL"; goto common2
;
case WONT
: cp
= "WONT"; goto common2
;
if (TELOPT_OK((int)pointer
[i
]))
fprintf(NetTrace
, " %s %s", cp
, TELOPT(pointer
[i
]));
fprintf(NetTrace
, " %s %d", cp
, pointer
[i
]);
fprintf(NetTrace
, "\r\n");
fprintf(NetTrace
, " SB ");
pointer
[k
++] = pointer
[j
++];
printsub(0, &pointer
[i
], k
- i
);
fprintf(NetTrace
, " SE");
fprintf(NetTrace
, "\r\n");
fprintf(NetTrace
, " %d", pointer
[i
]);
fprintf(NetTrace
, "X-DISPLAY-LOCATION ");
fprintf(NetTrace
, "IS \"%.*s\"", length
-2, (char *)pointer
+2);
fprintf(NetTrace
, "SEND");
fprintf(NetTrace
, "- unknown qualifier %d (0x%x).",
fprintf(NetTrace
, "ENVIRON ");
fprintf(NetTrace
, "IS ");
fprintf(NetTrace
, "SEND ");
fprintf(NetTrace
, "INFO ");
register int noquote
= 2;
for (i
= 2; i
< length
; i
++ ) {
if (pointer
[1] == TELQUAL_SEND
)
fprintf(NetTrace
, "\" VAR " + noquote
);
fprintf(NetTrace
, "\" VALUE " + noquote
);
fprintf(NetTrace
, "\" ESC " + noquote
);
if (pointer
[1] == TELQUAL_SEND
)
fprintf(NetTrace
, "\" USERVAR " + noquote
);
if (isprint(pointer
[i
]) && pointer
[i
] != '"') {
putc(pointer
[i
], NetTrace
);
fprintf(NetTrace
, "\" %03o " + noquote
,
if (TELOPT_OK(pointer
[0]))
fprintf(NetTrace
, "%s (unknown)", TELOPT(pointer
[0]));
fprintf(NetTrace
, "%d (unknown)", pointer
[0]);
for (i
= 1; i
< length
; i
++)
fprintf(NetTrace
, " %d", pointer
[i
]);
fprintf(NetTrace
, "\r\n");
/* EmptyTerminal - called to make sure that the terminal buffer is empty.
* Note that we consider the buffer to run all the
* way to the kernel (thus the select).
#endif /* defined(unix) */
(void) select(tout
+1, (fd_set
*) 0, &o
, (fd_set
*) 0,
(struct timeval
*) 0); /* wait for TTLOWAT */
#endif /* defined(unix) */
(void) select(tout
+1, (fd_set
*) 0, &o
, (fd_set
*) 0,
(struct timeval
*) 0); /* wait for TTLOWAT */
#endif /* defined(unix) */
#else /* defined(TN3270) */
(void)telrcv(); /* Process any incoming data */
} while (ring_full_count(&netiring
)); /* While there is any */
#endif /* defined(TN3270) */
#endif /* defined(TN3270) */
EmptyTerminal(); /* Flush the path to the tty */
ExitString(string
, returnCode
)
fwrite(string
, 1, strlen(string
), stderr
);