Markus F.X.J. Oberhumer's CURLOPT_NOSIGNAL patch
authorDaniel Stenberg <daniel@haxx.se>
Thu, 8 Aug 2002 22:52:50 +0000 (22:52 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 8 Aug 2002 22:52:50 +0000 (22:52 +0000)
include/curl/curl.h
lib/transfer.c
lib/url.c
lib/urldata.h

index c1f2e272a98b93593e8779089c69f0c41cd34650..53be2f5b2eab973beb22b16b7e90944243414ada 100644 (file)
@@ -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;
index ae9d621c830fc919cb32ef942d3549b6b3b7456b..0b0563f41cea92bb0afbdbf9144f7327c518a25a 100644 (file)
@@ -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;
index f11d5df1781772fc330c1dea2b60b105eb4f0b92..071ec07f777e9eed01240a4f22ac2049c4ae3b9b 100644 (file)
--- 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
index 57ac155298563a6640b1509caf3077a5f41de28b..9c7b18b1bc5f49695f48727887dfcb2667b025c1 100644 (file)
@@ -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;
 };