extern char *bind_address;
extern int default_af_hint;
+extern int connect_timeout;
#ifdef HAVE_SIGACTION
static struct sigaction sigact;
return -1;
}
+/* connect() timeout handler based on alarm() */
+static RETSIGTYPE contimeout_handler(UNUSED(int val))
+{
+ connect_timeout = -1;
+}
/**
* Open a socket to a tcp remote host with the specified port .
s = -1;
continue;
}
- if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
+ if (connect_timeout > 0) {
+ SIGACTION(SIGALRM, contimeout_handler);
+ alarm(connect_timeout);
+ }
+
+ while (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
+ if (connect_timeout < 0)
+ exit_cleanup(RERR_CONTIMEOUT);
+ if (errno == EINTR)
+ continue;
close(s);
s = -1;
- continue;
+ break;
}
+
+ if (connect_timeout > 0)
+ alarm(0);
+
+ if (s < 0)
+ continue;
+
if (proxied
&& establish_proxy_connection(s, host, port,
proxy_user, proxy_pass) != 0) {
free(options);
}
-/**
- * Become a daemon, discarding the controlling terminal
- **/
-void become_daemon(void)
-{
- int i;
-
- if (fork()) {
- _exit(0);
- }
-
- /* detach from the terminal */
-#ifdef HAVE_SETSID
- setsid();
-#elif defined TIOCNOTTY
- i = open("/dev/tty", O_RDWR);
- if (i >= 0) {
- ioctl(i, (int)TIOCNOTTY, (char *)0);
- close(i);
- }
-#endif
- /* make sure that stdin, stdout an stderr don't stuff things
- * up (library functions, for example) */
- for (i = 0; i < 3; i++) {
- close(i);
- open("/dev/null", O_RDWR);
- }
-}
-
/**
* This is like socketpair but uses tcp. It is used by the Samba