summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
f6b4a7c)
There has been cases where send() is returning EINVAL even though
there is a connected the socket. So use sendto() instead and supply
the destination address when sending.
char *interface;
GList *domains;
char *server;
char *interface;
GList *domains;
char *server;
+ struct sockaddr server_addr;
+ socklen_t server_addr_len;
int protocol;
GIOChannel *channel;
guint watch;
int protocol;
GIOChannel *channel;
guint watch;
sk = g_io_channel_unix_get_fd(server->channel);
sk = g_io_channel_unix_get_fd(server->channel);
- err = send(sk, request, req->request_len, MSG_NOSIGNAL);
- if (err < 0)
+ err = sendto(sk, request, req->request_len, MSG_NOSIGNAL,
+ &server->server_addr, server->server_addr_len);
+ if (err < 0) {
+ DBG("Cannot send message to server %s sock %d "
+ "protocol %d (%s/%d)",
+ server->server, sk, server->protocol,
+ strerror(errno), errno);
data->domains = g_list_append(data->domains, g_strdup(domain));
data->server = g_strdup(server);
data->protocol = protocol;
data->domains = g_list_append(data->domains, g_strdup(domain));
data->server = g_strdup(server);
data->protocol = protocol;
+ data->server_addr_len = rp->ai_addrlen;
+ memcpy(&data->server_addr, rp->ai_addr, rp->ai_addrlen);
ret = connect(sk, rp->ai_addr, rp->ai_addrlen);
freeaddrinfo(rp);
ret = connect(sk, rp->ai_addr, rp->ai_addrlen);
freeaddrinfo(rp);