* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 2012 */
+/* Copyright (c) University of Cambridge 1995 - 2013 */
/* See the file NOTICE for conditions of use and distribution. */
/* Code for handling Access Control Lists (ACLs) */
uschar *portend;
host_item *h;
int portnum;
-int host_af;
int len;
int r, s;
+uschar * errstr;
hostname = string_nextinlist(&arg, &sep, NULL, 0);
portstr = string_nextinlist(&arg, &sep, NULL, 0);
if (hostname == NULL)
{
- *log_msgptr = "missing destination host in \"udpsend\" modifier";
+ *log_msgptr = US"missing destination host in \"udpsend\" modifier";
return ERROR;
}
if (portstr == NULL)
{
- *log_msgptr = "missing destination port in \"udpsend\" modifier";
+ *log_msgptr = US"missing destination port in \"udpsend\" modifier";
return ERROR;
}
if (arg == NULL)
{
- *log_msgptr = "missing datagram payload in \"udpsend\" modifier";
+ *log_msgptr = US"missing datagram payload in \"udpsend\" modifier";
return ERROR;
}
portnum = Ustrtol(portstr, &portend, 10);
if (*portend != '\0')
{
- *log_msgptr = "bad destination port in \"udpsend\" modifier";
+ *log_msgptr = US"bad destination port in \"udpsend\" modifier";
return ERROR;
}
r = host_find_byname(h, NULL, 0, NULL, FALSE);
if (r == HOST_FIND_FAILED || r == HOST_FIND_AGAIN)
{
- *log_msgptr = "DNS lookup failed in \"udpsend\" modifier";
+ *log_msgptr = US"DNS lookup failed in \"udpsend\" modifier";
return DEFER;
}
HDEBUG(D_acl)
debug_printf("udpsend [%s]:%d %s\n", h->address, portnum, arg);
-host_af = (Ustrchr(h->address, ':') == NULL)? AF_INET:AF_INET6;
-r = s = ip_socket(SOCK_DGRAM, host_af);
-if (r < 0) goto defer;
-r = ip_connect(s, host_af, h->address, portnum, 1);
-if (r < 0) goto defer;
-len = strlen(arg);
-r = send(s, arg, len, MSG_NOSIGNAL);
+r = s = ip_connectedsocket(SOCK_DGRAM, h->address, portnum, 1, NULL, &errstr);
if (r < 0) goto defer;
+len = Ustrlen(arg);
+r = send(s, arg, len, 0);
+if (r < 0)
+ {
+ errstr = strerror(errno);
+ close(s);
+ goto defer;
+ }
+close(s);
if (r < len)
{
*log_msgptr =
return OK;
defer:
-*log_msgptr = string_sprintf("\"udpsend\" failed: %s", strerror(errno));
+*log_msgptr = string_sprintf("\"udpsend\" failed: %s", errstr);
return DEFER;
}