1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

Markus F.X.J. Oberhumer's CURLOPT_NOSIGNAL patch

This commit is contained in:
Daniel Stenberg 2002-08-08 22:52:50 +00:00
parent ca5678c8c1
commit 4cf953678d
4 changed files with 18 additions and 4 deletions

View File

@ -561,6 +561,9 @@ typedef enum {
/* Instruct libcurl to use a smaller receive buffer */ /* Instruct libcurl to use a smaller receive buffer */
CINIT(BUFFERSIZE, LONG, 98), 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 */ CURLOPT_LASTENTRY /* the last unusued */
} CURLoption; } CURLoption;

View File

@ -1130,7 +1130,8 @@ CURLcode Curl_pretransfer(struct SessionHandle *data)
/************************************************************* /*************************************************************
* Tell signal handler to ignore SIGPIPE * 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 #endif
Curl_initinfo(data); /* reset session-specific information "variables" */ Curl_initinfo(data); /* reset session-specific information "variables" */
@ -1143,7 +1144,8 @@ CURLcode Curl_posttransfer(struct SessionHandle *data)
{ {
#if defined(HAVE_SIGNAL) && defined(SIGPIPE) #if defined(HAVE_SIGNAL) && defined(SIGPIPE)
/* restore the signal handler for SIGPIPE before we get back */ /* 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 #endif
return CURLE_OK; return CURLE_OK;

View File

@ -1024,6 +1024,14 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
break; 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: default:
/* unknown tag and its companion, just ignore: */ /* unknown tag and its companion, just ignore: */
return CURLE_FAILED_INIT; /* correct this */ return CURLE_FAILED_INIT; /* correct this */
@ -2281,7 +2289,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,
/************************************************************* /*************************************************************
* Set timeout if that is being used * 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 * Set signal handler to catch SIGALRM
* Store the old value to be able to set it back later! * 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); Curl_pgrsTime(data, TIMER_NAMELOOKUP);
#ifdef HAVE_ALARM #ifdef HAVE_ALARM
if(data->set.timeout || data->set.connecttimeout) { if((data->set.timeout || data->set.connecttimeout) && !data->set.no_signal) {
#ifdef HAVE_SIGACTION #ifdef HAVE_SIGACTION
if(keep_copysig) { if(keep_copysig) {
/* we got a struct as it looked before, now put that one back nice /* we got a struct as it looked before, now put that one back nice

View File

@ -668,6 +668,7 @@ struct UserDefined {
bool reuse_fresh; /* do not re-use an existing connection */ bool reuse_fresh; /* do not re-use an existing connection */
bool expect100header; /* TRUE if we added Expect: 100-continue */ bool expect100header; /* TRUE if we added Expect: 100-continue */
bool ftp_use_epsv; /* if EPSV is to be attempted or not */ bool ftp_use_epsv; /* if EPSV is to be attempted or not */
bool no_signal;
bool global_dns_cache; bool global_dns_cache;
}; };