$NetBSD: patch-ai,v 1.5 2001/03/12 13:23:00 tron Exp $ --- src/server.c.orig Fri Jan 9 18:16:22 1998 +++ src/server.c Mon Mar 12 14:11:00 2001 @@ -2,19 +2,21 @@ * Copyright (C) 1995, 1996 Karl-Johan Johnsson. */ +#include +#include + #include "global.h" #include "child.h" #include "codes.h" #include "connect.h" #include "file.h" #include "resource.h" +#include "sysdeps.h" #include "server.h" #include "util.h" #include "widgets.h" #include "xutil.h" -#include "sysdeps.h" - struct SERVER { int fd; char *buffer; @@ -128,37 +130,70 @@ * tell != 0 means tell about errors * tell > 1 means say what you're doing */ -int server_open(SERVER *server, struct SERV_ADDR *addr, int tell) +int server_open(SERVER *server, SERV_ADDR *addr, int tell) { - long tmp; + int tmp; server_close(server); - server->fd = open_socket(); - if (server->fd < 0) { - set_message("Error: Failed to create socket!", True); - return -1; - } + while (addr) { + server->fd = open_socket(addr); + if (server->fd < 0) { + set_message("Error: Failed to create socket!", True); + return -1; + } - if (tell > 1) - set_message("Server contacted, waiting for response...", False); + if (tell > 1) + set_message("Server contacted, waiting for response...", False); - tmp = connect_socket(server->fd, addr); + if (connect_socket(server->fd, addr) == 0) + break; - if (tmp < 0 && would_block(server->fd, errno)) { - if (tell == 0) - return 0; /* don't block */ - - tmp = 0; - do_wait(&server->fd, True, server->quit_func, server); - if (server->fd < 0) - return -1; + if (would_block(server->fd, errno)) { + if (tell == 0) + return 0; /* don't block */ + + do_wait(&server->fd, True, server->quit_func, server); + if (server->fd < 0) + return -1; + else { +#ifdef __NetBSD__ + socklen_t length; + int error; +#else + int length, error; +#endif + length = sizeof(error); + if (getsockopt(server->fd, SOL_SOCKET, SO_ERROR, + (char *)&error, &length) == 0) { + if (error == 0) + break; + else + errno = error; + } + } + } + + server_close(server); + addr = next_addr(addr); + } + + if (server->fd < 0) { + if (tell) { + char message[128]; + char *tmp = error_string(errno); + + if (!tmp) + tmp = "Connection failed"; + sprintf(message, "Error: %s!", tmp); + set_message(message, True); + } + return -1; } server->buffer[0] = '\0'; - if (tmp >= 0) - do { - tmp = read(server->fd, server->buffer, server->len); - } while (tmp < 0 && errno == EINTR); + do { + tmp = read(server->fd, server->buffer, server->len); + } while (tmp < 0 && errno == EINTR); if (tmp >= 0) { server->buffer[tmp] = '\0';