File multitail-getaddrinfo.patch of Package multitail
--- cmdline.c.orig 2012-01-01 12:48:44.644473139 +0100
+++ cmdline.c 2012-01-01 13:17:50.776411019 +0100
@@ -182,11 +182,16 @@
void add_redir_to_socket(char filtered, char *prio, char *fac, char *address, redirect_t **predir, int *n_redirect)
{
- struct hostent *hp;
char *local_address = mystrdup(address, __FILE__, __PRETTY_FUNCTION__, __LINE__);
char *colon = strchr(local_address, ':');
int prio_nr = -1, fac_nr = -1;
int loop;
+ char* node;
+ char* service;
+ struct addrinfo hints;
+ struct addrinfo* result;
+ struct addrinfo* rp;
+ int s, sfd;
*predir = (redirect_t *)myrealloc(*predir, (*n_redirect) * sizeof(redirect_t), __FILE__, __PRETTY_FUNCTION__, __LINE__);
@@ -199,21 +204,44 @@
(*predir)[*n_redirect].redirect = mystrdup(address, __FILE__, __PRETTY_FUNCTION__, __LINE__);
- (*predir)[*n_redirect].fd = socket(AF_INET, SOCK_DGRAM, 0);
- if ((*predir)[*n_redirect].fd == -1)
- error_exit(__FILE__, __PRETTY_FUNCTION__, __LINE__, "Cannot create socket for redirecting via syslog protocol.\n");
-
- memset(&(*predir)[*n_redirect].sai, 0x00, sizeof((*predir)[*n_redirect].sai));
- (*predir)[*n_redirect].sai.sin_family = AF_INET;
if (colon)
{
*colon = 0x00;
- (*predir)[*n_redirect].sai.sin_port = atoi(colon + 1);
+ node = local_address;
+ service = colon + 1;
}
else
- (*predir)[*n_redirect].sai.sin_port = 514;
- hp = gethostbyname(local_address);
- memcpy(&(*predir)[*n_redirect].sai.sin_addr.s_addr, hp -> h_addr, hp -> h_length);
+ {
+ node = local_address;
+ service = "syslog";
+ }
+
+ memset(&hints, 0x00, sizeof(struct addrinfo));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_flags = 0;
+ hints.ai_protocol = 0;
+
+ s = getaddrinfo(node, service, &hints, &result);
+ if (s != 0)
+ error_exit(__FILE__, __PRETTY_FUNCTION__, __LINE__, "Cannot create socket for redirecting via syslog protocol: %s.\n", gai_strerror(s));
+
+ for (rp = result; rp != NULL; rp = rp -> ai_next)
+ {
+ sfd = socket(rp -> ai_family, rp -> ai_socktype, rp -> ai_protocol);
+ if (sfd == -1)
+ continue;
+ if (connect(sfd, rp -> ai_addr, rp -> ai_addrlen) != -1)
+ break;
+ close(sfd);
+ }
+
+ freeaddrinfo(result);
+
+ if (rp == NULL)
+ error_exit(__FILE__, __PRETTY_FUNCTION__, __LINE__, "Cannot create socket for redirecting via syslog protocol.\n");
+
+ (*predir)[*n_redirect].fd = sfd;
for(loop=0; loop<8; loop++)
{
--- mt.c.orig 2012-01-01 13:07:22.315433377 +0100
+++ mt.c 2012-01-01 13:17:29.752411767 +0100
@@ -2295,31 +2295,54 @@
{
char *dummy = mystrdup(cur -> filename, __FILE__, __PRETTY_FUNCTION__, __LINE__);
char *colon = strchr(dummy, ':');
- struct sockaddr_in sa;
- socklen_t ssai_len = sizeof(sa);
- char *host = "0.0.0.0";
- int port = 514;
+ struct addrinfo hints;
+ struct addrinfo* result;
+ struct addrinfo* rp;
+ int sfd, s;
- cur -> wfd = cur -> fd = socket(AF_INET, SOCK_DGRAM, 0);
- if (cur -> fd == -1)
- error_exit(__FILE__, __PRETTY_FUNCTION__, __LINE__, "Failed to create socket for receiving syslog data.\n");
+ char *host = NULL;
+ char *service = "syslog";
if (colon)
{
- port = atoi(colon + 1);
- if (port <= 0)
- error_exit(__FILE__, __PRETTY_FUNCTION__, __LINE__, "--[Ll]isten requires a >= 0 portnumber.\n");
+ service = colon + 1;
*colon = 0x00;
if (colon > dummy)
host = dummy;
}
- memset(&sa, 0x00, ssai_len);
- sa.sin_family = AF_INET;
- sa.sin_port = htons(port);
- sa.sin_addr.s_addr = inet_addr(host);
- if (bind(cur -> fd, (struct sockaddr *)&sa, ssai_len) == -1)
- error_exit(__FILE__, __PRETTY_FUNCTION__, __LINE__, "Failed to bind socket to %s.\n", cur -> filename);
+ memset(&hints, 0x00, sizeof(struct addrinfo));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_flags = AI_PASSIVE;
+ hints.ai_protocol = 0;
+ hints.ai_canonname = NULL;
+ hints.ai_addr = NULL;
+ hints.ai_next = NULL;
+
+ s = getaddrinfo(host, service, &hints, &result);
+ if (s != 0)
+ error_exit(__FILE__, __PRETTY_FUNCTION__, __LINE__, "Failed to create socket for receiving syslog data on %s: %s.\n", cur -> filename, gai_strerror(s));
+
+ for (rp = result; rp != NULL; rp = rp -> ai_next)
+ {
+ sfd = socket(rp -> ai_family, rp -> ai_socktype, rp -> ai_protocol);
+ if (sfd == -1)
+ continue;
+ if (bind(sfd, rp -> ai_addr, rp -> ai_addrlen) == 0)
+ break;
+ close(sfd);
+ }
+
+ freeaddrinfo(result);
+
+ if (rp == NULL)
+ error_exit(__FILE__, __PRETTY_FUNCTION__, __LINE__, "Failed to create socket for receiving syslog data on %s.\n", cur -> filename);
+
+ cur -> wfd = cur -> fd = sfd;
+
+ cur -> wfd = cur -> fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (cur -> fd == -1)
myfree(dummy);