added connect timeout support
diff --git a/lib/url.c b/lib/url.c
index b633982..b8c4232 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -122,6 +122,19 @@
                                     struct connectdata *conn);
 
 
+#if !defined(WIN32)||defined(__CYGWIN32__)
+#ifndef RETSIGTYPE
+#define RETSIGTYPE void
+#endif
+static
+RETSIGTYPE alarmfunc(int signal)
+{
+  /* this is for "-ansi -Wall -pedantic" to stop complaining!   (rabe) */
+  (void)signal;
+  return;
+}
+#endif
+
 CURLcode Curl_close(CURL *curl)
 {
   struct UrlData *data=(struct UrlData *)curl;
@@ -186,6 +199,9 @@
 {
   /* We don't yet support specifying the URL at this point */
   struct UrlData *data;
+#ifdef HAVE_SIGACTION
+  struct sigaction sigact;
+#endif
 
   /* Very simple start-up: alloc the struct, init it with zeroes and return */
   data = (struct UrlData *)malloc(sizeof(struct UrlData));
@@ -234,6 +250,26 @@
     memset(data->connects, 0, sizeof(struct connectdata *)*data->numconnects);
 
     *curl = data;
+
+    /*************************************************************
+     * Set signal handler
+     *************************************************************/
+#ifdef HAVE_SIGACTION
+    sigaction(SIGALRM, NULL, &sigact);
+    sigact.sa_handler = alarmfunc;
+#ifdef SA_RESTART
+    /* HPUX doesn't have SA_RESTART but defaults to that behaviour! */
+    sigact.sa_flags &= ~SA_RESTART;
+#endif
+    sigaction(SIGALRM, &sigact, NULL);
+#else
+    /* no sigaction(), revert to the much lamer signal() */
+#ifdef HAVE_SIGNAL
+    signal(SIGALRM, alarmfunc);
+#endif
+
+#endif
+
     return CURLE_OK;
   }
 
@@ -595,6 +631,12 @@
      */
     data->timeout = va_arg(param, long);
     break;
+  case CURLOPT_CONNECTTIMEOUT:
+    /*
+     * The maximum time you allow curl to use to connect.
+     */
+    data->connecttimeout = va_arg(param, long);
+    break;
   case CURLOPT_MAXREDIRS:
     /*
      * The maximum amount of hops you allow curl to follow Location:
@@ -748,19 +790,6 @@
   return CURLE_OK;
 }
 
-#if !defined(WIN32)||defined(__CYGWIN32__)
-#ifndef RETSIGTYPE
-#define RETSIGTYPE void
-#endif
-static
-RETSIGTYPE alarmfunc(int signal)
-{
-  /* this is for "-ansi -Wall -pedantic" to stop complaining!   (rabe) */
-  (void)signal;
-  return;
-}
-#endif
-
 CURLcode Curl_disconnect(struct connectdata *conn)
 {
   if(!conn)
@@ -1246,9 +1275,6 @@
   struct connectdata *conn;
   struct connectdata *conn_temp;
   char endbracket;
-#ifdef HAVE_SIGACTION
-  struct sigaction sigact;
-#endif
   int urllen;
 
   /*************************************************************
@@ -1389,25 +1415,6 @@
   buf = data->buffer; /* this is our buffer */
 
   /*************************************************************
-   * Set signal handler
-   *************************************************************/
-#ifdef HAVE_SIGACTION
-  sigaction(SIGALRM, NULL, &sigact);
-  sigact.sa_handler = alarmfunc;
-#ifdef SA_RESTART
-  /* HPUX doesn't have SA_RESTART but defaults to that behaviour! */
-  sigact.sa_flags &= ~SA_RESTART;
-#endif
-  sigaction(SIGALRM, &sigact, NULL);
-#else
-  /* no sigaction(), revert to the much lamer signal() */
-#ifdef HAVE_SIGNAL
-  signal(SIGALRM, alarmfunc);
-#endif
-
-#endif
-
-  /*************************************************************
    * Take care of user and password authentication stuff
    *************************************************************/
 
@@ -1603,11 +1610,16 @@
   /*************************************************************
    * Set timeout if that is being used
    *************************************************************/
-  if(data->timeout) {
+  if(data->timeout || data->connecttimeout) {
     /* We set the timeout on the connection/resolving phase first, separately
      * from the download/upload part to allow a maximum time on everything */
-    myalarm(data->timeout); /* this sends a signal when the timeout fires
-			       off, and that will abort system calls */
+
+    /* myalarm() makes a signal get sent when the timeout fires off, and that
+       will abort system calls */
+    if(data->connecttimeout)
+      myalarm(data->connecttimeout);
+    else
+      myalarm(data->timeout);
   }
 
   /*************************************************************
diff --git a/lib/urldata.h b/lib/urldata.h
index 773d5bf..07e8953 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -496,8 +496,9 @@
   curl_passwd_callback fpasswd;
   void *passwd_client; /* pointer to pass to the passwd callback */
 
-  long timeout; /* in seconds, 0 means no timeout */
-  long infilesize; /* size of file to upload, -1 means unknown */
+  long timeout;        /* in seconds, 0 means no timeout */
+  long connecttimeout; /* in seconds, 0 means no timeout */
+  long infilesize;     /* size of file to upload, -1 means unknown */
 
   char buffer[BUFSIZE+1]; /* buffer with size BUFSIZE */