1
0
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:
Andrew Tridgell
2005-01-30 07:22:16 +00:00
committed by Gerald (Jerry) Carter
parent 95d9766be8
commit 39d1ced21b
4 changed files with 299 additions and 242 deletions

View File

@@ -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;
}