telnet: Support --bind (-b) for NetKit compatibility.

* NEWS: Add.
* doc/inetutils.texi (telnet invocation): Add --bind (-b).
* telnet/commands.c (tn): New variables hostaddr and srchostp.
Parse -b parameter.  Update usage string.  If -b is set, call
getaddrinfo on it and pass that ai_addr on to bind.
* telnet/main.c (srcaddr): New global variable.
(argp_options): Add --bind (-b).
(parse_opt): Set srcaddr to -b value.
(main): Propagate -b value to tn function.
This commit is contained in:
Simon Josefsson
2021-04-28 20:14:09 +02:00
parent 4587969cf6
commit f70b506e37
5 changed files with 75 additions and 5 deletions

View File

@@ -1,3 +1,16 @@
2021-04-28 Simon Josefsson <simon@josefsson.org>
telnet: Support --bind (-b) for NetKit compatibility.
* NEWS: Add.
* doc/inetutils.texi (telnet invocation): Add --bind (-b).
* telnet/commands.c (tn): New variables hostaddr and srchostp.
Parse -b parameter. Update usage string. If -b is set, call
getaddrinfo on it and pass that ai_addr on to bind.
* telnet/main.c (srcaddr): New global variable.
(argp_options): Add --bind (-b).
(parse_opt): Set srcaddr to -b value.
(main): Propagate -b value to tn function.
2021-02-11 Simon Josefsson <simon@josefsson.org>
* TODO: Add items discussed on mailing list.

6
NEWS
View File

@@ -2,6 +2,12 @@ GNU inetutils NEWS -- history of user-visible changes.
* Noteworthy changes in release ?.? (????-??-??) [?]
* telnet
** Implement --bind (-b).
This is used to bind to a particular local socket, for compatibility
with NetKit's telnet.
* Noteworthy changes in release 2.0 (2021-02-05) [stable]

View File

@@ -2996,6 +2996,12 @@ Use an 8-bit data path.
@opindex --login
Attempt automatic login.
@item -b @var{address}
@itemx --bind=@var{address}
@opindex -b
@opindex --bind
Bind to specific local @var{address}.
@item -c
@itemx --no-rc
@opindex -c

View File

@@ -2449,7 +2449,7 @@ int
tn (int argc, char *argv[])
{
#ifdef IPV6
struct addrinfo *result, *aip, hints;
struct addrinfo *result, *aip, hints, *hostaddr;
#else
struct hostent *host = 0;
struct sockaddr_in sin;
@@ -2458,7 +2458,7 @@ tn (int argc, char *argv[])
#endif
const int on = 1;
int err;
char *cmd, *hostp = 0, *portp = 0, *user = 0;
char *cmd, *hostp = 0, *portp = 0, *user = 0, *srchostp = 0;
#if defined HAVE_IDN || defined HAVE_IDN2
char *hosttmp = 0;
#endif
@@ -2506,6 +2506,16 @@ tn (int argc, char *argv[])
--argc;
continue;
}
if (strcmp (*argv, "-b") == 0)
{
--argc;
++argv;
if (argc == 0)
goto usage;
srchostp = *argv++;
--argc;
continue;
}
if (strcmp (*argv, "-a") == 0)
{
--argc;
@@ -2546,7 +2556,7 @@ tn (int argc, char *argv[])
continue;
}
usage:
printf ("usage: %s [-4] [-6] [-l user] [-a] host-name [port]\n", cmd);
printf ("usage: %s [-4] [-6] [-l user] [-b addr] [-a] host-name [port]\n", cmd);
return 0;
}
if (hostp == 0)
@@ -2624,6 +2634,18 @@ tn (int argc, char *argv[])
hints.ai_flags = AI_IDN;
# endif
if (srchostp)
{
err = getaddrinfo (srchostp, "0", &hints, &hostaddr);
if (err < 0)
{
printf ("Could not resolve %s: %s\n", srchostp,
gai_strerror (err));
return 0;
}
hints.ai_family = hostaddr->ai_family;
}
err = getaddrinfo (hostp, portp, &hints, &result);
if (err)
{
@@ -2669,6 +2691,16 @@ tn (int argc, char *argv[])
return 0;
}
if (srchostp)
{
err = bind(net, hostaddr->ai_addr, hostaddr->ai_addrlen);
if (err < 0)
{
perror ("telnet: bind");
return 0;
}
}
if (debug)
{
err = setsockopt (net, SOL_SOCKET, SO_DEBUG, &on, sizeof (on));
@@ -2698,6 +2730,8 @@ tn (int argc, char *argv[])
}
while (!connected);
if (srchostp)
freeaddrinfo(hostaddr);
freeaddrinfo (result);
#else /* !IPV6 */
temp = inet_addr (hostp);

View File

@@ -105,7 +105,7 @@ tninit (void)
}
int family = 0;
char *user;
char *user, *srcaddr;
#ifdef FORWARD
extern int forward_flags;
#endif /* FORWARD */
@@ -132,6 +132,8 @@ static struct argp_option argp_options[] = {
/* FIXME: Called "8bit" in r* utils */
{ "binary", '8', NULL, 0,
"use an 8-bit data transmission", GRID+1 },
{ "bind", 'b', "ADDRESS", 0,
"bind to specific local ADDRESS", GRID+1 },
{ "login", 'a', NULL, 0,
"attempt automatic login", GRID+1 },
{ "no-rc", 'c', NULL, 0,
@@ -313,6 +315,10 @@ parse_opt (int key, char *arg, struct argp_state *state _GL_UNUSED_PARAMETER)
break;
#endif
case 'b':
srcaddr = arg;
break;
default:
return ARGP_ERR_UNKNOWN;
}
@@ -374,7 +380,7 @@ main (int argc, char *argv[])
{
/* The command line contains at least one argument.
*/
char *args[8], **argp = args;
char *args[10], **argp = args;
if (argc > 2)
error (EXIT_FAILURE, 0, "too many arguments");
@@ -384,6 +390,11 @@ main (int argc, char *argv[])
*argp++ = "-l";
*argp++ = user;
}
if (srcaddr)
{
*argp++ = "-b";
*argp++ = srcaddr;
}
if (family == 4)
*argp++ = "-4";
else if (family == 6)