fixes by David Powers (broadcast and >= 0)

Dion't mess with linger.
This commit is contained in:
Vitor Santos Costa 2010-09-21 22:27:35 +01:00
parent ea0fbabedd
commit 01776c7a48
2 changed files with 47 additions and 15 deletions

View File

@ -188,7 +188,6 @@ Yap_init_socks(char *host, long interface_port)
struct sockaddr_in soadr; struct sockaddr_in soadr;
struct in_addr adr; struct in_addr adr;
struct hostent *he; struct hostent *he;
struct linger ling; /* For making sockets linger. */
#if USE_SOCKET #if USE_SOCKET
@ -224,10 +223,22 @@ Yap_init_socks(char *host, long interface_port)
return; return;
} }
#if ENABLE_SO_LINGER
struct linger ling; /* disables socket lingering. */
ling.l_onoff = 1; ling.l_onoff = 1;
ling.l_linger = 0; ling.l_linger = 0;
setsockopt(s, SOL_SOCKET, SO_LINGER, (void *) &ling, if (setsockopt(s, SOL_SOCKET, SO_LINGER, (void *) &ling,
sizeof(ling)); sizeof(ling)) < 0) {
#if HAVE_STRERROR
Yap_Error(SYSTEM_ERROR, TermNil,
"socket_connect/3 (setsockopt_linger: %s)", strerror(socket_errno));
#else
Yap_Error(SYSTEM_ERROR, TermNil,
"socket_connect/3 (setsockopt_linger)");
#endif
return;
}
#endif
r = connect ( s, (struct sockaddr *) &soadr, sizeof(soadr)); r = connect ( s, (struct sockaddr *) &soadr, sizeof(soadr));
if (r<0) { if (r<0) {
@ -760,7 +771,6 @@ p_socket_connect(void)
struct hostent *he; struct hostent *he;
struct sockaddr_in saddr; struct sockaddr_in saddr;
unsigned short int port; unsigned short int port;
struct linger ling; /* For making sockets linger. */
memset((void *)&saddr,(int) 0, sizeof(saddr)); memset((void *)&saddr,(int) 0, sizeof(saddr));
if (IsVarTerm(thost)) { if (IsVarTerm(thost)) {
@ -794,6 +804,10 @@ p_socket_connect(void)
} }
saddr.sin_port = htons(port); saddr.sin_port = htons(port);
saddr.sin_family = AF_INET; saddr.sin_family = AF_INET;
#if ENABLE_SO_LINGER
{
struct linger ling; /* For making sockets linger. */
/* disabled: I see why no reason why we should throw things away by default!! */
ling.l_onoff = 1; ling.l_onoff = 1;
ling.l_linger = 0; ling.l_linger = 0;
if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (void *) &ling, if (setsockopt(fd, SOL_SOCKET, SO_LINGER, (void *) &ling,
@ -805,8 +819,26 @@ p_socket_connect(void)
Yap_Error(SYSTEM_ERROR, TermNil, Yap_Error(SYSTEM_ERROR, TermNil,
"socket_connect/3 (setsockopt_linger)"); "socket_connect/3 (setsockopt_linger)");
#endif #endif
return(FALSE); return FALSE;
} }
}
#endif
{
int one = 1; /* code by David MW Powers */
if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (void *)&one, sizeof(one))) {
#if HAVE_STRERROR
Yap_Error(SYSTEM_ERROR, TermNil,
"socket_connect/3 (setsockopt_broadcast: %s)", strerror(socket_errno));
#else
Yap_Error(SYSTEM_ERROR, TermNil,
"socket_connect/3 (setsockopt_broadcast)");
#endif
return FALSE;
}
}
flag = connect(fd,(struct sockaddr *)&saddr, sizeof(saddr)); flag = connect(fd,(struct sockaddr *)&saddr, sizeof(saddr));
if(flag<0) { if(flag<0) {
#if HAVE_STRERROR #if HAVE_STRERROR
@ -816,7 +848,7 @@ p_socket_connect(void)
Yap_Error(SYSTEM_ERROR, TermNil, Yap_Error(SYSTEM_ERROR, TermNil,
"socket_connect/3 (connect)"); "socket_connect/3 (connect)");
#endif #endif
return(FALSE); return FALSE;
} }
Yap_UpdateSocketStream(sno, client_socket, af_inet); Yap_UpdateSocketStream(sno, client_socket, af_inet);
} else } else

View File

@ -51,7 +51,7 @@ socket_select(Socks, OutSocks, TimeOut, Streams, OutStreams) :-
'$check_select_time'(Sec0:USec0, Sec, USec, _) :- '$check_select_time'(Sec0:USec0, Sec, USec, _) :-
Sec is Sec0, Sec is Sec0,
USec is USec0, USec is USec0,
Sec > 0, USec > 0. Sec >= 0, USec >= 0.
'$cp_socket_fds'([], Fds, [], Fds). '$cp_socket_fds'([], Fds, [], Fds).
'$cp_socket_fds'([_|Scks], [[]|Fds], Out, StrFds) :- !, '$cp_socket_fds'([_|Scks], [[]|Fds], Out, StrFds) :- !,