cookie jar adjustments
diff --git a/lib/cookie.c b/lib/cookie.c
index b9acb94..f303363 100644
--- a/lib/cookie.c
+++ b/lib/cookie.c
@@ -384,6 +384,8 @@
       c->cookies = co;
   }
 
+  c->numcookies++; /* one more cookie in the jar */
+
   return co;
 }
 
@@ -584,67 +586,86 @@
    }
 }
 
-#ifdef COOKIE /* experiemental functions for the upcoming cookie jar stuff */
-
 /*
- * On my Solaris box, this command line builds this test program:
+ * Curl_cookie_output()
  *
- * gcc -g -o cooktest -DCOOKIE=1 -DHAVE_CONFIG_H -I.. -I../include cookie.c strequal.o getdate.o memdebug.o mprintf.o strtok.o -lnsl -lsocket
+ * Writes all internally known cookies to the specified file. Specify
+ * "-" as file name to write to stdout.
  *
+ * The function returns non-zero on write failure.
  */
-
-void Curl_cookie_output(struct CookieInfo *c)
+int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
 {
   struct Cookie *co;
-  struct Cookie *next;
+  FILE *out;
+  bool use_stdout=FALSE;
+
+  if(0 == c->numcookies)
+    /* If there are no known cookies, we don't write or even create any
+       destination file */
+    return 0;
+
+  if(strequal("-", dumphere)) {
+    /* use stdout */
+    out = stdout;
+    use_stdout=TRUE;
+  }
+  else {
+    out = fopen(dumphere, "w");
+    if(!out)
+      return 1; /* failure */
+  }
+
   if(c) {
-#if COOKIE > 1
-    if(c->filename)
-      printf("Got these cookies from: \"%s\"\n", c->filename);
-#else
-    puts("# Netscape HTTP Cookie File\n"
-         "# http://www.netscape.com/newsref/std/cookie_spec.html\n"
-         "# This is generated by libcurl!  Do not edit.\n");
-#endif
-    
+    fputs("# Netscape HTTP Cookie File\n"
+          "# http://www.netscape.com/newsref/std/cookie_spec.html\n"
+          "# This is generated by libcurl! Edit on your own risk.\n\n",
+          out);
     co = c->cookies;
      
     while(co) {
-#if COOKIE > 1
-      printf("Name: %s\n", co->name?co->name:"");
-      printf(" Value: %s\n", co->value?co->value:"");
-      printf(" Domain: %s\n", co->domain?co->domain:"");
-      printf(" Path: %s\n", co->path?co->path:"");
-      printf(" Expire: %s\n", co->expirestr?co->expirestr:"");
-      printf(" Version: %s\n", co->version?co->version:"");
-      printf(" Max-Age: %s\n\n", co->maxage?co->maxage:"");
-#endif
-      printf("%s\t" /* domain */
-             "%s\t" /* field1 */
-             "%s\t" /* path */
-             "%s\t" /* secure */
-             "%d\t" /* expires */
-             "%s\t" /* name */
-             "%s\n", /* value */
-             co->domain,
-             co->field1==2?"TRUE":"FALSE",
-             co->path,
-             co->secure?"TRUE":"FALSE",
-             co->expires,
-             co->name,
-             co->value);
+      fprintf(out,
+              "%s\t" /* domain */
+              "%s\t" /* field1 */
+              "%s\t" /* path */
+              "%s\t" /* secure */
+              "%u\t" /* expires */
+              "%s\t" /* name */
+              "%s\n", /* value */
+              co->domain,
+              co->field1==2?"TRUE":"FALSE",
+              co->path,
+              co->secure?"TRUE":"FALSE",
+              (unsigned int)co->expires,
+              co->name,
+              co->value);
 
       co=co->next;
     }
   }
+
+  if(!use_stdout)
+    fclose(out);
+
+  return 0;
 }
 
+#ifdef CURL_COOKIE_DEBUG
+
+/*
+ * On my Solaris box, this command line builds this test program:
+ *
+ * gcc -g -o cooktest -DCURL_COOKIE_DEBUG -DHAVE_CONFIG_H -I.. -I../include cookie.c strequal.o getdate.o memdebug.o mprintf.o strtok.o -lnsl -lsocket
+ *
+ */
+
 int main(int argc, char **argv)
 {
   struct CookieInfo *c=NULL;
   if(argc>1) {
     c = Curl_cookie_init(argv[1], c);
     Curl_cookie_add(c, TRUE, "PERSONALIZE=none;expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=.fidelity.com; path=/ftgw; secure");
+    Curl_cookie_add(c, TRUE, "foobar=yes; domain=.haxx.se; path=/looser;");
     c = Curl_cookie_init(argv[1], c);
 
     Curl_cookie_output(c);
diff --git a/lib/cookie.h b/lib/cookie.h
index befd54c..34b6fd5 100644
--- a/lib/cookie.h
+++ b/lib/cookie.h
@@ -57,6 +57,7 @@
 
   char *filename; /* file we read from/write to */
   bool running;   /* state info, for cookie adding information */
+  long numcookies; /* number of cookies in the "jar" */
 };
 
 /* This is the maximum line length we accept for a cookie line */
@@ -72,5 +73,6 @@
 struct Cookie *Curl_cookie_getlist(struct CookieInfo *, char *, char *, bool);
 void Curl_cookie_freelist(struct Cookie *);
 void Curl_cookie_cleanup(struct CookieInfo *);
+int Curl_cookie_output(struct CookieInfo *, char *);
 
 #endif
diff --git a/lib/url.c b/lib/url.c
index 294a5db..20111d0 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -178,6 +178,10 @@
     /* the URL is allocated, free it! */
     free(data->url);
 
+  if(data->cookiejar)
+    /* we have a "destination" for all the cookies to get dumped to */
+    Curl_cookie_output(data->cookies, data->cookiejar);
+    
   Curl_cookie_cleanup(data->cookies);
 
   /* free the connection cache */
@@ -488,12 +492,19 @@
 
   case CURLOPT_COOKIEFILE:
     /*
-     * Set cookie file to read and parse.
+     * Set cookie file to read and parse. Can be used multiple times.
      */
     cookiefile = (char *)va_arg(param, void *);
     if(cookiefile)
       data->cookies = Curl_cookie_init(cookiefile, data->cookies);
     break;
+
+  case CURLOPT_COOKIEJAR:
+    /*
+     * Set cookie file name to dump all cookies to when we're done.
+     */
+    data->cookiejar = cookiefile = (char *)va_arg(param, void *);
+    break;
   case CURLOPT_WRITEHEADER:
     /*
      * Custom pointer to pass the header write callback function
diff --git a/lib/urldata.h b/lib/urldata.h
index d0e54c7..8f155e3 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -541,6 +541,7 @@
   char *cert_passwd; /* plain text certificate password */
 
   struct CookieInfo *cookies;
+  char *cookiejar; /* dump all cookies to this file */
 
   long crlf;
   struct curl_slist *quote;     /* before the transfer */