diff options
author | dillon <dillon@FreeBSD.org> | 2001-05-23 22:47:16 +0000 |
---|---|---|
committer | dillon <dillon@FreeBSD.org> | 2001-05-23 22:47:16 +0000 |
commit | a2bd71dbaf9c5662b4dd45011ebfec24b18c5740 (patch) | |
tree | a2a3188500ede8bdee474b70aa5560df7cda9769 /usr.bin/telnet | |
parent | 7959aca6f7927fb68c5325dea9b886220f5c7842 (diff) | |
download | FreeBSD-src-a2bd71dbaf9c5662b4dd45011ebfec24b18c5740.zip FreeBSD-src-a2bd71dbaf9c5662b4dd45011ebfec24b18c5740.tar.gz |
A feature to allow one to telnet to a unix domain socket.
Obtained from: Lyndon Nerenberg <lyndon@orthanc.ab.ca>
Diffstat (limited to 'usr.bin/telnet')
-rw-r--r-- | usr.bin/telnet/commands.c | 30 | ||||
-rw-r--r-- | usr.bin/telnet/main.c | 5 | ||||
-rw-r--r-- | usr.bin/telnet/telnet.1 | 13 |
3 files changed, 44 insertions, 4 deletions
diff --git a/usr.bin/telnet/commands.c b/usr.bin/telnet/commands.c index 5079dc1..d8160cc 100644 --- a/usr.bin/telnet/commands.c +++ b/usr.bin/telnet/commands.c @@ -39,6 +39,7 @@ static char sccsid[] = "@(#)commands.c 8.2 (Berkeley) 12/15/93"; #if defined(unix) #include <sys/param.h> +#include <sys/un.h> #if defined(CRAY) || defined(sysV88) #include <sys/types.h> #endif @@ -2109,6 +2110,9 @@ sockaddr_ntop(sa) case AF_INET: addr = &((struct sockaddr_in *)sa)->sin_addr; break; + case AF_UNIX: + addr = &((struct sockaddr_un *)sa)->sun_path; + break; #ifdef INET6 case AF_INET6: addr = &((struct sockaddr_in6 *)sa)->sin6_addr; @@ -2267,7 +2271,30 @@ tn(argc, argv) } src_res0 = src_res; } - if (hostp[0] == '@' || hostp[0] == '!') { + if (hostp[0] == '/') { + struct sockaddr_un su; + + if (strlen(hostp) >= sizeof(su.sun_path)) { + fprintf(stderr, "hostname too long for unix domain socket: %s", + hostp); + goto fail; + } + memset(&su, 0, sizeof su); + su.sun_family = AF_UNIX; + strncpy(su.sun_path, hostp, sizeof su.sun_path); + printf("Trying %s...\n", &su.sun_path); + net = socket(PF_UNIX, SOCK_STREAM, 0); + if ( net < 0) { + perror("socket"); + goto fail; + } + if (connect(net, (struct sockaddr *)&su, sizeof su) == -1) { + perror(su.sun_path); + (void) NetClose(net); + goto fail; + } + goto af_unix; + } else if (hostp[0] == '@' || hostp[0] == '!') { if ( #ifdef INET6 family == AF_INET6 || @@ -2450,6 +2477,7 @@ tn(argc, argv) if (src_res0 != NULL) freeaddrinfo(src_res0); cmdrc(hostp, hostname); + af_unix: if (autologin && user == NULL) { struct passwd *pw; diff --git a/usr.bin/telnet/main.c b/usr.bin/telnet/main.c index 657f560..4b4a13a 100644 --- a/usr.bin/telnet/main.c +++ b/usr.bin/telnet/main.c @@ -157,11 +157,14 @@ main(argc, argv) #define IPSECOPT #endif while ((ch = getopt(argc, argv, - "468EKLNS:X:acde:fFk:l:n:rs:t:x" IPSECOPT)) != -1) + "468EKLNS:X:acde:fFk:l:n:rs:t:ux" IPSECOPT)) != -1) #undef IPSECOPT { switch(ch) { + case 'u': + family = AF_UNIX; + break; case '4': family = AF_INET; break; diff --git a/usr.bin/telnet/telnet.1 b/usr.bin/telnet/telnet.1 index 56bf056..4c857d9 100644 --- a/usr.bin/telnet/telnet.1 +++ b/usr.bin/telnet/telnet.1 @@ -42,7 +42,7 @@ protocol .Sh SYNOPSIS .Nm -.Op Fl 468EFKLNacdfrx +.Op Fl u468EFKLNacdfrx .Op Fl S Ar tos .Op Fl X Ar authtype .Op Fl e Ar escapechar @@ -75,6 +75,11 @@ command with those arguments. .Pp Options: .Bl -tag -width indent +.It Fl u +Forces +.Nm +to use +AF_UNIX addresses only (e.g. unix domain sockets, accessed with a file path) .It Fl 4 Forces .Nm @@ -205,7 +210,11 @@ option is not available outside of the United States and Canada. .It Ar host Indicates the official name, an alias, or the Internet address -of a remote host. +of a remote host. If +.Ar host +starts with a /, +.Nm +establishes a connection to the corresponding named socket. .It Ar port Indicates a port number (address of an application). If a number is not specified, the default |