aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/telnet/commands.c
diff options
context:
space:
mode:
authorRuslan Ermilov <ru@FreeBSD.org>1999-06-16 15:26:22 +0000
committerRuslan Ermilov <ru@FreeBSD.org>1999-06-16 15:26:22 +0000
commitec5035fa0b1def32968290f54899c032319acf06 (patch)
treee923b4009e0f2b6f702613c1cf2997cded1c9f46 /usr.bin/telnet/commands.c
parent5c539f036dca3fd50bc0a207e629bec18078b1b4 (diff)
downloadsrc-ec5035fa0b1def32968290f54899c032319acf06.tar.gz
src-ec5035fa0b1def32968290f54899c032319acf06.zip
Add "-s src_addr" option to allow setting of the source IP address.
Notes
Notes: svn path=/head/; revision=47947
Diffstat (limited to 'usr.bin/telnet/commands.c')
-rw-r--r--usr.bin/telnet/commands.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/usr.bin/telnet/commands.c b/usr.bin/telnet/commands.c
index ebacc42bc0d9..a4677e0135e4 100644
--- a/usr.bin/telnet/commands.c
+++ b/usr.bin/telnet/commands.c
@@ -2100,7 +2100,7 @@ tn(argc, argv)
char *argv[];
{
register struct hostent *host = 0;
- struct sockaddr_in sin;
+ struct sockaddr_in sin, src_sin;
struct servent *sp = 0;
unsigned long temp;
#if defined(IP_OPTIONS) && defined(IPPROTO_IP)
@@ -2108,6 +2108,7 @@ tn(argc, argv)
unsigned long sourceroute(), srlen;
#endif
char *cmd, *hostp = 0, *portp = 0, *user = 0;
+ char *src_addr = NULL;
/* clear the socket address prior to use */
bzero((char *)&sin, sizeof(sin));
@@ -2143,6 +2144,14 @@ tn(argc, argv)
autologin = 1;
continue;
}
+ if (strcmp(*argv, "-s") == 0) {
+ --argc; ++argv;
+ if (argc == 0)
+ goto usage;
+ src_addr = *argv++;
+ --argc;
+ continue;
+ }
if (hostp == 0) {
hostp = *argv++;
--argc;
@@ -2154,13 +2163,31 @@ tn(argc, argv)
continue;
}
usage:
- printf("usage: telnet [-l user] [-a] host-name [port]\n");
+ printf("usage: telnet [-l user] [-a] [-s src_addr] host-name [port]\n");
setuid(getuid());
return 0;
}
if (hostp == 0)
goto usage;
+ if (src_addr != NULL) {
+ bzero((char *)&src_sin, sizeof(src_sin));
+ src_sin.sin_family = AF_INET;
+ if (!inet_aton(src_addr, &src_sin.sin_addr)) {
+ host = gethostbyname2(src_addr, AF_INET);
+ if (host == NULL) {
+ herror(src_addr);
+ return 0;
+ }
+ if (host->h_length != sizeof(src_sin.sin_addr)) {
+ fprintf(stderr, "telnet: gethostbyname2: invalid address\n");
+ return 0;
+ }
+ memcpy((void *)&src_sin.sin_addr, (void *)host->h_addr_list[0],
+ sizeof(src_sin.sin_addr));
+ }
+ }
+
#if defined(IP_OPTIONS) && defined(IPPROTO_IP)
if (hostp[0] == '@' || hostp[0] == '!') {
if ((hostname = strrchr(hostp, ':')) == NULL)
@@ -2285,6 +2312,13 @@ tn(argc, argv)
perror("setsockopt (SO_DEBUG)");
}
+ if (src_addr != NULL) {
+ if (bind(net, (struct sockaddr *)&src_sin, sizeof(src_sin)) == -1) {
+ perror("bind");
+ return 0;
+ }
+ }
+
if (connect(net, (struct sockaddr *)&sin, sizeof (sin)) < 0) {
#if defined(h_addr) /* In 4.3, this is a #define */
if (host && host->h_addr_list[1]) {