121 lines
2.7 KiB
Text
121 lines
2.7 KiB
Text
$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 <sys/types.h>
|
|
+#include <sys/socket.h>
|
|
+
|
|
#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';
|