mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
- add timeouts to connect() for password server connections. This
makes multiple password servers practical.
(This used to be commit 5c3e8326cc
)
This commit is contained in:
parent
cebbbffcae
commit
9155889092
@ -2956,7 +2956,7 @@ static BOOL send_session_request(char *inbuf,char *outbuf)
|
||||
putip((char *)&dest_ip,inbuf+4);
|
||||
|
||||
close_sockets();
|
||||
Client = open_socket_out(SOCK_STREAM, &dest_ip, port);
|
||||
Client = open_socket_out(SOCK_STREAM, &dest_ip, port, LONG_CONNECT_TIMEOUT);
|
||||
if (Client == -1)
|
||||
return False;
|
||||
|
||||
@ -4025,7 +4025,7 @@ static BOOL open_sockets(int port )
|
||||
}
|
||||
}
|
||||
|
||||
Client = open_socket_out(SOCK_STREAM, &dest_ip, port);
|
||||
Client = open_socket_out(SOCK_STREAM, &dest_ip, port, LONG_CONNECT_TIMEOUT);
|
||||
if (Client == -1)
|
||||
return False;
|
||||
|
||||
|
@ -212,7 +212,7 @@ BOOL cli_send_session_request(char *inbuf, char *outbuf)
|
||||
putip((char *)&dest_ip,inbuf+4);
|
||||
|
||||
close_sockets();
|
||||
Client = open_socket_out(SOCK_STREAM, &dest_ip, port);
|
||||
Client = open_socket_out(SOCK_STREAM, &dest_ip, port, SHORT_CONNECT_TIMEOUT);
|
||||
if (Client == -1)
|
||||
return False;
|
||||
|
||||
@ -835,7 +835,7 @@ BOOL cli_open_sockets(int port)
|
||||
putip((char *)&dest_ip,(char *)hp->h_addr);
|
||||
}
|
||||
|
||||
Client = open_socket_out(SOCK_STREAM, &dest_ip, port);
|
||||
Client = open_socket_out(SOCK_STREAM, &dest_ip, port, SHORT_CONNECT_TIMEOUT);
|
||||
if (Client == -1)
|
||||
return False;
|
||||
|
||||
|
@ -150,4 +150,8 @@
|
||||
by many apps */
|
||||
#define KEEP_PASSWORD_SERVER_OPEN 1
|
||||
|
||||
/* how long to wait for a socket connect to happen */
|
||||
#define LONG_CONNECT_TIMEOUT 30
|
||||
#define SHORT_CONNECT_TIMEOUT 5
|
||||
|
||||
#endif
|
||||
|
@ -856,6 +856,7 @@ BOOL strhaslower(char *s);
|
||||
int count_chars(char *s,char c);
|
||||
void make_dir_struct(char *buf,char *mask,char *fname,unsigned int size,int mode,time_t date);
|
||||
void close_low_fds(void);
|
||||
int set_blocking(int fd, int set);
|
||||
int write_socket(int fd,char *buf,int len);
|
||||
int read_udp_socket(int fd,char *buf,int len);
|
||||
int read_with_timeout(int fd,char *buf,int mincnt,int maxcnt,long time_out);
|
||||
@ -891,7 +892,7 @@ void Abort(void );
|
||||
BOOL get_myname(char *my_name,struct in_addr *ip);
|
||||
BOOL ip_equal(struct in_addr ip1,struct in_addr ip2);
|
||||
int open_socket_in(int type, int port, int dlevel,uint32 socket_addr);
|
||||
int open_socket_out(int type, struct in_addr *addr, int port );
|
||||
int open_socket_out(int type, struct in_addr *addr, int port ,int timeout);
|
||||
int interpret_protocol(char *str,int def);
|
||||
int interpret_security(char *str,int def);
|
||||
uint32 interpret_addr(char *str);
|
||||
|
@ -477,6 +477,12 @@ struct
|
||||
#endif
|
||||
#ifdef SO_RCVLOWAT
|
||||
{"SO_RCVLOWAT", SOL_SOCKET, SO_RCVLOWAT, 0, OPT_INT},
|
||||
#endif
|
||||
#ifdef SO_SNDTIMEO
|
||||
{"SO_SNDTIMEO", SOL_SOCKET, SO_SNDTIMEO, 0, OPT_INT},
|
||||
#endif
|
||||
#ifdef SO_RCVTIMEO
|
||||
{"SO_RCVTIMEO", SOL_SOCKET, SO_RCVTIMEO, 0, OPT_INT},
|
||||
#endif
|
||||
{NULL,0,0,0,0}};
|
||||
|
||||
@ -1655,6 +1661,35 @@ void close_low_fds(void)
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
|
||||
else
|
||||
if SYSV use O_NDELAY
|
||||
if BSD use FNDELAY
|
||||
****************************************************************************/
|
||||
int set_blocking(int fd, int set)
|
||||
{
|
||||
int val;
|
||||
#ifdef O_NONBLOCK
|
||||
#define FLAG_TO_SET O_NONBLOCK
|
||||
#else
|
||||
#ifdef SYSV
|
||||
#define FLAG_TO_SET O_NDELAY
|
||||
#else /* BSD */
|
||||
#define FLAG_TO_SET FNDELAY
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if((val = fcntl(fd, F_GETFL, 0)) == -1)
|
||||
return -1;
|
||||
if(set) /* Turn blocking on - ie. clear nonblock flag */
|
||||
val &= ~FLAG_TO_SET;
|
||||
else
|
||||
val |= FLAG_TO_SET;
|
||||
return fcntl( fd, F_SETFL, val);
|
||||
#undef FLAG_TO_SET
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
write to a socket
|
||||
@ -2813,10 +2848,12 @@ int open_socket_in(int type, int port, int dlevel,uint32 socket_addr)
|
||||
/****************************************************************************
|
||||
create an outgoing socket
|
||||
**************************************************************************/
|
||||
int open_socket_out(int type, struct in_addr *addr, int port )
|
||||
int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
|
||||
{
|
||||
struct sockaddr_in sock_out;
|
||||
int res;
|
||||
int res,ret;
|
||||
int connect_loop = 250; /* 250 milliseconds */
|
||||
int loops = (timeout * 1000) / connect_loop;
|
||||
|
||||
/* create a socket to write to */
|
||||
res = socket(PF_INET, type, 0);
|
||||
@ -2831,15 +2868,35 @@ int open_socket_out(int type, struct in_addr *addr, int port )
|
||||
sock_out.sin_port = htons( port );
|
||||
sock_out.sin_family = PF_INET;
|
||||
|
||||
/* set it non-blocking */
|
||||
set_blocking(res,0);
|
||||
|
||||
DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
|
||||
|
||||
/* and connect it to the destination */
|
||||
if (connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out))<0) {
|
||||
DEBUG(0,("connect error: %s\n",strerror(errno)));
|
||||
close(res);
|
||||
return(-1);
|
||||
connect_again:
|
||||
ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
|
||||
|
||||
if (ret < 0 && errno == EINPROGRESS && loops--) {
|
||||
msleep(connect_loop);
|
||||
goto connect_again;
|
||||
}
|
||||
|
||||
if (ret < 0 && errno == EINPROGRESS) {
|
||||
DEBUG(2,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
|
||||
close(res);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
DEBUG(2,("error connecting to %s:%d (%s)\n",
|
||||
inet_ntoa(*addr),port,strerror(errno)));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* set it blocking again */
|
||||
set_blocking(res,1);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -357,17 +357,22 @@ static BOOL open_sockets(BOOL isdaemon, int port)
|
||||
****************************************************************************/
|
||||
static BOOL init_structs()
|
||||
{
|
||||
if (!get_myname(myhostname,NULL))
|
||||
return(False);
|
||||
extern fstring local_machine;
|
||||
char *p;
|
||||
|
||||
if (! *myname) {
|
||||
char *p;
|
||||
strcpy(myname,myhostname);
|
||||
p = strchr(myname,'.');
|
||||
if (p) *p = 0;
|
||||
}
|
||||
strupper(myname);
|
||||
|
||||
strcpy(local_machine,myname);
|
||||
trim_string(local_machine," "," ");
|
||||
p = strchr(local_machine,' ');
|
||||
if (p) *p = 0;
|
||||
strlower(local_machine);
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
@ -479,11 +484,15 @@ static void usage(char *pname)
|
||||
DEBUG(1,("%s netbios nameserver version %s started\n",timestring(),VERSION));
|
||||
DEBUG(1,("Copyright Andrew Tridgell 1994\n"));
|
||||
|
||||
get_myname(myhostname,NULL);
|
||||
|
||||
if (!reload_services(False))
|
||||
return(-1);
|
||||
|
||||
init_structs();
|
||||
|
||||
reload_services(True);
|
||||
|
||||
set_samba_nb_type();
|
||||
|
||||
if (!is_daemon && !is_a_socket(0)) {
|
||||
|
@ -1287,7 +1287,7 @@ BOOL server_cryptkey(char *buf)
|
||||
continue;
|
||||
}
|
||||
|
||||
password_client = open_socket_out(SOCK_STREAM, &dest_ip, port);
|
||||
password_client = open_socket_out(SOCK_STREAM, &dest_ip, port, SHORT_CONNECT_TIMEOUT);
|
||||
if (password_client >= 0) {
|
||||
DEBUG(3,("connected to password server %s\n",p));
|
||||
StrnCpy(pserver,p,sizeof(pserver)-1);
|
||||
|
Loading…
Reference in New Issue
Block a user