diff --git a/telnet/commands.c b/telnet/commands.c index 4a360df..ab25963 100644 --- a/telnet/commands.c +++ b/telnet/commands.c @@ -39,6 +39,7 @@ static const char sccsid[] = "@(#)commands.c 8.4 (Berkeley) 5/30/95"; #if defined(unix) #include +#include #if defined(CRAY) || defined(sysV88) #include #endif @@ -2285,6 +2286,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; @@ -2443,7 +2447,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 || @@ -2626,6 +2653,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/telnet/main.c b/telnet/main.c index b165f4a..47a5d2e 100644 --- a/telnet/main.c +++ b/telnet/main.c @@ -184,6 +184,9 @@ main(argc, argv) #undef IPSECOPT { switch(ch) { + case 'u': + family = AF_UNIX; + break; case '4': family = AF_INET; break; diff --git a/telnet/telnet.1 b/telnet/telnet.1 index 6434cfc..d734247 100644 --- a/telnet/telnet.1 +++ b/telnet/telnet.1 @@ -42,7 +42,7 @@ protocol .Sh SYNOPSIS .Nm -.Op Fl 8EFKLNcdfry +.Op Fl u468EFKLNcdfry .Op Fl S Ar tos .Op Fl X Ar authtype .Op Fl e Ar escapechar @@ -75,6 +75,19 @@ 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 +to use IPv4 addresses only. +.It Fl 6 +Forces +.Nm +to use IPv6 addresses only. .It Fl 8 Specifies an 8-bit data path. This causes an attempt to negotiate the @@ -191,7 +204,11 @@ This is now the default, so this option is ignored. Suppresses encryption of the data stream. .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