From a4cc82665c26e8db94017aacf79d31b83e101c0c Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Wed, 23 May 2001 22:47:16 +0000 Subject: [PATCH] A feature to allow one to telnet to a unix domain socket. Obtained from: Lyndon Nerenberg --- usr.bin/telnet/commands.c | 30 +++++++++++++++++++++++++++++- usr.bin/telnet/main.c | 5 ++++- 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 5079dc19b845..d8160ccd46d6 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 +#include #if defined(CRAY) || defined(sysV88) #include #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 657f560e64a4..4b4a13a1b410 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 56bf05693b35..4c857d9b280a 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