Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Aug 2011 23:43:28 GMT
From:      Catalin Nicutar <cnicutar@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 197249 for review
Message-ID:  <201108052343.p75NhSAn067609@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@197249?ac=10

Change 197249 by cnicutar@cnicutar_cronos on 2011/08/05 23:43:09

	Forward-port telnet and telnetd UTO support to HEAD.

Affected files ...

.. //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnet/commands.c#2 edit
.. //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnet/externs.h#2 edit
.. //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnet/main.c#2 edit
.. //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnet/telnet.1#2 edit
.. //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnet/telnet.c#2 edit
.. //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnetd/telnetd.8#2 edit
.. //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnetd/telnetd.c#2 edit

Differences ...

==== //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnet/commands.c#2 (text+ko) ====

@@ -78,6 +78,7 @@
 #include <netinet/in_systm.h>
 #include <netinet/ip.h>
 #include <netinet/ip6.h>
+#include <netinet/tcp.h>
 
 #ifndef       MAXHOSTNAMELEN
 #define       MAXHOSTNAMELEN 256
@@ -877,6 +878,7 @@
     { "escape",	"character to escape back to telnet command mode", NULL, &escape },
     { "rlogin", "rlogin escape character", 0, &rlogin },
     { "tracefile", "file to write trace information to", SetNetTrace, (cc_t *)NetTraceFile},
+    { "timeout", "tcp timeout for this connection", set_timeout, NULL},
     { " ", "", NULL, NULL },
     { " ", "The following need 'localchars' to be toggled true", NULL, NULL },
     { "flushoutput", "character to cause an Abort Output", NULL, termFlushCharp },
@@ -919,6 +921,21 @@
 	}
 }
 
+void
+set_timeout(char *s)
+{
+	if (s == NULL) {
+		uto = 0;
+		/* There is not way to "take it back". */
+		return;
+	}
+	/* Setting the timeout if net is a valid descriptor. */
+	uto = strtonum(s, 0, INT_MAX, NULL);
+	if (uto && net > 0 && setsockopt(net, IPPROTO_TCP, TCP_SNDUTO_TIMEOUT,
+	    &uto, sizeof(uto)))
+		perror("setsockopt UTO");
+}
+
 static int
 setcmd(int argc, char *argv[])
 {
@@ -976,7 +993,8 @@
 	return 0;
     } else if (ct->handler) {
 	(*ct->handler)(argv[2]);
-	printf("%s set to \"%s\".\n", ct->name, (char *)ct->charp);
+	if (ct->charp)
+		printf("%s set to \"%s\".\n", ct->name, (char *)ct->charp);
     } else {
 	if (strcmp("off", argv[2])) {
 	    value = special(argv[2]);
@@ -1042,7 +1060,8 @@
 	    return 0;
 	} else if (ct->handler) {
 	    (*ct->handler)(0);
-	    printf("%s reset to \"%s\".\n", ct->name, (char *)ct->charp);
+	    if (ct->charp)
+		    printf("%s reset to \"%s\".\n", ct->name, (char *)ct->charp);
 	} else {
 	    *(ct->charp) = _POSIX_VDISABLE;
 	    printf("%s character is '%s'.\n", ct->name, control(*(ct->charp)));
@@ -2442,6 +2461,9 @@
 		goto fail;
 	}
 #endif
+	if (uto && setsockopt(net, IPPROTO_TCP, TCP_SNDUTO_TIMEOUT, &uto,
+	    sizeof(uto)))
+		perror("setsockopt UTO");
 
 	if (connect(net, res->ai_addr, res->ai_addrlen) < 0) {
 	    struct addrinfo *next;

==== //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnet/externs.h#2 (text+ko) ====

@@ -129,6 +129,7 @@
     termdata,		/* Print out terminal data flow */
     telnet_debug,	/* Debug level */
     doaddrlookup,	/* do a reverse lookup? */
+    uto,		/* Request User Timeout. */
     clienteof;		/* Client received EOF */
 
 extern cc_t escape;	/* Escape to command mode */
@@ -260,6 +261,7 @@
     setcommandmode(void),
     set_escape_char(char *s),
     setneturg(void),
+    set_timeout(char *s),
     sys_telnet_init(void),
     telnet(char *),
     tel_enter_binary(int),

==== //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnet/main.c#2 (text+ko) ====

@@ -97,7 +97,7 @@
 	    "[-4] [-6] [-8] [-E] [-L] [-N] [-S tos] [-c] [-d]",
 	    "\n\t[-e char] [-l user] [-n tracefile] ",
 #endif
-	    "[-r] [-s src_addr] [-u] ",
+	    "[-r] [-s src_addr] [-t timeout] [-u] ",
 #if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
 	    "[-P policy] "
 #endif
@@ -154,7 +154,7 @@
 #define IPSECOPT
 #endif
 	while ((ch = getopt(argc, argv,
-			    "468EKLNS:X:acde:fFk:l:n:rs:uxy" IPSECOPT)) != -1)
+			    "468EKLNS:X:acde:fFk:l:n:rs:ut:xy" IPSECOPT)) != -1)
 #undef IPSECOPT
 	{
 		switch(ch) {
@@ -303,6 +303,12 @@
 		case 's':
 			src_addr = optarg;
 			break;
+		case 't':
+			set_timeout(optarg);
+			if (!uto) 
+				fprintf(stderr, "Warning: timeout `%s'"
+				    " ignored\n", optarg);
+			break;
 		case 'u':
 			family = AF_UNIX;
 			break;

==== //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnet/telnet.1#2 (text+ko) ====

@@ -50,6 +50,7 @@
 .Op Fl l Ar user
 .Op Fl n Ar tracefile
 .Op Fl s Ar src_addr
+.Op Fl t Ar timeout
 .Oo
 .Ar host
 .Op Ar port
@@ -203,6 +204,14 @@
 connection to
 .Ar src_addr ,
 which can be an IP address or a host name.
+.It Fl t Ar timeout
+Sets the requested timeout (UTO) for the connection.
+If the server accepts this value, the connection will be kept for
+.Ar timeout
+seconds in the absence of network connectivity.
+.Pp
+This is server-dependent, but usually it only works with authentication,
+for security reasons.
 .It Fl u
 Forces
 .Nm

==== //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnet/telnet.c#2 (text+ko) ====

@@ -112,6 +112,7 @@
 	dontlecho,	/* do we suppress local echoing right now? */
 	globalmode,
 	doaddrlookup = 1, /* do a reverse address lookup? */
+	uto = 0,	/* Request User Timeout. */
 	clienteof = 0;
 
 char *prompt = 0;

==== //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnetd/telnetd.8#2 (text+ko) ====

@@ -32,7 +32,7 @@
 .\"	@(#)telnetd.8	8.4 (Berkeley) 6/1/94
 .\" $FreeBSD: src/contrib/telnet/telnetd/telnetd.8,v 1.22 2008/08/29 00:04:37 trhodes Exp $
 .\"
-.Dd August 28, 2008
+.Dd August 05, 2011
 .Dt TELNETD 8
 .Os
 .Sh NAME
@@ -42,7 +42,7 @@
 protocol server
 .Sh SYNOPSIS
 .Nm /usr/libexec/telnetd
-.Op Fl 46BUhlkn
+.Op Fl 46BUhlknt
 .Op Fl D Ar debugmode
 .Op Fl S Ar tos
 .Op Fl X Ar authtype
@@ -263,6 +263,14 @@
 TOS name found in the
 .Pa /etc/iptos
 file.
+.It Fl t
+Accepts UTO (User Timeout) suggestion from client.
+Normally a TCP connection is dropped if data is not acknowledged for a period
+of time.
+A client may influnce this period by advertising a timeout value.
+.Pp
+The value sent by the client is only accepted after successful authentication,
+for security reasons.
 .It Fl u Ar len
 This option is used to specify the size of the field
 in the

==== //depot/projects/soc2011/cnicutar_tcputo_9/src/contrib/telnet/telnetd/telnetd.c#2 (text+ko) ====

@@ -49,6 +49,7 @@
 #include <termcap.h>
 
 #include <arpa/inet.h>
+#include <netinet/tcp.h>	/* For UTO. */
 
 #ifdef	AUTHENTICATION
 #include <libtelnet/auth.h>
@@ -80,6 +81,7 @@
 static int debug = 0;
 int keepalive = 1;
 const char *altlogin;
+int uto = 0;				/* Accept advertised timeout. */
 
 void doit(struct sockaddr *);
 int terminaltypeok(char *);
@@ -93,7 +95,7 @@
  * passed off to getopt().
  */
 char valid_opts[] = {
-	'd', ':', 'h', 'k', 'n', 'p', ':', 'S', ':', 'u', ':', 'U',
+	'd', ':', 'h', 'k', 'n', 'p', ':', 'S', ':', 't', 'u', ':', 'U',
 	'4', '6',
 #ifdef	AUTHENTICATION
 	'a', ':', 'X', ':',
@@ -285,6 +287,11 @@
 #endif
 			break;
 
+		case 't':
+			 /* Enable TCP_RCVUTO_TIMEOUT after authentication.*/
+			uto = 1;
+			break;
+
 		case 'u':
 			utmp_len = (size_t)atoi(optarg);
 			if (utmp_len >= sizeof(remote_hostname))
@@ -445,6 +452,7 @@
 #ifdef	HAS_GETTOS
 	fprintf(stderr, " [-S tos]");
 #endif
+	fprintf(stderr, " [-t]");
 #ifdef	AUTHENTICATION
 	fprintf(stderr, " [-X auth-type]");
 #endif
@@ -931,6 +939,11 @@
 
 	DIAG(TD_REPORT, output_data("td: Entering processing loop\r\n"));
 
+	/* If authenticated we'll accept the received UTO. */
+	if (uto && level && setsockopt(net, IPPROTO_TCP, TCP_RCVUTO_TIMEOUT, &uto,
+	    sizeof(uto)))
+		perror("setsockopt UTO");
+
 	/*
 	 * Startup the login process on the slave side of the terminal
 	 * now.  We delay this until here to insure option negotiation



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201108052343.p75NhSAn067609>