mirror of
https://github.com/samba-team/samba.git
synced 2025-11-12 04:23:49 +03:00
r5107: moved the horrible ldap socket code, and the even worse
asn1-tied-to-blocking-sockets code into the ldap client and torture suite, and out of the generic libs, so nobody else is tempted to use it for any new code.
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
95d9766be8
commit
39d1ced21b
@@ -122,178 +122,3 @@ void set_socket_options(int fd, const char *options)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
Check the timeout.
|
||||
****************************************************************************/
|
||||
static BOOL timeout_until(struct timeval *timeout,
|
||||
const struct timeval *endtime)
|
||||
{
|
||||
struct timeval now;
|
||||
|
||||
GetTimeOfDay(&now);
|
||||
|
||||
if ((now.tv_sec > endtime->tv_sec) ||
|
||||
((now.tv_sec == endtime->tv_sec) &&
|
||||
(now.tv_usec > endtime->tv_usec)))
|
||||
return False;
|
||||
|
||||
timeout->tv_sec = endtime->tv_sec - now.tv_sec;
|
||||
timeout->tv_usec = endtime->tv_usec - now.tv_usec;
|
||||
return True;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
Read data from the client, reading exactly N bytes, with timeout.
|
||||
****************************************************************************/
|
||||
ssize_t read_data_until(int fd,char *buffer,size_t N,
|
||||
const struct timeval *endtime)
|
||||
{
|
||||
ssize_t ret;
|
||||
size_t total=0;
|
||||
|
||||
while (total < N) {
|
||||
|
||||
if (endtime != NULL) {
|
||||
fd_set r_fds;
|
||||
struct timeval timeout;
|
||||
int res;
|
||||
|
||||
FD_ZERO(&r_fds);
|
||||
FD_SET(fd, &r_fds);
|
||||
|
||||
if (!timeout_until(&timeout, endtime))
|
||||
return -1;
|
||||
|
||||
res = sys_select(fd+1, &r_fds, NULL, NULL, &timeout);
|
||||
if (res <= 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = sys_read(fd,buffer + total,N - total);
|
||||
|
||||
if (ret == 0) {
|
||||
DEBUG(10,("read_data: read of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ret == -1) {
|
||||
DEBUG(0,("read_data: read failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
|
||||
return -1;
|
||||
}
|
||||
total += ret;
|
||||
}
|
||||
return (ssize_t)total;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
Write data to a fd with timeout.
|
||||
****************************************************************************/
|
||||
ssize_t write_data_until(int fd,char *buffer,size_t N,
|
||||
const struct timeval *endtime)
|
||||
{
|
||||
size_t total=0;
|
||||
ssize_t ret;
|
||||
|
||||
while (total < N) {
|
||||
|
||||
if (endtime != NULL) {
|
||||
fd_set w_fds;
|
||||
struct timeval timeout;
|
||||
int res;
|
||||
|
||||
FD_ZERO(&w_fds);
|
||||
FD_SET(fd, &w_fds);
|
||||
|
||||
if (!timeout_until(&timeout, endtime))
|
||||
return -1;
|
||||
|
||||
res = sys_select(fd+1, NULL, &w_fds, NULL, &timeout);
|
||||
if (res <= 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = sys_write(fd,buffer + total,N - total);
|
||||
|
||||
if (ret == -1) {
|
||||
DEBUG(0,("write_data: write failure. Error = %s\n", strerror(errno) ));
|
||||
return -1;
|
||||
}
|
||||
if (ret == 0)
|
||||
return total;
|
||||
|
||||
total += ret;
|
||||
}
|
||||
return (ssize_t)total;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
create an outgoing socket. timeout is in milliseconds.
|
||||
**************************************************************************/
|
||||
int open_socket_out(int type, struct ipv4_addr *addr, int port, int timeout)
|
||||
{
|
||||
struct sockaddr_in sock_out;
|
||||
int res,ret;
|
||||
int connect_loop = 250; /* 250 milliseconds */
|
||||
int loops = (timeout) / connect_loop;
|
||||
|
||||
/* create a socket to write to */
|
||||
res = socket(PF_INET, type, 0);
|
||||
if (res == -1)
|
||||
{ DEBUG(0,("socket error\n")); return -1; }
|
||||
|
||||
if (type != SOCK_STREAM) return(res);
|
||||
|
||||
memset((char *)&sock_out,'\0',sizeof(sock_out));
|
||||
putip((char *)&sock_out.sin_addr,(char *)addr);
|
||||
|
||||
sock_out.sin_port = htons( port );
|
||||
sock_out.sin_family = PF_INET;
|
||||
|
||||
/* set it non-blocking */
|
||||
set_blocking(res,False);
|
||||
|
||||
DEBUG(3,("Connecting to %s at port %d\n", sys_inet_ntoa(*addr),port));
|
||||
|
||||
/* and connect it to the destination */
|
||||
connect_again:
|
||||
ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
|
||||
|
||||
/* Some systems return EAGAIN when they mean EINPROGRESS */
|
||||
if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
|
||||
errno == EAGAIN) && loops--) {
|
||||
msleep(connect_loop);
|
||||
goto connect_again;
|
||||
}
|
||||
|
||||
if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
|
||||
errno == EAGAIN)) {
|
||||
DEBUG(1,("timeout connecting to %s:%d\n", sys_inet_ntoa(*addr),port));
|
||||
close(res);
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef EISCONN
|
||||
if (ret < 0 && errno == EISCONN) {
|
||||
errno = 0;
|
||||
ret = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ret < 0) {
|
||||
DEBUG(2,("error connecting to %s:%d (%s)\n",
|
||||
sys_inet_ntoa(*addr),port,strerror(errno)));
|
||||
close(res);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* set it blocking again */
|
||||
set_blocking(res,True);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user