--- manpages/bsmtp.1.old.old 2012-06-28 16:52:03.000000000 +0200 +++ manpages/bsmtp.1 2012-07-10 14:39:27.818315931 +0200 @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH BSMTP 1 "6 December 2009" "Kern Sibbald" "Network backup, recovery and verification" +.TH BSMTP 1 "3 July 2012" "Kern Sibbald" "Network backup, recovery and verification" .\" Please adjust this date whenever revising the manpage. .\" .SH NAME @@ -23,9 +23,18 @@ .SH OPTIONS .TP +.B \-4 +Forces bsmtp to use IPv4 addresses only. +.TP +.B \-6 +Forces bsmtp to use IPv6 addresses only. +.TP .B \-8 Encode the mail in UTF-8. .TP +.B \-a +Use any ip protocol for address resolution. +.TP .B \-c Set the \fBCc:\fR header. .TP @@ -115,4 +124,4 @@ .nh . .SH SEE ALSO -.BR "bacula-dir" "(8) " \ No newline at end of file +.BR "bacula-dir" "(8) " --- src/tools/bsmtp.c.old 2012-06-28 16:52:03.000000000 +0200 +++ src/tools/bsmtp.c 2012-07-10 14:39:27.967318985 +0200 @@ -85,6 +85,12 @@ #define MAXSTRING 254 #endif +enum resolv_type { + RESOLV_PROTO_ANY, + RESOLV_PROTO_IPV4, + RESOLV_PROTO_IPV6 +}; + static FILE *sfp; static FILE *rfp; @@ -97,6 +103,7 @@ static int mailport = 25; static char my_hostname[MAXSTRING]; static bool content_utf8 = false; +static resolv_type default_resolv_type = RESOLV_PROTO_IPV4; /* * Take input that may have names and other stuff and strip @@ -185,7 +192,12 @@ fprintf(stderr, _("\n" "Usage: %s [-f from] [-h mailhost] [-s subject] [-c copy] [recipient ...]\n" +" -4 forces bsmtp to use IPv4 addresses only.\n" +#ifdef HAVE_IPV6 +" -6 forces bsmtp to use IPv6 addresses only.\n" +#endif " -8 set charset to UTF-8\n" +" -a use any ip protocol for address resolution\n" " -c set the Cc: field\n" " -d set debug level to \n" " -dt print a timestamp in debug output\n" @@ -277,6 +289,11 @@ struct hostent *hp; struct sockaddr_in sin; #endif +#ifdef HAVE_IPV6 + const char *options = "468ac:d:f:h:r:s:l:?"; +#else + const char *options = "48ac:d:f:h:r:s:l:?"; +#endif setlocale(LC_ALL, "en_US"); bindtextdomain("bacula", LOCALEDIR); @@ -285,11 +302,26 @@ my_name_is(argc, argv, "bsmtp"); maxlines = 0; - while ((ch = getopt(argc, argv, "8c:d:f:h:r:s:l:?")) != -1) { + while ((ch = getopt(argc, argv, options)) != -1) { switch (ch) { + case '4': + default_resolv_type = RESOLV_PROTO_IPV4; + break; + +#ifdef HAVE_IPV6 + case '6': + default_resolv_type = RESOLV_PROTO_IPV6; + break; +#endif + case '8': content_utf8 = true; break; + + case 'a': + default_resolv_type = RESOLV_PROTO_ANY; + break; + case 'c': Dmsg1(20, "cc=%s\n", optarg); cc_addr = optarg; @@ -430,16 +462,31 @@ lookup_host: #ifdef HAVE_GETADDRINFO memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_UNSPEC; + switch (default_resolv_type) { + case RESOLV_PROTO_ANY: + hints.ai_family = AF_UNSPEC; + break; + case RESOLV_PROTO_IPV4: + hints.ai_family = AF_INET; + break; +#ifdef HAVE_IPV6 + case RESOLV_PROTO_IPV6: + hints.ai_family = AF_INET6; + break; +#endif + default: + hints.ai_family = AF_UNSPEC; + break; + } hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; + hints.ai_protocol = 0; hints.ai_flags = 0; snprintf(mail_port, sizeof(mail_port), "%d", mailport); if ((res = getaddrinfo(mailhost, mail_port, &hints, &ai)) != 0) { Pmsg2(0, _("Error unknown mail host \"%s\": ERR=%s\n"), mailhost, gai_strerror(res)); - if (!strcasecmp(mailhost, "localhost")) { + if (strcasecmp(mailhost, "localhost")) { Pmsg0(0, _("Retrying connection using \"localhost\".\n")); mailhost = "localhost"; goto lookup_host;