aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/curl/curl.h3
-rw-r--r--lib/transfer.c6
-rw-r--r--lib/url.c12
-rw-r--r--lib/urldata.h1
4 files changed, 18 insertions, 4 deletions
diff --git a/include/curl/curl.h b/include/curl/curl.h
index c1f2e272a..53be2f5b2 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -561,6 +561,9 @@ typedef enum {
/* Instruct libcurl to use a smaller receive buffer */
CINIT(BUFFERSIZE, LONG, 98),
+
+ /* Instruct libcurl to do not use any signal/alarm handlers, even with timeouts. */
+ CINIT(NOSIGNAL, LONG, 99),
CURLOPT_LASTENTRY /* the last unusued */
} CURLoption;
diff --git a/lib/transfer.c b/lib/transfer.c
index ae9d621c8..0b0563f41 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -1130,7 +1130,8 @@ CURLcode Curl_pretransfer(struct SessionHandle *data)
/*************************************************************
* Tell signal handler to ignore SIGPIPE
*************************************************************/
- data->state.prev_signal = signal(SIGPIPE, SIG_IGN);
+ if(!data->set.no_signal)
+ data->state.prev_signal = signal(SIGPIPE, SIG_IGN);
#endif
Curl_initinfo(data); /* reset session-specific information "variables" */
@@ -1143,7 +1144,8 @@ CURLcode Curl_posttransfer(struct SessionHandle *data)
{
#if defined(HAVE_SIGNAL) && defined(SIGPIPE)
/* restore the signal handler for SIGPIPE before we get back */
- signal(SIGPIPE, data->state.prev_signal);
+ if(!data->set.no_signal)
+ signal(SIGPIPE, data->state.prev_signal);
#endif
return CURLE_OK;
diff --git a/lib/url.c b/lib/url.c
index f11d5df17..071ec07f7 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -1024,6 +1024,14 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
break;
+ case CURLOPT_NOSIGNAL:
+ /*
+ * The application asks not to set any signal() or alarm() handlers,
+ * even when using a timeout.
+ */
+ data->set.no_signal = va_arg(param, long) ? TRUE : FALSE;
+ break;
+
default:
/* unknown tag and its companion, just ignore: */
return CURLE_FAILED_INIT; /* correct this */
@@ -2281,7 +2289,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,
/*************************************************************
* Set timeout if that is being used
*************************************************************/
- if(data->set.timeout || data->set.connecttimeout) {
+ if((data->set.timeout || data->set.connecttimeout) && !data->set.no_signal) {
/*************************************************************
* Set signal handler to catch SIGALRM
* Store the old value to be able to set it back later!
@@ -2358,7 +2366,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,
}
Curl_pgrsTime(data, TIMER_NAMELOOKUP);
#ifdef HAVE_ALARM
- if(data->set.timeout || data->set.connecttimeout) {
+ if((data->set.timeout || data->set.connecttimeout) && !data->set.no_signal) {
#ifdef HAVE_SIGACTION
if(keep_copysig) {
/* we got a struct as it looked before, now put that one back nice
diff --git a/lib/urldata.h b/lib/urldata.h
index 57ac15529..9c7b18b1b 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -668,6 +668,7 @@ struct UserDefined {
bool reuse_fresh; /* do not re-use an existing connection */
bool expect100header; /* TRUE if we added Expect: 100-continue */
bool ftp_use_epsv; /* if EPSV is to be attempted or not */
+ bool no_signal;
bool global_dns_cache;
};