s_in.sin_addr.s_addr = ulAddress;
s_in.sin_port = htons( DNS_TCP_PORT );
- res = connect(conn->s, (struct sockaddr*)&s_in, sizeof( s_in ));
+ do {
+ res = connect(conn->s, (struct sockaddr*)&s_in, sizeof( s_in ));
+ } while ((res == -1) && (errno == EINTR));
if (res == -1) {
TALLOC_FREE(conn);
return ERROR_DNS_CONNECTION_FAILED;
while (total < len) {
- ssize_t ret = write(fd, data + total, len - total);
+ ssize_t ret;
+
+ do {
+ ret = write(fd, data + total, len - total);
+ } while ((ret == -1) && (errno == EINTR));
if (ret <= 0) {
/*
{
ssize_t ret;
- ret = sendto(conn->s, buf->data, buf->offset, 0,
+ do {
+ ret = sendto(conn->s, buf->data, buf->offset, 0,
(struct sockaddr *)&conn->RecvAddr,
sizeof(conn->RecvAddr));
+ } while ((ret == -1) && (errno == EINTR));
if (ret != buf->offset) {
return ERROR_DNS_SOCKET_ERROR;
pfd.events = POLLIN|POLLHUP;
fd_ready = poll(&pfd, 1, 10000);
+ if (fd_ready == -1) {
+ if (errno == EINTR) {
+ continue;
+ }
+ return ERROR_DNS_SOCKET_ERROR;
+ }
if ( fd_ready == 0 ) {
/* read timeout */
return ERROR_DNS_SOCKET_ERROR;
}
- ret = read(fd, data + total, len - total);
+ do {
+ ret = read(fd, data + total, len - total);
+ } while ((ret == -1) && (errno == EINTR));
+
if (ret <= 0) {
/* EOF or error */
return ERROR_DNS_SOCKET_ERROR;
return ERROR_DNS_NO_MEMORY;
}
- received = recv(conn->s, (void *)buf->data, 512, 0);
+ do {
+ received = recv(conn->s, (void *)buf->data, 512, 0);
+ } while ((received == -1) && (errno == EINTR));
if (received == -1) {
TALLOC_FREE(buf);