#DPATCHLEVEL=1 diff -ru inetutils-1.4.2+20040207.old/telnet/commands.c inetutils-1.4.2+20040207/telnet/commands.c --- inetutils-1.4.2+20040207.old/telnet/commands.c 2004-12-10 11:08:37.000000000 -0200 +++ inetutils-1.4.2+20040207/telnet/commands.c 2004-12-10 14:31:55.000000000 -0200 @@ -83,6 +83,11 @@ #include "defines.h" #include "types.h" +#ifdef USE_DNSSRV +#include +#include +#endif /* USE_DNSSRV */ + #if !defined(CRAY) && !defined(sysV88) #ifdef HAVE_NETINET_IN_SYSTM_H #include @@ -2195,6 +2200,48 @@ } #endif +typedef int (*_getaddrinfo_call_t)(const char *, + const char *, + const struct addrinfo *, + struct addrinfo **); + +#ifdef USE_DNSSRV +static void *ruli_handle = 0; + +static _getaddrinfo_call_t open_getaddrinfo() +{ + if (dontdnssrv) { + return getaddrinfo; + } + + if (!ruli_handle) { + ruli_handle = dlopen("libruli.so", RTLD_LAZY); + if (!ruli_handle) { + return getaddrinfo; + } + } + + { + _getaddrinfo_call_t call_ptr = \ + (_getaddrinfo_call_t) dlsym(ruli_handle, "ruli_getaddrinfo"); + if (call_ptr) { + printf("DNS SRV support detected (use -H to disable)\n"); + return call_ptr; + } + } + + return getaddrinfo; +} + +static void close_getaddrinfo() +{ + if (ruli_handle) { + dlclose(ruli_handle); + ruli_handle = 0; + } +} +#endif /* USE_DNSSRV */ + int tn(int argc, char *argv[]) { @@ -2209,6 +2256,7 @@ const int on = 1; int err; char *cmd, *hostp = 0, *portp = 0, *user = 0; + _getaddrinfo_call_t local_getaddrinfo; #ifdef IPV6 memset (&hints, 0, sizeof (hints)); @@ -2322,7 +2370,13 @@ #endif hints.ai_socktype = SOCK_STREAM; - err = getaddrinfo (hostp, portp, &hints, &result); +#ifdef USE_DNSSRV + local_getaddrinfo = open_getaddrinfo(); +#else + local_getaddrinfo = getaddrinfo; +#endif + + err = local_getaddrinfo (hostp, portp, &hints, &result); if (err) { const char *errmsg; @@ -2333,17 +2387,27 @@ errmsg = gai_strerror (err); printf ("%s/%s: lookup failure: %s\n", hostp, portp, errmsg); +#ifdef USE_DNSSRV + close_getaddrinfo(); +#endif return 0; } +#ifdef USE_DNSSRV + close_getaddrinfo(); +#endif + aip = result; do { - char buf[256]; + char name_buf[256]; + char service_buf[256]; - err = getnameinfo (aip->ai_addr, aip->ai_addrlen, buf, sizeof (buf), - NULL, 0, NI_NUMERICHOST); + err = getnameinfo (aip->ai_addr, aip->ai_addrlen, + name_buf, sizeof(name_buf), + service_buf, sizeof(service_buf), + NI_NUMERICHOST); if (err) { /* I don't know how thing can happen, but we just handle it. */ @@ -2355,15 +2419,35 @@ errmsg = gai_strerror (err); printf ("getnameinfo error: %s\n", errmsg); + + if (aip->ai_next) + { + aip = aip->ai_next; + continue; + } + return 0; } - - printf ("Trying %s...\n", buf); + +#ifdef USE_DNSSRV + if (dontdnssrv) + printf("Trying %s...\n", name_buf); + else + printf("Trying %s/%s/%s/%s...\n", + portp, hostp, name_buf, service_buf); +#else + printf("Trying %s...\n", name_buf); +#endif net = socket (aip->ai_family, SOCK_STREAM, 0); if (net < 0) { perror("telnet: socket"); + if (aip->ai_next) + { + aip = aip->ai_next; + continue; + } return 0; } diff -ru inetutils-1.4.2+20040207.old/telnet/externs.h inetutils-1.4.2+20040207/telnet/externs.h --- inetutils-1.4.2+20040207.old/telnet/externs.h 2001-10-27 17:10:33.000000000 -0200 +++ inetutils-1.4.2+20040207/telnet/externs.h 2004-12-10 10:45:36.000000000 -0200 @@ -152,6 +152,9 @@ apitrace, /* Trace API transactions */ #endif /* defined(TN3270) */ termdata, /* Print out terminal data flow */ +#ifdef USE_DNSSRV + dontdnssrv, /* Disable run-time DNS SRV support, if available */ +#endif debug; /* Debug level */ extern cc_t escape; /* Escape to command mode */ diff -ru inetutils-1.4.2+20040207.old/telnet/main.c inetutils-1.4.2+20040207/telnet/main.c --- inetutils-1.4.2+20040207.old/telnet/main.c 2004-12-10 11:08:37.000000000 -0200 +++ inetutils-1.4.2+20040207/telnet/main.c 2004-12-10 14:07:19.000000000 -0200 @@ -97,6 +97,11 @@ -r, --rlogin Use a user-interface similar to rlogin\n\ -X ATYPE, --disable-auth=ATYPE Disable type ATYPE authentication"); +#ifdef USE_DNSSRV + puts ("\ + -H Disable DNS SRV lookups"); +#endif + #ifdef ENCRYPTION puts ("\ -x, --encrypt Encrypt the data stream, if possible"); @@ -209,7 +214,7 @@ rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; autologin = -1; - while ((ch = getopt_long (argc, argv, "468EKLS:X:acde:fFk:l:n:rt:x", + while ((ch = getopt_long (argc, argv, "468EHKLS:X:acde:fFk:l:n:rt:x", long_options, 0)) != EOF) { @@ -228,6 +233,11 @@ case 'E': rlogin = escape = _POSIX_VDISABLE; break; +#ifdef USE_DNSSRV + case 'H': + ++dontdnssrv; + break; +#endif case 'K': #ifdef AUTHENTICATION autologin = 0; diff -ru inetutils-1.4.2+20040207.old/telnet/telnet.1 inetutils-1.4.2+20040207/telnet/telnet.1 --- inetutils-1.4.2+20040207.old/telnet/telnet.1 2000-07-06 01:21:09.000000000 -0300 +++ inetutils-1.4.2+20040207/telnet/telnet.1 2004-12-10 10:56:24.000000000 -0200 @@ -82,6 +82,8 @@ option allows the local credentials to be forwarded to the remote system, including any credentials that have already been forwarded into the local environment. +.It Fl H +Disables DNS SRV lookups at run-time, if support is available. .It Fl K Specifies no automatic login to the remote system. .It Fl L diff -ru inetutils-1.4.2+20040207.old/telnet/telnet.c inetutils-1.4.2+20040207/telnet/telnet.c --- inetutils-1.4.2+20040207.old/telnet/telnet.c 2001-10-27 17:10:33.000000000 -0200 +++ inetutils-1.4.2+20040207/telnet/telnet.c 2004-12-10 10:54:23.000000000 -0200 @@ -107,6 +107,9 @@ donelclchars, /* the user has set "localchars" */ donebinarytoggle, /* the user has put us in binary */ dontlecho, /* do we suppress local echoing right now? */ +#ifdef USE_DNSSRV + dontdnssrv = 0, /* Disable run-time DNS SRV support, if available */ +#endif globalmode; char *prompt = 0;