Initial revision
authorDaniel Stenberg <daniel@haxx.se>
Wed, 29 Dec 1999 14:20:26 +0000 (14:20 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 29 Dec 1999 14:20:26 +0000 (14:20 +0000)
144 files changed:
CHANGES [new file with mode: 0644]
CONTRIBUTE [new file with mode: 0644]
FAQ [new file with mode: 0644]
FEATURES [new file with mode: 0644]
FILES [new file with mode: 0644]
INSTALL [new file with mode: 0644]
LEGAL [new file with mode: 0644]
MPL-1.0.txt [new file with mode: 0644]
Makefile [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile.dist [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
README [new file with mode: 0644]
README.curl [new file with mode: 0644]
README.libcurl [new file with mode: 0644]
RESOURCES [new file with mode: 0644]
TODO [new file with mode: 0644]
acconfig.h [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
config-win32.h [new file with mode: 0644]
config.cache [new file with mode: 0644]
config.guess [new file with mode: 0755]
config.guess-991124 [new file with mode: 0755]
config.h [new file with mode: 0644]
config.h.in [new file with mode: 0644]
config.log [new file with mode: 0644]
config.status [new file with mode: 0755]
config.sub [new file with mode: 0755]
config.sub-991124 [new file with mode: 0755]
configure [new file with mode: 0755]
configure.in [new file with mode: 0644]
curl-6.3.1.tar.gz [new file with mode: 0644]
curl-ssl.spec [new file with mode: 0644]
curl.1 [new file with mode: 0644]
curl.beos-patch [new file with mode: 0644]
curl.spec [new file with mode: 0644]
curl_631_general.patch [new file with mode: 0644]
curl_63_form.patch [new file with mode: 0644]
curl_63_partialdl.patch [new file with mode: 0644]
head [new file with mode: 0644]
include/README [new file with mode: 0644]
include/curl/curl.beos-patch [new file with mode: 0644]
include/curl/curl.h [new file with mode: 0644]
include/curl/getdate.h [new file with mode: 0644]
include/curl/mprintf.h [new file with mode: 0644]
include/curl/stdcheaders.h [new file with mode: 0644]
install-sh [new file with mode: 0755]
lib/Makefile [new file with mode: 0644]
lib/Makefile.am [new file with mode: 0644]
lib/Makefile.in [new file with mode: 0644]
lib/Makefile.m32 [new file with mode: 0644]
lib/Makefile.vc6 [new file with mode: 0644]
lib/arpa_telnet.h [new file with mode: 0644]
lib/base64.c [new file with mode: 0644]
lib/base64.h [new file with mode: 0644]
lib/cookie.c [new file with mode: 0644]
lib/cookie.h [new file with mode: 0644]
lib/dict.c [new file with mode: 0644]
lib/dict.h [new file with mode: 0644]
lib/download.c [new file with mode: 0644]
lib/download.h [new file with mode: 0644]
lib/escape.c [new file with mode: 0644]
lib/escape.h [new file with mode: 0644]
lib/file.c [new file with mode: 0644]
lib/file.h [new file with mode: 0644]
lib/formdata [new file with mode: 0755]
lib/formdata.c [new file with mode: 0644]
lib/formdata.h [new file with mode: 0644]
lib/ftp.c [new file with mode: 0644]
lib/ftp.h [new file with mode: 0644]
lib/getdate.c [new file with mode: 0644]
lib/getdate.h [new file with mode: 0644]
lib/getdate.y [new file with mode: 0644]
lib/getenv.c [new file with mode: 0644]
lib/getenv.h [new file with mode: 0644]
lib/getpass.c [new file with mode: 0644]
lib/getpass.h [new file with mode: 0644]
lib/hostip.c [new file with mode: 0644]
lib/hostip.h [new file with mode: 0644]
lib/http.c [new file with mode: 0644]
lib/http.h [new file with mode: 0644]
lib/if2ip.c [new file with mode: 0644]
lib/if2ip.h [new file with mode: 0644]
lib/ldap.c [new file with mode: 0644]
lib/ldap.h [new file with mode: 0644]
lib/mprintf.c [new file with mode: 0644]
lib/netrc.c [new file with mode: 0644]
lib/netrc.h [new file with mode: 0644]
lib/progress.c [new file with mode: 0644]
lib/progress.h [new file with mode: 0644]
lib/sendf.c [new file with mode: 0644]
lib/sendf.h [new file with mode: 0644]
lib/setup.h [new file with mode: 0644]
lib/speedcheck.c [new file with mode: 0644]
lib/speedcheck.h [new file with mode: 0644]
lib/ssluse.c [new file with mode: 0644]
lib/ssluse.h [new file with mode: 0644]
lib/sta01005 [new file with mode: 0644]
lib/sta18057 [new file with mode: 0644]
lib/telnet.c [new file with mode: 0644]
lib/telnet.h [new file with mode: 0644]
lib/timeval.c [new file with mode: 0644]
lib/timeval.h [new file with mode: 0644]
lib/upload.c [new file with mode: 0644]
lib/upload.h [new file with mode: 0644]
lib/url.c [new file with mode: 0644]
lib/url.h [new file with mode: 0644]
lib/urldata.h [new file with mode: 0644]
lib/version.c [new file with mode: 0644]
maketgz [new file with mode: 0755]
missing [new file with mode: 0755]
mkinstalldirs [new file with mode: 0755]
perl/README [new file with mode: 0644]
perl/checklinks.pl [new file with mode: 0644]
perl/checklinks.pl.in [new file with mode: 0755]
perl/formfind.pl [new file with mode: 0644]
perl/formfind.pl.in [new file with mode: 0755]
perl/getlinks.pl [new file with mode: 0644]
perl/getlinks.pl.in [new file with mode: 0755]
perl/recursiveftpget.pl [new file with mode: 0644]
perl/recursiveftpget.pl.in [new file with mode: 0755]
reconf [new file with mode: 0755]
src/Makefile [new file with mode: 0644]
src/Makefile.am [new file with mode: 0644]
src/Makefile.in [new file with mode: 0644]
src/Makefile.m32 [new file with mode: 0644]
src/Makefile.vc6 [new file with mode: 0644]
src/config-win32.h [new file with mode: 0644]
src/config.h [new file with mode: 0644]
src/config.h.in [new file with mode: 0644]
src/curl [new file with mode: 0755]
src/hugehelp.c [new file with mode: 0644]
src/main.c [new file with mode: 0644]
src/mkhelp.pl [new file with mode: 0644]
src/setup.h [new file with mode: 0644]
src/stamp-h2 [new file with mode: 0644]
src/stamp-h2.in [new file with mode: 0644]
src/urlglob.c [new file with mode: 0644]
src/urlglob.h [new file with mode: 0644]
src/version.h [new file with mode: 0644]
stamp-h [new file with mode: 0644]
stamp-h.in [new file with mode: 0644]
stamp-h1 [new file with mode: 0644]
stamp-h1.in [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
new file mode 100644 (file)
index 0000000..34cc7bf
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,1656 @@
+                                  _   _ ____  _     
+                              ___| | | |  _ \| |    
+                             / __| | | | |_) | |    
+                            | (__| |_| |  _ <| |___ 
+                             \___|\___/|_| \_\_____|
+
+                               History of Changes
+
+
+Version 6.4
+
+Daniel (28 December 1999):
+ - Tim Verhoeven <dj@walhalla.sin.khk.be> correctly identified that curl
+   doesn't support URL formatted file names when getting ftp. Now, there's a
+   problem with getting very weird file names off FTP servers. RFC 959 defines
+   that the file name syntax to use should be the same as in the native OS of
+   the server. Since we don't know the peer server system we currently just
+   translate the URL syntax into plain letters. It is still better and with
+   the solaris 2.6-supplied ftp server it works with spaces in the file names.
+
+Daniel (27 December 1999):
+ - When curl parsed cookies straight off a remote site, it corrupted the input
+   data, which, if the downloaded headers were stored made very odd characters
+   in the saved data. Correctfully identified and reported by Paul Harrington
+   <paul@pizza.org>.
+
+Daniel (13 December 1999):
+ - General cleanups in the library interface. There had been some bad kludges
+   added during times of stress and I did my best to clean them off. It was
+   both regarding the lib API as well as include file confusions.
+
+Daniel (3 December 1999):
+ - A small --stderr bug was reported by Eetu Ojanen <esojanen@jyu.fi>...
+
+ - who also brought the suggestion of extending the -X flag to ftp list as
+   well. So, now it is and the long option is now --request instead. It is
+   only for ftp list for now (and the former http stuff too of course).
+
+Lars J. Aas <larsa@sim.no> (24 November 1999):
+ - Patched curl to compile and build under BeOS. Doesn't work yet though!
+
+ - Corrected the Makefile.am files to allow putting object files in
+   different directories than the sources.
+
+Version 6.3.1
+
+Daniel (23 November 1999):
+ - I've had this major disk crash. My good old trust-worthy source disk died
+   along with the machine that hosted it. Thank goodness most of all the
+   things I've done are either backed up elsewhere or stored in this CVS
+   server!
+
+ - Michael S. Steuer <michael@steuer.com> pointed out a bug in the -F handling
+   that made curl hang if you posted an empty variable such as '-F name='. It
+   was one of those old bugs that never have worked properly...
+
+ - Jason Baietto <jason@durians.com> pointed out a general flaw in the HTTP
+   download. Curl didn't complain if it was prematurely aborted before the
+   entire download was completed. It does now.
+
+Daniel (19 November 1999):
+ - Chris Maltby <chris@aurema.com> very accurately criticized the lack of
+   return code checks on the fwrite() calls. I did a thorough check for all
+   occurrences and corrected this.
+
+Daniel (17 November 1999):
+ - Paul Harrington <paul@pizza.org> pointed out that the -m/--max-time option
+   doesn't work for the slow system calls like gethostbyname()... I don't have
+   any good fix yet, just a slightly less bad one that makes curl exit hard
+   when the timeout is reached.
+
+ - Bjorn Reese helped me point out a possible problem that might be the reason
+   why Thomas Hurst experience problems in his Amiga version.
+
+ Daniel (12 November 1999):
+ - I found a crash in the new cookie file parser. It crashed when you gave
+   a plain http header file as input...
+
+Version 6.3
+
+ Daniel (10 November 1999):
+ - I kind of found out that the HTTP time-conditional GETs (-z) aren't always
+   respected by the web server and the document is therefore sent in whole
+   again, even though it doesn't match the requested condition. After reading
+   section 13.3.4 of RFC 2616, I think I'm doing the right thing now when I do
+   my own check as well. If curl thinks the condition isn't met, the transfer
+   is aborted prematurely (after all the headers have been received).
+
+ - After comments from Robert Linden <robert.linden@postcom.deutschepost.de> I
+   also rewrote some parts of the man page to better describe how the -F
+   works.
+
+ - Michael Anti <anti@pshowing.com> put up a new curl download mirror in
+   China:  http://www.pshowing.com/curl/
+
+ - I added the list of download mirrors to the README file
+
+ - I did add more explanations to the man page
+
+ Daniel (8 November 1999):
+ - I made the -b/--cookie option capable of reading netscape formatted cookie
+   files as well as normal http-header files. It should be able to
+   transparantly figure out what kind of file it got as input.
+
+ Daniel (29 October 1999):
+ - Another one of Sebastiaan van Erk's ideas (that has been requested before
+   but I seem to have forgotten who it was), is to add support for ranges in
+   FTP downloads. As usual, one request is just a request, when they're two
+   it is a demand. I've added simple support for X-Y style fetches. X has to
+   be the lower number, though you may omit one of the numbers. Use the -r/
+   --range switch (previously HTTP-only).
+
+ - Sebastiaan van Erk <sebster@sebster.com> suggested that curl should be
+   able to show the file size of a specified file. I think this is a splendid
+   idea and the -I flag is now working for FTP. It displays the file size in
+   this manner:
+        Content-Length: XXXX
+   As it resembles normal headers, and leaves us the opportunity to add more
+   info in that display if we can come up with more in the future! It also
+   makes sense since if you access ftp through a HTTP proxy, you'd get the
+   file size the same way.
+
+   I changed the order of the QUOTE command execusions. They're now executed
+   just after the login and before any other command. I made this to enable
+   quote commands to run before the -I stuff is done too.
+
+ - I found out that -D/--dump-header and -V/--version weren't documented in
+   the man page.
+
+ - Many HTTP/1.1 servers do not support ranges. Don't ask me why. I did add
+   some text about this in the man page for the range option. The thread in
+   the mailing list that started this was initiated by Michael Anti
+   <anti@pshowing.com>.
+
+ - I get reports about nroff crashes on solaris 2.6+ when displaying the curl
+   man page. Switch to gnroff instead, it is reported to work(!). Adam Barclay
+   <adam@oz.org> reported and brought the suggestion.
+
+ - In a dialogue with Johannes G. Kristinsson <d98is@dtek.chalmers.se> we came
+   up with the idea to let -H/--header specified headers replace the
+   internally generated headers, if you happened to select to add a header
+   that curl normally uses by itself. The advantage with this is not entirely
+   obvious, but in Johannes' case it means that he can use another Host: than
+   the one curl would set.
+
+ Daniel (27 October 1999):
+ - Jongki Suwandi <Jongki.Suwandi@eng.sun.com> brought a nice patch for
+   (yet another) crash when following a location:. This time you had to
+   follow a https:// server's redirect to get the core.
+
+Version 6.2
+
+ Daniel (21 October 1999):
+ - I think I managed to remove the suspicious (nil) that has been seen just
+   before the "Host:" in HTTP requests when -v was used.
+ - I found out that if you followed a location: when using a proxy, without
+   having specified http:// in the URL, the protocol part was added once again
+   when moving to the next URL! (The protocol part has to be added to the
+   URL when going through a proxy since it has no protocol-guessing system
+   such as curl has.)
+ - Benjamin Ritcey <ritcey@tfn.com> reported a core dump under solaris 2.6
+   with OpenSSL 0.9.4. It turned out this was due to a bad free() in main.c
+   that occurred after the download was done and completed.
+ - Benjamin found ftp downloads to show the first line of the download meter
+   to get written twice, and I removed that problem. It was introduced with
+   the multiple URL support.
+ - Dan Zitter <dzitter@zitter.net> correctly pointed out that curl 6.1 and
+   earlier versions didn't honor RFC 2616 chapter 4 section 2, "Message
+   Headers": "...Field names are case-insensitive..."
+   HTTP header parsing assumed a certain casing. Dan also provided me with
+   a patch that corrected this, which I took the liberty of editing slightly.
+ - Dan Zitter also provided a nice patch for config.guess to better recognize
+   the Mac OS X
+ - Dan also corrected a minor problem in the lib/Makefile that caused linking
+   to fail on OS X.
+
+ Daniel (19 October 1999):
+ - Len Marinaccio <len@goodnet.com> came up with some problems with curl.
+   Since Windows has a crippled shell, it can't redirect stderr and that
+   causes trouble. I added --stderr today which allows the user to redirect
+   the stderr stream to a file or stdout.
+
+ Daniel (18 October 1999):
+ - The configure script now understands the '--without-ssl' flag, which now
+   totally disable SSL/https support. Previously it wasn't possible to force
+   the configure script to leave SSL alone. The previous functionality has
+   been retained. Troy Engel helped test this new one.
+
+Version 6.1
+
+ Daniel (17 October 1999):
+ - I ifdef'ed or commented all the zlib stuff in the sources and configure
+   script. It turned out we needed to mock more with zlib than I initially
+   thought, to make it capable of downloading compressed HTTP documents and
+   uncompress them on the fly. I didn't mean the zlib parts of curl to become
+   more than minor so this means I halt the zlib expedition for now and wait
+   until someone either writes the code or zlib gets updated and better
+   adjusted for this kind of usage.  I won't get into details here, but a
+   short a summary is suitable:
+   - zlib can't automatically detect whether to use zlib or gzip
+     decompression methods.
+   - zlib is very neat for reading gzipped files from a file descriptor,
+     although not as nice for reading buffer-based data such as we would
+     want it.
+   - there are still some problems with the win32 version when reading from
+     a file descriptor if that is a socket
+
+ Daniel (14 October 1999):
+ - Moved the (external) include files for libcurl into a subdirectory named
+   curl and adjusted all #include lines to use <curl/XXXX> to maintain a
+   better name space and control of the headers. This has been requested.
+
+ Daniel (12 October 1999):
+ - I modified the 'maketgz' script to perform a 'make' too before a release
+   archive is put together in an attempt to make the time stamps better and
+   hopefully avoid the double configure-running that use to occur.
+
+ Daniel (11 October 1999):
+ - Applied Jörn's patches that fixes zlib for mingw32 compiles as well as
+   some other missing zlib #ifdef and more text on the multiple URL docs in
+   the man page.
+
+Version 6.1beta
+
+ Daniel (6 October 1999):
+ - Douglas E. Wegscheid <wegscd@whirlpool.com> sent me a patch that made the
+   exact same thing as I just made: the -d switch is now capable of reading
+   post data from a named file or stdin.  Use it similarly to the -F. To read
+   the post data from a given file:
+
+        curl -d @path/to/filename www.postsite.com
+
+   or let curl read it out from stdin:
+
+        curl -d @- www.postit.com
+
+ Jörn Hartroth (3 October 1999):
+ - Brought some more patches for multiple URL functionality. The MIME
+   separation ideas are almost scrapped now, and a custom separator is being
+   used instead. This is still compile-time "flagged".
+
+ Daniel
+ - Updated curl.1 with multiple URL info.
+
+ Daniel (30 September 1999):
+ - Felix von Leitner <felix@convergence.de> brought openssl-check fixes
+   for configure.in to work out-of-the-box when the openssl files are
+   installed in the system default dirs.
+
+ Daniel (28 September 1999)
+ - Added libz functionality. This should enable decompressing gzip, compress
+   or deflate encoding HTTP documents. It also makes curl send an accept that
+   it accepts that kind of encoding. Compressed contents usually shortens
+   download time. I *need* someone to tell me a site that uses compressed HTTP
+   documents so that I can test this out properly.
+
+ - As a result of the adding of zlib awareness, I changed the version string
+   a little. I plan to add openldap version reporting in there too.
+
+ Daniel (17 September 1999)
+ - Made the -F option allow stdin when specifying files. By using '-' instead
+   of file name, the data will be read from stdin.
+
+Version 6.0
+
+ Daniel (13 September 1999)
+ - Added -X/--http-request <request> to enable any HTTP command to be sent.
+   Do not that your server has to support the exact string you enter. This
+   should possibly a string like DELETE or TRACE.
+
+ - Applied Douglas' mingw32-fixes for the makefiles.
+
+ Daniel (10 September 1999)
+ - Douglas E. Wegscheid <wegscd@whirlpool.com> pointed out a problem. Curl
+   didn't check the FTP servers return code properly after the --quote
+   commands were issued. It took anything non 200 as an error, when all 2XX
+   codes should be accepted as OK.
+
+ - Sending cookies to the same site in multiple lines like curl used to do
+   turned out to be bad and breaking the cookie specs. Curl now sends all
+   cookies on a single Cookie: line. Curl is not yet RFC 2109 compliant, but I
+   doubt that many servers do use that syntax (yet).
+
+ Daniel (8 September 1999)
+ - Jörn helped me make sure it still compiles nicely with mingw32 under win32.
+
+ Daniel (7 September 1999)
+ - FTP upload through proxy is now turned into a HTTP PUT. Requested by
+   Stefan Kanthak <Stefan.Kanthak@mchp.siemens.de>.
+
+ - Added the ldap files to the .m32 makefile.
+
+ Daniel (3 September 1999)
+ - Made cookie matching work while using HTTP proxy.
+
+ Bjorn Reese <breese@mail1.stofanet.dk> (31 August 1999)
+ - Passed his ldap:// patch. Note that this requires the openldap shared
+   library to be installed and that LD_LIBRARY_PATH points to the
+   directory where the lib will be found when curl is run with a
+   ldap:// URL.
+
+ Jörn Hartroth <Joern.Hartroth@telekom.de> (31 August 1999)
+ - Made the Mingw32 makefiles into single files.
+ - Made file:// work for Win32. The same code is now used for unix as well for
+   performance reasons.
+
+ Douglas E. Wegscheid <wegscd@whirlpool.com> (30 August 1999)
+ - Patched the Mingw32 makefiles for SSL builds.
+
+ Matthew Clarke <clamat@van.maves.ca> (30 August 1999)
+ - Made a cool patch for configure.in to allow --with-ssl to specify the
+   root dir of the openssl installation, as in
+
+        ./configure --with-ssl=/usr/ssl_here
+
+ - Corrected the 'reconf' script to work better with some shells.
+
+ Jörn Hartroth <Joern.Hartroth@telekom.de> (26 August 1999)
+ - Fixed the Mingw32 makefiles in lib/ and corrected the file.c for win32
+   compiles.
+
+Version 5.11
+
+ Daniel (25 August 1999)
+ - John Weismiller <johnweis@home.com> pointed out a bug in the header-line
+   realloc() system in download.c.
+
+ - I added lib/file.[ch] to offer a first, simple, file:// support. It
+   probably won't do much good on win32 system at this point, but I see it
+   as a start.
+
+ - Made the release archives get a Makefile in the root dir, which can be
+   used to start the compiling/building process easier. I haven't really
+   changed any INSTALL text yet, I wanted to get some feed-back on this
+   first.
+
+ Daniel (17 August 1999)
+ - Another Location: bug. Curl didn't do proper relative locations if the
+   original URL had cgi-parameters that contained a slash. Nusu's page
+   again.
+
+ - Corrected the NO_PROXY usage. It is a list of substrings that if one of
+   them matches the tail of the host name it should connect to, curl should
+   not use a proxy to connect there. Pointed out to me by Douglas E. Wegscheid
+   <wegscd@whirlpool.com>. I also changed the README text a little regarding
+   this.
+
+ Daniel (16 August 1999)
+ - Fixed a memory bug with http-servers that sent Location: to a Location:
+   page. Nusu's page showed this too.
+
+ - Made cookies work a lot better. Setting the same cookie name several times
+   used to add more cookies instead of replacing the former one which it
+   should've. Nusu <nus@intergorj.ro> brought me an URL that made this
+   painfully visible...
+
+ Troy (15 August 1999)
+ - Brought new .spec files as well as a patch for configure.in that lets the
+   configure script find the openssl files better, even when the include
+   files are in /usr/include/openssl
+
+Version 5.10
+
+ Daniel (13 August 1999)
+ - SSL_CTX_set_default_passwd_cb() has been modified in the 0.9.4 version of
+   OpenSSL. Now why couldn't they simply add a *new* function instead of
+   modifying the parameters of an already existing function? This way, we get
+   a compiler warning if compiling with 0.9.4 but not with earlier. So, I had
+   to come up with a #if contruction that deals with this...
+
+ - Made curl output the SSL version number get displayed properly with 0.9.4.
+
+ Troy (12 August 1999)
+ - Added MingW32 (GCC-2.95) support under Win32. The INSTALL file was also
+   a bit rearranged.
+ Daniel (12 August 1999)
+ - I had to copy a good <arpa/telnet.h> include file into the curl source
+   tree to enable the silly win32 systems to compile. The distribution rights
+   allows us to do that as long as the file remains unmodified.
+
+ - I corrected a few minor things that made the compiler complain when
+   -Wall -pedantic was used.
+
+ - I'm moving the official curl web page to http://curl.haxx.nu. I think it
+   will make it easier to remember as it is a lot shorter and less cryptic.
+   The old one still works and shows the same info.
+
+ Daniel (11 August 1999)
+ - Albert Chin-A-Young mailed me another correction for NROFF in the
+   configure.in that is supposed to be better for IRIX users.
+
+ Daniel (10 August 1999)
+ - Albert Chin-A-Young <china@thewrittenword.com> helped me with some stupid
+   Makefile things, as well as some fiddling with the getdate.c
+   stuff that he had problems with under HP-UX v10. getdate.y will now be
+   compiled into getdate.c if the appropriate yacc or bison is found by the
+   configure script. Since this is slightly new, we need to test the output
+   getdate.c with win32 systems to make sure it still compiles there.
+
+ Daniel (5 August 1999)
+ - I've just setup a new mailing list with the intention to keep discussions
+   around libcurl development in it. I mainly expect it to be for thoughts and
+   brainstorming around a "next generation" library, rather than nitpicking
+   about the current implementation or details in the current libcurl.
+
+   To join our happy bunch of future-looking geeks, enter 'subscribe
+   <address>' in the body of a mail and send it to
+   libcurl-request@listserv.fts.frontec.se.  Curl bug reports, the usual curl
+   talk and everything else should still be kept in this mailing list. I've
+   started to archive this mailing list and have put the libcurl web page at
+   www.fts.frontec.se/~dast/libcurl/.
+
+ - Stefan Kanthak <Stefan.Kanthak@mchp.siemens.de> contacted me regarding a
+   few problems in the configure script which he discovered when trying to
+   make curl compile and build under Siemens SINIX-Z V5.42B2004!
+
+ - Marcus Klein <m.klein@in-olpe.de> very accurately informed me that
+   src/version.h was not present in the CVS repository. Oh, how silly...
+
+ - Linus Nielsen <Linus.Nielsen@sth.frontec.se> rewrote the telnet:// part and
+   now curl offers limited telnet support. If you run curl like 'curl
+   telnet://host' you'll get all output on the screen and curl will read input
+   from stdin. You'll be able to login and run commands etc, but since the
+   output is buffered, expect to get a little weird output.
+
+   This is still in its infancy and it might get changed. We need your
+   feed-back and input in how this is best done.
+
+   WIN32 NOTE: I bet we'll get problems when trying to compile the current
+   lib/telnet.c on win32, but I think we can sort them out in time.
+
+ - David Sanderson <david@transarc.com> reported that FORCE_ALLOCA_H or
+   HAVE_ALLOCA_H must be defined for getdate.c to compile properly on HP-UX
+   11.0. I updated the configure script to check for alloca.h which should
+   make it.
+
+ Daniel (4 August 1999)
+ - I finally got to understand Marcus Klein's ftp download resume problem,
+   which turns out to be due to different outputs from different ftp
+   servers. It makes ftp download resuming a little trickier, but I've made
+   some modifications I really believe will work for most ftp servers and I do
+   hope you report if you have problems with this!
+
+ - Added text about file transfer resuming to README.curl.
+
+ Daniel (2 August 1999)
+ - Applied a progress-bar patch from Lars J. Aas <larsa@sim.no>. It offers
+   a new styled progress bar enabled with -#/--progress-bar. 
+
+ T. Yamada <tai@imasy.or.jp> (30 July 1999)
+ - It breaks with segfault when 1) curl is using .netrc to obtain
+   username/password (option '-n'), and 2) is auto-matically redirected to
+   another location (option '-L').
+
+   There is a small bug in lib/url.c (block starting from line 641), which
+   tries to take out username/password from user- supplied command-line
+   argument ('-u' option). This block is never executed on first attempt since
+   CONF_USERPWD bit isn't set at first, but curl later turns it on when it
+   checks for CONF_NETRC bit. So when curl tries to redo everything due to
+   redirection, it segfaults trying to access *data->userpwd.
+
+Version 5.9.1
+
+ Daniel (30 July 1999)
+ - Steve Walch <swalch@cisoft.com> pointed out that there is a memory leak in
+   the formdata functions. I added a FormFree() function that is now used and
+   supposed to correct this flaw.
+
+ - Mark Wotton <mwotton@black.ug.cs.usyd.edu.au> reported:
+   'curl -L https://www.cwa.com.au/' core dumps.  I managed to cure this by
+   correcting the cleanup procedure. The bug seems to be gone with my OpenSSL
+   0.9.2b, although still occurs when I run the ~100 years old SSLeay 0.8.0. I
+   don't know whether it is curl or SSLeay that is to blame for that.
+
+ - Marcus Klein <m.klein@in-olpe.de>:
+   Reported an FTP upload resume bug that I really can't repeat nor understand.
+   I leave it here so that it won't be forgotten.
+
+ Daniel (29 July 1999)
+ - Costya Shulyupin <costya@trivnet.com> suggested support for longer URLs
+   when following Location: and I could only agree and fix it!
+
+ - Leigh Purdie <leighp@defcen.gov.au> found a problem in the upload/POST
+   department. It turned out that http.c accidentaly cleared the pointer
+   instead of the byte counter when supposed to.
+
+ - Costya Shulyupin <costya@trivnet.com> pointed out a problem with port
+   numbers and Location:. If you had a server at a non-standard port that
+   redirected to an URL using a standard port number, curl still used that
+   first port number.
+
+ - Ralph Beckmann <rabe@uni-paderborn.de> pointed out a problem when using both
+   CONF_FOLLOWLOCATION and CONF_FAILONERROR simultaneously. Since the
+   CONF_FAILONERROR exits on the 302-code that the follow location header
+   outputs it will never show any html on location: pages. I have now made it
+   look for >=400 codes if CONF_FOLLOWLOCATION is set.
+
+ - 'struct slist' is now renamed to 'struct curl_slist' (as suggested by Ralph
+   Beckmann).
+
+ - Joshua Swink <jpswink@hotmail.com> and Rick Welykochy <rick@praxis.com.au>
+   were the first to point out to me that the latest OpenSSL package now have
+   moved the standard include path. It is now in
+   /usr/local/ssl/include/openssl and I have now modified the --enable-ssl
+   option for the configure script to use that as the primary path, and I
+   leave the former path too to work with older packages of OpenSSL too.
+
+ Daniel (9 June 1999)
+ - I finally understood the IRIX problem and now it seem to compile on it!
+   I am gonna remove those #define strcasecmp() things once and for all now.
+
+ Daniel (4 June 1999)
+ - I adjusted the FTP reply 227 parser to make the PASV command work better
+   with more ftp servers. Appearantly the Roxen Challanger server replied
+   something curl 5.9 could deal with! :-( Reported by Ashley Reid-Montanaro
+   <ashley@compsoc.man.ac.uk> and Mark Butler <butlerm@xmission.com> brought a
+   solution for it.
+
+ Daniel (26 May 1999)
+ - Rearranged. README is new, the old one is now README.curl and I added a
+   README.libcurl with text I got from Ralph Beckmann <rabe@uni-paderborn.de>.
+
+ - I also updated the INSTALL text.
+
+ Daniel (25 May 1999)
+ - David Jonathan Lowsky <dlowsky@leland.stanford.edu> correctly pointed out
+   that curl didn't properly deal with form posting where the variable 
+   shouldn't have any content, as in curl -F "form=" www.site.com. It was
+   now fixed.
+
+Version 5.9
+
+ Daniel (22 May 1999)
+ - I've got a bug report from Aaron Scarisbrick <aaronsca@hotmail.com> in
+   which he states he has some problems with -L under FreeBSD 3.0. I have
+   previously got another bug report from Stefan Grether
+   <stefan.grether@ubs.com> which points at an error with similar sympthoms
+   when using win32. I made the allocation of the new url string a bit faster
+   and different, don't know if it actually improves anything though...
+
+ Daniel (20 May 1999)
+ - Made the cookie parser deal with CRLF newlines too.
+
+ Daniel (19 May 1999)
+ - Download() didn't properly deal with failing return codes from the
+   sread() function. Adam Coyne <adam@gamespy.com> found the problem in the
+   win32 version, and Troy Engel helped me out isolating it.
+
+ Daniel (16 May 1999)
+ - Richard Adams <Richard@Slayford.com> pointed out a bug I introduced in
+   5.8. --dump-header doesn't work anymore! :-/ I fixed it now.
+
+ - After a suggestion by Joshua Swink <jpswink@hotmail.com> I added -S /
+   --show-error to force curl to display the error message in case of an
+   error, even if -s/--silent was used.
+
+ Daniel (10 May 1999)
+ - I moved the stuff concerning HTTP, DICT and TELNET it their own source
+   files now. It is a beginning on my clean-up of the sources to make them
+   layer all those protocols better to enable more to be added easier in the
+   future!
+
+ - Leon Breedt <ljb@debian.org> sent me some files I've not put into the main
+   curl archive. They're for creating the Debian package thingie. He also sent
+   me a debian package that I've made available for download at the web page
+
+ Daniel (9 May 1999)
+ - Made it compile on cygwin too.
+
+ Troy Engel (7 May 1999)
+ - Brought a series of patches to allow curl to compile smoothly on MSVC++ 6
+   again!
+
+ Daniel (6 May 1999)
+ - I changed the #ifdef HAVE_STRFTIME placement for the -z code so that it
+   will be easier to discover systems that don't have that function and thus
+   can't use -z successfully. Made the strftime() get used if WIN32 is defined
+   too.
+
+Version 5.8
+
+ Daniel (5 May 1999)
+ - I've had it with this autoconf/automake mess. It seems to work allright
+   for most people who don't have automake installed, but for those who have
+   there are problems all over.
+
+   I've got like five different bug reports on this only the last
+   week... Claudio Neves <claudio@nextis.com> and Federico Bianchi
+   <bianchi@pc-arte2.arte.unipi.it> and root <duggerj001@hawaii.rr.com> are
+   some of them reporting this.
+
+   Currently, I have no really good fix since I want to use automake myself to
+   generate the Makefile.in files. I've found out that the @SHELL@-problems
+   can often be fixed by manually invoking 'automake' in the archive root
+   before you run ./configure... I've hacked my maketgz script now to fiddle
+   a bit with this and my tests seem to work better than before at least!
+
+ Daniel (4 May 1999)
+ - mkhelp.pl has been doing badly lately. I corrected a case problem in
+   the regexes.
+
+ - I've now remade the -o option to not touch the file unless it needs to.
+   I had to do this to make -z option really fine, since now you can make a
+   curl fetch and use a local copy's time when downloading to that file, as
+   in:
+
+        curl -z dump -o dump remote.site.com/file.html
+
+   This will only get the file if the remote one is newer than the local.
+   I'm aware that this alters previous behaviour a little. Some scripts out
+   there may depend on that the file is always touched...
+
+ - Corrected a bug in the SSLv2/v3 selection.
+
+ - Felix von Leitner <leitner@math.fu-berlin.de> requested that curl should
+   be able to send "If-Modified-Since" headers, which indeed is a fair idea.
+   I implemented it right away! Try -z <expression> where expression is a full
+   GNU date expression or a file name to get the date from!
+
+ Stephan Lagerholm <stephan@unilog.se> (30 Apr 1999)
+ - Pointed out a problem with the src/Makefile for FreeBSD. The RM variable
+   isn't set and causes the make to fail.
+
+ Daniel (26 April 1999)
+ - Am I silly or what? <Irving_Wolfe@wolfe.net> pointed out to me that the
+   curl version number was not set properly. Hasn't been since 5.6. This was
+   due to a bug in my maketgz script!
+
+ David Eriksson <david@2good.com> (25 Apr 1999)
+ - Found a bug in cookies.c that made it crash at times.
+
+Version 5.7.1
+
+ Doug Kaufman <dkaufman@rahul.net> (23 Apr 1999)
+ - Brought two sunos 4 fixes. One of them being the hostip.c fix mentioned
+   below and the other one a correction in include/stdcheaders.h
+
+ - Added a paragraph about compiling with the US-version of openssl to the
+   INSTALL file.
+
+ Daniel
+ - New mailing list address. Info updated on the web page as well as in the
+   README file
+
+ Greg Onufer <Greg.Onufer@Eng.Sun.COM> (20 Apr 1999)
+ - hostip.c didn't compile properly on SunOS 5.5.1.
+   It needs an #include <sys/types.h>
+
+Version 5.7
+
+ Daniel (Apr 20 1999)
+ - Decided to upload a non-beta version right now!
+
+ - Made curl support any-length HTTP headers. The destination buffer is now
+   simply enlarged every time it turns out to be too small!
+
+ - Added the FAQ file to the archive. Still a bit smallish, but it is a
+   start.
+
+ Eric Thelin <eric@generation-i.com> (15 Apr 1999)
+ - Made -D accept '-' instead of filename to write to stdout.
+
+Version 5.6.3beta
+
+ Daniel (Apr 12 1999)
+
+ - Changed two #ifdef WIN32 to better #ifdef <errorcode> when connect()ing
+   in url.c and ftp.c. Makes cygwin32 deal with them better too. We should
+   try to get some decent win32-replacement there. Anyone?
+
+ - The old -3/--crlf option is now ONLY --crlf!
+
+ - I changed the "SSL fix" to a more lame one, but that doesn't remove as
+   much functionality. Now I've enabled the lib to select what SSL version it
+   should try first. Appearantly some older SSL-servers don't like when you
+   talk v3 with them so you need to be able to force curl to talk v2 from the
+   start. The fix dated April 6 and posted on the mailing list forced curl to
+   use v2 at all times using a modern OpenSSL version, but we don't really
+   want such a crippled solution.
+ - Marc Boucher <marc@mbsi.ca> sent me a patch that corrected a math error
+   for the "Curr.Speed" progress meter.
+
+ - Eric Thelin <eric@generation-i.com> sent me a patch that enables '-K -'
+   to read a config file from stdin.
+
+ - I found out we didn't close the file properly before so I added it!
+
+ Daniel (Apr 9 1999)
+ - Yu Xin <is@isee.za.net> pointed out a problem with ftp download resume.
+   It didn't work at all! ;-O
+
+ Daniel (Apr 6 1999)
+ - Corrected the version string part generated for the SSL version.
+
+ - I found a way to make some other SSL page work with openssl 0.9.1+ that
+   previously didn't (ssleay 0.8.0 works with it though!). Trying to get
+   some real info from the OpenSSL guys to see how I should do to behave the
+   best way. SSLeay 0.8.0 shouldn't be that much in use anyway these days!
+
+Version 5.6.2beta
+
+ Daniel (Apr 4 1999)
+ - Finally have curl more cookie "aware". Now read carefully. This is how
+   it works.
+   To make curl read cookies from an already existing file, in plain header-
+   format (like from the headers of a previous fetch) invoke curl with the
+   -b flag like:
+
+        curl -b file http://site/foo.html
+
+   Curl will then use all cookies it finds matching. The old style that sets
+   a single cookie with -b is still supported and is used if the string
+   following -b includes a '=' letter, as in "-b name=daniel".
+
+   To make curl read the cookies sent in combination with a location: (which
+   sites often do) point curl to read a non-existing file at first (i.e
+   to start with no existing cookies), like:
+
+        curl -b nowhere http://site/setcookieandrelocate.html
+
+ - Added a paragraph in the TODO file about the SSL problems recently
+   reported. Evidently, some kind of SSL-problem curl may need to address.
+
+ - Better "Location:" following.
+
+ Douglas E. Wegscheid <wegscd@whirlpool.com> (Tue, 30 Mar 1999)
+ - A subsecond display patch.
+
+ Daniel (Mar 14 1999)
+ - I've separated the version number of libcurl and curl now. To make
+   things a little easier, I decided to start the curl numbering from
+   5.6 and the former version number known as "curl" is now the one
+   set for libcurl.
+
+ - Removed the 'enable-no-pass' from configure, I doubt anyone wanted
+   that.
+
+ - Made lots of tiny adjustments to compile smoothly with cygwin under
+   win32. It's a killer for porting this to win32, bye bye VC++! ;-)
+   Compiles and builds out-of-the-box now. See the new wordings in
+   INSTALL for details.
+
+ - Beginning experiments with downloading multiple document from a http
+   server while remaining connected.
+
+Version 5.6beta
+
+ Daniel (Mar 13 1999)
+ - Since I've changed so much, I thought I'd just go ahead and implement
+   the suggestion from Douglas E. Wegscheid <wegscd@whirlpool.com>. -D or
+   --dump-header is now storing HTTP headers separately in the specified
+   file.
+
+ - Added new text to INSTALL on what to do to build this on win32 now.
+
+ - Aaargh. I had to take a step back and prefix the shared #include files
+   in the sources with "../include/" to please VC++...
+
+ Daniel (Mar 12 1999)
+ - Split the url.c source into many tiny sources for better readability
+   and smaller size.
+
+ Daniel (Mar 11 1999)
+ - Started to change stuff for a move to make libcurl and a more separate
+   curl application that uses the libcurl. Made the libcurl sources into
+   the new lib directory while the curl application will remain in src as
+   before. New makefiles, adjusted configure script and so.
+
+   libcurl.a built quickly and easily. I better make a better interface to
+   the lib functions though.
+
+   The new root dir include/ is supposed to contain the public information
+   about the new libcurl. It is a little ugly so far :-)
+
+
+ Daniel (Mar 1 1999)
+ - Todd Kaufmann <tkaufmann@adforce.com> sent me a good link to Netscape's
+   cookie spec as well as the info that RFC 2109 specifies how to use them.
+   The link is now in the README and the RFC in the RESOURCES.
+
+ Daniel (Feb 23 1999)
+ - Finally made configure accept --with-ssl to look for SSL libs and includes
+   in the "standard" place /usr/local/ssl...
+
+ Daniel (Feb 22 1999)
+ - Verified that curl linked fine with OpenSSL 0.9.1c which seems to be
+   the most recent.
+
+ Henri Gomez <gomez@slib.fr> (Fri Feb  5 1999)
+ - Sent in an updated curl-ssl.spec. I still miss the script that builds an
+   RPM automatically...
+
+Version 5.5.1
+
+ Mark Butler <butlerm@xmission.com> (27 Jan 1999)
+ - Corrected problems in Download().
+
+ Danitel Stenberg (25 Jan 1999)
+ - Jeremie Petit <Jeremie.Petit@Digital.com> pointed out a few flaws in the
+   source that prevented it from compile warning free with the native
+   compiler under Digital Unix v4.0d.
+
+Version 5.5
+
+ Daniel Stenberg (15 Jan 1999)
+ - Added Bjorns small text to the README about the DICT protocol.
+
+ Daniel Stenberg (11 Jan 1999)
+ - <jswink@softcom.net> reported about the win32-versioin: "Doesn't use
+   ALL_PROXY environment variable". Turned out to be because of the static-
+   buffer nature of the win32 environment variable calls!
+
+ Bjorn Reese <breese@imada.ou.dk> (10 Jan 1999)
+ - I have attached a simple addition for the DICT protocol (RFC 2229).
+   It performs dictionary lookups. The output still needs to be better
+   formatted.
+
+   To test it try (the exact format, and more examples are described in
+   the RFC)
+
+        dict://dict.org/m:hello
+        dict://dict.org/m:hello::soundex
+
+
+ Vicente Garcia <verot@redestb.es> (10 Jan 1999)
+ - Corrected the progress meter for files larger than 20MB.
+
+ Daniel Stenberg (7 Jan 1999)
+ - Corrected the -t and -T help texts. They claimed to be FTP only.
+
+Version 5.4
+
+ Daniel Stenberg
+ (7 Jan 1999)
+ - <Irving_Wolfe@Wolfe.Net> reported that curl -s didn't always supress the
+   progress reporting. It was the form post that autoamtically always switched
+   it on again. This is now corrected!
+
+ (4 Jan 1999)
+ - Andreas Kostyrka <andreas@mtg.co.at> suggested I'd add PUT and he helped me
+   out to test it. If you use -t or -T now on a http or https server, PUT will
+   be used for file upload.
+
+   I removed the former use of -T with HTTP. I doubt anyone ever really used
+   that.
+
+ (4 Jan 1999)
+ - Erik Jacobsen <erik@mint.com> found a width bug in the mprintf() function.
+   I corrected it now.
+
+ (4 Jan 1999)
+ - As John V. Chow <johnchow@brooklinetech.com> pointed out to me, curl
+   accepted very limited URL sizes. It should now accept path parts that are
+   up to at least 4096 bytes.
+
+ - Somehow I screwed up when applying the AIX fix from Gilbert Ramirez, so
+   I redid that now.
+
+Version 5.3a (win32 only)
+
+ Troy Engel
+ - Corrected a win32 bug in the environment variable part.
+
+Version 5.3
+
+ Gilbert Ramirez Jr. (21 Dec 1998)
+ - I have implemented the "quote" function of FTP clients. It allows you to
+   send arbitrary commands to the remote FTP server. I chose the -Q/--quote
+   command-line arguments.
+
+   You can have more than one quoted string, and curl will apply them in
+   order.  This is what I use for my MVS upload:
+
+  curl -B --crlf -Q "site lrecl=80" -Q "site blk=8000" -T file ftp://os390/test
+
+   Curl will send the two quoted "site" commands in the proper order.
+
+ - Made it compile smoothly on AIX.
+
+ Gilbert Ramirez Jr. <gram@verdict.uthscsa.edu> (18 Dec 1998)
+ - Brought an MVS patch: -3/--mvs, for ftp upload to the MVS ftp server.
+
+ Troy Engel <tengel@sonic.net> (17 Dec 1998)
+ - Brought a correction that fixes the win32 curl bug.
+
+ Daniel Stenberg
+ - A bug, pointed out to me by Dr H. T. Leung <htl10@cus.cam.ac.uk>, caused
+   curl to crash on the -A flag on certain systems. Actually, all systems
+   should've!
+
+ - Added a few defines to make directories/file names get build nicer (with _
+   instead of . and \ instead of / in win32).
+
+ - steve <fisk@polar.bowdoin.edu> reported a weird bug that occured if the
+   ftp server response line had a parenthesis on the line before the (size)
+   info. I hope it works better now!
+
+Version 5.2.1
+
+ Steven G. Johnson <stevenj@alum.mit.edu> (Dec 14, 1998)
+ - Brought a fix that corrected a crash in 5.2 due to bad treatment of the
+   environment variables.
+
+Version 5.2
+
+ Daniel Stenberg (Dec 14, 1998)
+ - Rewrote the mkhelp script and now, the mkhelp.pl script generates the
+   hugehelp.c file from the README *and* the man page file curl.1. By using
+   both files, I no longer need to have double information in both the man
+   page and the README as well. So, win32-users will only have the hugehelp.c
+   file for all info, but then, they download the plain binary most times
+   anyway.
+
+ - gcc2.8.1 with the -Wall flag complaints a lot on subscript has type `char'
+   if I don't explicitly typecast the argument to isdigit() or isspace() to
+   int. So I did to compile warning free with that too.
+
+ - Added checks for 'long double' and 'long long' in the configure script. I
+   need those for the mprintf.c source to compile well on non long long
+   comforming systems!
+
+Version 5.1 (not publicly released)
+
+ Daniel Stenberg (Dec 10, 1998)
+ - I got a request for a pre-compiled NT Alpha version. Anyone?
+
+ - Added Lynx/CERN www lib proxy environment variable support. That means curl
+   now reads and understands the following environment variables:
+
+       HTTP_PROXY, HTTPS_PROXY, FTP_PROXY, GOPHER_PROXY
+
+   They should be set for protocol-specific proxies. General proxy should be
+   set with
+       
+       ALL_PROXY
+
+   And a comma-separated list of host names that shouldn't go through any
+   proxy is set in (only an asterisk, '*' matches all hosts).
+
+       NO_PROXY
+
+   The usage of the -x/--proxy flag overrides the environment variables.
+
+ - Proxy can now be specified with a procotol:// prefix.
+
+ - Wrote the curl.1 man page.
+
+ - Introduced a whole new dynamic buffer system for all sprintf()s. It is
+   based on the *printf() package by yours truly and Bjorn Reese. Hopefully,
+   there aren't that many buffer overflow risks left now.
+
+ - Ah, I should mention I've compiled and built curl successfully under
+   solaris 2.6 with gcc now, gcc 2.7.2 won't work but 2.8.1 did ok.
+
+ Oren Tirosh <oren@hishome.net> (Dec 3, 1998)
+ - Brought two .spec files, to use when creating (Linux) Redhat style RPM
+   packages. They're named curl.spec and curl-ssl.spec.
+
+ Troy Engel <tengel@sonic.net>
+ - Supplied the src/Makefile.vc6 for easy compiling with VC++ under Win32.
+
+Version 5.0
+
+ Daniel Stenberg (Dec 1, 1998)
+ - Not a single bug report in ages.
+ - Corrected getpass.c and main.c to compile warning and error free with the
+   Win32 VC++ crap.
+
+Version 5.0 beta 24
+
+ Daniel Stenberg (Nov 20, 1998)
+
+ HOW TO BUILD A RELEASE ARCHIVE:
+
+ * Pre-requisite software:
+   What                     To build what             Reads data from
+   ====              =============             ===============
+   GNU automake      Makefile.in, aclocal.m4   configure.in
+     GNU make(1)      - " -
+     GNU gcc(1)       - " -
+   GNU autoconf      configure                 configure.in
+   GNU autoheader(2) config.h.in              configure.in, acconfig.h
+
+ * Make sure all files that should be part of the archive are put in FILES.
+
+ * Run './maketgz' and enter version number of the new to become archive.
+
+   maketgz does:
+
+   - Enters the newly created version number in url.h.
+   - (If you don't have automake, this script will warn about that, but unless
+     you have changed the Makefile.am files, that is nothing to care about.)
+     If you have it, it'll run it.
+   - If you have autoconf, the configure.in will be edited to get the newly
+     created version number and autoconf will be run.
+   - Creates a new directory named curl-<version>. (Actually, it uses the base
+     name of the current directory up to the first '-'.)
+   - Copies all files mentioned in FILES to the new directory. Saving
+     permissions and directory structure.
+   - Uses tar to create an archive of it all, named curl-<version>.tar.gz
+   - gzips the archive
+   - Removes the new directory and all its contents.
+
+ * When done, you have an archive stored in your directory named
+   curl-<version>.tar.gz.
+
+   Done!
+
+   (1) They're required to make automake run properly.
+   (2) It is distributed as a part of the GNU autoconf archive.
+
+ Daniel Stenberg (Nov 18, 1998)
+ - I changed the TAG-system. If you ever used urlget() from this package in
+   another product, you need to recompile with the new headers. I did this
+   new stuff to better deal with different compilers and system with different
+   variable sizes. I think it makes it a little more portable. This proves
+   to compile warning free with the problematic IRIX compiler!
+ - Win32 compiled with a silly error. Corrected now.
+ - Brian Chaplin <bchaplin@capital-mkts.com> reported yet another problem in
+   multiline FTP responses. I've tried to correct it. I mailed him a new
+   version and I hope he gets back soon with positive feedback!
+ - Improved the 'maketgz' to create a temporary directory tree which it makes
+   an archive from instead of the previous renaming of the current one.
+ - Mailing list opened (see README).
+ - Made -v more verbose on the PASV section of ftp transfers. Now it tells
+   host name and IP of the new host (and port number). I also added a section
+   about PORT vs PASV in the README.
+
+Version 5.0 beta 21
+
+ Angus Mackay (Nov 15, 1998)
+ - Introduced automake stuff.
+
+ Daniel Stenberg (Nov 13, 1998)
+ - Just made a successful GET of a document from an SSL-server using my own
+   private certificate for authentication! The certificate has to be in PEM
+   format. You do that the easiest way (although not *that* easy) by
+   downloading the SSLyeay PKCS#12-patch by Dr Stephen N. Henson from his site
+   at: http://www.drh-consultancy.demon.co.uk/. Using his tool, you can
+   convert any modern Netscape or (even) MSIE certificate to PEM-format.  Use
+   it with 'curl -E <certificate:password> https://site.com'.  If this isn't a
+   cool feature, then I don't know what cool features look like! ;-)
+ - Working slowly on telnet connections. #define TRY_TELNET to try it out.
+   (curl -u user:passwd "telnet://host.com/cat .login" is one example) I do
+   have problem to define how it should work. The prime purpose for this must
+   be to get (8bit clean) files via telnet, and it really isn't that easy to
+   get files this way. Still having problems with \n being converted to \r\n.
+
+ Angus Mackay (Nov 12, 1998)
+ - Corrected another bug in the long parameter name parser.
+ - Modified getpass.c (NOTE: see the special licensing in the top of that
+   source file).
+
+ Daniel Stenberg (Nov 12, 1998)
+ - We may have removed the silly warnings from url.c when compiled under IRIX.
+   Thanks again to Bjorn Reese <breese@imada.ou.dk> and Martin Staael
+   <martin@netgroup.dk>.
+ - Wrote formfind.pl which is a new perl script intended to help you find out
+   how a FORM submission should be done. This needs a little more work to get
+   really good.
+
+ Daniel Stenberg (Nov 11, 1998)
+ - Made the HTTP header-checker accept white spaces before the HTTP/1.? line.
+   Appearantly some proxies/sites add such at times (my test proxy did when I
+   downloaded a gopher page with it)!
+ - Moved the former -h to -M and made -h show the short help text instead. I
+   had to enable a forced help text option. Now an even shorter help text will
+   be presented when an unknown option and similar, is used.
+ - stdcheaders.h didn't work with IRIX 6.4 native cc compiler. I hope my
+   changes don't make other versions go nuts instead.
+
+ Daniel Stenberg (Nov 10, 1998)
+ - Added a weird check in the configure script to check for the silly AIX
+   warnings about my #define strcasecmp() stuff. I do that define to prevent
+   me and other contributors to accidentaly use that function name instead
+   of strequal()...
+ - I bugfixed Angus's getpass.c very little.
+ - Fixed the verbose flag names to getopt-style, i.e 'curl --loc' will be
+   sufficient instead of --location as "loc" is a unique prefix. Also, anything
+   after a '--' is treated as an URL. So if you do have a host with a weeeird
+   name you can do 'curl -- -host.com'.
+ - Another getopt-adjust; curl now accepts flags after the URL on the command
+   line. 'curl www.foo.com -O' is perfectly valid.
+ - Corrected the .curlrc parser so that strtok() is no longer used and I
+   believe it works better. Even URLs can be specified in it now.
+
+ Angus Mackay (Nov 9, 1998)
+ - Replaced getpass.c with a newly written one, not under GPL license
+ - Changed OS to a #define in config.h instead of compiler flag
+ - Makefile now uses -DHAVE_CONFIG_H
+
+ Daniel Stenberg (Nov 9, 1998)
+ - Ok, I expanded the tgz-target to update the version string on each occation
+   I build a release archive!
+ - I reacted on Angus Mackay's initiative and remade the parameter parser to
+   be more getopt compliant. Curl now supports "merged" flags as in 
+       curl -lsv ftp.site.com
+   Do note that I had to move three short-names of the options. Parameters
+   that needs an additional string such as -x must be stand-alone or the
+   last in a merged sequence:
+       curl -lsx my-proxy ftp.site.com
+   is ok, but using the flags in a different order like '-lxs' would cause
+   unexpected results (as the 's' option would be skipped).
+ - I've changed the headers in all files that are subject to the MozPL
+   license, as they are supposed to look like when conforming.
+ - Made the configure script make the config.h. The former config.h is now
+   setup.h.
+ - The RESOURCES and TODO files have been added to the archive.
+
+ Angus Mackay <amackay@gus.ml.org> (Nov 5, 1998)
+ - Fixed getpass.c and various configure stuff
+
+ Daniel Stenberg (Nov 3, 1998)
+ - Use -H/--header for custom HTTP-headers. Lets you pass on your own
+   specified headers to the remote server. I wouldn't recommend trying to use
+   a header with a defined usage according to standards. Use this flag once
+   for every custom header you want to add.
+ - Use -B/--ftp-ascii to force ftp to use ASCII mode when transfering files.
+ - Corrected the 'getlinks.pl' script, I accidentally left my silly proxy
+   usage in there! Since the introduction of the .curlrc file, it is easier to
+   write scripts that use curl since proxies and stuff should be in the
+   .curlrc file anyway.
+ - Introducing the new -F flag for HTTP POST. It supports multipart/form-data
+   which means it is gonna be possible to upload files etc through HTTP POST.
+   Shiraz Kanga <skanga@bigfoot.com> asked for the feature and my brother,
+   Björn Stenberg <Bjorn.Stenberg@sth.frontec.se> helped me design the user
+   interface for this beast.  This feature requires quite some docs,
+   since it has turned out not only quite capable, but also complicated! :-)
+ - A note here, since I've received mail about it. SSLeay versions prior to
+   0.8 will *not* work with curl!
+ - Wil Langford <wil@langford.net> reported a bug that occurred since curl
+   did not properly use CRLF when issuing ftp commands. I fixed it.
+ - Rearranged the order config files are read. .curlrc is now *always* read
+   first and before the command line flags. -K config files then act as
+   additional config items.
+ - Use -q AS THE FIRST OPTION specified to prevent .curlrc from being read.
+ - You can now disable a proxy by using -x "". Useful if the .curlrc file
+   specifies a proxy and you wanna fetch something without going through
+   that.
+ - I'm thinking of dropping the -p support. Its really not useful since ports
+   could (and should?) be specified as :<port> appended on the host name
+   instead, both in URLs and to proxy host names.
+ - Martin Staael <martin@netgroup.dk> reports curl -L bugs under Windows NT
+   (test with URL http://come.to/scsde). This bug is not present in this
+   version anymore.
+ - Added support for the weird FTP URL type= thing. You can download a file
+   using ASCII transfer by appending ";type=A" to the right of it. Other
+   available types are type=D for dir-list (NLST) and type=I for binary
+   transfer. I can't say I've ever seen anyone use this kind of URL though!
+   :-)
+ - Troy Engel <tengel@palladium.net> pointed out a bug in my getenv("HOME")
+   usage for win32 systems. I introduce getenv.c to better cope with
+   this. Mr Engel helps me with the details around that...
+ - A little note to myself and others, I should make the win32-binary built
+   with SSL support...
+ - r-y-a-n/n-e-l-s-o-n <ryan@inch.com> sent me comments about building curl
+   with SSL under FreeBSD. See the Makefile for details. Using the configure
+   script, it should work better and automatically now...
+ - Cleaned up in the port number mess in the source. No longer stores and uses
+   proxy port number separate from normal port number.
+ - 'configure' script working. Confirmed compiles on:
+    Host         SSL  Compiler
+    SunOS 5.5    no   gcc
+    SunOS 5.5.1  yes  gcc
+    SunOS 5.6    no   cc  (with gcc, it has the "gcc include files" problem)
+    SunOS 4.1.3  no   gcc (without ANSI C headers)
+    SunOS 4.1.2  no   gcc (native compiler failed)
+    Linux 2.0.18 no   gcc
+    Linux 2.0.32 yes  gcc
+    Linux 2.0.35 no   gcc (with glibc)
+    IRIX 6.2     no   gcc (cc compiles generate a few warnings)
+    IRIX 6.4     no   cc  (generated warnings though)
+    Win32        no   Borland
+    OSF4.0      no   ?
+
+ - Ooops. The 5beta (and 4.10) under win32 failed if the HOME variable wasn't
+   set.
+ - When using a proxy, curl now guesses and uses the protocol part in cases
+   like:
+       curl -x proxy:80 www.site.com
+   Proxies normally go nuts unless http:// is prepended to the host name, so
+   if curl is used like this, it guesses protocol and appends the protocol
+   string before passing it to the proxy. It already did this when used
+   without proxy.
+ - Better port usage with SSL through proxy now. If you specified a different
+   https-port when accessing through a proxy, it didn't use that number
+   correctly. I also rewrote the code that parses the stuff read from the
+   proxy when you wanna connect through it with SSL.
+ - Bjorn Reese <breese@imada.ou.dk> helped me work around one of the compiler
+   warnings on IRIX native cc compiles.
+
+Version 4.10 (Oct 26, 1998)
+ Daniel Stenberg
+ - John A. Bristor <jbristor@bellsouth.net> suggested a config file switch,
+   and since I've been having that idea kind of in the background for a long
+   time I rewrote the parameter parsing function a little and now I introduce
+   the -K/--config flag. I also made curl *always* (unless -K is used) try to
+   load the .curlrc file for command line parameters. The syntax for the
+   config file is the standard command line argument style. Details in 'curl
+   -h' or the README.
+ - I removed the -k option. Keep-alive isn't really anything anyone would
+   want to enable with curl anyway.
+ - Martin Staael <Martin@Staael.dk> helped me add the 'irix' target. Now
+   "make irix" should build curl successfully on non-gcc SGI machines.
+ - Single switches now toggle behaviours. I.e if you use -v -v the second
+   will switch off the verbose mode the first one enabled. This is so that
+   you can disable a default setting a .curlrc file enables etc.
+
+Version 4.9 (Oct 7, 1998)
+ Daniel Stenberg
+ - Martin Staael <Martin@Staael.dk> suggested curl would support cookies.
+   I added -b/--cookie to enable free-text cookie data to be passed. There's
+   also a little blurb about general cookie stuff in the README/help text.
+ - dmh <dmh@jet.es> suggested HTTP resume capabilities. Although you could
+   manually get curl to resume HTTP documents, I made the -c resume flag work
+   for HTTP too (unless -r is used too, which would be very odd anyway).
+ - Added checklinks.pl to the archive. It is a still experimental perl script
+   that checks all links of a web page by using curl.
+ - Rearranged the archive hierarchy a little. Build the executable in the
+   src/ dir from now on!
+ - Version 4.9 and hereafter, is no longer released under the GPL license.
+   I have now updated the LEGAL file etc and now this is released using the
+   Mozilla Public License to avoid the plague known as "the GPL virus". You
+   must make the source available if you decide to change and/or redistribute
+   curl, but if you decide to use curl within something else you do not need
+   to offer the world the source to that too.
+ - Curl did not like HTTP servers that sent no headers at all on a GET
+   request.  It is a violation of RFC2068 but appearantly some servers do
+   that anyway.  Thanks to Gordon Beaton <gordon@erix.ericsson.se> for the
+   report!
+ - -L/--location was added after a suggestion from Martin Staael
+   <Martin@Staael.dk>. This makes curl ATTEMPT to follow the Location:
+   redirect if one is present in the HTTP headers. If -i or -I is used with
+   this flag, you will see headers from all sites the Location: points to. Do
+   note that the first server can point to a second that points to a third
+   etc. It seems the Location: parameter (said to be an AbsoluteURI in
+   RFC2068) isn't always absolute.. :-/ Anyway, I've made curl ATTEMPT to do
+   the best it can to deal with the reality.
+ - Added getlinks.pl to the archive. getlinks.pl selectively downloads
+   files that a web page links to.
+
+Version 4.8.4
+ Daniel Stenberg
+ - As Julian Romero Nieto <jromero@anaya.es> reported, curl reported wrong
+   version number.
+ - As Teemu Yli-Elsila <tylielsi@mail.student.oulu.fi> pointed out,
+   the win32 version of 4.8 (and probably all other versions for win32)
+   didn't work with binary files since I'm too used to the UNIX style
+   fopen() where binary and text don't differ...
+ - Ralph Beckmann <rabe@uni-paderborn.de> brought me some changes that lets
+   curl compile error and warning free with -Wall -pedantic with
+   g++. I also took the opportunity to clean off some unused variables
+   and similar.
+ - Ralph Beckmann <rabe@uni-paderborn.de> made me aware of a really odd bug
+   now corrected. When curl read a set of headers from a HTTP server, divided
+   into more than one read and the first read showed a full line *exactly*
+   (i.e ending with a newline), curl did not behave well.
+
+Version 4.8.3
+ Daniel Stenberg
+ - I was too quick to release 4.8.2 with too little testing. One of the
+   changes is now reverted slightly to the 4.8.1 way since 4.8.2 couldn't
+   upload files. I still think both problems corrected in 4.8.2 remain
+   corrected.  Reported by Julian Romero Nieto <jromero@anaya.es>.
+
+Version 4.8.2
+ Daniel Stenberg
+ - Bernhard Iselborn <biselbor@rhrk.uni-kl.de> reported two FTP protocol
+   errors curl did. They're now corrected. Both appeared when getting files
+   from a MS FTP server! :-)
+
+Version 4.8.1
+ Daniel Stenberg
+ - Added a last update of the progress meter when the transfer is done. The
+   final output on the screen didn't have to be the final size transfered
+   which made it sometimes look odd.
+ - Thanks to David Long <long@research.bell-labs.com> I got rid of a silly
+   bug that happened if a HTTP-page had nothing but header. Appearantly
+   Solaris deals with negative sizes in fwrite() calls a lot better than
+   Linux does... =B-]
+
+Version 4.8
+ Daniel Stenberg
+ - Continue FTP file transfer. -c is the switch. Note that you need to
+   specify a file name if you wanna resume a download (you can't resume a
+   download sent to stdout). Resuming upload may be limited by the server
+   since curl is then using the non-RFC959 command SIZE to get the size of
+   the target file before upload begins (to figure out which offset to
+   use). Use -C to specify the offset yourself! -C is handy if you're doing
+   the output to something else but a plain file or when you just want to get
+   the end of a file.
+ - recursiveftpget.pl now features a maximum recursive level argument.
+
+Version 4.7
+ Daniel Stenberg
+ - Added support to abort a download if the speed is below a certain amount
+   (speed-limit) bytes per second for a certain (speed-time) time.
+ - Wrote a perl script 'recursiveftpget.pl' to recursively use curl to get a
+   whole ftp directory tree. It is meant as an example of how curl can be
+   used.  I agree it isn't the wisest thing to do to make a separate new
+   connection for each file and directory for this.
+
+Version 4.6
+ Daniel Stenberg
+ - Added a first attempt to optionally parse the .netrc file for login user
+   and password. If used with http, it enables user authentication. -n is
+   the new switch.
+ - Removed the extra newlines on the default user-agent string.
+ - Corrected the missing ftp upload error messages when it failed without the
+   verbose flag set. Gary W. Swearingen found it.
+ - Now using alarm() to enable second-precision timeout even on the name
+   resolving/connecting phase. The timeout is although reset after that first
+   sequence. (This should be corrected.) Gary W. Swearingen <swear@aa.net>
+   reported.
+ - Now spells "Unknown" properly, as in "Unknown option 'z'"... :-)
+ - Added bug report email address in the README.
+ - Added a "current speed" field to the progress meter. It shows the average
+   speed the last 5 seconds. The other speed field shows the average speed of
+   the entire transfer so far.
+
+Version 4.5.1
+ Linas Vepstas
+ - SSL through proxy fix
+ - Added -A to allow User-Agent: changes
+
+ Daniel Stenberg 
+ - Made the -A work when SSL-through-proxy.
+
+Version 4.5
+ Linas Vepstas <linas@linas.org>
+ - More SSL corrections
+ - I've added a port to AIX.
+ - running SSL through a proxy causes a chunk of code to be executred twice.
+   one of those blocks needs to be deleted.
+
+ Daniel Stenberg
+ - Made -i and -I work again
+
+Version 4.4
+ Linas Vepstas <linas@us.ibm.com>
+ - -x can now also specify proxyport when used as in 'proxyhost:proxyport'
+ - SSL fixes
+
+Version 4.3
+ Daniel Stenberg
+ - Adjusted to compile under win32 (VisualC++ 5). The -P switch does not
+   support network interface names in win32. I couldn't figure out how!
+
+Version 4.2
+ Linas Vepstas / Sampo Kellomaki
+ - Added SSL / SSLeay support (https://)
+ - Added the -T usage for HTTP POST.
+
+ Daniel Stenberg
+ - Bugfixed the SSL implementation.
+ - Made -P a lot better to use other IP addresses. It now accepts a following
+   parameter that can be either
+        interface - i.e "eth0" to specify which interface's IP address you
+                    want to use
+        IP address - i.e "192.168.10.1" to specify exact IP number
+        host name - i.e "my.host.domain" to specify machine
+        "-"       - (any single-letter string) to make it pick the machine's
+                    default
+ - The Makefile is now ready to compile for solaris, sunos4 and linux right
+   out of the box.
+ - Better generated version string seen with 'curl -V'
+
+Version 4.1
+ Daniel Stenberg
+ - The IP number returned by the ftp server as a reply to PASV does no longer
+   have to DNS resolve. In fact, no IP-number-only addresses have to anymore.
+ - Binds better to available port when -P is used.
+ - Now LISTs ./ instead of / when used as in ftp://ftp.funet.fi/. The reason
+   for this is that exactly that site, ftp.funet.fi, does not allow LIST /
+   while LIST ./ is fine. Any objections?
+
+Version 4 (1998-03-20)
+ Daniel Stenberg
+ - I took another huge step and changed both version number and project name!
+   The reason for the new name is that there are just one too many programs
+   named urlget already and this program already can a lot more than merely
+   getting URLs, and the reason for the version number is that I did add the
+   pretty big change in -P and since I changed name I wanted to start with
+   something fresh!
+ - The --style flags are working better now.
+ - Listing directories with FTP often reported that the file transfer was
+   incomplete. Wrong assumptions were too common for directories, why no
+   size will be attempted to get compared on them from now on.
+ - Implemented the -P flag that let's the ftp control issue a PORT command
+   instead of the standard PASV.
+ - -a for appending FTP uploads works.
+
+***************************************************************************
+
+Version 3.12
+ Daniel Stenberg
+ - End-of-header tracking still lacked support for \r\n or just \n at the
+   end of the last header line.
+ Sergio Barresi <sbarresi@imispa.it>
+ - Added PROXY authentication.
+ Rafael Sagula
+ - Fixed some little bugs.
+
+Version 3.11
+ Daniel Stenberg
+ - The header parsing was still not correct since the 3.2 modification...
+
+Version 3.10
+ Daniel Stenberg
+ - 3.7 and 3.9 were simultaneously developed and merged into this version.
+ - FTP upload did not work correctly since 3.2.
+
+Version 3.9
+ Rafael Sagula
+ - Added the "-e <url> / --referer <url>" option where we can specify
+   the referer page. Obviously, this is necessary only to fool the
+   server, but...
+
+Version 3.7
+ Daniel Stenberg
+ - Now checks the last error code sent from the ftp server after a file has
+   been received or uploaded. Wasn't done previously.
+ - When 'urlget <host>' is used without a 'protocol://' first in the host part,
+   it now checks for host names starting with ftp or gopher and if it does,
+   it uses that protocol by default instead of http.
+
+Version 3.6
+ Daniel Stenberg
+ - Silly mistake made the POST bug. This has now also been tested to work with
+   proxy.
+
+Version 3.5
+ Daniel Stenberg
+ - Highly inspired by Rafael Sagula's changes to the 3.1 that added an almost
+   functional POST, I applied his changes into this version and made them work.
+   (It seems POST requires the Content-Type and Content-Length headers.) It is
+   now usable with the -d switch.
+
+Version 3.3 - 3.4
+ Passed to avoid confusions
+
+Version 3.2
+ Daniel Stenberg
+ - Major rewrite of two crucial parts of this code: upload and download.
+   They are both now using a select() switch, that allows much better
+   progress meter and time control. 
+ - alarm() usage removed completely
+ - FTP get can now list directory contents if the path ends with a slash '/'.
+   Urlget on a ftp-path that doesn't end with a slash means urlget will
+   attempt getting it as a file name.
+ - FTP directory view supports -l for "list-only" which lists the file names
+   only.
+ - All operations support -m for max time usage in seconds allowed.
+ - FTP upload now allows the size of the uploaded file to be provided, and
+   thus it can better check it actually uploaded the whole file. It also
+   makes the progress meter for uploads much better!
+ - Made the parameter parsing fail in cases like 'urlget -r 900' which
+   previously tried to connect to the host named '900'.
+
+Version 3.1
+ Kjell Ericson
+ - Pointed out how to correct the 3 warnings in win32-compiles.
+
+ Daniel Stenberg
+ - Removed all calls to exit().
+ - Made the short help text get written to stdout instead of stderr.
+ - Made this file instead of keeping these comments in the source.
+ - Made two callback hooks, that enable external programs to use urlget()
+   easier and to grab the output/offer the input easier.
+ - It is evident that Win32-compiles are painful. I watched the output from
+   the Borland C++ v5 and it was awful. Just ignore all those warnings.
+
+Version 3.0
+ Daniel Stenberg
+ - Added FTP upload capabilities. The name urlget gets a bit silly now
+   when we can put too... =)
+ - Restructured the source quite a lot.
+   Changed the urlget() interface. This way, we will survive changes much
+   better. New features can come and old can be removed without us needing
+   to change the interface. I've written a small explanation in urlget.h
+   that explains it.
+ - New flags include -t, -T, -O and -h. The -h text is generated by the new
+   mkhelp script.
+
+Version 2.9
+ Remco van Hooff
+ - Added a fix to make it compile smoothly on Amiga using the SAS/C
+   compiler.
+  
+ Daniel Stenberg
+ - Believe it or not, but the STUPID Novell web server seems to require
+   that the Host: keyword is used, so well I use it and I (re-introduce) the
+   urlget User-Agent:. I still have to check that this Host: usage works with
+   proxies... 'Host:' is required for HTTP/1.1 GET according to RFC2068.
+
+Version 2.8
+ Rafael Sagula
+ - some little modifications
+
+Version 2.7
+ Daniel Stenberg
+ - Removed the -l option and introduced the -f option instead. Now I'll
+   rewrite the former -l kludge in an external script that'll use urlget to
+   fetch multipart files like that.
+ - '-f' is introduced, it means Fail without output in case of HTTP server
+   errors (return code >=300).
+ - Added support for -r, ranges. Specify which part of a document you 
+   want, and only that part is returned. Only with HTTP/1.1-servers.
+ - Split up the source in 3 parts. Now all pure URL functions are in
+   urlget.c and stuff that deals with the stand-alone program is in main.c.
+ - I took a few minutes and wrote an embryo of a README file to explain
+   a few things.
+
+Version 2.6
+ Daniel Stenberg
+ - Made the -l (loop) thing use the new CONF_FAILONERROR which makes
+   urlget() return error code if non-successful. It also won't output anything
+   then. Now finally removed the HTTP 1.0 and error 404 dependencies.
+ - Added -I which uses the HEAD request to get the header only from a
+   http-server.
+
+Version 2.5
+ Rafael Sagula
+ - Made the progress meter use HHH:MM:SS instead of only seconds.
+
+Version 2.4
+ Daniel Stenberg
+ - Added progress meter. It appears when downloading > BUFFER SIZE and
+   mute is not selected. I found out that when downloading large files from
+   really really slow sites, it is desirable to know the status of the
+   download. Do note that some downloads are done unawaring of the size, which
+   makes the progress meter less thrilling ;) If the output is sent to a tty,
+   the progress meter is shut off.
+ - Increased buffer size used for reading.
+ - Added length checks in the user+passwd parsing.
+ - Made it grok user+passwd for HTTP fetches. The trick is to base64
+   encode the user+passwd and send an extra header line. Read chapter 11.1 in
+   RFC2068 for details. I added it to be used just like the ftp one.  To get a
+   http document from a place that requires user and password, use an URL
+   like:
+
+        http://user:passwd@www.site.to.leach/doc.html
+
+   I also added the -u flag, since WHEN USING A PROXY YOU CAN'T SPECIFY THE
+   USER AND PASSWORD WITH HTTP LIKE THAT. The -u flag works for ftp too, but
+   not if used with proxy. To do the same as the above one, you can invoke:
+
+        urlget -u user:passwd http://www.site.to.leach/doc.html
+
+Version 2.3
+ Rafael Sagula
+ - Added "-o" option (output file)
+ - Added URG_HTTP_NOT_FOUND return code.
+   (Daniel's note:)
+   Perhaps we should detect all kinds of errors and instead of writing that
+   custom string for the particular 404-error, use the error text we actually
+   get from the server. See further details in RFC2068 (HTTP 1.1
+   definition). The current way also relies on a HTTP/1.0 reply, which newer
+   servers might not do.
+ - Looping mode ("-l" option). It's easier to get various split files.
+   (Daniel's note:)
+   Use it like 'urlget -l 1 http://from.this.site/file%d.html', which will
+   make urlget to attempt to fetch all files named file1.html, file2.html etc
+   until no more files are found. This is only a modification of the
+   STAND_ALONE part, nothing in the urlget() function was modfified for this.
+ Daniel Stenberg
+ - Changed the -h to be -i instead. -h should be preserved to help use.
+ - Bjorn Reese indicated that Borland _might_ use '_WIN32' instead of the
+   VC++ WIN32 define and therefore I added a little fix for that.
+
+Version 2.2
+ Johan Andersson
+ - The urlget function didn't set the path to url when using proxy.
+ - Fixed bug with IMC proxy. Now using (almost) complete GET command.
+  
+ Daniel Stenberg
+ - Made it compile on Solaris. Had to reorganize the includes a bit.
+   (so Win32, Linux, SunOS 4 and Solaris 2 compile fine.)
+ - Made Johan's keepalive keyword optional with the -k flag (since it
+   makes a lot of urlgets take a lot longer time).
+ - Made a '-h' switch in case you want the HTTP-header in the output.
+
+Version 2.1
+ Daniel Stenberg and Kjell Ericson
+ - Win32-compilable
+ - No more global variables
+ - Mute option (no output at all to stderr)
+ - Full range of return codes from urlget(), which is now written to be a
+   function for easy-to-use in [other] programs.
+ - Define STAND_ALONE to compile the stand alone urlget program
+ - Now compiles with gcc options -ansi -Wall -pedantic ;)
+
+Version 2.0
+ - Introducing ftp GET support. The FTP URL type is recognized and used.
+ - Renamed the project to 'urlget'.
+ - Supports the user+passwd in the FTP URL (otherwise it tries anonymous
+   login with a weird email address as password).
+
+Version 1.5
+ Daniel Stenberg
+ - The skip_header() crap messed it up big-time. By simply removing that
+   one we can all of a sudden download anything ;)
+ - No longer requires a trailing slash on the URLs.
+ - If the given URL isn't prefixed with 'http://', HTTP is assumed and
+   given a try!
+ - 'void main()' is history.
+
+Version 1.4
+ Daniel Stenberg
+ - The gopher source used the ppath variable instead of path which could
+   lead to disaster.
+
+Version 1.3
+ Daniel Stenberg
+ - Well, I added a lame text about the time it took to get the data. I also
+   fought against Johan to prevent his -f option (to specify a file name
+   that should be written instead of stdout)! =)
+ - Made it write 'connection refused' for that particular connect()
+   problem.
+ - Renumbered the version. Let's not make silly 1.0.X versions, this is
+   a plain 1.3 instead.
+
+Version 1.2
+ Johan Andersson
+ - Discovered and fixed the problem with getting binary files. puts() is
+   now replaced with fwrite(). (Daniel's note: this also fixed the buffer
+   overwrite problem I found in the previous version.)
+
+ Rafael Sagula <sagula@inf.ufrgs.br>
+ - Let "-p" before "-x".
+
+ Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>
+ - Bugfixed the proxy usage. It should *NOT* use nor strip the port number
+   from the URL but simply pass that information to the proxy. This also
+   made the user/password fields possible to use in proxy [ftp-] URLs.
+   (like in ftp://user:password@ftp.my.site:8021/README)
+
+ Johan Andersson <johan@homemail.com>
+ - Implemented HTTP proxy support.
+ - Receive byte counter added.
+
+ Bjorn Reese <breese@imada.ou.dk>
+ - Implemented URLs (and skipped the old syntax).
+ - Output is written to stdout, so to achieve the above example, do:
+   httpget http://143.54.10.6/info_logo.gif > test.gif
+
+Version 1.1
+ Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>
+ - Adjusted it slightly to accept named hosts on the command line. We
+   wouldn't wanna use IP numbers for the rest of our lifes, would we?
+
+Version 1.0
+  Rafael Sagula <sagula@inf.ufrgs.br>
+  - Wrote the initial httpget, which started all this!
diff --git a/CONTRIBUTE b/CONTRIBUTE
new file mode 100644 (file)
index 0000000..e268d4e
--- /dev/null
@@ -0,0 +1,68 @@
+ Date: 1999-08-04
+
+To Think About When Contributing Source Code
+
+ This document is intended to offer some guidelines that can be useful to
+ keep in mind when you decide to write a contribution to the project. This
+ concerns new features as well as corrections to existing flaws or bugs.
+
+Naming
+
+ Try using a non-confusing naming scheme for your new functions and variable
+ names. It doesn't necessarily have to mean that you should use the same as
+ in other places of the code, just that the names should be logical,
+ understandable and be named according to what they're used for.
+
+Indenting
+
+ Please try using the same indenting levels and bracing method as all the
+ other code already does. It makes the source code a lot easier to follow if
+ all of it is written using the same style. I don't ask you to like it, I
+ just ask you to follow the tradition! ;-)
+
+Commenting
+
+ Comment your source code extensively. I don't see myself as a very good
+ source commenter, but I try to become one. Commented code is quality code
+ and enables future modifications much more. Uncommented code much more risk
+ being completely replaced when someone wants to extend things, since other
+ persons' source code can get quite hard to read.
+
+General Style
+
+ Keep your functions small. If they're small you avoid a lot of mistakes and
+ you don't accidentaly mix up variables.
+
+Non-clobbering All Over
+
+ When you write new functionality or fix bugs, it is important that you
+ don't fiddle all over the source files and functions. Remember that it is
+ likely that other people have done changes in the same source files as you
+ have and possibly even in the same functions. If you bring completely new
+ functionality, try writing it in a new source file. If you fix bugs, try to
+ fix one bug at a time and send them as separate patches.
+
+Separate Patches Doing Different Things
+
+ It is annoying when you get a huge patch from someone that is said to fix 511
+ odd problems, but discussions and opinions don't agree with 510 of them - or
+ 509 of them were already fixed in a different way. Then the patcher needs to
+ extract the single interesting patch from somewhere within the huge pile of
+ source, and that gives a lot of extra work. Preferably, all fixes that
+ correct different problems should be in their own patch with an attached
+ description exactly what they correct so that all patches can be selectively
+ applied by the maintainer or other interested parties.
+
+Document
+
+ Writing docs is dead boring and one of the big problems with many open
+ source projects. Someone's gotta do it. It makes it a lot easier if you
+ submit a small description of your fix or your new features with every
+ contribution so that it can be swiftly added to the package documentation.
+
+Write Access to CVS Repository
+
+ If you are a frequent contributor, or have another good reason, you can of
+ course get write access to the CVS repository and then you'll be able to
+ check-in all your changes straight into the CVS tree instead of sending all
+ changes by mail as patches. Just ask if this is what you'd want.
diff --git a/FAQ b/FAQ
new file mode 100644 (file)
index 0000000..dea807e
--- /dev/null
+++ b/FAQ
@@ -0,0 +1,31 @@
+Date: 19 November 1999
+
+             Frequently Asked Questions about Curl
+
+1. Problems connecting to SSL servers.
+
+  It took a very long time before I could sort out why curl had problems
+  to connect to certain SSL servers when using SSLeay or OpenSSL v0.9+.
+  The error sometimes showed up similar to:
+
+  16570:error:1407D071:SSL routines:SSL2_READ:bad mac decode:s2_pkt.c:233:
+
+  It turned out to be because many older SSL servers don't deal with SSLv3
+  requests properly. To correct this problem, tell curl to select SSLv2 from
+  the command line (-2/--sslv2).
+
+  I have also seen examples where the remote server didn't like the SSLv2
+  request and instead you had to force curl to use SSLv3 with -3/--sslv3.
+
+2. Does curl support resume?
+
+  Yes. Both ways on FTP, download ways on HTTP.
+
+3. Is libcurl thread safe?
+
+  Yes, as far as curl's own code goes. It does use system calls that often
+  aren't thread safe in most environments, such as gethostbyname().
+
+  I am very interested in once and for all getting some kind of report or
+  README file from those who have used libcurl in a threaded environment,
+  since I haven't and I get this question more and more frequently!
diff --git a/FEATURES b/FEATURES
new file mode 100644 (file)
index 0000000..18d3d3d
--- /dev/null
+++ b/FEATURES
@@ -0,0 +1,72 @@
+Misc
+ - full URL syntax
+ - custom maximum download time
+ - custom least download speed acceptable
+ - multiple URLs
+ - guesses protocol from host name unless specified
+ - uses .netrc
+ - progress bar/time specs while downloading
+ - PROXY environment variables support
+ - config file support
+ - compiles on win32
+
+HTTP
+ - GET
+ - PUT
+ - HEAD
+ - POST
+ - multipart POST
+ - authentication
+ - resume
+ - follow redirects
+ - custom HTTP request
+ - cookie get/send
+ - custom headers (that can replace internally generated headers)
+ - custom user-agent string
+ - custom referer string
+ - range
+ - proxy authentication
+ - time conditions
+ - via http-proxy
+
+HTTPS (*1)
+ - (all the HTTP features)
+ - using certificates
+ - via http-proxy
+
+FTP
+ - download
+ - authentication
+ - PORT or PASV
+ - single file size information (compare to HTTP HEAD)
+ - 'type=' URL support
+ - dir listing
+ - dir listing names-only
+ - upload
+ - upload append
+ - upload via http-proxy as HTTP PUT
+ - download resume
+ - upload resume
+ - QUOT commands
+ - simple "range" support
+ - via http-proxy
+
+TELNET
+ - connection negotiation
+ - stdin/stdout I/O
+
+LDAP (*2)
+ - full LDAP URL support
+
+DICT
+ - extended DICT URL support
+
+GOPHER
+ - GET
+ - via http-proxy
+
+FILE
+ - URL support
+
+        *1 = requires OpenSSL
+        *2 = requires OpenLDAP
diff --git a/FILES b/FILES
new file mode 100644 (file)
index 0000000..d26a3c0
--- /dev/null
+++ b/FILES
@@ -0,0 +1,47 @@
+CHANGES
+CONTRIBUTE
+FEATURES
+FAQ
+FILES
+INSTALL
+LEGAL
+MPL-1.0.txt
+README
+README.curl
+README.libcurl
+curl.1
+*spec
+RESOURCES
+TODO
+maketgz
+Makefile.in
+Makefile.am
+acconfig.h
+aclocal.m4
+config.guess
+config.h.in
+config.sub
+configure
+configure.in
+install-sh
+missing
+mkinstalldirs
+reconf
+stamp-h.in
+perl/README
+perl/*.pl.in
+src/*.[ch]
+src/*in
+src/*am
+src/mkhelp.pl
+src/Makefile.vc6
+src/*m32
+lib/getdate.y
+lib/*.[ch]
+lib/*in
+lib/*am
+lib/Makefile.vc6
+lib/*m32
+include/README
+include/curl/*.h
+
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..a2e3894
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,195 @@
+                                  _   _ ____  _     
+                              ___| | | |  _ \| |    
+                             / __| | | | |_) | |    
+                            | (__| |_| |  _ <| |___ 
+                             \___|\___/|_| \_\_____|
+
+                                How To Compile
+
+UNIX
+====
+
+   The configure script *always* tries to find a working SSL library unless
+   explicitely told not to.  If you have SSLeay or OpenSSL installed in the
+   default search path for your compiler/linker, you don't need to do anything
+   special.
+
+   If you have SSLeay or OpenSSL installed in /usr/local/ssl, you can
+   run configure like so:
+
+       ./configure --with-ssl
+
+   If you have SSLeay or OpenSSL installed somewhere else (for example,
+   /opt/OpenSSL,) you can run configure like this:
+
+       ./configure --with-ssl=/opt/OpenSSL
+
+   If you insist on forcing a build *without* SSL support, even though you may
+   have it installed in your system, you can run configure like this:
+
+        ./configure --without-ssl
+
+   If you have SSLeay or OpenSSL installed, but with the libraries in
+   one place and the header files somewhere else, you'll have to set the
+   LDFLAGS and CPPFLAGS environment variables prior to running configure.
+   Something like this should work:
+
+     (with the Bourne shell and its clones):
+
+       CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \
+           ./configure
+
+     (with csh, tcsh and their clones):
+     
+       env CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \
+       ./configure
+
+   If your SSL library was compiled with rsaref (usually for use in
+   the United States), you may also need to set:
+
+     LIBS=-lRSAglue -lrsaref
+     (from Doug Kaufman <dkaufman@rahul.net>)
+
+   Without SSL support, just run:
+
+     ./configure
+
+   Then run:
+
+     make
+
+   Use the executable `curl` in src/ directory.
+
+   'make install' copies the curl file to /usr/local/bin/ (or $prefix/bin
+   if you used the --prefix option to configure) and copies the curl.1
+   man page to a suitable place too.
+
+   KNOWN PROBLEMS
+
+     If you happen to have autoconf installed, but a version older than
+     2.12 you will get into trouble. Then you can still build curl by
+     issuing these commands: (from Ralph Beckmann <rabe@uni-paderborn.de>)
+
+       ./configure [...]
+       cd lib; make; cd ..
+       cd src; make; cd ..
+       cp src/curl elsewhere/bin/
+
+   OPTIONS
+
+     Remember, to force configure to use the standard cc compiler if both
+     cc and gcc are present, run configure like
+
+       CC=cc ./configure
+         or
+       env Cc=cc ./configure
+
+
+Win32
+=====
+   Without SSL:
+
+      MingW32 (GCC-2.95) style
+      ------------------------
+        Run the 'mingw32.bat' file to get the proper environment variables
+        set, then run 'make -f Makefile.m32' in the lib/ dir and then
+        'make -f Makefile.m32' in the src/ dir.
+
+        If you have any problems linking libraries or finding header files,
+        be sure to look at the provided "Makefile.m32" files for the proper
+        paths, and adjust as necessary.
+
+      Cygwin style
+      ------------
+        Almost identical to the unix installation. Run the configure script
+        in the curl root with 'sh configure'. Make sure you have the sh
+        executable in /bin/ or you'll see the configure fail towards the
+        end.
+
+        Run 'make'
+
+      Microsoft command line style
+      ----------------------------
+        Run the 'vcvars32.bat' file to get the proper environment variables
+        set, then run 'nmake -f Makefile.vc6' in the lib/ dir and then
+        'nmake -f Makefile.vc6' in the src/ dir.
+
+      IDE-style
+      -------------------------
+        If you use VC++, Borland or similar compilers. Include all lib source
+        files in a static lib "project" (all .c and .h files that is).
+        (you should name it libcurl or similar)
+
+        Make the sources in the src/ drawer be a "win32 console application"
+        project. Name it curl.
+
+        With VC++, add 'wsock32.lib' to the link libs when you build curl!
+        Borland seems to do that itself magically. Of course you have to
+        make sure it links with the libcurl too!
+
+        For VC++ 6, there's an included Makefile.vc6 that should be possible
+        to use out-of-the-box.
+
+        Microsoft note: add /Zm200 to the compiler options, as the hugehelp.c
+        won't compile otherwise due to "too long puts string" or something
+        like that!
+
+
+   With SSL:
+
+      MingW32 (GCC-2.95) style
+      ------------------------
+        Run the 'mingw32.bat' file to get the proper environment variables
+        set, then run 'make -f Makefile.m32 SSL=1' in the lib/ dir and then
+        'make -f Makefile.m32 SSL=1' in the src/ dir.
+
+        If you have any problems linking libraries or finding header files,
+        be sure to look at the provided "Makefile.m32" files for the proper
+        paths, and adjust as necessary.
+
+      Cygwin style
+      ------------
+
+        Haven't done, nor got any reports on how to do. It should although be
+        identical to the unix setup for the same purpose. See above.
+
+      Microsoft command line style
+      ----------------------------
+        Run the 'vcvars32.bat' file to get the proper environment variables
+        set, then run 'nmake -f Makefile.vc6 release-ssl' in the lib/ dir and
+        then 'nmake -f Makefile.vc6' in the src/ dir.
+
+      Microsoft / Borland style
+      -------------------------
+        If you have OpenSSL/SSLeay, and want curl to take advantage of it,
+        edit your project properties to use the SSL include path, link with
+        the SSL libs and define the USE_SSLEAY symbol.
+
+
+OpenSSL/SSLeay
+==============
+
+   You'll find OpenSSL information at:
+
+      http://www.openssl.org
+
+
+MingW32/Cygwin
+==============
+
+   You'll find MingW32 and Cygwin information at:
+
+      http://www.xraylith.wisc.edu/~khan/software/gnu-win32/index.html
+
+OpenLDAP
+========
+
+   You'll find OpenLDAP information at:
+
+      http://www.openldap.org
+
+   You need to install it with shared libraries, which is enabled when running
+   the ldap configure script with "--enable-shared". With my linux 2.0.36
+   kernel I also had to disable using threads (with --without-threads),
+   because the configure script couldn't figure out my system.
diff --git a/LEGAL b/LEGAL
new file mode 100644 (file)
index 0000000..cc1143c
--- /dev/null
+++ b/LEGAL
@@ -0,0 +1,21 @@
+Part of this software is distributed under the Mozilla Public License
+version 1.0, which is part of this distribution (MPL-1.0.txt) and
+available on-line at http://www.mozilla.org/MPL/
+
+The terminology used here is described in the Mozilla Public License.
+
+In accordance with section "4. Inability to Comply Due to Statute or
+Regulation" the following exemptions apply to this software:
+
+ * The Initial Developer has the right, regardless of the citizenship
+   of any involved party, to choose the location for settling disputes
+   as refered to under section "11. Miscellaneous" of the Mozilla Public
+   License.
+
+Initial Developers of this software are:
+
+  Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>
+  Rafael Linden Sagula <sagula@inf.ufrgs.br>
+
+Curl is Copyright (C) 1996-1998 Daniel Stenberg and Rafael Linden Sagula
\ No newline at end of file
diff --git a/MPL-1.0.txt b/MPL-1.0.txt
new file mode 100644 (file)
index 0000000..f7f2ff1
--- /dev/null
@@ -0,0 +1,360 @@
+                           MOZILLA PUBLIC LICENSE
+                                Version 1.0
+
+                              ----------------
+
+1. Definitions.
+
+     1.1. ``Contributor'' means each entity that creates or contributes to
+     the creation of Modifications.
+
+     1.2. ``Contributor Version'' means the combination of the Original
+     Code, prior Modifications used by a Contributor, and the Modifications
+     made by that particular Contributor.
+
+     1.3. ``Covered Code'' means the Original Code or Modifications or the
+     combination of the Original Code and Modifications, in each case
+     including portions thereof.
+
+     1.4. ``Electronic Distribution Mechanism'' means a mechanism generally
+     accepted in the software development community for the electronic
+     transfer of data.
+
+     1.5. ``Executable'' means Covered Code in any form other than Source
+     Code.
+
+     1.6. ``Initial Developer'' means the individual or entity identified as
+     the Initial Developer in the Source Code notice required by Exhibit A.
+
+     1.7. ``Larger Work'' means a work which combines Covered Code or
+     portions thereof with code not governed by the terms of this License.
+
+     1.8. ``License'' means this document.
+
+     1.9. ``Modifications'' means any addition to or deletion from the
+     substance or structure of either the Original Code or any previous
+     Modifications. When Covered Code is released as a series of files, a
+     Modification is:
+
+          A. Any addition to or deletion from the contents of a file
+          containing Original Code or previous Modifications.
+
+          B. Any new file that contains any part of the Original Code or
+          previous Modifications.
+
+     1.10. ``Original Code'' means Source Code of computer software code
+     which is described in the Source Code notice required by Exhibit A as
+     Original Code, and which, at the time of its release under this License
+     is not already Covered Code governed by this License.
+
+     1.11. ``Source Code'' means the preferred form of the Covered Code for
+     making modifications to it, including all modules it contains, plus any
+     associated interface definition files, scripts used to control
+     compilation and installation of an Executable, or a list of source code
+     differential comparisons against either the Original Code or another
+     well known, available Covered Code of the Contributor's choice. The
+     Source Code can be in a compressed or archival form, provided the
+     appropriate decompression or de-archiving software is widely available
+     for no charge.
+
+     1.12. ``You'' means an individual or a legal entity exercising rights
+     under, and complying with all of the terms of, this License or a future
+     version of this License issued under Section 6.1. For legal entities,
+     ``You'' includes any entity which controls, is controlled by, or is
+     under common control with You. For purposes of this definition,
+     ``control'' means (a) the power, direct or indirect, to cause the
+     direction or management of such entity, whether by contract or
+     otherwise, or (b) ownership of fifty percent (50%) or more of the
+     outstanding shares or beneficial ownership of such entity.
+
+2. Source Code License.
+
+     2.1. The Initial Developer Grant.
+     The Initial Developer hereby grants You a world-wide, royalty-free,
+     non-exclusive license, subject to third party intellectual property
+     claims:
+
+          (a) to use, reproduce, modify, display, perform, sublicense and
+          distribute the Original Code (or portions thereof) with or without
+          Modifications, or as part of a Larger Work; and
+
+          (b) under patents now or hereafter owned or controlled by Initial
+          Developer, to make, have made, use and sell (``Utilize'') the
+          Original Code (or portions thereof), but solely to the extent that
+          any such patent is reasonably necessary to enable You to Utilize
+          the Original Code (or portions thereof) and not to any greater
+          extent that may be necessary to Utilize further Modifications or
+          combinations.
+
+     2.2. Contributor Grant.
+     Each Contributor hereby grants You a world-wide, royalty-free,
+     non-exclusive license, subject to third party intellectual property
+     claims:
+
+          (a) to use, reproduce, modify, display, perform, sublicense and
+          distribute the Modifications created by such Contributor (or
+          portions thereof) either on an unmodified basis, with other
+          Modifications, as Covered Code or as part of a Larger Work; and
+
+          (b) under patents now or hereafter owned or controlled by
+          Contributor, to Utilize the Contributor Version (or portions
+          thereof), but solely to the extent that any such patent is
+          reasonably necessary to enable You to Utilize the Contributor
+          Version (or portions thereof), and not to any greater extent that
+          may be necessary to Utilize further Modifications or combinations.
+
+3. Distribution Obligations.
+
+     3.1. Application of License.
+     The Modifications which You create or to which You contribute are
+     governed by the terms of this License, including without limitation
+     Section 2.2. The Source Code version of Covered Code may be distributed
+     only under the terms of this License or a future version of this
+     License released under Section 6.1, and You must include a copy of this
+     License with every copy of the Source Code You distribute. You may not
+     offer or impose any terms on any Source Code version that alters or
+     restricts the applicable version of this License or the recipients'
+     rights hereunder. However, You may include an additional document
+     offering the additional rights described in Section 3.5.
+
+     3.2. Availability of Source Code.
+     Any Modification which You create or to which You contribute must be
+     made available in Source Code form under the terms of this License
+     either on the same media as an Executable version or via an accepted
+     Electronic Distribution Mechanism to anyone to whom you made an
+     Executable version available; and if made available via Electronic
+     Distribution Mechanism, must remain available for at least twelve (12)
+     months after the date it initially became available, or at least six
+     (6) months after a subsequent version of that particular Modification
+     has been made available to such recipients. You are responsible for
+     ensuring that the Source Code version remains available even if the
+     Electronic Distribution Mechanism is maintained by a third party.
+
+     3.3. Description of Modifications.
+     You must cause all Covered Code to which you contribute to contain a
+     file documenting the changes You made to create that Covered Code and
+     the date of any change. You must include a prominent statement that the
+     Modification is derived, directly or indirectly, from Original Code
+     provided by the Initial Developer and including the name of the Initial
+     Developer in (a) the Source Code, and (b) in any notice in an
+     Executable version or related documentation in which You describe the
+     origin or ownership of the Covered Code.
+
+     3.4. Intellectual Property Matters
+
+          (a) Third Party Claims.
+          If You have knowledge that a party claims an intellectual property
+          right in particular functionality or code (or its utilization
+          under this License), you must include a text file with the source
+          code distribution titled ``LEGAL'' which describes the claim and
+          the party making the claim in sufficient detail that a recipient
+          will know whom to contact. If you obtain such knowledge after You
+          make Your Modification available as described in Section 3.2, You
+          shall promptly modify the LEGAL file in all copies You make
+          available thereafter and shall take other steps (such as notifying
+          appropriate mailing lists or newsgroups) reasonably calculated to
+          inform those who received the Covered Code that new knowledge has
+          been obtained.
+
+          (b) Contributor APIs.
+          If Your Modification is an application programming interface and
+          You own or control patents which are reasonably necessary to
+          implement that API, you must also include this information in the
+          LEGAL file.
+
+     3.5. Required Notices.
+     You must duplicate the notice in Exhibit A in each file of the Source
+     Code, and this License in any documentation for the Source Code, where
+     You describe recipients' rights relating to Covered Code. If You
+     created one or more Modification(s), You may add your name as a
+     Contributor to the notice described in Exhibit A. If it is not possible
+     to put such notice in a particular Source Code file due to its
+     structure, then you must include such notice in a location (such as a
+     relevant directory file) where a user would be likely to look for such
+     a notice. You may choose to offer, and to charge a fee for, warranty,
+     support, indemnity or liability obligations to one or more recipients
+     of Covered Code. However, You may do so only on Your own behalf, and
+     not on behalf of the Initial Developer or any Contributor. You must
+     make it absolutely clear than any such warranty, support, indemnity or
+     liability obligation is offered by You alone, and You hereby agree to
+     indemnify the Initial Developer and every Contributor for any liability
+     incurred by the Initial Developer or such Contributor as a result of
+     warranty, support, indemnity or liability terms You offer.
+
+     3.6. Distribution of Executable Versions.
+     You may distribute Covered Code in Executable form only if the
+     requirements of Section 3.1-3.5 have been met for that Covered Code,
+     and if You include a notice stating that the Source Code version of the
+     Covered Code is available under the terms of this License, including a
+     description of how and where You have fulfilled the obligations of
+     Section 3.2. The notice must be conspicuously included in any notice in
+     an Executable version, related documentation or collateral in which You
+     describe recipients' rights relating to the Covered Code. You may
+     distribute the Executable version of Covered Code under a license of
+     Your choice, which may contain terms different from this License,
+     provided that You are in compliance with the terms of this License and
+     that the license for the Executable version does not attempt to limit
+     or alter the recipient's rights in the Source Code version from the
+     rights set forth in this License. If You distribute the Executable
+     version under a different license You must make it absolutely clear
+     that any terms which differ from this License are offered by You alone,
+     not by the Initial Developer or any Contributor. You hereby agree to
+     indemnify the Initial Developer and every Contributor for any liability
+     incurred by the Initial Developer or such Contributor as a result of
+     any such terms You offer.
+
+     3.7. Larger Works.
+     You may create a Larger Work by combining Covered Code with other code
+     not governed by the terms of this License and distribute the Larger
+     Work as a single product. In such a case, You must make sure the
+     requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+     If it is impossible for You to comply with any of the terms of this
+     License with respect to some or all of the Covered Code due to statute
+     or regulation then You must: (a) comply with the terms of this License
+     to the maximum extent possible; and (b) describe the limitations and
+     the code they affect. Such description must be included in the LEGAL
+     file described in Section 3.4 and must be included with all
+     distributions of the Source Code. Except to the extent prohibited by
+     statute or regulation, such description must be sufficiently detailed
+     for a recipient of ordinary skill to be able to understand it.
+
+5. Application of this License.
+
+     This License applies to code to which the Initial Developer has
+     attached the notice in Exhibit A, and to related Covered Code.
+
+6. Versions of the License.
+
+     6.1. New Versions.
+     Netscape Communications Corporation (``Netscape'') may publish revised
+     and/or new versions of the License from time to time. Each version will
+     be given a distinguishing version number.
+
+     6.2. Effect of New Versions.
+     Once Covered Code has been published under a particular version of the
+     License, You may always continue to use it under the terms of that
+     version. You may also choose to use such Covered Code under the terms
+     of any subsequent version of the License published by Netscape. No one
+     other than Netscape has the right to modify the terms applicable to
+     Covered Code created under this License.
+
+     6.3. Derivative Works.
+     If you create or use a modified version of this License (which you may
+     only do in order to apply it to code which is not already Covered Code
+     governed by this License), you must (a) rename Your license so that the
+     phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or
+     any confusingly similar phrase do not appear anywhere in your license
+     and (b) otherwise make it clear that your version of the license
+     contains terms which differ from the Mozilla Public License and
+     Netscape Public License. (Filling in the name of the Initial Developer,
+     Original Code or Contributor in the notice described in Exhibit A shall
+     not of themselves be deemed to be modifications of this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+     COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS,
+     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+     WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+     DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+     THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+     IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+     YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+     COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+     OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+     ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+     This License and the rights granted hereunder will terminate
+     automatically if You fail to comply with terms herein and fail to cure
+     such breach within 30 days of becoming aware of the breach. All
+     sublicenses to the Covered Code which are properly granted shall
+     survive any termination of this License. Provisions which, by their
+     nature, must remain in effect beyond the termination of this License
+     shall survive.
+
+9. LIMITATION OF LIABILITY.
+
+     UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+     (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL
+     DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+     OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER
+     PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+     OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF
+     GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND
+     ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE
+     BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+     LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+     RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+     PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+     EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT
+     EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+     The Covered Code is a ``commercial item,'' as that term is defined in
+     48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer
+     software'' and ``commercial computer software documentation,'' as such
+     terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+     C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+     all U.S. Government End Users acquire Covered Code with only those
+     rights set forth herein.
+
+11. MISCELLANEOUS.
+
+     This License represents the complete agreement concerning subject
+     matter hereof. If any provision of this License is held to be
+     unenforceable, such provision shall be reformed only to the extent
+     necessary to make it enforceable. This License shall be governed by
+     California law provisions (except to the extent applicable law, if any,
+     provides otherwise), excluding its conflict-of-law provisions. With
+     respect to disputes in which at least one party is a citizen of, or an
+     entity chartered or registered to do business in, the United States of
+     America: (a) unless otherwise agreed in writing, all disputes relating
+     to this License (excepting any dispute relating to intellectual
+     property rights) shall be subject to final and binding arbitration,
+     with the losing party paying all costs of arbitration; (b) any
+     arbitration relating to this Agreement shall be held in Santa Clara
+     County, California, under the auspices of JAMS/EndDispute; and (c) any
+     litigation relating to this Agreement shall be subject to the
+     jurisdiction of the Federal Courts of the Northern District of
+     California, with venue lying in Santa Clara County, California, with
+     the losing party responsible for costs, including without limitation,
+     court costs and reasonable attorneys fees and expenses. The application
+     of the United Nations Convention on Contracts for the International
+     Sale of Goods is expressly excluded. Any law or regulation which
+     provides that the language of a contract shall be construed against the
+     drafter shall not apply to this License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+     Except in cases where another Contributor has failed to comply with
+     Section 3.4, You are responsible for damages arising, directly or
+     indirectly, out of Your utilization of rights under this License, based
+     on the number of copies of Covered Code you made available, the
+     revenues you received from utilizing such rights, and other relevant
+     factors. You agree to work with affected parties to distribute
+     responsibility on an equitable basis.
+
+EXHIBIT A.
+
+     ``The contents of this file are subject to the Mozilla Public License
+     Version 1.0 (the "License"); you may not use this file except in
+     compliance with the License. You may obtain a copy of the License at
+     http://www.mozilla.org/MPL/
+
+     Software distributed under the License is distributed on an "AS IS"
+     basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+     License for the specific language governing rights and limitations
+     under the License.
+
+     The Original Code is ______________________________________.
+
+     The Initial Developer of the Original Code is ________________________.
+     Portions created by ______________________ are Copyright (C) ______
+     _______________________. All Rights Reserved.
+
+     Contributor(s): ______________________________________.''
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..0eaf996
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,426 @@
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+#
+# $Id$
+#
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = .
+prefix = /usr/local
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/curl
+pkglibdir = $(libdir)/curl
+pkgincludedir = $(includedir)/curl
+
+top_builddir = .
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = ./install-sh -c
+INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = sparc-sun-solaris2.6
+host_triplet = sparc-sun-solaris2.6
+CC = gcc
+MAKEINFO = makeinfo
+NROFF = /bin/nroff
+PACKAGE = curl
+PERL = /usr/local/bin/perl
+RANLIB = ranlib
+VERSION = 6.3.1
+YACC = bison -y
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
+
+man_MANS = curl.1
+
+EXTRA_DIST = $(man_MANS)
+
+SUBDIRS = lib src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h ./src/config.h
+CONFIG_CLEAN_FILES = 
+man1dir = $(mandir)/man1
+MANS = $(man_MANS)
+DIST_COMMON =  README ./stamp-h1.in INSTALL Makefile.am Makefile.in TODO \
+acconfig.h aclocal.m4 config.guess config.h.in config.sub configure \
+configure.in install-sh missing mkinstalldirs src/config.h.in \
+src/stamp-h2.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(ACLOCAL_M4):  configure.in 
+       cd $(srcdir) && $(ACLOCAL)
+
+config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+       cd $(srcdir) && $(AUTOCONF)
+
+config.h: stamp-h1
+       @if test ! -f $@; then \
+               rm -f stamp-h1; \
+               $(MAKE) stamp-h1; \
+       else :; fi
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES= CONFIG_HEADERS=config.h \
+            $(SHELL) ./config.status
+       @echo timestamp > stamp-h1 2> /dev/null
+$(srcdir)/config.h.in: $(srcdir)/stamp-h1.in
+       @if test ! -f $@; then \
+               rm -f $(srcdir)/stamp-h1.in; \
+               $(MAKE) $(srcdir)/stamp-h1.in; \
+       else :; fi
+$(srcdir)/stamp-h1.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
+       cd $(top_srcdir) && $(AUTOHEADER)
+       @echo timestamp > $(srcdir)/stamp-h1.in 2> /dev/null
+
+src/config.h: src/stamp-h2
+       @if test ! -f $@; then \
+               rm -f src/stamp-h2; \
+               $(MAKE) src/stamp-h2; \
+       else :; fi
+src/stamp-h2: $(srcdir)/src/config.h.in $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES= CONFIG_HEADERS=src/config.h \
+            $(SHELL) ./config.status
+       @echo timestamp > src/stamp-h2 2> /dev/null
+$(srcdir)/src/config.h.in: $(srcdir)/src/stamp-h2.in
+       @if test ! -f $@; then \
+               rm -f $(srcdir)/src/stamp-h2.in; \
+               $(MAKE) $(srcdir)/src/stamp-h2.in; \
+       else :; fi
+$(srcdir)/src/stamp-h2.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
+       cd $(top_srcdir) && $(AUTOHEADER)
+       @echo timestamp > $(srcdir)/src/stamp-h2.in 2> /dev/null
+
+mostlyclean-hdr:
+
+clean-hdr:
+
+distclean-hdr:
+       -rm -f config.h src/config.h
+
+maintainer-clean-hdr:
+
+install-man1:
+       $(mkinstalldirs) $(DESTDIR)$(man1dir)
+       @list='$(man1_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
+         $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
+       done
+
+uninstall-man1:
+       @list='$(man1_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
+         rm -f $(DESTDIR)$(man1dir)/$$inst; \
+       done
+install-man: $(MANS)
+       @$(NORMAL_INSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) install-man1
+uninstall-man:
+       @$(NORMAL_UNINSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) uninstall-man1
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+         rev="$$subdir $$rev"; \
+         test "$$subdir" = "." && dot_seen=yes; \
+       done; \
+       test "$$dot_seen" = "no" && rev=". $$rev"; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+           test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       -rm -rf $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+       mkdir $(distdir)/=build
+       mkdir $(distdir)/=inst
+       dc_install_base=`cd $(distdir)/=inst && pwd`; \
+       cd $(distdir)/=build \
+         && ../configure --srcdir=.. --prefix=$$dc_install_base \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) dist
+       -rm -rf $(distdir)
+       @banner="$(distdir).tar.gz is ready for distribution"; \
+       dashes=`echo "$$banner" | sed s/./=/g`; \
+       echo "$$dashes"; \
+       echo "$$banner"; \
+       echo "$$dashes"
+dist: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+dist-all: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+distdir: $(DISTFILES)
+       -rm -rf $(distdir)
+       mkdir $(distdir)
+       -chmod 777 $(distdir)
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+       for subdir in $(SUBDIRS); do \
+         if test "$$subdir" = .; then :; else \
+           test -d $(distdir)/$$subdir \
+           || mkdir $(distdir)/$$subdir \
+           || exit 1; \
+           chmod 777 $(distdir)/$$subdir; \
+           (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
+             || exit 1; \
+         fi; \
+       done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+all-recursive-am: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am: install-man
+install-data: install-data-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am: uninstall-man
+uninstall: uninstall-recursive
+all-am: Makefile $(MANS) config.h
+all-redirect: all-recursive-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+       $(mkinstalldirs)  $(DESTDIR)$(mandir)/man1
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-hdr mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-hdr clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-hdr distclean-tags distclean-generic clean-am
+
+distclean: distclean-recursive
+       -rm -f config.status
+
+maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-tags \
+               maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f config.status
+
+.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+install-man1 uninstall-man1 install-man uninstall-man \
+install-data-recursive uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..b5b81a5
--- /dev/null
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
+
+man_MANS = curl.1
+
+EXTRA_DIST = $(man_MANS)
+
+SUBDIRS = lib src
+
+
diff --git a/Makefile.dist b/Makefile.dist
new file mode 100644 (file)
index 0000000..843091d
--- /dev/null
@@ -0,0 +1,78 @@
+############################################################################
+#                                  _   _ ____  _     
+#  Project                     ___| | | |  _ \| |    
+#                             / __| | | | |_) | |    
+#                            | (__| |_| |  _ <| |___ 
+#                             \___|\___/|_| \_\_____|
+#
+#  The contents of this file are subject to the Mozilla Public License
+#  Version 1.0 (the "License"); you may not use this file except in
+#  compliance with the License. You may obtain a copy of the License at
+#  http://www.mozilla.org/MPL/
+#
+#  Software distributed under the License is distributed on an "AS IS"
+#  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+#  License for the specific language governing rights and limitations
+#  under the License.
+#
+#  The Original Code is Curl.
+#
+#  The Initial Developer of the Original Code is Daniel Stenberg.
+#
+#  Portions created by the Initial Developer are Copyright (C) 1999.
+#  All Rights Reserved.
+#
+# ------------------------------------------------------------
+# Main author:
+# - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+#
+#      http://curl.haxx.nu
+#
+# $Source$
+# $Revision$
+# $Date$
+# $Author$
+# $State$
+# $Locker$
+#
+# ------------------------------------------------------------
+#
+# In a normal unix-setup, this file will become overwritten.
+#
+############################################################################
+
+all:
+       ./configure
+       make
+
+ssl:
+       ./configure --with-ssl
+       make
+
+mingw32:
+       cd lib; make -f Makefile.m32
+       cd src; make -f Makefile.m32
+
+mingw32-ssl:
+       cd lib; make -f Makefile.m32 SSL=1
+       cd src; make -f Makefile.m32 SSL=1
+
+vc:
+       cd lib; nmake -f Makefile.vc6
+       cd src; nmake -f Makefile.vc6
+
+cygwin:
+       ./configure
+       make
+
+cygwin-ssl:
+       ./configure --with-ssl
+       make
+
+unix: all
+
+unix-ssl: ssl
+
+linux: all
+
+linux-ssl: ssl
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..18fa701
--- /dev/null
@@ -0,0 +1,426 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+#
+# $Id$
+#
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = .
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+NROFF = @NROFF@
+PACKAGE = @PACKAGE@
+PERL = @PERL@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+YACC = @YACC@
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
+
+man_MANS = curl.1
+
+EXTRA_DIST = $(man_MANS)
+
+SUBDIRS = lib src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h ./src/config.h
+CONFIG_CLEAN_FILES = 
+man1dir = $(mandir)/man1
+MANS = $(man_MANS)
+DIST_COMMON =  README ./stamp-h1.in INSTALL Makefile.am Makefile.in TODO \
+acconfig.h aclocal.m4 config.guess config.h.in config.sub configure \
+configure.in install-sh missing mkinstalldirs src/config.h.in \
+src/stamp-h2.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(ACLOCAL_M4):  configure.in 
+       cd $(srcdir) && $(ACLOCAL)
+
+config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+       cd $(srcdir) && $(AUTOCONF)
+
+config.h: stamp-h1
+       @if test ! -f $@; then \
+               rm -f stamp-h1; \
+               $(MAKE) stamp-h1; \
+       else :; fi
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES= CONFIG_HEADERS=config.h \
+            $(SHELL) ./config.status
+       @echo timestamp > stamp-h1 2> /dev/null
+$(srcdir)/config.h.in: $(srcdir)/stamp-h1.in
+       @if test ! -f $@; then \
+               rm -f $(srcdir)/stamp-h1.in; \
+               $(MAKE) $(srcdir)/stamp-h1.in; \
+       else :; fi
+$(srcdir)/stamp-h1.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
+       cd $(top_srcdir) && $(AUTOHEADER)
+       @echo timestamp > $(srcdir)/stamp-h1.in 2> /dev/null
+
+src/config.h: src/stamp-h2
+       @if test ! -f $@; then \
+               rm -f src/stamp-h2; \
+               $(MAKE) src/stamp-h2; \
+       else :; fi
+src/stamp-h2: $(srcdir)/src/config.h.in $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES= CONFIG_HEADERS=src/config.h \
+            $(SHELL) ./config.status
+       @echo timestamp > src/stamp-h2 2> /dev/null
+$(srcdir)/src/config.h.in: $(srcdir)/src/stamp-h2.in
+       @if test ! -f $@; then \
+               rm -f $(srcdir)/src/stamp-h2.in; \
+               $(MAKE) $(srcdir)/src/stamp-h2.in; \
+       else :; fi
+$(srcdir)/src/stamp-h2.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
+       cd $(top_srcdir) && $(AUTOHEADER)
+       @echo timestamp > $(srcdir)/src/stamp-h2.in 2> /dev/null
+
+mostlyclean-hdr:
+
+clean-hdr:
+
+distclean-hdr:
+       -rm -f config.h src/config.h
+
+maintainer-clean-hdr:
+
+install-man1:
+       $(mkinstalldirs) $(DESTDIR)$(man1dir)
+       @list='$(man1_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
+         $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
+       done
+
+uninstall-man1:
+       @list='$(man1_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
+         rm -f $(DESTDIR)$(man1dir)/$$inst; \
+       done
+install-man: $(MANS)
+       @$(NORMAL_INSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) install-man1
+uninstall-man:
+       @$(NORMAL_UNINSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) uninstall-man1
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+         rev="$$subdir $$rev"; \
+         test "$$subdir" = "." && dot_seen=yes; \
+       done; \
+       test "$$dot_seen" = "no" && rev=". $$rev"; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+           test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       -rm -rf $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+       mkdir $(distdir)/=build
+       mkdir $(distdir)/=inst
+       dc_install_base=`cd $(distdir)/=inst && pwd`; \
+       cd $(distdir)/=build \
+         && ../configure --srcdir=.. --prefix=$$dc_install_base \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) dist
+       -rm -rf $(distdir)
+       @banner="$(distdir).tar.gz is ready for distribution"; \
+       dashes=`echo "$$banner" | sed s/./=/g`; \
+       echo "$$dashes"; \
+       echo "$$banner"; \
+       echo "$$dashes"
+dist: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+dist-all: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+distdir: $(DISTFILES)
+       -rm -rf $(distdir)
+       mkdir $(distdir)
+       -chmod 777 $(distdir)
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+       for subdir in $(SUBDIRS); do \
+         if test "$$subdir" = .; then :; else \
+           test -d $(distdir)/$$subdir \
+           || mkdir $(distdir)/$$subdir \
+           || exit 1; \
+           chmod 777 $(distdir)/$$subdir; \
+           (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
+             || exit 1; \
+         fi; \
+       done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+all-recursive-am: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am: install-man
+install-data: install-data-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am: uninstall-man
+uninstall: uninstall-recursive
+all-am: Makefile $(MANS) config.h
+all-redirect: all-recursive-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+       $(mkinstalldirs)  $(DESTDIR)$(mandir)/man1
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-hdr mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-hdr clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-hdr distclean-tags distclean-generic clean-am
+
+distclean: distclean-recursive
+       -rm -f config.status
+
+maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-tags \
+               maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f config.status
+
+.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+install-man1 uninstall-man1 install-man uninstall-man \
+install-data-recursive uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..e7754b5
--- /dev/null
+++ b/README
@@ -0,0 +1,28 @@
+                                  _   _ ____  _     
+                              ___| | | |  _ \| |    
+                             / __| | | | |_) | |    
+                            | (__| |_| |  _ <| |___ 
+                             \___|\___/|_| \_\_____|
+
+README
+
+  Curl is a command line tool for transfering data specified with URL
+  syntax. Find out how to use Curl by reading the curl.1 man page or the
+  README.curl document. Find out how to install Curl by reading the INSTALL
+  document.
+
+  libcurl is a link-library that Curl is using to to its job. It is readily
+  available to be used by your software. Read the README.libcurl document to
+  find out how!
+
+  You find answers to the most frequent questions we get in the FAQ document.
+
+  Always try the Curl web site for the latest news:
+
+        http://curl.haxx.nu
+
+  The official download mirror sites are:
+
+        Sweden --  ftp://ftp.sunet.se/pub/www/utilities/curl/
+        Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
+        China --   http://www.pshowing.com/curl/
diff --git a/README.curl b/README.curl
new file mode 100644 (file)
index 0000000..00f685e
--- /dev/null
@@ -0,0 +1,611 @@
+LATEST VERSION
+
+  You always find news about what's going on as well as the latest versions
+  from the curl web pages, located at:
+
+        http://curl.haxx.nu
+
+SIMPLE USAGE
+
+  Get the main page from netscape's web-server:
+
+        curl http://www.netscape.com/
+
+  Get the root README file from funet's ftp-server:
+
+        curl ftp://ftp.funet.fi/README
+
+  Get a gopher document from funet's gopher server:
+
+        curl gopher://gopher.funet.fi
+
+  Get a web page from a server using port 8000:
+
+        curl http://www.weirdserver.com:8000/
+
+  Get a list of the root directory of an FTP site:
+
+        curl ftp://ftp.fts.frontec.se/
+
+  Get the definition of curl from a dictionary:
+
+        curl dict://dict.org/m:curl
+
+DOWNLOAD TO A FILE
+
+  Get a web page and store in a local file:
+
+        curl -o thatpage.html http://www.netscape.com/
+
+  Get a web page and store in a local file, make the local file get the name
+  of the remote document (if no file name part is specified in the URL, this
+  will fail):
+
+        curl -O http://www.netscape.com/index.html
+
+USING PASSWORDS
+
+ FTP
+
+   To ftp files using name+passwd, include them in the URL like:
+
+        curl ftp://name:passwd@machine.domain:port/full/path/to/file
+
+   or specify them with the -u flag like
+
+        curl -u name:passwd ftp://machine.domain:port/full/path/to/file
+
+ HTTP
+
+   The HTTP URL doesn't support user and password in the URL string. Curl
+   does support that anyway to provide a ftp-style interface and thus you can
+   pick a file like:
+
+        curl http://name:passwd@machine.domain/full/path/to/file
+
+   or specify user and password separately like in
+
+        curl -u name:passwd http://machine.domain/full/path/to/file
+
+   NOTE! Since HTTP URLs don't support user and password, you can't use that
+   style when using Curl via a proxy. You _must_ use the -u style fetch
+   during such circumstances.
+
+ HTTPS
+
+   Probably most commonly used with private certificates, as explained below.
+
+ GOPHER
+
+   Curl features no password support for gopher.
+
+PROXY
+
+ Get an ftp file using a proxy named my-proxy that uses port 888:
+
+        curl -x my-proxy:888 ftp://ftp.leachsite.com/README
+
+ Get a file from a HTTP server that requires user and password, using the
+ same proxy as above:
+
+        curl -u user:passwd -x my-proxy:888 http://www.get.this/
+
+ Some proxies require special authentication. Specify by using -U as above:
+
+        curl -U user:passwd -x my-proxy:888 http://www.get.this/
+
+ See also the environment variables Curl support that offer further proxy
+ control.
+
+RANGES
+
+  With HTTP 1.1 byte-ranges were introduced. Using this, a client can request
+  to get only one or more subparts of a specified document. Curl supports
+  this with the -r flag.
+
+  Get the first 100 bytes of a document:
+
+        curl -r 0-99 http://www.get.this/
+
+  Get the last 500 bytes of a document:
+
+        curl -r -500 http://www.get.this/
+
+  Curl also supports simple ranges for FTP files as well. Then you can only
+  specify start and stop position.
+
+  Get the first 100 bytes of a document using FTP:
+
+        curl -r 0-99 ftp://www.get.this/README  
+
+UPLOADING
+
+ FTP
+
+   Upload all data on stdin to a specified ftp site:
+
+        curl -t ftp://ftp.upload.com/myfile
+
+   Upload data from a specified file, login with user and password:
+
+        curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile
+
+   Upload a local file to the remote site, and use the local file name remote
+   too:
+        curl -T uploadfile -u user:passwd ftp://ftp.upload.com/
+
+   NOTE: Curl is not currently supporing ftp upload through a proxy! The reason
+   for this is simply that proxies are seldomly configured to allow this and
+   that no author has supplied code that makes it possible!
+
+ HTTP
+
+   Upload all data on stdin to a specified http site:
+
+        curl -t http://www.upload.com/myfile
+
+   Note that the http server must've been configured to accept PUT before this
+   can be done successfully.
+
+   For other ways to do http data upload, see the POST section below.
+
+VERBOSE / DEBUG
+
+  If curl fails where it isn't supposed to, if the servers don't let you
+  in, if you can't understand the responses: use the -v flag to get VERBOSE
+  fetching. Curl will output lots of info and all data it sends and
+  receives in order to let the user see all client-server interaction.
+
+        curl -v ftp://ftp.upload.com/
+
+DETAILED INFORMATION
+
+  Different protocols provide different ways of getting detailed information
+  about specific files/documents. To get curl to show detailed information
+  about a single file, you should use -I/--head option. It displays all
+  available info on a single file for HTTP and FTP. The HTTP information is a
+  lot more extensive.
+
+  For HTTP, you can get the header information (the same as -I would show)
+  shown before the data by using -i/--include. Curl understands the
+  -D/--dump-header option when getting files from both FTP and HTTP, and it
+  will then store the headers in the specified file.
+
+  Store the HTTP headers in a separate file:
+
+        curl --dump-header headers.txt curl.haxx.nu
+
+  Note that headers stored in a separate file can be very useful at a later
+  time if you want curl to use cookies sent by the server. More about that in
+  the cookies section.
+
+POST (HTTP)
+
+  It's easy to post data using curl. This is done using the -d <data>
+  option.  The post data must be urlencoded.
+
+  Post a simple "name" and "phone" guestbook.
+
+        curl -d "name=Rafael%20Sagula&phone=3320780" \
+                http://www.where.com/guest.cgi
+
+  While -d uses the application/x-www-form-urlencoded mime-type, generally
+  understood by CGI's and similar, curl also supports the more capable
+  multipart/form-data type. This latter type supports things like file upload.
+
+  -F accepts parameters like -F "name=contents". If you want the contents to
+  be read from a file, use <@filename> as contents. When specifying a file,
+  you can also specify which content type the file is, by appending
+  ';type=<mime type>' to the file name. You can also post contents of several
+  files in one field. So that the field name 'coolfiles' can be sent three
+  files with different content types in a manner similar to:
+
+        curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" \
+        http://www.post.com/postit.cgi
+
+  If content-type is not specified, curl will try to guess from the extension
+  (it only knows a few), or use the previously specified type (from an earlier
+  file if several files are specified in a list) or finally using the default
+  type 'text/plain'.
+
+  Emulate a fill-in form with -F. Let's say you fill in three fields in a
+  form. One field is a file name which to post, one field is your name and one
+  field is a file description. We want to post the file we have written named
+  "cooltext.txt". To let curl do the posting of this data instead of your
+  favourite browser, you have to check out the HTML of the form page to get to
+  know the names of the input fields. In our example, the input field names are
+  'file', 'yourname' and 'filedescription'.
+
+        curl -F "file=@cooltext.txt" -F "yourname=Daniel" \
+             -F "filedescription=Cool text file with cool text inside" \
+             http://www.post.com/postit.cgi
+
+  So, to send two files in one post you can do it in two ways:
+
+  1. Send multiple files in a single "field" with a single field name:
+        curl -F "pictures=@dog.gif,cat.gif" 
+  2. Send two fields with two field names: 
+
+        curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif" 
+
+REFERER
+
+  A HTTP request has the option to include information about which address
+  that referred to actual page, and curl allows the user to specify that
+  referrer to get specified on the command line. It is especially useful to
+  fool or trick stupid servers or CGI scripts that rely on that information
+  being available or contain certain data.
+
+        curl -e www.coolsite.com http://www.showme.com/
+
+USER AGENT
+
+  A HTTP request has the option to include information about the browser
+  that generated the request. Curl allows it to be specified on the command
+  line. It is especially useful to fool or trick stupid servers or CGI
+  scripts that only accept certain browsers.
+
+  Example:
+
+  curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/
+
+  Other common strings:
+    'Mozilla/3.0 (Win95; I)'     Netscape Version 3 for Windows 95
+    'Mozilla/3.04 (Win95; U)'    Netscape Version 3 for Windows 95
+    'Mozilla/2.02 (OS/2; U)'     Netscape Version 2 for OS/2
+    'Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)'           NS for AIX
+    'Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)'      NS for Linux
+
+  Note that Internet Explorer tries hard to be compatible in every way:
+    'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)'    MSIE for W95
+
+  Mozilla is not the only possible User-Agent name:
+    'Konqueror/1.0'             KDE File Manager desktop client
+    'Lynx/2.7.1 libwww-FM/2.14' Lynx command line browser
+
+COOKIES
+
+  Cookies are generally used by web servers to keep state information at the
+  client's side. The server sets cookies by sending a response line in the
+  headers that looks like 'Set-Cookie: <data>' where the data part then
+  typically contains a set of NAME=VALUE pairs (separated by semicolons ';'
+  like "NAME1=VALUE1; NAME2=VALUE2;"). The server can also specify for what
+  path the "cookie" should be used for (by specifying "path=value"), when the
+  cookie should expire ("expire=DATE"), for what domain to use it
+  ("domain=NAME") and if it should be used on secure connections only
+  ("secure").
+
+  If you've received a page from a server that contains a header like:
+        Set-Cookie: sessionid=boo123; path="/foo";
+
+  it means the server wants that first pair passed on when we get anything in
+  a path beginning with "/foo".
+
+  Example, get a page that wants my name passed in a cookie:
+
+        curl -b "name=Daniel" www.sillypage.com
+
+  Curl also has the ability to use previously received cookies in following
+  sessions. If you get cookies from a server and store them in a file in a
+  manner similar to:
+
+        curl --dump-header headers www.example.com
+
+  ... you can then in a second connect to that (or another) site, use the
+  cookies from the 'headers' file like:
+
+        curl -b headers www.example.com
+
+  Note that by specifying -b you enable the "cookie awareness" and with -L
+  you can make curl follow a location: (which often is used in combination
+  with cookies). So that if a site sends cookies and a location, you can
+  use a non-existing file to trig the cookie awareness like:
+
+        curl -L -b empty-file www.example.com
+
+  The file to read cookies from must be formatted using plain HTTP headers OR
+  as netscape's cookie file. Curl will determine what kind it is based on the
+  file contents.
+
+PROGRESS METER
+
+  The progress meter was introduced to better show a user that something
+  actually is happening. The different fields in the output have the following
+  meaning:
+
+   %   Received   Total  Speed   Time left  Total   Curr.Speed
+  13   524140   3841536   4296   0:12:52   0:14:54    292     
+
+  From left-to-right:
+  - The first column, is the percentage of the file currently transfered.
+  - Received means the total number of bytes that has been transfered.
+  - Total is the total number of bytes expected to transfer.
+  - Speed is average speed in bytes per second for the whole transfer so far.
+  - Time left is the estimated time left for this transfer to finnish if the
+    current average speed will remain steady.
+  - Total is the estimated total transfer time.
+  - Curr.Speed is the average transfer speed the last 5 seconds (the first
+    5 seconds of a transfer is based on less time of course.)
+
+  NOTE: Much of the output is based on the fact that the size of the transfer
+  is known before it takes place. If it isn't, a much less fancy display will
+  be used.
+
+SPEED LIMIT
+
+  Curl offers the user to set conditions regarding transfer speed that must
+  be met to let the transfer keep going. By using the switch -y and -Y you
+  can make curl abort transfers if the transfer speed doesn't exceed your
+  given lowest limit for a specified time.
+
+  To let curl abandon downloading this page if its slower than 3000 bytes per
+  second for 1 minute, run:
+
+        curl -y 3000 -Y 60 www.far-away-site.com
+
+  This can very well be used in combination with the overall time limit, so
+  that the above operatioin must be completed in whole within 30 minutes:
+
+        curl -m 1800 -y 3000 -Y 60 www.far-away-site.com
+
+CONFIG FILE
+
+  Curl automatically tries to read the .curlrc file (or _curlrc file on win32
+  systems) from the user's home dir on startup. The config file should be
+  made up with normal command line switches. Comments can be used within the
+  file. If the first letter on a line is a '#'-letter the rest of the line
+  is treated as a comment.
+
+  Example, set default time out and proxy in a config file:
+
+        # We want a 30 minute timeout:
+        -m 1800
+        # ... and we use a proxy for all accesses:
+        -x proxy.our.domain.com:8080
+
+  White spaces ARE significant at the end of lines, but all white spaces
+  leading up to the first characters of each line are ignored.
+
+  Prevent curl from reading the default file by using -q as the first command
+  line parameter, like:
+
+        curl -q www.thatsite.com
+
+  Force curl to get and display a local help page in case it is invoked
+  without URL by making a config file similar to:
+
+        # default url to get
+        http://help.with.curl.com/curlhelp.html
+
+  You can specify another config file to be read by using the -K/--config
+  flag. If you set config file name to "-" it'll read the config from stdin,
+  which can be handy if you want to hide options from being visible in process
+  tables etc:
+
+        echo "-u user:passwd" | curl -K - http://that.secret.site.com
+
+EXTRA HEADERS
+
+  When using curl in your own very special programs, you may end up needing
+  to pass on your own custom headers when getting a web page. You can do
+  this by using the -H flag.
+
+  Example, send the header "X-you-and-me: yes" to the server when getting a
+  page:
+
+        curl -H "X-you-and-me: yes" www.love.com
+
+  This can also be useful in case you want curl to send a different text in
+  a header than it normally does. The -H header you specify then replaces the
+  header curl would normally send.
+
+FTP and PATH NAMES
+
+  Do note that when getting files with the ftp:// URL, the given path is
+  relative the directory you enter. To get the file 'README' from your home
+  directory at your ftp site, do:
+
+        curl ftp://user:passwd@my.site.com/README
+
+  But if you want the README file from the root directory of that very same
+  site, you need to specify the absolute file name:
+
+        curl ftp://user:passwd@my.site.com//README
+
+  (I.e with an extra slash in front of the file name.)
+
+FTP and firewalls
+
+  The FTP protocol requires one of the involved parties to open a second
+  connction as soon as data is about to get transfered. There are two ways to
+  do this.
+
+  The default way for curl is to issue the PASV command which causes the
+  server to open another port and await another connection performed by the
+  client. This is good if the client is behind a firewall that don't allow
+  incoming connections.
+
+        curl ftp.download.com
+
+  If the server for example, is behind a firewall that don't allow connections
+  on other ports than 21 (or if it just doesn't support the PASV command), the
+  other way to do it is to use the PORT command and instruct the server to
+  connect to the client on the given (as parameters to the PORT command) IP
+  number and port.
+
+  The -P flag to curl allows for different options. Your machine may have
+  several IP-addresses and/or network interfaces and curl allows you to select
+  which of them to use. Default address can also be used:
+
+        curl -P - ftp.download.com
+
+  Download with PORT but use the IP address of our 'le0' interface:
+
+        curl -P le0 ftp.download.com
+
+  Download with PORT but use 192.168.0.10 as our IP address to use:
+
+        curl -P 192.168.0.10 ftp.download.com
+
+HTTPS
+
+  Secure HTTP requires SSLeay to be installed and used when curl is built. If
+  that is done, curl is capable of retrieving and posting documents using the
+  HTTPS procotol.
+
+  Example:
+
+        curl https://www.secure-site.com
+
+  Curl is also capable of using your personal certificates to get/post files
+  from sites that require valid certificates. The only drawback is that the
+  certificate needs to be in PEM-format. PEM is a standard and open format to
+  store certificates with, but it is not used by the most commonly used
+  browsers (Netscape and MSEI both use the so called PKCS#12 format). If you
+  want curl to use the certificates you use with your (favourite) browser, you
+  may need to download/compile a converter that can convert your browser's
+  formatted certificates to PEM formatted ones. Dr Stephen N. Henson has
+  written a patch for SSLeay that adds this functionality. You can get his
+  patch (that requires an SSLeay installation) from his site at:
+  http://www.drh-consultancy.demon.co.uk/
+
+  Example on how to automatically retrieve a document using a certificate with
+  a personal password:
+
+        curl -E /path/to/cert.pem:password https://secure.site.com/
+
+  If you neglect to specify the password on the command line, you will be
+  prompted for the correct password before any data can be received.
+
+  Many older SSL-servers have problems with SSLv3 or TLS, that newer versions
+  of OpenSSL etc is using, therefore it is sometimes useful to specify what
+  SSL-version curl should use. Use -3 or -2 to specify that exact SSL version
+  to use:
+
+        curl -2 https://secure.site.com/
+
+  Otherwise, curl will first attempt to use v3 and then v2.
+
+RESUMING FILE TRANSFERS
+
+ To continue a file transfer where it was previously aborted, curl supports
+ resume on http(s) downloads as well as ftp uploads and downloads.
+
+ Continue downloading a document:
+
+        curl -c -o file ftp://ftp.server.com/path/file
+
+ Continue uploading a document(*1):
+
+        curl -c -T file ftp://ftp.server.com/path/file
+
+ Continue downloading a document from a web server(*2):
+
+        curl -c -o file http://www.server.com/
+
+ (*1) = This requires that the ftp server supports the non-standard command
+        SIZE. If it doesn't, curl will say so.
+
+ (*2) = This requires that the wb server supports at least HTTP/1.1. If it
+        doesn't, curl will say so.
+
+TIME CONDITIONS
+
+ HTTP allows a client to specify a time condition for the document it
+ requests. It is If-Modified-Since or If-Unmodified-Since. Curl allow you to
+ specify them with the -z/--time-cond flag.
+
+ For example, you can easily make a download that only gets performed if the
+ remote file is newer than a local copy. It would be made like:
+
+        curl -z local.html http://remote.server.com/remote.html
+
+ Or you can download a file only if the local file is newer than the remote
+ one. Do this by prepending the date string with a '-', as in:
+
+        curl -z -local.html http://remote.server.com/remote.html
+
+ You can specify a "free text" date as condition. Tell curl to only download
+ the file if it was updated since yesterday:
+
+        curl -z yesterday http://remote.server.com/remote.html
+
+ Curl will then accept a wide range of date formats. You always make the date
+ check the other way around by prepending it with a dash '-'.
+
+DICT
+
+  For fun try
+
+        curl dict://dict.org/m:curl
+        curl dict://dict.org/d:heisenbug:jargon
+        curl dict://dict.org/d:daniel:web1913
+
+  Aliases for 'm' are 'match' and 'find', and aliases for 'd' are 'define'
+  and 'lookup'. For example,
+
+        curl dict://dict.org/find:curl
+
+  Commands that break the URL description of the RFC (but not the DICT
+  protocol) are
+
+        curl dict://dict.org/show:db
+        curl dict://dict.org/show:strat
+
+  Authentication is still missing (but this is not required by the RFC)
+
+LDAP
+
+  If you have installed the OpenLDAP library, curl can take advantage of it
+  and offer ldap:// support.
+
+  LDAP is a complex thing and writing an LDAP query is not an easy task. I do
+  advice you to dig up the syntax description for that elsewhere, RFC 1959 if
+  no other place is better.
+
+  To show you an example, this is now I can get all people from my local LDAP
+  server that has a certain sub-domain in their email address:
+
+        curl -B "ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se"
+
+  If I want the same info in HTML format, I can get it by not using the -B
+  (enforce ASCII) flag.
+
+ENVIRONMENT VARIABLES
+
+  Curl reads and understands the following environment variables:
+
+        HTTP_PROXY, HTTPS_PROXY, FTP_PROXY, GOPHER_PROXY
+
+  They should be set for protocol-specific proxies. General proxy should be
+  set with
+        
+        ALL_PROXY
+
+  A comma-separated list of host names that shouldn't go through any proxy is
+  set in (only an asterisk, '*' matches all hosts)
+
+        NO_PROXY
+
+  If a tail substring of the domain-path for a host matches one of these
+  strings, transactions with that node will not be proxied.
+
+
+  The usage of the -x/--proxy flag overrides the environment variables.
+
+MAILING LIST
+
+  We have an open mailing list to discuss curl, its development and things
+  relevant to this.
+
+  To subscribe, mail curl-request@contactor.se with "subscribe <your email
+  address>" in the body.
+
+  To post to the list, mail curl@contactor.se.
+
+  To unsubcribe, mail curl-request@contactor.se with "unsubscribe <your
+  subscribed email address>" in the body.
+
diff --git a/README.libcurl b/README.libcurl
new file mode 100644 (file)
index 0000000..ccec761
--- /dev/null
@@ -0,0 +1,108 @@
+                         _ _ _                     _ 
+                        | (_) |__   ___ _   _ _ __| |
+                        | | | '_ \ / __| | | | '__| |
+                        | | | |_) | (__| |_| | |  | |
+                        |_|_|_.__/ \___|\__,_|_|  |_|
+
+
+                     How To Use Libcurl In Your Program:
+                                 (by Ralph Beckmann <rabe@uni-paderborn.de>)
+
+NOTE: If you plan to use libcurl.a in Threads under Linux, do not use the old
+gcc-2.7.x because the function 'gethostbyname' seems not to be thread-safe,
+that is to say an unavoidable SEGMENTATION FAULT might occur.
+
+
+1. a) In a C-Program:
+      #include "curl.h"
+   
+   b) In a C++-Program:
+      extern "C" {
+      #include "curl.h"
+      }
+2. char *url="http://www.domain.com";
+   curl_urlget (URGTAG_URL, url, 
+          URGTAG_FLAGS, CONF_NOPROGRESS,
+          URGTAG_ERRORBUFFER, errorBuffer,
+          URGTAG_WRITEFUNCTION, (size_t (*)(void *, int, int, FILE
+*))handle_data,
+          URGTAG_TIMEOUT, 30,         /* or anything You want             */
+   ...
+          URGTAG_DONE);
+
+3. size_t handle_data (const void *ptr, size_t size, size_t nitems,
+                       FILE *stream)
+   {
+      (void)stream;                   /* stop complaining using g++ -Wall */
+      if ((int)nitems <= 0) {
+         return (size_t)0;
+      }
+      fprintf(stdout, (char *)ptr);   /* or do anything else with it      */
+      return nitems;
+   }
+
+4. Compile Your Program with  -I$(CURL_DIR)/include
+
+5. Link Your Program together with  $(CURL_DIR)/lib/libcurl.a
+
+                     Small Example of How To Use libcurl
+
+----------------------------------------------------------------------
+/* Full example that uses libcurl.a to fetch web pages.                    */
+/* curlthreads.c                                                           */
+/* - Test-Program by Ralph Beckmann for using curl in POSIX-Threads        */
+/* Change *url1 and *url2 to textual long and slow non-FRAMESET websites!  */
+/* 
+   1. Compile with gcc or g++ as $(CC): 
+       $(CC) -c -Wall -pedantic curlthreads.c -I$(CURL_DIR)/include
+
+   2. Link with:
+      - Linux:
+        $(CC) -o curlthreads curlthreads.o $(CURL_DIR)/lib/libcurl.a -lpthread
+-lm 
+      - Solaris:
+        $(CC) -o curlthreads curlthreads.o $(CURL_DIR)/lib/libcurl.a -lpthread
+-lm -lsocket -lnsl
+*/
+
+#include <pthread.h> 
+#include <stdio.h>
+#ifdef __cplusplus
+extern "C" {
+#include "curl.h"
+}
+#else
+#include "curl.h"
+#endif
+
+size_t storedata (const void *ptr, size_t size, size_t nitems, FILE *stream) {
+  (void)ptr; (void)stream;            /* just to stop g++ -Wall complaining */
+  fprintf(stdout, "Thread #%i reads %i Bytes.\n", 
+                   (int)pthread_self(), (int)(nitems*size));
+  return (nitems);
+}
+
+void *urlfetcher(void *url) {
+  curl_urlget (URGTAG_URL,            url, 
+               URGTAG_FLAGS,          CONF_NOPROGRESS | CONF_FAILONERROR,
+               URGTAG_WRITEFUNCTION,  (size_t (*)(void *, int, int, FILE
+*))storedata,
+               URGTAG_DONE);
+  return NULL; 
+}
+
+int main(void) {
+  char *url1="www.sun.com";  
+  char *url2="www.microsoft.com";
+
+  pthread_t thread_id1, thread_id2;
+  pthread_create(&thread_id1, NULL, urlfetcher, (void *)url1);
+  pthread_create(&thread_id2, NULL, urlfetcher, (void *)url2);
+  pthread_join(thread_id1, NULL);
+  pthread_join(thread_id2, NULL);
+  fprintf(stdout, "Ready.\n");
+
+  return 0;
+}
diff --git a/RESOURCES b/RESOURCES
new file mode 100644 (file)
index 0000000..92b25ce
--- /dev/null
+++ b/RESOURCES
@@ -0,0 +1,62 @@
+                                  _   _ ____  _     
+  Project                     ___| | | |  _ \| |    
+                             / __| | | | |_) | |    
+                            | (__| |_| |  _ <| |___ 
+                             \___|\___/|_| \_\_____|
+
+
+This document has been introduced in order to let you find documents that
+specify standards used by curl, software that extends curl and web pages with
+"competing" utilities.
+
+Standards
+
+  RFC 959  - Defines how FTP works
+  RFC 1738 - Uniform Resource Locators
+  RFC 1777 - defines the LDAP protocol
+  RFC 1808 - Relative Uniform Resource Locators
+  RFC 1867 - Form-based File Upload in HTML
+
+  RFC 1950 - ZLIB Compressed Data Format Specification
+  RFC 1951 - DEFLATE Compressed Data Format Specification
+  RFC 1952 - gzip compression format
+
+  RFC 1959 - LDAP URL syntax
+  RFC 2045-2049 - Everything you need to know about MIME! (needed for form
+                  based upload)
+  RFC 2068 - HTTP 1.1 (obsoleted by RFC 2616)
+  RFC 2109 - HTTP State Management Mechanism (cookie stuff)
+           - Also, read Netscape's specification at
+             http://www.netscape.com/newsref/std/cookie_spec.html
+  RFC 2183 - "The Content-Disposition Header Field"
+  RFC 2229 - "A Dictionary Server Protocol"
+  RFC 2231 - "MIME Parameter Value and Encoded Word Extensions:
+              Character Sets, Languages, and Continuations"
+  RFC 2388 - "Returning Values from Forms: multipart/form-data"
+   Use this as an addition to the 1867 
+  RFC 2396 - "Uniform Resource Identifiers: Generic Syntax and Semantics" 
+   This one obsoletes 1738, but since 1738 is often mentioned I've left it
+   in this list.
+  RFC 2428 - "FTP Extensions for IPv6 and NATs"
+   This should be considered when introducing IPv6 awareness.
+  RFC 2616 - HTTP 1.1
+  RFC 2617 - HTTP Authentication
+
+Compilers
+
+  MingW32 - http://www.xraylith.wisc.edu/~khan/software/gnu-win32/index.html
+
+Software
+
+  OpenSSL - http://www.openssl.org
+  OpenLDAP - http://www.openldap.org
+  zlib - http://www.cdrom.com/pub/infozip/zlib/
+
+Competitors
+
+  wget    - ftp://prep.ai.mit.edu/pub/gnu/
+  snarf   - http://www.xach.com/snarf/
+  lynx    - http://lynx.browser.org/ (well at least when -dump is used)
+  swebget - http://www.uni-hildesheim.de/~smol0075/swebget/
+  fetch   - ?
+
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..6ff69fc
--- /dev/null
+++ b/TODO
@@ -0,0 +1,87 @@
+                                  _   _ ____  _     
+                              ___| | | |  _ \| |    
+                             / __| | | | |_) | |    
+                            | (__| |_| |  _ <| |___ 
+                             \___|\___/|_| \_\_____|
+
+TODO
+
+ Ok, this is what I wanna do with Curl. Please tell me what you think, and
+ please don't hesitate to contribute and send me patches that improve this
+ product! (Yes, you may add things not mentioned here, these are just a
+ few teasers...)
+
+ * rtsp:// support -- "Real Time Streaming Protocol"
+
+   RFC 2326
+
+ * "Content-Encoding: compress/gzip/zlib"
+
+   HTTP 1.1 clearly defines how to get and decode compressed documents. There
+   is the zlib that is pretty good at decompressing stuff. This work was
+   started in October 1999 but halted again since it proved more work than we
+   thought. It is still a good idea to implement though.
+
+ * HTTP Pipelining/persistant connections
+
+ - I'm gonna introduce HTTP "pipelining". Curl should be able
+   to request for several HTTP documents in one connect. It is the beginning
+   for supporing more advanced functions in the future, like web site
+   mirroring. This will require that the urlget() function supports several
+   documents from a single HTTP server, which it doesn't today.
+
+ - When curl supports fetching several documents from the same
+   server using pipelining, I'd like to offer that function to the command
+   line. Anyone has a good idea how? The current way of specifying one URL
+   with the output sent to the stdout or a file gets in the way. Imagine a
+   syntax that supports "additional documents from the same server" in a way
+   similar to:
+
+     curl <main URL> --more-doc <path> --more-doc <path>
+
+   where --more-doc specifies another document on the same server. Where are
+   the output files gonna be put and how should they be named? Should each
+   "--more-doc" parameter require a local file name to store the result in?
+   Like "--more-file" as in:
+
+     curl <URL> --more-doc <path> --more-file <file>
+
+ * RFC2617 compliance, "Digest Access Authentication"
+   A valid test page seem to exist at:
+    http://hopf.math.nwu.edu/testpage/digest/
+   And some friendly person's server source code is available at
+    http://hopf.math.nwu.edu/digestauth/index.html
+
+   Then there's the Apache mod_digest source code too of course.
+   It seems as if Netscape doesn't support this, and not many servers
+   do. Although this is a lot better authentication method than the more
+   common "Basic". Basic sends the password in cleartext over the network,
+   this "Digest" method uses a challange-response protocol which increases
+   security quite a lot.
+
+ * Different FTP Upload Through Web Proxy
+   I don't know any web proxies that allow CONNECT through on port 21, but
+   that would be the best way to do ftp upload. All we would need to do would
+   be to 'CONNECT <host>:<port> HTTP/1.0\r\n\r\n' and then do business as
+   usual. I least I think so. It would be fun if someone tried this...
+
+ * Multiple Proxies?
+   Is there anyone that actually uses serial-proxies? I mean, send CONNECT to
+   the first proxy to connect to the second proxy to which you send CONNECT to
+   connect to the remote host (or even more iterations). Is there anyone
+   wanting curl to support it? (Not that it would be hard, just confusing...)
+
+ * Other proxies
+   Ftp-kind proxy, Socks5, whatever kind of proxies are there?
+
+ * IPv6 Awareness
+   Where ever it would fit. I am not that into v6 yet to fully grasp what we
+   would need to do, but letting the autoconf search for v6-versions of a few
+   functions and then use them instead is of course the first thing to do...
+   RFC 2428 "FTP Extensions for IPv6 and NATs" will be interesting. PORT
+   should be replaced with EPRT for IPv6, and EPSV instead of PASV.
+
+ * An automatic RPM package maker
+   Please, write me a script that makes it. It'd make my day.
+
+ * SSL for more protocols, like SSL-FTP...
diff --git a/acconfig.h b/acconfig.h
new file mode 100644 (file)
index 0000000..616cc06
--- /dev/null
@@ -0,0 +1,12 @@
+/* Name of this package! */
+#undef PACKAGE
+
+/* Version number of this archive. */
+#undef VERSION
+
+/* Define if you have the getpass function.  */
+#undef HAVE_GETPASS
+
+/* Define cpu-machine-OS */
+#undef OS
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..bd4779c
--- /dev/null
@@ -0,0 +1,127 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4
+
+dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file.
+
+AC_DEFUN(AM_CONFIG_HEADER,
+[AC_PREREQ([2.12])
+AC_CONFIG_HEADER([$1])
+dnl When config.status generates a header, we must update the stamp-h file.
+dnl This file resides in the same directory as the config header
+dnl that is generated.  We must strip everything past the first ":",
+dnl and everything past the last "/".
+AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
+ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
+<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
+<<am_indx=1
+for am_file in <<$1>>; do
+  case " <<$>>CONFIG_HEADERS " in
+  *" <<$>>am_file "*<<)>>
+    echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
+    ;;
+  esac
+  am_indx=`expr "<<$>>am_indx" + 1`
+done<<>>dnl>>)
+changequote([,]))])
+
+# Do all the work for Automake.  This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN(AM_INIT_AUTOMAKE,
+[AC_REQUIRE([AC_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN(AM_SANITY_CHECK,
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "[$]*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "[$]*" != "X $srcdir/configure conftestfile" \
+      && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "[$]2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN(AM_MISSING_PROG,
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+   $1=$2
+   AC_MSG_RESULT(found)
+else
+   $1="$3/missing $2"
+   AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
diff --git a/config-win32.h b/config-win32.h
new file mode 100644 (file)
index 0000000..8fe85e8
--- /dev/null
@@ -0,0 +1,168 @@
+/* config.h.  Generated automatically by configure.  */
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+/* #undef _ALL_SOURCE */
+#endif
+
+/* Define to empty if the keyword does not work.  */
+/* #undef const */
+
+/* Define if you don't have vprintf but do have _doprnt.  */
+/* #undef HAVE_DOPRNT */
+
+/* Define if you have the vprintf function.  */
+#define HAVE_VPRINTF 1
+
+/* Define as the return type of signal handlers (int or void).  */
+/*#define RETSIGTYPE void */
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+/* #undef size_t */
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS 1
+
+/* Define if you can safely include both <sys/time.h> and <time.h>.  */
+/* #define TIME_WITH_SYS_TIME 1 */
+
+/* Define cpu-machine-OS */
+#define OS "win32"
+
+/* The number of bytes in a long double.  */
+#define SIZEOF_LONG_DOUBLE 16
+
+/* The number of bytes in a long long.  */
+#define SIZEOF_LONG_LONG 8
+
+/* Define if you have the gethostbyaddr function.  */
+#define HAVE_GETHOSTBYADDR 1
+
+/* Define if you have the gethostname function.  */
+#define HAVE_GETHOSTNAME 1
+
+/* Define if you have the getpass function.  */
+/*#define HAVE_GETPASS 1*/
+
+/* Define if you have the getservbyname function.  */
+#define HAVE_GETSERVBYNAME 1
+
+/* Define if you have the gettimeofday function.  */
+#define HAVE_GETTIMEOFDAY 1
+
+/* Define if you have the inet_addr function.  */
+#define HAVE_INET_ADDR 1
+
+/* Define if you have the inet_ntoa function.  */
+#define HAVE_INET_NTOA 1
+
+/* Define if you have the perror function.  */
+#define HAVE_PERROR 1
+
+/* Define if you have the select function.  */
+#define HAVE_SELECT 1
+
+/* Define if you have the socket function.  */
+#define HAVE_SOCKET 1
+
+/* Define if you have the strcasecmp function.  */
+/*#define HAVE_STRCASECMP 1*/
+
+/* Define if you have the strdup function.  */
+#define HAVE_STRDUP 1
+
+/* Define if you have the strftime function.  */
+#define HAVE_STRFTIME 1
+
+/* Define if you have the strstr function.  */
+#define HAVE_STRSTR 1
+
+/* Define if you have the tcgetattr function.  */
+/*#define HAVE_TCGETATTR 1*/
+
+/* Define if you have the tcsetattr function.  */
+/*#define HAVE_TCSETATTR 1*/
+
+/* Define if you have the uname function.  */
+#define HAVE_UNAME 1
+
+/* Define if you have the <alloca.h> header file.  */
+/*#define HAVE_ALLOCA_H 1*/
+
+/* Define if you have the <arpa/inet.h> header file.  */
+#define HAVE_ARPA_INET_H 1
+
+/* Define if you have the <crypto.h> header file.  */
+/* #undef HAVE_CRYPTO_H */
+
+/* Define if you have the <dlfcn.h> header file.  */
+/*#define HAVE_DLFCN_H 1*/
+
+/* Define if you have the <err.h> header file.  */
+/* #undef HAVE_ERR_H */
+
+/* Define if you have the <fcntl.h> header file.  */
+#define HAVE_FCNTL_H 1
+
+/* Define if you have the <getopt.h> header file.  */
+/* #undef HAVE_GETOPT_H */
+
+/* Define if you have the <netdb.h> header file.  */
+#define HAVE_NETDB_H 1
+
+/* Define if you have the <netinet/in.h> header file.  */
+#define HAVE_NETINET_IN_H 1
+
+/* Define if you have the <sgtty.h> header file.  */
+/*#define HAVE_SGTTY_H 1*/
+
+/* Define if you have the <ssl.h> header file.  */
+/* #undef HAVE_SSL_H */
+
+/* Define if you have the <sys/param.h> header file.  */
+/*#define HAVE_SYS_PARAM_H 1*/
+
+/* Define if you have the <sys/select.h> header file.  */
+#define HAVE_SYS_SELECT_H 1
+
+/* Define if you have the <sys/socket.h> header file.  */
+/*#define HAVE_SYS_SOCKET_H 1*/
+
+/* Define if you have the <sys/sockio.h> header file.  */
+#define HAVE_SYS_SOCKIO_H 1
+
+/* Define if you have the <sys/stat.h> header file.  */
+#define HAVE_SYS_STAT_H 1
+
+/* Define if you have the <sys/types.h> header file.  */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define if you have the <termio.h> header file.  */
+#define HAVE_TERMIO_H 1
+
+/* Define if you have the <termios.h> header file.  */
+#define HAVE_TERMIOS_H 1
+
+/* Define if you have the <unistd.h> header file.  */
+#define HAVE_UNISTD_H 1
+
+/* Name of package */
+#define PACKAGE "curl"
+
+/* Version number of package */
+#define VERSION "6.3.1"
+
+/* Define if you have the <io.h> header file.  */
+#define HAVE_IO_H 1
+
+/* Define if you have the <time.h> header file.  */
+#define HAVE_TIME_H 1
+
+/* Define if you have the <winsock.h> header file.  */
+#define HAVE_WINSOCK_H 1
+
+/* Define if you have the closesocket function.  */
+#define HAVE_CLOSESOCKET 1
diff --git a/config.cache b/config.cache
new file mode 100644 (file)
index 0000000..ba8353a
--- /dev/null
@@ -0,0 +1,86 @@
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+ac_cv_c_const=${ac_cv_c_const='yes'}
+ac_cv_func_closesocket=${ac_cv_func_closesocket='no'}
+ac_cv_func_connect=${ac_cv_func_connect='no'}
+ac_cv_func_dlopen=${ac_cv_func_dlopen='no'}
+ac_cv_func_gethostbyaddr=${ac_cv_func_gethostbyaddr='yes'}
+ac_cv_func_gethostbyname=${ac_cv_func_gethostbyname='no'}
+ac_cv_func_gethostname=${ac_cv_func_gethostname='yes'}
+ac_cv_func_getpass=${ac_cv_func_getpass='yes'}
+ac_cv_func_getservbyname=${ac_cv_func_getservbyname='yes'}
+ac_cv_func_gettimeofday=${ac_cv_func_gettimeofday='yes'}
+ac_cv_func_inet_addr=${ac_cv_func_inet_addr='yes'}
+ac_cv_func_inet_ntoa=${ac_cv_func_inet_ntoa='yes'}
+ac_cv_func_perror=${ac_cv_func_perror='yes'}
+ac_cv_func_select=${ac_cv_func_select='yes'}
+ac_cv_func_socket=${ac_cv_func_socket='yes'}
+ac_cv_func_strcasecmp=${ac_cv_func_strcasecmp='yes'}
+ac_cv_func_strdup=${ac_cv_func_strdup='yes'}
+ac_cv_func_strftime=${ac_cv_func_strftime='yes'}
+ac_cv_func_strstr=${ac_cv_func_strstr='yes'}
+ac_cv_func_tcgetattr=${ac_cv_func_tcgetattr='yes'}
+ac_cv_func_tcsetattr=${ac_cv_func_tcsetattr='yes'}
+ac_cv_func_uname=${ac_cv_func_uname='yes'}
+ac_cv_func_vprintf=${ac_cv_func_vprintf='yes'}
+ac_cv_header_alloca_h=${ac_cv_header_alloca_h='yes'}
+ac_cv_header_arpa_inet_h=${ac_cv_header_arpa_inet_h='yes'}
+ac_cv_header_dlfcn_h=${ac_cv_header_dlfcn_h='yes'}
+ac_cv_header_fcntl_h=${ac_cv_header_fcntl_h='yes'}
+ac_cv_header_getopt_h=${ac_cv_header_getopt_h='no'}
+ac_cv_header_io_h=${ac_cv_header_io_h='no'}
+ac_cv_header_net_if_h=${ac_cv_header_net_if_h='yes'}
+ac_cv_header_netdb_h=${ac_cv_header_netdb_h='yes'}
+ac_cv_header_netinet_in_h=${ac_cv_header_netinet_in_h='yes'}
+ac_cv_header_openssl_crypto_h=${ac_cv_header_openssl_crypto_h='yes'}
+ac_cv_header_openssl_err_h=${ac_cv_header_openssl_err_h='yes'}
+ac_cv_header_openssl_pem_h=${ac_cv_header_openssl_pem_h='yes'}
+ac_cv_header_openssl_rsa_h=${ac_cv_header_openssl_rsa_h='yes'}
+ac_cv_header_openssl_ssl_h=${ac_cv_header_openssl_ssl_h='yes'}
+ac_cv_header_openssl_x509_h=${ac_cv_header_openssl_x509_h='yes'}
+ac_cv_header_sgtty_h=${ac_cv_header_sgtty_h='yes'}
+ac_cv_header_stdc=${ac_cv_header_stdc='yes'}
+ac_cv_header_sys_param_h=${ac_cv_header_sys_param_h='yes'}
+ac_cv_header_sys_select_h=${ac_cv_header_sys_select_h='yes'}
+ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h='yes'}
+ac_cv_header_sys_sockio_h=${ac_cv_header_sys_sockio_h='yes'}
+ac_cv_header_sys_stat_h=${ac_cv_header_sys_stat_h='yes'}
+ac_cv_header_sys_types_h=${ac_cv_header_sys_types_h='yes'}
+ac_cv_header_termio_h=${ac_cv_header_termio_h='yes'}
+ac_cv_header_termios_h=${ac_cv_header_termios_h='yes'}
+ac_cv_header_time=${ac_cv_header_time='yes'}
+ac_cv_header_time_h=${ac_cv_header_time_h='yes'}
+ac_cv_header_unistd_h=${ac_cv_header_unistd_h='yes'}
+ac_cv_header_winsock_h=${ac_cv_header_winsock_h='no'}
+ac_cv_lib_crypto_CRYPTO_lock=${ac_cv_lib_crypto_CRYPTO_lock='yes'}
+ac_cv_lib_dl_dlopen=${ac_cv_lib_dl_dlopen='yes'}
+ac_cv_lib_nsl_gethostbyname=${ac_cv_lib_nsl_gethostbyname='yes'}
+ac_cv_lib_socket_connect=${ac_cv_lib_socket_connect='yes'}
+ac_cv_lib_ssl_SSL_connect=${ac_cv_lib_ssl_SSL_connect='yes'}
+ac_cv_path_NROFF=${ac_cv_path_NROFF='/bin/nroff'}
+ac_cv_path_PERL=${ac_cv_path_PERL='/usr/local/bin/perl'}
+ac_cv_prog_CC=${ac_cv_prog_CC='gcc'}
+ac_cv_prog_CPP=${ac_cv_prog_CPP='gcc -E'}
+ac_cv_prog_RANLIB=${ac_cv_prog_RANLIB='ranlib'}
+ac_cv_prog_YACC=${ac_cv_prog_YACC='bison -y'}
+ac_cv_prog_cc_cross=${ac_cv_prog_cc_cross='no'}
+ac_cv_prog_cc_g=${ac_cv_prog_cc_g='yes'}
+ac_cv_prog_cc_works=${ac_cv_prog_cc_works='yes'}
+ac_cv_prog_gcc=${ac_cv_prog_gcc='yes'}
+ac_cv_prog_make_make_set=${ac_cv_prog_make_make_set='yes'}
+ac_cv_sizeof_long_double=${ac_cv_sizeof_long_double='16'}
+ac_cv_sizeof_long_long=${ac_cv_sizeof_long_long='8'}
+ac_cv_type_signal=${ac_cv_type_signal='void'}
+ac_cv_type_size_t=${ac_cv_type_size_t='yes'}
diff --git a/config.guess b/config.guess
new file mode 100755 (executable)
index 0000000..1d27287
--- /dev/null
@@ -0,0 +1,997 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+# Please send patches to the Autoconf mailing list <autoconf@gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    alpha:OSF1:*:*)
+       if test $UNAME_RELEASE = "V4.0"; then
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+       fi
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       cat <<EOF >$dummy.s
+       .globl main
+       .ent main
+main:
+       .frame \$30,0,\$26,0
+       .prologue 0
+       .long 0x47e03d80 # implver $0
+       lda \$2,259
+       .long 0x47e20c21 # amask $2,$1
+       srl \$1,8,\$2
+       sll \$2,2,\$2
+       sll \$0,3,\$0
+       addl \$1,\$0,\$0
+       addl \$2,\$0,\$0
+       ret \$31,(\$26),1
+       .end main
+EOF
+       ${CC-cc} $dummy.s -o $dummy 2>/dev/null
+       if test "$?" = 0 ; then
+               ./$dummy
+               case "$?" in
+                       7)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       15)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       14)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       10)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       16)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+               esac
+       fi
+       rm -f $dummy.s $dummy
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]`
+       exit 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-cbm-sysv4
+       exit 0;;
+    amiga:NetBSD:*:*)
+      echo m68k-cbm-netbsd${UNAME_RELEASE}
+      exit 0 ;;
+    amiga:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit 0 ;;
+    arc64:OpenBSD:*:*)
+       echo mips64el-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hkmips:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    pmax:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sgi:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    arm32:NetBSD:*:*)
+       echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    SR2?01:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit 0;;
+    Pyramid*:OSx*:*:*|MIS*:OSx*:*:*|MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit 0 ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit 0 ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit 0 ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:NetBSD:*:*)
+       echo m68k-atari-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3*:NetBSD:*:*)
+       echo m68k-sun-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:NetBSD:*:*)
+       echo m68k-apple-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+       echo m88k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit 0 ;;
+    macppc:NetBSD:*:*)
+        echo powerpc-apple-netbsd${UNAME_RELEASE}
+        exit 0 ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    2020:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       ${CC-cc} $dummy.c -o $dummy \
+         && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+         && rm $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+        if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+       if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+            -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+       else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+       fi
+        else echo i586-dg-dgux${UNAME_RELEASE}
+        fi
+       exit 0 ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit 0 ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i?86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               ${CC-cc} $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+               rm -f $dummy.c $dummy
+               echo rs6000-ibm-aix3.2.5
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit 0 ;;
+    *:AIX:*:4)
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=4.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC NetBSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/6?? | 9000/7?? | 9000/80[024] | 9000/8?[136790] | 9000/892 )
+              sed 's/^              //' << EOF >$dummy.c
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+               {
+               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+               case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+                   switch (bits)
+                       {
+                       case 64: puts ("hppa2.0w"); break;
+                       case 32: puts ("hppa2.0n"); break;
+                       default: puts ("hppa2.0"); break;
+                       } break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+                   puts ("hppa2.0"); break;
+              #endif
+               default: puts ("hppa1.0"); break;
+               }
+                  exit (0);
+              }
+EOF
+       (${CC-cc} $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+       rm -f $dummy.c $dummy
+       esac
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       sed 's/^        //' << EOF >$dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       ${CC-cc} $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+       rm -f $dummy.c $dummy
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    *9??*:MPE*:*:*)
+       echo hppa1.0-hp-mpeix
+       exit 0 ;;
+    *9??*:MPE*:*:*)
+       echo hppa1.0-hp-mpeix
+       exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit 0 ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit 0 ;;
+    i?86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit 0 ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+       echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+       exit 0 ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY*T3E:*:*:*)
+       echo t3e-cray-unicosmk${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY-2:*:*:*)
+       echo cray2-cray-unicos
+        exit 0 ;;
+    F300:UNIX_System_V:*:*)
+        FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    F301:UNIX_System_V:*:*)
+       echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+       exit 0 ;;
+    hp3[0-9][05]:NetBSD:*:*)
+       echo m68k-hp-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hp300:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    i?86:BSD/386:*:* | i?86:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:FreeBSD:*:*)
+       if test -x /usr/bin/objformat; then
+           if test "elf" = "`/usr/bin/objformat`"; then
+               echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
+               exit 0
+           fi
+       fi
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit 0 ;;
+    *:NetBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit 0 ;;
+    i*:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit 0 ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    *:GNU:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    *:Linux:*:*)
+#      # uname on the ARM produces all sorts of strangeness, and we need to
+#      # filter it out.
+#      case "$UNAME_MACHINE" in
+#        armv*)                      UNAME_MACHINE=$UNAME_MACHINE ;;
+#        arm* | sa110*)              UNAME_MACHINE="arm" ;;
+#      esac
+
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us.
+       ld_help_string=`ld --help 2>&1`
+       ld_supported_emulations=`echo $ld_help_string \
+                        | sed -ne '/supported emulations:/!d
+                                   s/[         ][      ]*/ /g
+                                   s/.*supported emulations: *//
+                                   s/ .*//
+                                   p'`
+        case "$ld_supported_emulations" in
+         i?86linux)  echo "${UNAME_MACHINE}-pc-linux-gnuaout"      ; exit 0 ;;
+         i?86coff)   echo "${UNAME_MACHINE}-pc-linux-gnucoff"      ; exit 0 ;;
+         sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         armlinux)   echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         m68klinux)  echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         elf32arm)   echo "${UNAME_MACHINE}-unknown-linux-gnu"     ; exit 0 ;;
+         elf32ppc)   echo "powerpc-unknown-linux-gnu"              ; exit 0 ;;
+       esac
+
+       if test "${UNAME_MACHINE}" = "alpha" ; then
+               sed 's/^        //'  <<EOF >$dummy.s
+               .globl main
+               .ent main
+       main:
+               .frame \$30,0,\$26,0
+               .prologue 0
+               .long 0x47e03d80 # implver $0
+               lda \$2,259
+               .long 0x47e20c21 # amask $2,$1
+               srl \$1,8,\$2
+               sll \$2,2,\$2
+               sll \$0,3,\$0
+               addl \$1,\$0,\$0
+               addl \$2,\$0,\$0
+               ret \$31,(\$26),1
+               .end main
+EOF
+               LIBC=""
+               ${CC-cc} $dummy.s -o $dummy 2>/dev/null
+               if test "$?" = 0 ; then
+                       ./$dummy
+                       case "$?" in
+                       7)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       15)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       14)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       10)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       16)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+                       esac
+
+                       objdump --private-headers $dummy | \
+                         grep ld.so.1 > /dev/null
+                       if test "$?" = 0 ; then
+                               LIBC="libc1"
+                       fi
+               fi
+               rm -f $dummy.s $dummy
+               echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+       elif test "${UNAME_MACHINE}" = "mips" ; then
+         cat >$dummy.c <<EOF
+#ifdef __cplusplus
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __MIPSEB__
+  printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+  printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+         ${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+         rm -f $dummy.c $dummy
+       else
+         # Either a pre-BFD a.out linker (linux-gnuoldld)
+         # or one that does not give us useful --help.
+         # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+         # If ld does not provide *any* "supported emulations:"
+         # that means it is gnuoldld.
+         echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+         test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+         case "${UNAME_MACHINE}" in
+         i?86)
+           VENDOR=pc;
+           ;;
+         *)
+           VENDOR=unknown;
+           ;;
+         esac
+         # Determine whether the default compiler is a.out or elf
+         cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+         ${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+         rm -f $dummy.c $dummy
+       fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+    i?86:DYNIX/ptx:4*:*)
+       echo i386-sequent-sysv4
+       exit 0 ;;
+    i?86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit 0 ;;
+    i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    i?86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit 0 ;;
+    i?86:UnixWare:*:*)
+       if /bin/uname -X 2>/dev/null >/dev/null ; then
+         (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+           && UNAME_MACHINE=i586
+       fi
+       echo ${UNAME_MACHINE}-unixware-${UNAME_RELEASE}-${UNAME_VERSION}
+       exit 0 ;;
+    pc:*:*:*)
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+       echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit 0 ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    M68*:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit 0 ;;
+    i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit 0 ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    news*:NEWS-OS:*:6*)
+       echo mips-sony-newsos6
+       exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R4000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit 0 ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit 0 ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+         ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+  printf ("vax-dec-bsd\n"); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit 0 ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit 0 ;;
+    c34*)
+       echo c34-convex-bsd
+       exit 0 ;;
+    c38*)
+       echo c38-convex-bsd
+       exit 0 ;;
+    c4*)
+       echo c4-convex-bsd
+       exit 0 ;;
+    esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/config.guess-991124 b/config.guess-991124
new file mode 100755 (executable)
index 0000000..58670de
--- /dev/null
@@ -0,0 +1,900 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    alpha:OSF1:*:*)
+       if test $UNAME_RELEASE = "V4.0"; then
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+       fi
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       cat <<EOF >dummy.s
+       .globl main
+       .ent main
+main:
+       .frame \$30,0,\$26,0
+       .prologue 0
+       .long 0x47e03d80 # implver $0
+       lda \$2,259
+       .long 0x47e20c21 # amask $2,$1
+       srl \$1,8,\$2
+       sll \$2,2,\$2
+       sll \$0,3,\$0
+       addl \$1,\$0,\$0
+       addl \$2,\$0,\$0
+       ret \$31,(\$26),1
+       .end main
+EOF
+       ${CC-cc} dummy.s -o dummy 2>/dev/null
+       if test "$?" = 0 ; then
+               ./dummy
+               case "$?" in
+                       7)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       15)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       14)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       10)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       16)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+               esac
+       fi
+       rm -f dummy.s dummy
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]`
+       exit 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-cbm-sysv4
+       exit 0;;
+    amiga:NetBSD:*:*)
+      echo m68k-cbm-netbsd${UNAME_RELEASE}
+      exit 0 ;;
+    amiga:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc64:OpenBSD:*:*)
+       echo mips64el-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hkmips:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    pmax:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sgi:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    arm32:NetBSD:*:*)
+       echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    SR2?01:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit 0;;
+    Pyramid*:OSx*:*:*|MIS*:OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit 0 ;;
+    NILE:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit 0 ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:NetBSD:*:*)
+       echo m68k-atari-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3*:NetBSD:*:*)
+       echo m68k-sun-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:NetBSD:*:*)
+       echo m68k-apple-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+       echo m88k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit 0 ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    2020:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       sed 's/^        //' << EOF >dummy.c
+       int main (argc, argv) int argc; char **argv; {
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       ${CC-cc} dummy.c -o dummy \
+         && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+         && rm dummy.c dummy && exit 0
+       rm -f dummy.c dummy
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+        if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+       if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+            -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+       else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+       fi
+        else echo i586-dg-dgux${UNAME_RELEASE}
+        fi
+       exit 0 ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit 0 ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i?86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               sed 's/^                //' << EOF >dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+               rm -f dummy.c dummy
+               echo rs6000-ibm-aix3.2.5
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit 0 ;;
+    *:AIX:*:4)
+       if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=4.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC NetBSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    9000/[3478]??:HP-UX:*:*)
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
+           9000/8?? )            HP_ARCH=hppa1.0 ;;
+       esac
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       sed 's/^        //' << EOF >dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+       rm -f dummy.c dummy
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit 0 ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit 0 ;;
+    i?86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit 0 ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+       echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+       exit 0 ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY-2:*:*:*)
+       echo cray2-cray-unicos
+        exit 0 ;;
+    F300:UNIX_System_V:*:*)
+        FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    F301:UNIX_System_V:*:*)
+       echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+       exit 0 ;;
+    hp3[0-9][05]:NetBSD:*:*)
+       echo m68k-hp-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hp300:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    i?86:BSD/386:*:* | *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:FreeBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit 0 ;;
+    *:NetBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin32
+       exit 0 ;;
+    i*:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin32
+       exit 0 ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    *:GNU:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    *:Linux:*:*)
+       # uname on the ARM produces all sorts of strangeness, and we need to
+       # filter it out.
+       case "$UNAME_MACHINE" in
+         arm* | sa110*)              UNAME_MACHINE="arm" ;;
+       esac
+
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us.
+       ld_help_string=`ld --help 2>&1`
+       ld_supported_emulations=`echo $ld_help_string \
+                        | sed -ne '/supported emulations:/!d
+                                   s/[         ][      ]*/ /g
+                                   s/.*supported emulations: *//
+                                   s/ .*//
+                                   p'`
+        case "$ld_supported_emulations" in
+         i?86linux)  echo "${UNAME_MACHINE}-pc-linux-gnuaout"      ; exit 0 ;;
+         i?86coff)   echo "${UNAME_MACHINE}-pc-linux-gnucoff"      ; exit 0 ;;
+         sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         armlinux)   echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         m68klinux)  echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         elf32ppc)   echo "powerpc-unknown-linux-gnu"              ; exit 0 ;;
+       esac
+
+       if test "${UNAME_MACHINE}" = "alpha" ; then
+               sed 's/^        //'  <<EOF >dummy.s
+               .globl main
+               .ent main
+       main:
+               .frame \$30,0,\$26,0
+               .prologue 0
+               .long 0x47e03d80 # implver $0
+               lda \$2,259
+               .long 0x47e20c21 # amask $2,$1
+               srl \$1,8,\$2
+               sll \$2,2,\$2
+               sll \$0,3,\$0
+               addl \$1,\$0,\$0
+               addl \$2,\$0,\$0
+               ret \$31,(\$26),1
+               .end main
+EOF
+               LIBC=""
+               ${CC-cc} dummy.s -o dummy 2>/dev/null
+               if test "$?" = 0 ; then
+                       ./dummy
+                       case "$?" in
+                       7)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       15)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       14)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       10)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       16)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+                       esac    
+
+                       objdump --private-headers dummy | \
+                         grep ld.so.1 > /dev/null
+                       if test "$?" = 0 ; then
+                               LIBC="libc1"
+                       fi
+               fi      
+               rm -f dummy.s dummy
+               echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+       elif test "${UNAME_MACHINE}" = "mips" ; then
+         cat >dummy.c <<EOF
+main(argc, argv)
+     int argc;
+     char *argv[];
+{
+#ifdef __MIPSEB__
+  printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+  printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+         ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+         rm -f dummy.c dummy
+       else
+         # Either a pre-BFD a.out linker (linux-gnuoldld)
+         # or one that does not give us useful --help.
+         # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+         # If ld does not provide *any* "supported emulations:"
+         # that means it is gnuoldld.
+         echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+         test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+         case "${UNAME_MACHINE}" in
+         i?86)
+           VENDOR=pc;
+           ;;
+         *)
+           VENDOR=unknown;
+           ;;
+         esac
+         # Determine whether the default compiler is a.out or elf
+         cat >dummy.c <<EOF
+#include <features.h>
+main(argc, argv)
+     int argc;
+     char *argv[];
+{
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+         ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+         rm -f dummy.c dummy
+       fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+    i?86:DYNIX/ptx:4*:*)
+       echo i386-sequent-sysv4
+       exit 0 ;;
+    i?86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit 0 ;;
+    i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    i?86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit 0 ;;
+    pc:*:*:*)
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+       echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit 0 ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    M68*:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit 0 ;;
+    i?86:LynxOS:2.*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit 0 ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit 0 ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    news*:NEWS-OS:*:6*)
+       echo mips-sony-newsos6
+       exit 0 ;;
+    R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+         ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined(__APPLE__)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*Kernel Release \([0-9]*\).*/\1/p') 2>/dev/null`;
+  printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+  printf ("vax-dec-bsd\n"); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit 0 ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit 0 ;;
+    c34*)
+       echo c34-convex-bsd
+       exit 0 ;;
+    c38*)
+       echo c38-convex-bsd
+       exit 0 ;;
+    c4*)
+       echo c4-convex-bsd
+       exit 0 ;;
+    esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/config.h b/config.h
new file mode 100644 (file)
index 0000000..195afa8
--- /dev/null
+++ b/config.h
@@ -0,0 +1,220 @@
+/* config.h.  Generated automatically by configure.  */
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+/* #undef _ALL_SOURCE */
+#endif
+
+/* Define to empty if the keyword does not work.  */
+/* #undef const */
+
+/* Define if you don't have vprintf but do have _doprnt.  */
+/* #undef HAVE_DOPRNT */
+
+/* Define if you have the vprintf function.  */
+#define HAVE_VPRINTF 1
+
+/* Define as the return type of signal handlers (int or void).  */
+#define RETSIGTYPE void
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+/* #undef size_t */
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS 1
+
+/* Define if you can safely include both <sys/time.h> and <time.h>.  */
+#define TIME_WITH_SYS_TIME 1
+
+/* Define cpu-machine-OS */
+#define OS "sparc-sun-solaris2.6"
+
+/* The number of bytes in a long double.  */
+#define SIZEOF_LONG_DOUBLE 16
+
+/* The number of bytes in a long long.  */
+#define SIZEOF_LONG_LONG 8
+
+/* Define if you have the closesocket function.  */
+/* #undef HAVE_CLOSESOCKET */
+
+/* Define if you have the gethostbyaddr function.  */
+#define HAVE_GETHOSTBYADDR 1
+
+/* Define if you have the gethostname function.  */
+#define HAVE_GETHOSTNAME 1
+
+/* Define if you have the getpass function.  */
+#define HAVE_GETPASS 1
+
+/* Define if you have the getservbyname function.  */
+#define HAVE_GETSERVBYNAME 1
+
+/* Define if you have the gettimeofday function.  */
+#define HAVE_GETTIMEOFDAY 1
+
+/* Define if you have the inet_addr function.  */
+#define HAVE_INET_ADDR 1
+
+/* Define if you have the inet_ntoa function.  */
+#define HAVE_INET_NTOA 1
+
+/* Define if you have the perror function.  */
+#define HAVE_PERROR 1
+
+/* Define if you have the select function.  */
+#define HAVE_SELECT 1
+
+/* Define if you have the socket function.  */
+#define HAVE_SOCKET 1
+
+/* Define if you have the strcasecmp function.  */
+#define HAVE_STRCASECMP 1
+
+/* Define if you have the strdup function.  */
+#define HAVE_STRDUP 1
+
+/* Define if you have the strftime function.  */
+#define HAVE_STRFTIME 1
+
+/* Define if you have the strstr function.  */
+#define HAVE_STRSTR 1
+
+/* Define if you have the tcgetattr function.  */
+#define HAVE_TCGETATTR 1
+
+/* Define if you have the tcsetattr function.  */
+#define HAVE_TCSETATTR 1
+
+/* Define if you have the uname function.  */
+#define HAVE_UNAME 1
+
+/* Define if you have the <alloca.h> header file.  */
+#define HAVE_ALLOCA_H 1
+
+/* Define if you have the <arpa/inet.h> header file.  */
+#define HAVE_ARPA_INET_H 1
+
+/* Define if you have the <crypto.h> header file.  */
+/* #undef HAVE_CRYPTO_H */
+
+/* Define if you have the <dlfcn.h> header file.  */
+#define HAVE_DLFCN_H 1
+
+/* Define if you have the <err.h> header file.  */
+/* #undef HAVE_ERR_H */
+
+/* Define if you have the <fcntl.h> header file.  */
+#define HAVE_FCNTL_H 1
+
+/* Define if you have the <getopt.h> header file.  */
+/* #undef HAVE_GETOPT_H */
+
+/* Define if you have the <io.h> header file.  */
+/* #undef HAVE_IO_H */
+
+/* Define if you have the <net/if.h> header file.  */
+#define HAVE_NET_IF_H 1
+
+/* Define if you have the <netdb.h> header file.  */
+#define HAVE_NETDB_H 1
+
+/* Define if you have the <netinet/in.h> header file.  */
+#define HAVE_NETINET_IN_H 1
+
+/* Define if you have the <openssl/crypto.h> header file.  */
+#define HAVE_OPENSSL_CRYPTO_H 1
+
+/* Define if you have the <openssl/err.h> header file.  */
+#define HAVE_OPENSSL_ERR_H 1
+
+/* Define if you have the <openssl/pem.h> header file.  */
+#define HAVE_OPENSSL_PEM_H 1
+
+/* Define if you have the <openssl/rsa.h> header file.  */
+#define HAVE_OPENSSL_RSA_H 1
+
+/* Define if you have the <openssl/ssl.h> header file.  */
+#define HAVE_OPENSSL_SSL_H 1
+
+/* Define if you have the <openssl/x509.h> header file.  */
+#define HAVE_OPENSSL_X509_H 1
+
+/* Define if you have the <pem.h> header file.  */
+/* #undef HAVE_PEM_H */
+
+/* Define if you have the <rsa.h> header file.  */
+/* #undef HAVE_RSA_H */
+
+/* Define if you have the <sgtty.h> header file.  */
+#define HAVE_SGTTY_H 1
+
+/* Define if you have the <ssl.h> header file.  */
+/* #undef HAVE_SSL_H */
+
+/* Define if you have the <sys/param.h> header file.  */
+#define HAVE_SYS_PARAM_H 1
+
+/* Define if you have the <sys/select.h> header file.  */
+#define HAVE_SYS_SELECT_H 1
+
+/* Define if you have the <sys/socket.h> header file.  */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define if you have the <sys/sockio.h> header file.  */
+#define HAVE_SYS_SOCKIO_H 1
+
+/* Define if you have the <sys/stat.h> header file.  */
+#define HAVE_SYS_STAT_H 1
+
+/* Define if you have the <sys/types.h> header file.  */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define if you have the <termio.h> header file.  */
+#define HAVE_TERMIO_H 1
+
+/* Define if you have the <termios.h> header file.  */
+#define HAVE_TERMIOS_H 1
+
+/* Define if you have the <time.h> header file.  */
+#define HAVE_TIME_H 1
+
+/* Define if you have the <unistd.h> header file.  */
+#define HAVE_UNISTD_H 1
+
+/* Define if you have the <winsock.h> header file.  */
+/* #undef HAVE_WINSOCK_H */
+
+/* Define if you have the <x509.h> header file.  */
+/* #undef HAVE_X509_H */
+
+/* Define if you have the crypto library (-lcrypto).  */
+#define HAVE_LIBCRYPTO 1
+
+/* Define if you have the dl library (-ldl).  */
+#define HAVE_LIBDL 1
+
+/* Define if you have the nsl library (-lnsl).  */
+#define HAVE_LIBNSL 1
+
+/* Define if you have the resolve library (-lresolve).  */
+/* #undef HAVE_LIBRESOLVE */
+
+/* Define if you have the socket library (-lsocket).  */
+#define HAVE_LIBSOCKET 1
+
+/* Define if you have the ssl library (-lssl).  */
+#define HAVE_LIBSSL 1
+
+/* Define if you have the ucb library (-lucb).  */
+/* #undef HAVE_LIBUCB */
+
+/* Name of package */
+#define PACKAGE "curl"
+
+/* Version number of package */
+#define VERSION "6.3.1"
+
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..9c5e110
--- /dev/null
@@ -0,0 +1,219 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+#undef _ALL_SOURCE
+#endif
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define if you don't have vprintf but do have _doprnt.  */
+#undef HAVE_DOPRNT
+
+/* Define if you have the vprintf function.  */
+#undef HAVE_VPRINTF
+
+/* Define as the return type of signal handlers (int or void).  */
+#undef RETSIGTYPE
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/* Define if you can safely include both <sys/time.h> and <time.h>.  */
+#undef TIME_WITH_SYS_TIME
+
+/* Define cpu-machine-OS */
+#undef OS
+
+/* The number of bytes in a long double.  */
+#undef SIZEOF_LONG_DOUBLE
+
+/* The number of bytes in a long long.  */
+#undef SIZEOF_LONG_LONG
+
+/* Define if you have the closesocket function.  */
+#undef HAVE_CLOSESOCKET
+
+/* Define if you have the gethostbyaddr function.  */
+#undef HAVE_GETHOSTBYADDR
+
+/* Define if you have the gethostname function.  */
+#undef HAVE_GETHOSTNAME
+
+/* Define if you have the getpass function.  */
+#undef HAVE_GETPASS
+
+/* Define if you have the getservbyname function.  */
+#undef HAVE_GETSERVBYNAME
+
+/* Define if you have the gettimeofday function.  */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define if you have the inet_addr function.  */
+#undef HAVE_INET_ADDR
+
+/* Define if you have the inet_ntoa function.  */
+#undef HAVE_INET_NTOA
+
+/* Define if you have the perror function.  */
+#undef HAVE_PERROR
+
+/* Define if you have the select function.  */
+#undef HAVE_SELECT
+
+/* Define if you have the socket function.  */
+#undef HAVE_SOCKET
+
+/* Define if you have the strcasecmp function.  */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strdup function.  */
+#undef HAVE_STRDUP
+
+/* Define if you have the strftime function.  */
+#undef HAVE_STRFTIME
+
+/* Define if you have the strstr function.  */
+#undef HAVE_STRSTR
+
+/* Define if you have the tcgetattr function.  */
+#undef HAVE_TCGETATTR
+
+/* Define if you have the tcsetattr function.  */
+#undef HAVE_TCSETATTR
+
+/* Define if you have the uname function.  */
+#undef HAVE_UNAME
+
+/* Define if you have the <alloca.h> header file.  */
+#undef HAVE_ALLOCA_H
+
+/* Define if you have the <arpa/inet.h> header file.  */
+#undef HAVE_ARPA_INET_H
+
+/* Define if you have the <crypto.h> header file.  */
+#undef HAVE_CRYPTO_H
+
+/* Define if you have the <dlfcn.h> header file.  */
+#undef HAVE_DLFCN_H
+
+/* Define if you have the <err.h> header file.  */
+#undef HAVE_ERR_H
+
+/* Define if you have the <fcntl.h> header file.  */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <getopt.h> header file.  */
+#undef HAVE_GETOPT_H
+
+/* Define if you have the <io.h> header file.  */
+#undef HAVE_IO_H
+
+/* Define if you have the <net/if.h> header file.  */
+#undef HAVE_NET_IF_H
+
+/* Define if you have the <netdb.h> header file.  */
+#undef HAVE_NETDB_H
+
+/* Define if you have the <netinet/in.h> header file.  */
+#undef HAVE_NETINET_IN_H
+
+/* Define if you have the <openssl/crypto.h> header file.  */
+#undef HAVE_OPENSSL_CRYPTO_H
+
+/* Define if you have the <openssl/err.h> header file.  */
+#undef HAVE_OPENSSL_ERR_H
+
+/* Define if you have the <openssl/pem.h> header file.  */
+#undef HAVE_OPENSSL_PEM_H
+
+/* Define if you have the <openssl/rsa.h> header file.  */
+#undef HAVE_OPENSSL_RSA_H
+
+/* Define if you have the <openssl/ssl.h> header file.  */
+#undef HAVE_OPENSSL_SSL_H
+
+/* Define if you have the <openssl/x509.h> header file.  */
+#undef HAVE_OPENSSL_X509_H
+
+/* Define if you have the <pem.h> header file.  */
+#undef HAVE_PEM_H
+
+/* Define if you have the <rsa.h> header file.  */
+#undef HAVE_RSA_H
+
+/* Define if you have the <sgtty.h> header file.  */
+#undef HAVE_SGTTY_H
+
+/* Define if you have the <ssl.h> header file.  */
+#undef HAVE_SSL_H
+
+/* Define if you have the <sys/param.h> header file.  */
+#undef HAVE_SYS_PARAM_H
+
+/* Define if you have the <sys/select.h> header file.  */
+#undef HAVE_SYS_SELECT_H
+
+/* Define if you have the <sys/socket.h> header file.  */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define if you have the <sys/sockio.h> header file.  */
+#undef HAVE_SYS_SOCKIO_H
+
+/* Define if you have the <sys/stat.h> header file.  */
+#undef HAVE_SYS_STAT_H
+
+/* Define if you have the <sys/types.h> header file.  */
+#undef HAVE_SYS_TYPES_H
+
+/* Define if you have the <termio.h> header file.  */
+#undef HAVE_TERMIO_H
+
+/* Define if you have the <termios.h> header file.  */
+#undef HAVE_TERMIOS_H
+
+/* Define if you have the <time.h> header file.  */
+#undef HAVE_TIME_H
+
+/* Define if you have the <unistd.h> header file.  */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <winsock.h> header file.  */
+#undef HAVE_WINSOCK_H
+
+/* Define if you have the <x509.h> header file.  */
+#undef HAVE_X509_H
+
+/* Define if you have the crypto library (-lcrypto).  */
+#undef HAVE_LIBCRYPTO
+
+/* Define if you have the dl library (-ldl).  */
+#undef HAVE_LIBDL
+
+/* Define if you have the nsl library (-lnsl).  */
+#undef HAVE_LIBNSL
+
+/* Define if you have the resolve library (-lresolve).  */
+#undef HAVE_LIBRESOLVE
+
+/* Define if you have the socket library (-lsocket).  */
+#undef HAVE_LIBSOCKET
+
+/* Define if you have the ssl library (-lssl).  */
+#undef HAVE_LIBSSL
+
+/* Define if you have the ucb library (-lucb).  */
+#undef HAVE_LIBUCB
+
+/* Name of package */
+#undef PACKAGE
+
+/* Version number of package */
+#undef VERSION
+
diff --git a/config.log b/config.log
new file mode 100644 (file)
index 0000000..ac13614
--- /dev/null
@@ -0,0 +1,90 @@
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+configure:562: checking for a BSD compatible install
+configure:615: checking whether build environment is sane
+configure:672: checking whether make sets ${MAKE}
+configure:718: checking for working aclocal
+configure:731: checking for working autoconf
+configure:744: checking for working automake
+configure:757: checking for working autoheader
+configure:770: checking for working makeinfo
+configure:787: checking for gcc
+configure:900: checking whether the C compiler (gcc  ) works
+configure:916: gcc -o conftest    conftest.c  1>&5
+configure:942: checking whether the C compiler (gcc  ) is a cross-compiler
+configure:947: checking whether we are using GNU C
+configure:975: checking whether gcc accepts -g
+configure:1018: checking for a BSD compatible install
+configure:1071: checking whether make sets ${MAKE}
+configure:1099: checking how to run the C preprocessor
+configure:1179: checking for AIX
+configure:1205: checking for gethostbyname
+configure:1251: checking for gethostbyname in -lnsl
+configure:1301: checking for strcasecmp
+configure:1397: checking for connect
+configure:1443: checking for connect in -lsocket
+configure:1493: checking for gethostname
+configure:1589: checking for dlopen
+configure:1635: checking for dlopen in -ldl
+configure:1701: checking where to look for SSL
+configure:1713: checking for CRYPTO_lock in -lcrypto
+configure:1762: checking for SSL_connect in -lssl
+configure:1813: checking for openssl/x509.h
+configure:1813: checking for openssl/rsa.h
+configure:1813: checking for openssl/crypto.h
+configure:1813: checking for openssl/pem.h
+configure:1813: checking for openssl/ssl.h
+configure:1813: checking for openssl/err.h
+configure:1903: checking for ANSI C header files
+configure:2032: checking for unistd.h
+configure:2032: checking for arpa/inet.h
+configure:2032: checking for net/if.h
+configure:2032: checking for netinet/in.h
+configure:2032: checking for netdb.h
+configure:2032: checking for sys/select.h
+configure:2032: checking for sys/socket.h
+configure:2032: checking for sys/sockio.h
+configure:2032: checking for sys/stat.h
+configure:2032: checking for sys/types.h
+configure:2032: checking for getopt.h
+configure:2032: checking for sys/param.h
+configure:2032: checking for termios.h
+configure:2032: checking for termio.h
+configure:2032: checking for sgtty.h
+configure:2032: checking for fcntl.h
+configure:2032: checking for dlfcn.h
+configure:2032: checking for alloca.h
+configure:2032: checking for winsock.h
+configure:2032: checking for time.h
+configure:2032: checking for io.h
+configure:2071: checking for working const
+configure:2146: checking for size_t
+configure:2179: checking whether time.h and sys/time.h may both be included
+configure:2218: checking size of long double
+configure:2258: checking size of long long
+configure:2304: checking host system type
+configure:2330: checking return type of signal handlers
+configure:2371: checking for vprintf
+configure:2496: checking for socket
+configure:2496: checking for select
+configure:2496: checking for strdup
+configure:2496: checking for strstr
+configure:2496: checking for strftime
+configure:2496: checking for uname
+configure:2496: checking for strcasecmp
+configure:2496: checking for gethostname
+configure:2496: checking for gethostbyaddr
+configure:2496: checking for getservbyname
+configure:2496: checking for gettimeofday
+configure:2496: checking for inet_addr
+configure:2496: checking for inet_ntoa
+configure:2496: checking for tcsetattr
+configure:2496: checking for tcgetattr
+configure:2496: checking for perror
+configure:2496: checking for getpass
+configure:2496: checking for closesocket
+configure:2554: checking for perl
+configure:2593: checking for nroff
+configure:2633: checking for ranlib
+configure:2665: checking for bison
diff --git a/config.status b/config.status
new file mode 100755 (executable)
index 0000000..8c3de4b
--- /dev/null
@@ -0,0 +1,492 @@
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host pm1:
+#
+# ./configure  --with-ssl=/home/dast
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: ./config.status [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running ${CONFIG_SHELL-/bin/sh} ./configure  --with-ssl=/home/dast --no-create --no-recursion"
+    exec ${CONFIG_SHELL-/bin/sh} ./configure  --with-ssl=/home/dast --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "./config.status generated by autoconf version 2.13"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "$ac_cs_usage"; exit 0 ;;
+  *) echo "$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=.
+ac_given_INSTALL="./install-sh -c"
+
+trap 'rm -fr Makefile     src/Makefile            lib/Makefile            perl/checklinks.pl      perl/getlinks.pl            perl/formfind.pl            perl/recursiveftpget.pl   config.h src/config.h conftest*; exit 1' 1 2 15
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\&%]/\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF
+/^[    ]*VPATH[        ]*=[^:]*$/d
+
+s%@SHELL@%/bin/sh%g
+s%@CFLAGS@%-g -O2%g
+s%@CPPFLAGS@% -I/home/dast/include/openssl -I/home/dast/include%g
+s%@CXXFLAGS@%%g
+s%@FFLAGS@%%g
+s%@DEFS@%-DHAVE_CONFIG_H%g
+s%@LDFLAGS@%%g
+s%@LIBS@%-lssl -lcrypto -ldl -lsocket -lnsl  -L/home/dast/lib%g
+s%@exec_prefix@%${prefix}%g
+s%@prefix@%/usr/local%g
+s%@program_transform_name@%s,x,x,%g
+s%@bindir@%${exec_prefix}/bin%g
+s%@sbindir@%${exec_prefix}/sbin%g
+s%@libexecdir@%${exec_prefix}/libexec%g
+s%@datadir@%${prefix}/share%g
+s%@sysconfdir@%${prefix}/etc%g
+s%@sharedstatedir@%${prefix}/com%g
+s%@localstatedir@%${prefix}/var%g
+s%@libdir@%${exec_prefix}/lib%g
+s%@includedir@%${prefix}/include%g
+s%@oldincludedir@%/usr/include%g
+s%@infodir@%${prefix}/info%g
+s%@mandir@%${prefix}/man%g
+s%@INSTALL_PROGRAM@%${INSTALL}%g
+s%@INSTALL_SCRIPT@%${INSTALL_PROGRAM}%g
+s%@INSTALL_DATA@%${INSTALL} -m 644%g
+s%@PACKAGE@%curl%g
+s%@VERSION@%6.3.1%g
+s%@ACLOCAL@%aclocal%g
+s%@AUTOCONF@%autoconf%g
+s%@AUTOMAKE@%automake%g
+s%@AUTOHEADER@%autoheader%g
+s%@MAKEINFO@%makeinfo%g
+s%@SET_MAKE@%%g
+s%@CC@%gcc%g
+s%@CPP@%gcc -E%g
+s%@host@%sparc-sun-solaris2.6%g
+s%@host_alias@%sparc-sun-solaris2.6%g
+s%@host_cpu@%sparc%g
+s%@host_vendor@%sun%g
+s%@host_os@%solaris2.6%g
+s%@PERL@%/usr/local/bin/perl%g
+s%@NROFF@%/bin/nroff%g
+s%@RANLIB@%ranlib%g
+s%@YACC@%bison -y%g
+
+CEOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+  if test $ac_beg -gt 1; then
+    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+
+CONFIG_FILES=${CONFIG_FILES-"Makefile     src/Makefile            lib/Makefile            perl/checklinks.pl      perl/getlinks.pl            perl/formfind.pl            perl/recursiveftpget.pl  "}
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  case "$ac_given_INSTALL" in
+  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  esac
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([  ]*\)#\([        ]*define[       ][      ]*\)'
+ac_dB='\([     ][      ]*\)[^  ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_uB='\([     ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+  CONFIG_HEADERS="config.h src/config.h"
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  cat $ac_file_inputs > conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}PACKAGE${ac_dB}PACKAGE${ac_dC}"curl"${ac_dD}
+${ac_uA}PACKAGE${ac_uB}PACKAGE${ac_uC}"curl"${ac_uD}
+${ac_eA}PACKAGE${ac_eB}PACKAGE${ac_eC}"curl"${ac_eD}
+${ac_dA}VERSION${ac_dB}VERSION${ac_dC}"6.3.1"${ac_dD}
+${ac_uA}VERSION${ac_uB}VERSION${ac_uC}"6.3.1"${ac_uD}
+${ac_eA}VERSION${ac_eB}VERSION${ac_eC}"6.3.1"${ac_eD}
+${ac_dA}HAVE_LIBNSL${ac_dB}HAVE_LIBNSL${ac_dC}1${ac_dD}
+${ac_uA}HAVE_LIBNSL${ac_uB}HAVE_LIBNSL${ac_uC}1${ac_uD}
+${ac_eA}HAVE_LIBNSL${ac_eB}HAVE_LIBNSL${ac_eC}1${ac_eD}
+${ac_dA}HAVE_LIBSOCKET${ac_dB}HAVE_LIBSOCKET${ac_dC}1${ac_dD}
+${ac_uA}HAVE_LIBSOCKET${ac_uB}HAVE_LIBSOCKET${ac_uC}1${ac_uD}
+${ac_eA}HAVE_LIBSOCKET${ac_eB}HAVE_LIBSOCKET${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}HAVE_LIBDL${ac_dB}HAVE_LIBDL${ac_dC}1${ac_dD}
+${ac_uA}HAVE_LIBDL${ac_uB}HAVE_LIBDL${ac_uC}1${ac_uD}
+${ac_eA}HAVE_LIBDL${ac_eB}HAVE_LIBDL${ac_eC}1${ac_eD}
+${ac_dA}HAVE_LIBCRYPTO${ac_dB}HAVE_LIBCRYPTO${ac_dC}1${ac_dD}
+${ac_uA}HAVE_LIBCRYPTO${ac_uB}HAVE_LIBCRYPTO${ac_uC}1${ac_uD}
+${ac_eA}HAVE_LIBCRYPTO${ac_eB}HAVE_LIBCRYPTO${ac_eC}1${ac_eD}
+${ac_dA}HAVE_LIBSSL${ac_dB}HAVE_LIBSSL${ac_dC}1${ac_dD}
+${ac_uA}HAVE_LIBSSL${ac_uB}HAVE_LIBSSL${ac_uC}1${ac_uD}
+${ac_eA}HAVE_LIBSSL${ac_eB}HAVE_LIBSSL${ac_eC}1${ac_eD}
+${ac_dA}HAVE_OPENSSL_X509_H${ac_dB}HAVE_OPENSSL_X509_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_OPENSSL_X509_H${ac_uB}HAVE_OPENSSL_X509_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_OPENSSL_X509_H${ac_eB}HAVE_OPENSSL_X509_H${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}HAVE_OPENSSL_RSA_H${ac_dB}HAVE_OPENSSL_RSA_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_OPENSSL_RSA_H${ac_uB}HAVE_OPENSSL_RSA_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_OPENSSL_RSA_H${ac_eB}HAVE_OPENSSL_RSA_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_OPENSSL_CRYPTO_H${ac_dB}HAVE_OPENSSL_CRYPTO_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_OPENSSL_CRYPTO_H${ac_uB}HAVE_OPENSSL_CRYPTO_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_OPENSSL_CRYPTO_H${ac_eB}HAVE_OPENSSL_CRYPTO_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_OPENSSL_PEM_H${ac_dB}HAVE_OPENSSL_PEM_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_OPENSSL_PEM_H${ac_uB}HAVE_OPENSSL_PEM_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_OPENSSL_PEM_H${ac_eB}HAVE_OPENSSL_PEM_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_OPENSSL_SSL_H${ac_dB}HAVE_OPENSSL_SSL_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_OPENSSL_SSL_H${ac_uB}HAVE_OPENSSL_SSL_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_OPENSSL_SSL_H${ac_eB}HAVE_OPENSSL_SSL_H${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}HAVE_OPENSSL_ERR_H${ac_dB}HAVE_OPENSSL_ERR_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_OPENSSL_ERR_H${ac_uB}HAVE_OPENSSL_ERR_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_OPENSSL_ERR_H${ac_eB}HAVE_OPENSSL_ERR_H${ac_eC}1${ac_eD}
+${ac_dA}STDC_HEADERS${ac_dB}STDC_HEADERS${ac_dC}1${ac_dD}
+${ac_uA}STDC_HEADERS${ac_uB}STDC_HEADERS${ac_uC}1${ac_uD}
+${ac_eA}STDC_HEADERS${ac_eB}STDC_HEADERS${ac_eC}1${ac_eD}
+${ac_dA}HAVE_UNISTD_H${ac_dB}HAVE_UNISTD_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_UNISTD_H${ac_uB}HAVE_UNISTD_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_UNISTD_H${ac_eB}HAVE_UNISTD_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_ARPA_INET_H${ac_dB}HAVE_ARPA_INET_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_ARPA_INET_H${ac_uB}HAVE_ARPA_INET_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_ARPA_INET_H${ac_eB}HAVE_ARPA_INET_H${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}HAVE_NET_IF_H${ac_dB}HAVE_NET_IF_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_NET_IF_H${ac_uB}HAVE_NET_IF_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_NET_IF_H${ac_eB}HAVE_NET_IF_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_NETINET_IN_H${ac_dB}HAVE_NETINET_IN_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_NETINET_IN_H${ac_uB}HAVE_NETINET_IN_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_NETINET_IN_H${ac_eB}HAVE_NETINET_IN_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_NETDB_H${ac_dB}HAVE_NETDB_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_NETDB_H${ac_uB}HAVE_NETDB_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_NETDB_H${ac_eB}HAVE_NETDB_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_SYS_SELECT_H${ac_dB}HAVE_SYS_SELECT_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_SYS_SELECT_H${ac_uB}HAVE_SYS_SELECT_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_SYS_SELECT_H${ac_eB}HAVE_SYS_SELECT_H${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}HAVE_SYS_SOCKET_H${ac_dB}HAVE_SYS_SOCKET_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_SYS_SOCKET_H${ac_uB}HAVE_SYS_SOCKET_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_SYS_SOCKET_H${ac_eB}HAVE_SYS_SOCKET_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_SYS_SOCKIO_H${ac_dB}HAVE_SYS_SOCKIO_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_SYS_SOCKIO_H${ac_uB}HAVE_SYS_SOCKIO_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_SYS_SOCKIO_H${ac_eB}HAVE_SYS_SOCKIO_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_SYS_STAT_H${ac_dB}HAVE_SYS_STAT_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_SYS_STAT_H${ac_uB}HAVE_SYS_STAT_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_SYS_STAT_H${ac_eB}HAVE_SYS_STAT_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_SYS_TYPES_H${ac_dB}HAVE_SYS_TYPES_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_SYS_TYPES_H${ac_uB}HAVE_SYS_TYPES_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_SYS_TYPES_H${ac_eB}HAVE_SYS_TYPES_H${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}HAVE_SYS_PARAM_H${ac_dB}HAVE_SYS_PARAM_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_SYS_PARAM_H${ac_uB}HAVE_SYS_PARAM_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_SYS_PARAM_H${ac_eB}HAVE_SYS_PARAM_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_TERMIOS_H${ac_dB}HAVE_TERMIOS_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_TERMIOS_H${ac_uB}HAVE_TERMIOS_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_TERMIOS_H${ac_eB}HAVE_TERMIOS_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_TERMIO_H${ac_dB}HAVE_TERMIO_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_TERMIO_H${ac_uB}HAVE_TERMIO_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_TERMIO_H${ac_eB}HAVE_TERMIO_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_SGTTY_H${ac_dB}HAVE_SGTTY_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_SGTTY_H${ac_uB}HAVE_SGTTY_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_SGTTY_H${ac_eB}HAVE_SGTTY_H${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}HAVE_FCNTL_H${ac_dB}HAVE_FCNTL_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_FCNTL_H${ac_uB}HAVE_FCNTL_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_FCNTL_H${ac_eB}HAVE_FCNTL_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_DLFCN_H${ac_dB}HAVE_DLFCN_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_DLFCN_H${ac_uB}HAVE_DLFCN_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_DLFCN_H${ac_eB}HAVE_DLFCN_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_ALLOCA_H${ac_dB}HAVE_ALLOCA_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_ALLOCA_H${ac_uB}HAVE_ALLOCA_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_ALLOCA_H${ac_eB}HAVE_ALLOCA_H${ac_eC}1${ac_eD}
+${ac_dA}HAVE_TIME_H${ac_dB}HAVE_TIME_H${ac_dC}1${ac_dD}
+${ac_uA}HAVE_TIME_H${ac_uB}HAVE_TIME_H${ac_uC}1${ac_uD}
+${ac_eA}HAVE_TIME_H${ac_eB}HAVE_TIME_H${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}TIME_WITH_SYS_TIME${ac_dB}TIME_WITH_SYS_TIME${ac_dC}1${ac_dD}
+${ac_uA}TIME_WITH_SYS_TIME${ac_uB}TIME_WITH_SYS_TIME${ac_uC}1${ac_uD}
+${ac_eA}TIME_WITH_SYS_TIME${ac_eB}TIME_WITH_SYS_TIME${ac_eC}1${ac_eD}
+${ac_dA}SIZEOF_LONG_DOUBLE${ac_dB}SIZEOF_LONG_DOUBLE${ac_dC}16${ac_dD}
+${ac_uA}SIZEOF_LONG_DOUBLE${ac_uB}SIZEOF_LONG_DOUBLE${ac_uC}16${ac_uD}
+${ac_eA}SIZEOF_LONG_DOUBLE${ac_eB}SIZEOF_LONG_DOUBLE${ac_eC}16${ac_eD}
+${ac_dA}SIZEOF_LONG_LONG${ac_dB}SIZEOF_LONG_LONG${ac_dC}8${ac_dD}
+${ac_uA}SIZEOF_LONG_LONG${ac_uB}SIZEOF_LONG_LONG${ac_uC}8${ac_uD}
+${ac_eA}SIZEOF_LONG_LONG${ac_eB}SIZEOF_LONG_LONG${ac_eC}8${ac_eD}
+${ac_dA}OS${ac_dB}OS${ac_dC}"sparc-sun-solaris2.6"${ac_dD}
+${ac_uA}OS${ac_uB}OS${ac_uC}"sparc-sun-solaris2.6"${ac_uD}
+${ac_eA}OS${ac_eB}OS${ac_eC}"sparc-sun-solaris2.6"${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}RETSIGTYPE${ac_dB}RETSIGTYPE${ac_dC}void${ac_dD}
+${ac_uA}RETSIGTYPE${ac_uB}RETSIGTYPE${ac_uC}void${ac_uD}
+${ac_eA}RETSIGTYPE${ac_eB}RETSIGTYPE${ac_eC}void${ac_eD}
+${ac_dA}HAVE_VPRINTF${ac_dB}HAVE_VPRINTF${ac_dC}1${ac_dD}
+${ac_uA}HAVE_VPRINTF${ac_uB}HAVE_VPRINTF${ac_uC}1${ac_uD}
+${ac_eA}HAVE_VPRINTF${ac_eB}HAVE_VPRINTF${ac_eC}1${ac_eD}
+${ac_dA}HAVE_SOCKET${ac_dB}HAVE_SOCKET${ac_dC}1${ac_dD}
+${ac_uA}HAVE_SOCKET${ac_uB}HAVE_SOCKET${ac_uC}1${ac_uD}
+${ac_eA}HAVE_SOCKET${ac_eB}HAVE_SOCKET${ac_eC}1${ac_eD}
+${ac_dA}HAVE_SELECT${ac_dB}HAVE_SELECT${ac_dC}1${ac_dD}
+${ac_uA}HAVE_SELECT${ac_uB}HAVE_SELECT${ac_uC}1${ac_uD}
+${ac_eA}HAVE_SELECT${ac_eB}HAVE_SELECT${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}HAVE_STRDUP${ac_dB}HAVE_STRDUP${ac_dC}1${ac_dD}
+${ac_uA}HAVE_STRDUP${ac_uB}HAVE_STRDUP${ac_uC}1${ac_uD}
+${ac_eA}HAVE_STRDUP${ac_eB}HAVE_STRDUP${ac_eC}1${ac_eD}
+${ac_dA}HAVE_STRSTR${ac_dB}HAVE_STRSTR${ac_dC}1${ac_dD}
+${ac_uA}HAVE_STRSTR${ac_uB}HAVE_STRSTR${ac_uC}1${ac_uD}
+${ac_eA}HAVE_STRSTR${ac_eB}HAVE_STRSTR${ac_eC}1${ac_eD}
+${ac_dA}HAVE_STRFTIME${ac_dB}HAVE_STRFTIME${ac_dC}1${ac_dD}
+${ac_uA}HAVE_STRFTIME${ac_uB}HAVE_STRFTIME${ac_uC}1${ac_uD}
+${ac_eA}HAVE_STRFTIME${ac_eB}HAVE_STRFTIME${ac_eC}1${ac_eD}
+${ac_dA}HAVE_UNAME${ac_dB}HAVE_UNAME${ac_dC}1${ac_dD}
+${ac_uA}HAVE_UNAME${ac_uB}HAVE_UNAME${ac_uC}1${ac_uD}
+${ac_eA}HAVE_UNAME${ac_eB}HAVE_UNAME${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}HAVE_STRCASECMP${ac_dB}HAVE_STRCASECMP${ac_dC}1${ac_dD}
+${ac_uA}HAVE_STRCASECMP${ac_uB}HAVE_STRCASECMP${ac_uC}1${ac_uD}
+${ac_eA}HAVE_STRCASECMP${ac_eB}HAVE_STRCASECMP${ac_eC}1${ac_eD}
+${ac_dA}HAVE_GETHOSTNAME${ac_dB}HAVE_GETHOSTNAME${ac_dC}1${ac_dD}
+${ac_uA}HAVE_GETHOSTNAME${ac_uB}HAVE_GETHOSTNAME${ac_uC}1${ac_uD}
+${ac_eA}HAVE_GETHOSTNAME${ac_eB}HAVE_GETHOSTNAME${ac_eC}1${ac_eD}
+${ac_dA}HAVE_GETHOSTBYADDR${ac_dB}HAVE_GETHOSTBYADDR${ac_dC}1${ac_dD}
+${ac_uA}HAVE_GETHOSTBYADDR${ac_uB}HAVE_GETHOSTBYADDR${ac_uC}1${ac_uD}
+${ac_eA}HAVE_GETHOSTBYADDR${ac_eB}HAVE_GETHOSTBYADDR${ac_eC}1${ac_eD}
+${ac_dA}HAVE_GETSERVBYNAME${ac_dB}HAVE_GETSERVBYNAME${ac_dC}1${ac_dD}
+${ac_uA}HAVE_GETSERVBYNAME${ac_uB}HAVE_GETSERVBYNAME${ac_uC}1${ac_uD}
+${ac_eA}HAVE_GETSERVBYNAME${ac_eB}HAVE_GETSERVBYNAME${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}HAVE_GETTIMEOFDAY${ac_dB}HAVE_GETTIMEOFDAY${ac_dC}1${ac_dD}
+${ac_uA}HAVE_GETTIMEOFDAY${ac_uB}HAVE_GETTIMEOFDAY${ac_uC}1${ac_uD}
+${ac_eA}HAVE_GETTIMEOFDAY${ac_eB}HAVE_GETTIMEOFDAY${ac_eC}1${ac_eD}
+${ac_dA}HAVE_INET_ADDR${ac_dB}HAVE_INET_ADDR${ac_dC}1${ac_dD}
+${ac_uA}HAVE_INET_ADDR${ac_uB}HAVE_INET_ADDR${ac_uC}1${ac_uD}
+${ac_eA}HAVE_INET_ADDR${ac_eB}HAVE_INET_ADDR${ac_eC}1${ac_eD}
+${ac_dA}HAVE_INET_NTOA${ac_dB}HAVE_INET_NTOA${ac_dC}1${ac_dD}
+${ac_uA}HAVE_INET_NTOA${ac_uB}HAVE_INET_NTOA${ac_uC}1${ac_uD}
+${ac_eA}HAVE_INET_NTOA${ac_eB}HAVE_INET_NTOA${ac_eC}1${ac_eD}
+${ac_dA}HAVE_TCSETATTR${ac_dB}HAVE_TCSETATTR${ac_dC}1${ac_dD}
+${ac_uA}HAVE_TCSETATTR${ac_uB}HAVE_TCSETATTR${ac_uC}1${ac_uD}
+${ac_eA}HAVE_TCSETATTR${ac_eB}HAVE_TCSETATTR${ac_eC}1${ac_eD}
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  cat > conftest.frag <<CEOF
+${ac_dA}HAVE_TCGETATTR${ac_dB}HAVE_TCGETATTR${ac_dC}1${ac_dD}
+${ac_uA}HAVE_TCGETATTR${ac_uB}HAVE_TCGETATTR${ac_uC}1${ac_uD}
+${ac_eA}HAVE_TCGETATTR${ac_eB}HAVE_TCGETATTR${ac_eC}1${ac_eD}
+${ac_dA}HAVE_PERROR${ac_dB}HAVE_PERROR${ac_dC}1${ac_dD}
+${ac_uA}HAVE_PERROR${ac_uB}HAVE_PERROR${ac_uC}1${ac_uD}
+${ac_eA}HAVE_PERROR${ac_eB}HAVE_PERROR${ac_eC}1${ac_eD}
+${ac_dA}HAVE_GETPASS${ac_dB}HAVE_GETPASS${ac_dC}1${ac_dD}
+${ac_uA}HAVE_GETPASS${ac_uB}HAVE_GETPASS${ac_uC}1${ac_uD}
+${ac_eA}HAVE_GETPASS${ac_eB}HAVE_GETPASS${ac_eC}1${ac_eD}
+s%^[   ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    # Remove last slash and all that follows it.  Not all systems have dirname.
+      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+      # The file is in a subdirectory.
+      test ! -d "$ac_dir" && mkdir "$ac_dir"
+    fi
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
+
+
+am_indx=1
+for am_file in config.h src/config.h; do
+  case " $CONFIG_HEADERS " in
+  *" $am_file "*)
+    echo timestamp > `echo $am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
+    ;;
+  esac
+  am_indx=`expr "$am_indx" + 1`
+done
+
+exit 0
diff --git a/config.sub b/config.sub
new file mode 100755 (executable)
index 0000000..ecf770c
--- /dev/null
@@ -0,0 +1,979 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+#   Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+       echo Configuration name missing. 1>&2
+       echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+       echo "or     $0 ALIAS" 1>&2
+       echo where ALIAS is a recognized configuration type. 1>&2
+       exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+       *local*)
+               echo $1
+               exit 0
+               ;;
+       *)
+       ;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  linux-gnu*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple)
+               os=
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco5)
+               os=sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+               | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
+               | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 | hppa2.0 \
+               | hppa2.0w \
+               | alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
+               | i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
+               | mips64 | mipsel | mips64el | mips64orion | mips64orionel \
+               | mipstx39 | mipstx39el | armv[34][lb] \
+               | sparc | sparclet | sparclite | sparc64 | v850)
+               basic_machine=$basic_machine-unknown
+               ;;
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i[34567]86)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
+             | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+             | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+             | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
+             | xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* \
+             | hppa2.0w-* \
+             | alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \
+             | ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
+             | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+             | sparc64-* | mips64-* | mipsel-* | armv[34][lb]-*\
+             | mips64el-* | mips64orion-* | mips64orionel-*  \
+             | mipstx39-* | mipstx39el-* \
+             | f301-* | armv*-*)
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-cbm
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-cbm
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-cbm
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       cray2)
+               basic_machine=cray2-cray
+               os=-unicos
+               ;;
+       [ctj]90-cray)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               os=-mpeix
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               os=-mpeix
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i[34567]86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i[34567]86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i[34567]86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i[34567]86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       mipsel*-linux*)
+               basic_machine=mipsel-unknown
+               os=-linux-gnu
+               ;;
+       mips*-linux*)
+               basic_machine=mips-unknown
+               os=-linux-gnu
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netwinder)
+               basic_machine=armv4l-corel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+        pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pentium | p5 | k5 | nexen)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | k6 | 6x86)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2)
+               basic_machine=i786-pc
+               ;;
+       pentium-* | p5-* | k5-* | nexen-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | k6-* | 6x86-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-*)
+               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=rs6000-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       xmp)
+               basic_machine=xmp-cray
+               os=-unicos
+               ;;
+        xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       mips)
+               if [ x$os = x-linux-gnu ]; then
+                       basic_machine=mips-unknown
+               else
+                       basic_machine=mips-mips
+               fi
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sparc)
+               basic_machine=sparc-sun
+               ;;
+        cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -rhapsody* \
+             | -openstep* | -mpeix* | -oskit*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-corel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+        pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+        *-gould)
+               os=-sysv
+               ;;
+        *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+        *-sgi)
+               os=-irix
+               ;;
+        *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f301-fujitsu)
+               os=-uxpv
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -aix*)
+                               vendor=ibm
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -vxsim* | -vxworks*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
diff --git a/config.sub-991124 b/config.sub-991124
new file mode 100755 (executable)
index 0000000..e24b850
--- /dev/null
@@ -0,0 +1,952 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+#   Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+       echo Configuration name missing. 1>&2
+       echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+       echo "or     $0 ALIAS" 1>&2
+       echo where ALIAS is a recognized configuration type. 1>&2
+       exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+       *local*)
+               echo $1
+               exit 0
+               ;;
+       *)
+       ;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  linux-gnu*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple)
+               os=
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco5)
+               os=sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+               | arme[lb] | pyramid | mn10200 | mn10300 \
+               | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
+               | alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
+               | i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
+               | mips64 | mipsel | mips64el | mips64orion | mips64orionel \
+               | mipstx39 | mipstx39el \
+               | sparc | sparclet | sparclite | sparc64 | v850)
+               basic_machine=$basic_machine-unknown
+               ;;
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i[34567]86)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
+             | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+             | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+             | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
+             | xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* \
+             | alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \
+             | ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
+             | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+             | sparc64-* | mips64-* | mipsel-* \
+             | mips64el-* | mips64orion-* | mips64orionel-*  \
+             | mipstx39-* | mipstx39el-* \
+             | f301-*)
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-cbm
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-cbm
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-cbm
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       cray2)
+               basic_machine=cray2-cray
+               os=-unicos
+               ;;
+       [ctj]90-cray)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i[34567]86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i[34567]86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i[34567]86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i[34567]86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       mipsel*-linux*)
+               basic_machine=mipsel-unknown
+               os=-linux-gnu
+               ;;
+       mips*-linux*)
+               basic_machine=mips-unknown
+               os=-linux-gnu
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+        pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pentium | p5 | k5 | nexen)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | k6 | 6x86)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2)
+               basic_machine=i786-pc
+               ;;
+       pentium-* | p5-* | k5-* | nexen-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | k6-* | 6x86-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-*)
+               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=rs6000-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       xmp)
+               basic_machine=xmp-cray
+               os=-unicos
+               ;;
+        xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       mips)
+               if [ x$os = x-linux-gnu ]; then
+                       basic_machine=mips-unknown
+               else
+                       basic_machine=mips-mips
+               fi
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sparc)
+               basic_machine=sparc-sun
+               ;;
+        cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -uxpv*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+        pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+        *-gould)
+               os=-sysv
+               ;;
+        *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+        *-sgi)
+               os=-irix
+               ;;
+        *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f301-fujitsu)
+               os=-uxpv
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -aix*)
+                               vendor=ibm
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -vxsim* | -vxworks*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..51b1b3d
--- /dev/null
+++ b/configure
@@ -0,0 +1,3091 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+  --with-ssl[=DIR]        where to look for SSL [compiler/linker default paths]
+                          DIR points to the SSL installation [/usr/local/ssl]"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir="$ac_optarg" ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [same as prefix]
+  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+  --datadir=DIR           read-only architecture-independent data in DIR
+                          [PREFIX/share]
+  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+                          [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+  --includedir=DIR        C header files in DIR [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+  --infodir=DIR           info documentation in DIR [PREFIX/info]
+  --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
+EOF
+    cat << EOF
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+EOF
+    if test -n "$ac_help"; then
+      echo "--enable and --with options recognized:$ac_help"
+    fi
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir="$ac_optarg" ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir="$ac_optarg" ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir="$ac_optarg" ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir="$ac_optarg" ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir="$ac_optarg" ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir="$ac_optarg" ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir="$ac_optarg" ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir="$ac_optarg" ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.13"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *)
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set.  These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=lib/urldata.h
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='       '
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:562: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         else
+           ac_cv_path_install="$ac_dir/$ac_prog -c"
+           break 2
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL="$ac_cv_path_install"
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:615: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "$*" != "X $srcdir/configure conftestfile" \
+      && test "$*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { echo "configure: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+   fi
+
+   test "$2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+  program_transform_name=
+else
+  # Double any \ or $.  echo might interpret backslashes.
+  cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+  program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+  rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:672: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftestmake <<\EOF
+all:
+       @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SET_MAKE=
+else
+  echo "$ac_t""no" 1>&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+PACKAGE=curl
+
+VERSION="6.3.1"
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:718: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+   ACLOCAL=aclocal
+   echo "$ac_t""found" 1>&6
+else
+   ACLOCAL="$missing_dir/missing aclocal"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:731: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+   AUTOCONF=autoconf
+   echo "$ac_t""found" 1>&6
+else
+   AUTOCONF="$missing_dir/missing autoconf"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:744: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+   AUTOMAKE=automake
+   echo "$ac_t""found" 1>&6
+else
+   AUTOMAKE="$missing_dir/missing automake"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:757: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+   AUTOHEADER=autoheader
+   echo "$ac_t""found" 1>&6
+else
+   AUTOHEADER="$missing_dir/missing autoheader"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:770: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+   MAKEINFO=makeinfo
+   echo "$ac_t""found" 1>&6
+else
+   MAKEINFO="$missing_dir/missing makeinfo"
+   echo "$ac_t""missing" 1>&6
+fi
+
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:787: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:817: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_prog_rejected=no
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+        ac_prog_rejected=yes
+       continue
+      fi
+      ac_cv_prog_CC="cc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# -gt 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    set dummy "$ac_dir/$ac_word" "$@"
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:868: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+ ;;
+    esac
+  fi
+  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:900: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 911 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:916: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cc_works=yes
+  # If we can't run a trivial program, we are probably using a cross compiler.
+  if (./conftest; exit) 2>/dev/null; then
+    ac_cv_prog_cc_cross=no
+  else
+    ac_cv_prog_cc_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:942: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:947: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:956: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:975: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_cc_g=yes
+else
+  ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:1018: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         else
+           ac_cv_path_install="$ac_dir/$ac_prog -c"
+           break 2
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL="$ac_cv_path_install"
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:1071: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftestmake <<\EOF
+all:
+       @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SET_MAKE=
+else
+  echo "$ac_t""no" 1>&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1099: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 1114 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1120: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 1131 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1137: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 1148 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1154: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for AIX""... $ac_c" 1>&6
+echo "configure:1179: checking for AIX" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1181 "configure"
+#include "confdefs.h"
+#ifdef _AIX
+  yes
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "yes" >/dev/null 2>&1; then
+  rm -rf conftest*
+  echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
+#define _ALL_SOURCE 1
+EOF
+
+else
+  rm -rf conftest*
+  echo "$ac_t""no" 1>&6
+fi
+rm -f conftest*
+
+
+
+
+echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
+echo "configure:1205: checking for gethostbyname" >&5
+if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1210 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char gethostbyname(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char gethostbyname();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
+choke me
+#else
+gethostbyname();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1233: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_gethostbyname=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_gethostbyname=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
+echo "configure:1251: checking for gethostbyname in -lnsl" >&5
+ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lnsl  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1259 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char gethostbyname();
+
+int main() {
+gethostbyname()
+; return 0; }
+EOF
+if { (eval echo configure:1270: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_lib=HAVE_LIB`echo nsl | sed -e 's/^a-zA-Z0-9_/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lnsl $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+
+echo $ac_n "checking for strcasecmp""... $ac_c" 1>&6
+echo "configure:1301: checking for strcasecmp" >&5
+if eval "test \"`echo '$''{'ac_cv_func_strcasecmp'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1306 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char strcasecmp(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char strcasecmp();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_strcasecmp) || defined (__stub___strcasecmp)
+choke me
+#else
+strcasecmp();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1329: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_strcasecmp=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_strcasecmp=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'strcasecmp`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for strcasecmp in -lresolve""... $ac_c" 1>&6
+echo "configure:1347: checking for strcasecmp in -lresolve" >&5
+ac_lib_var=`echo resolve'_'strcasecmp | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lresolve  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1355 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char strcasecmp();
+
+int main() {
+strcasecmp()
+; return 0; }
+EOF
+if { (eval echo configure:1366: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_lib=HAVE_LIB`echo resolve | sed -e 's/^a-zA-Z0-9_/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lresolve $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+
+echo $ac_n "checking for connect""... $ac_c" 1>&6
+echo "configure:1397: checking for connect" >&5
+if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1402 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char connect(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char connect();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_connect) || defined (__stub___connect)
+choke me
+#else
+connect();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1425: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_connect=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_connect=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
+echo "configure:1443: checking for connect in -lsocket" >&5
+ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lsocket  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1451 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char connect();
+
+int main() {
+connect()
+; return 0; }
+EOF
+if { (eval echo configure:1462: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_lib=HAVE_LIB`echo socket | sed -e 's/^a-zA-Z0-9_/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lsocket $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+
+echo $ac_n "checking for gethostname""... $ac_c" 1>&6
+echo "configure:1493: checking for gethostname" >&5
+if eval "test \"`echo '$''{'ac_cv_func_gethostname'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1498 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char gethostname(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char gethostname();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_gethostname) || defined (__stub___gethostname)
+choke me
+#else
+gethostname();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1521: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_gethostname=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_gethostname=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'gethostname`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for gethostname in -lucb""... $ac_c" 1>&6
+echo "configure:1539: checking for gethostname in -lucb" >&5
+ac_lib_var=`echo ucb'_'gethostname | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lucb  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1547 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char gethostname();
+
+int main() {
+gethostname()
+; return 0; }
+EOF
+if { (eval echo configure:1558: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_lib=HAVE_LIB`echo ucb | sed -e 's/^a-zA-Z0-9_/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lucb $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+
+echo $ac_n "checking for dlopen""... $ac_c" 1>&6
+echo "configure:1589: checking for dlopen" >&5
+if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1594 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char dlopen(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char dlopen();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+dlopen();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_dlopen=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_dlopen=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
+echo "configure:1635: checking for dlopen in -ldl" >&5
+ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldl  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1643 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char dlopen();
+
+int main() {
+dlopen()
+; return 0; }
+EOF
+if { (eval echo configure:1654: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_lib=HAVE_LIB`echo dl | sed -e 's/^a-zA-Z0-9_/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-ldl $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+
+
+OPT_SSL=off
+# Check whether --with-ssl or --without-ssl was given.
+if test "${with_ssl+set}" = set; then
+  withval="$with_ssl"
+  OPT_SSL=$withval
+
+fi
+
+
+if test X"$OPT_SSL" = Xno
+then
+  echo "configure: warning: SSL/https support disabled" 1>&2  
+else
+
+  
+  echo $ac_n "checking where to look for SSL""... $ac_c" 1>&6
+echo "configure:1701: checking where to look for SSL" >&5
+  if test X"$OPT_SSL" = Xoff
+  then
+       echo "$ac_t""defaults (or given in environment)" 1>&6
+  else
+       test X"$OPT_SSL" = Xyes && OPT_SSL=/usr/local/ssl
+       LIBS="$LIBS -L$OPT_SSL/lib"
+       CPPFLAGS="$CPPFLAGS -I$OPT_SSL/include/openssl -I$OPT_SSL/include"
+       echo "$ac_t""$OPT_SSL" 1>&6
+  fi
+
+    echo $ac_n "checking for CRYPTO_lock in -lcrypto""... $ac_c" 1>&6
+echo "configure:1713: checking for CRYPTO_lock in -lcrypto" >&5
+ac_lib_var=`echo crypto'_'CRYPTO_lock | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lcrypto  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1721 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char CRYPTO_lock();
+
+int main() {
+CRYPTO_lock()
+; return 0; }
+EOF
+if { (eval echo configure:1732: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_lib=HAVE_LIB`echo crypto | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lcrypto $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+  if test $ac_cv_lib_crypto_CRYPTO_lock = yes; then
+            echo $ac_n "checking for SSL_connect in -lssl""... $ac_c" 1>&6
+echo "configure:1762: checking for SSL_connect in -lssl" >&5
+ac_lib_var=`echo ssl'_'SSL_connect | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lssl  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1770 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char SSL_connect();
+
+int main() {
+SSL_connect()
+; return 0; }
+EOF
+if { (eval echo configure:1781: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_lib=HAVE_LIB`echo ssl | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lssl $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+        for ac_hdr in openssl/x509.h openssl/rsa.h openssl/crypto.h openssl/pem.h openssl/ssl.h openssl/err.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1813: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1818 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1823: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+    if test $ac_cv_header_openssl_x509_h = no; then
+      for ac_hdr in x509.h rsa.h crypto.h pem.h ssl.h err.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1855: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1860 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1865: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+    fi
+
+  fi
+fi
+
+
+
+
+
+
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1903: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1908 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1916: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  ac_cv_header_stdc=yes
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1933 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "memchr" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1951 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "free" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+  :
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1972 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1983: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+  cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+for ac_hdr in \
+        unistd.h \
+        arpa/inet.h \
+        net/if.h \
+        netinet/in.h \
+        netdb.h \
+        sys/select.h \
+        sys/socket.h \
+        sys/sockio.h \
+        sys/stat.h \
+        sys/types.h \
+        getopt.h \
+        sys/param.h \
+        termios.h \
+        termio.h \
+        sgtty.h \
+        fcntl.h \
+        dlfcn.h \
+        alloca.h \
+        winsock.h \
+        time.h \
+        io.h \
+
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2032: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2037 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2042: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:2071: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2076 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this.  */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this.  */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this.  */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+   It does not let you subtract one const X* pointer from another in an arm
+   of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this.  */
+  char *t;
+  char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+  *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+  int x[] = {25, 17};
+  const int *foo = &x[0];
+  ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+  typedef const int *iptr;
+  iptr p = 0;
+  ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+  struct s { int j; const int *ap[3]; };
+  struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+  const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:2125: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_c_const=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+  cat >> confdefs.h <<\EOF
+#define const 
+EOF
+
+fi
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:2146: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2151 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_size_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+  cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
+echo "configure:2179: checking whether time.h and sys/time.h may both be included" >&5
+if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2184 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+int main() {
+struct tm *tp;
+; return 0; }
+EOF
+if { (eval echo configure:2193: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_header_time=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_time=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_time" 1>&6
+if test $ac_cv_header_time = yes; then
+  cat >> confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
+
+fi
+
+
+# mprintf() checks:
+
+# check for 'long double'
+echo $ac_n "checking size of long double""... $ac_c" 1>&6
+echo "configure:2218: checking size of long double" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_long_double=8
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2226 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(long double));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2237: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_long_double=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_long_double=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_long_double" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
+EOF
+
+
+# check for 'long long'
+echo $ac_n "checking size of long long""... $ac_c" 1>&6
+echo "configure:2258: checking size of long long" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_long_long=4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2266 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(long long));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2277: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_long_long=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_long_long=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_long_long" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+EOF
+
+
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:2304: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+  case $nonopt in
+  NONE)
+    if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+    else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+    fi ;;
+  *) host_alias=$nonopt ;;
+  esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+cat >> confdefs.h <<EOF
+#define OS "${host}"
+EOF
+
+
+echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
+echo "configure:2330: checking return type of signal handlers" >&5
+if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2335 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+#ifdef __cplusplus
+extern "C" void (*signal (int, void (*)(int)))(int);
+#else
+void (*signal ()) ();
+#endif
+
+int main() {
+int i;
+; return 0; }
+EOF
+if { (eval echo configure:2352: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_type_signal=void
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_type_signal=int
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_type_signal" 1>&6
+cat >> confdefs.h <<EOF
+#define RETSIGTYPE $ac_cv_type_signal
+EOF
+
+
+echo $ac_n "checking for vprintf""... $ac_c" 1>&6
+echo "configure:2371: checking for vprintf" >&5
+if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2376 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char vprintf(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char vprintf();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_vprintf) || defined (__stub___vprintf)
+choke me
+#else
+vprintf();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2399: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_VPRINTF 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test "$ac_cv_func_vprintf" != yes; then
+echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
+echo "configure:2423: checking for _doprnt" >&5
+if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2428 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char _doprnt(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char _doprnt();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub__doprnt) || defined (__stub____doprnt)
+choke me
+#else
+_doprnt();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_DOPRNT 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+for ac_func in socket \
+                select \
+                strdup \
+                strstr \
+                strftime \
+                uname \
+                strcasecmp \
+                gethostname \
+                gethostbyaddr \
+                getservbyname \
+                gettimeofday \
+                inet_addr \
+                inet_ntoa \
+                tcsetattr \
+                tcgetattr \
+                perror \
+                getpass \
+                closesocket
+
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2496: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2501 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2524: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+
+
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2554: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$PERL" in
+  /*)
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+  ;;
+  ?:/*)                         
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin "
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_PERL="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+PERL="$ac_cv_path_PERL"
+if test -n "$PERL"; then
+  echo "$ac_t""$PERL" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+
+for ac_prog in nroff gnroff
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2593: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_NROFF'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$NROFF" in
+  /*)
+  ac_cv_path_NROFF="$NROFF" # Let the user override the test with a path.
+  ;;
+  ?:/*)                         
+  ac_cv_path_NROFF="$NROFF" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH:/usr/bin/:/usr/local/bin "
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_NROFF="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+NROFF="$ac_cv_path_NROFF"
+if test -n "$NROFF"; then
+  echo "$ac_t""$NROFF" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$NROFF" && break
+done
+
+
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2633: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_RANLIB="ranlib"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+for ac_prog in 'bison -y' byacc
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2665: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$YACC"; then
+  ac_cv_prog_YACC="$YACC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_YACC="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+YACC="$ac_cv_prog_YACC"
+if test -n "$YACC"; then
+  echo "$ac_t""$YACC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+  case `(ac_space=' '; set | grep ac_space) 2>&1` in
+  *ac_space=\ *)
+    # `set' does not quote correctly, so add quotes (double-quote substitution
+    # turns \\\\ into \\, and sed turns \\ into \).
+    sed -n \
+      -e "s/'/'\\\\''/g" \
+      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+    ;;
+  *)
+    # `set' quotes correctly as required by POSIX, so do not add quotes.
+    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    ;;
+  esac >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.13"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile \
+          src/Makefile \
+           lib/Makefile \
+          perl/checklinks.pl \
+          perl/getlinks.pl \
+           perl/formfind.pl \
+          perl/recursiveftpget.pl   config.h src/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@PERL@%$PERL%g
+s%@NROFF@%$NROFF%g
+s%@RANLIB@%$RANLIB%g
+s%@YACC@%$YACC%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+  if test $ac_beg -gt 1; then
+    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile \
+          src/Makefile \
+           lib/Makefile \
+          perl/checklinks.pl \
+          perl/getlinks.pl \
+           perl/formfind.pl \
+          perl/recursiveftpget.pl  "}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  case "$ac_given_INSTALL" in
+  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  esac
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([  ]*\)#\([        ]*define[       ][      ]*\)'
+ac_dB='\([     ][      ]*\)[^  ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_uB='\([     ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+  CONFIG_HEADERS="config.h src/config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h.  And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[   ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+  ac_lines=`grep -c . conftest.vals`
+  # grep -c gives empty output for an empty file on some AIX systems.
+  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+  # Write a limited-size here document to conftest.frag.
+  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  echo 'CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    # Remove last slash and all that follows it.  Not all systems have dirname.
+      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+      # The file is in a subdirectory.
+      test ! -d "$ac_dir" && mkdir "$ac_dir"
+    fi
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+am_indx=1
+for am_file in config.h src/config.h; do
+  case " $CONFIG_HEADERS " in
+  *" $am_file "*)
+    echo timestamp > `echo $am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
+    ;;
+  esac
+  am_indx=`expr "$am_indx" + 1`
+done
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/configure.in b/configure.in
new file mode 100644 (file)
index 0000000..17418fd
--- /dev/null
@@ -0,0 +1,210 @@
+dnl $Id$
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(lib/urldata.h)
+AM_CONFIG_HEADER(config.h src/config.h)
+AM_INIT_AUTOMAKE(curl,"6.3.1")
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_MAKE_SET
+
+dnl Check for AIX weirdos
+AC_AIX
+
+dnl **********************************************************************
+dnl Checks for libraries.
+dnl **********************************************************************
+
+dnl nsl lib?
+AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, gethostbyname))
+
+dnl resolve lib?
+AC_CHECK_FUNC(strcasecmp, , AC_CHECK_LIB(resolve, strcasecmp))
+
+dnl socket lib?
+AC_CHECK_FUNC(connect, , AC_CHECK_LIB(socket, connect))
+
+dnl ucb lib?
+AC_CHECK_FUNC(gethostname, , AC_CHECK_LIB(ucb, gethostname))
+
+dnl dl lib?
+AC_CHECK_FUNC(dlopen, , AC_CHECK_LIB(dl, dlopen))
+
+dnl **********************************************************************
+dnl Check for the presence of SSL libraries and headers
+dnl **********************************************************************
+
+dnl Default to compiler & linker defaults for SSL files & libraries.
+OPT_SSL=off
+AC_ARG_WITH(ssl,dnl
+[  --with-ssl[=DIR]        where to look for SSL [compiler/linker default paths]
+                          DIR points to the SSL installation [/usr/local/ssl]],
+  OPT_SSL=$withval
+)
+
+if test X"$OPT_SSL" = Xno
+then
+  AC_MSG_WARN(SSL/https support disabled)  
+else
+
+  dnl Check for & handle argument to --with-ssl.
+
+  AC_MSG_CHECKING(where to look for SSL)
+  if test X"$OPT_SSL" = Xoff
+  then
+       AC_MSG_RESULT([defaults (or given in environment)])
+  else
+       test X"$OPT_SSL" = Xyes && OPT_SSL=/usr/local/ssl
+       LIBS="$LIBS -L$OPT_SSL/lib"
+       CPPFLAGS="$CPPFLAGS -I$OPT_SSL/include/openssl -I$OPT_SSL/include"
+       AC_MSG_RESULT([$OPT_SSL])
+  fi
+
+  dnl check for crypto libs (part of SSLeay)
+  AC_CHECK_LIB(crypto, CRYPTO_lock)
+
+  if test $ac_cv_lib_crypto_CRYPTO_lock = yes; then
+    dnl This is only reasonable to do if crypto actually is there: check for
+    dnl SSL libs NOTE: it is important to do this AFTER the crypto lib
+    AC_CHECK_LIB(ssl, SSL_connect)
+
+    dnl Check for SSLeay headers
+    AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h openssl/pem.h openssl/ssl.h openssl/err.h)
+
+    if test $ac_cv_header_openssl_x509_h = no; then
+      AC_CHECK_HEADERS(x509.h rsa.h crypto.h pem.h ssl.h err.h)
+    fi
+
+  fi
+fi
+
+dnl **********************************************************************
+dnl Check for the presence of ZLIB libraries and headers
+dnl **********************************************************************
+
+dnl Default to compiler & linker defaults for files & libraries.
+dnl OPT_ZLIB=no
+dnl AC_ARG_WITH(zlib,dnl
+dnl [  --with-zlib[=DIR]  where to look for ZLIB [compiler/linker default paths]
+dnl                      DIR points to the ZLIB installation prefix [/usr/local]],
+dnl  OPT_ZLIB=$withval,
+dnl )
+
+dnl Check for & handle argument to --with-zlib.
+dnl
+dnl NOTE:  We *always* look for ZLIB headers & libraries, all this option
+dnl        does is change where we look (by adjusting LIBS and CPPFLAGS.)
+dnl
+
+dnl AC_MSG_CHECKING(where to look for ZLIB)
+dnl if test X"$OPT_ZLIB" = Xno
+dnl then
+dnl    AC_MSG_RESULT([defaults (or given in environment)])
+dnl else
+dnl    test X"$OPT_ZLIB" = Xyes && OPT_ZLIB=/usr/local
+dnl    LIBS="$LIBS -L$OPT_ZLIB/lib"
+dnl    CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include"
+dnl    AC_MSG_RESULT([$OPT_ZLIB])
+dnl fi
+
+dnl z lib?
+dnl AC_CHECK_FUNC(gzread, , AC_CHECK_LIB(z, gzread))
+
+dnl **********************************************************************
+dnl Back to "normal" configuring
+dnl **********************************************************************
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS( \
+        unistd.h \
+        arpa/inet.h \
+        net/if.h \
+        netinet/in.h \
+        netdb.h \
+        sys/select.h \
+        sys/socket.h \
+        sys/sockio.h \
+        sys/stat.h \
+        sys/types.h \
+        getopt.h \
+        sys/param.h \
+        termios.h \
+        termio.h \
+        sgtty.h \
+        fcntl.h \
+        dlfcn.h \
+        alloca.h \
+        winsock.h \
+        time.h \
+        io.h \
+)
+
+dnl Check for libz header
+dnl AC_CHECK_HEADERS(zlib.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_SIZE_T
+AC_HEADER_TIME
+
+# mprintf() checks:
+
+# check for 'long double'
+AC_CHECK_SIZEOF(long double, 8)
+# check for 'long long'
+AC_CHECK_SIZEOF(long long, 4)
+
+dnl Get system canonical name
+AC_CANONICAL_HOST
+AC_DEFINE_UNQUOTED(OS, "${host}")
+
+dnl Checks for library functions.
+dnl AC_PROG_GCC_TRADITIONAL
+AC_TYPE_SIGNAL
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS( socket \
+                select \
+                strdup \
+                strstr \
+                strftime \
+                uname \
+                strcasecmp \
+                gethostname \
+                gethostbyaddr \
+                getservbyname \
+                gettimeofday \
+                inet_addr \
+                inet_ntoa \
+                tcsetattr \
+                tcgetattr \
+                perror \
+                getpass \
+                closesocket
+)
+
+
+
+AC_PATH_PROG( PERL, perl, , 
+  $PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin )
+AC_SUBST(PERL)
+
+AC_PATH_PROGS( NROFF, nroff gnroff, , 
+  $PATH:/usr/bin/:/usr/local/bin )
+AC_SUBST(NROFF)
+
+AC_PROG_RANLIB
+AC_PROG_YACC
+
+dnl AC_PATH_PROG( RANLIB, ranlib, /usr/bin/ranlib, 
+dnl   $PATH:/usr/bin/:/usr/local/bin )
+dnl AC_SUBST(RANLIB)
+
+AC_OUTPUT( Makefile \
+          src/Makefile \
+           lib/Makefile \
+          perl/checklinks.pl \
+          perl/getlinks.pl \
+           perl/formfind.pl \
+          perl/recursiveftpget.pl  )
diff --git a/curl-6.3.1.tar.gz b/curl-6.3.1.tar.gz
new file mode 100644 (file)
index 0000000..38bba51
Binary files /dev/null and b/curl-6.3.1.tar.gz differ
diff --git a/curl-ssl.spec b/curl-ssl.spec
new file mode 100644 (file)
index 0000000..1d69342
--- /dev/null
@@ -0,0 +1,52 @@
+%define name curl-ssl
+%define tarball curl
+%define version 6.0
+%define release 1
+%define prefix /usr/local
+
+%define builddir $RPM_BUILD_DIR/%{tarball}-%{version}
+
+Summary: get a file from a FTP, GOPHER or HTTP server.
+Name: %{name}
+Version: %{version}
+Release: %{release}
+Copyright: MPL
+Vendor: Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+Packager: Troy Engel <tengel@sonic.net>
+Group: Utilities/Console
+Source: %{tarball}-%{version}.tar.gz
+URL: http://curl.haxx.nu/
+BuildRoot: /tmp/%{tarball}-%{version}-root
+
+%description
+curl is a client to get documents/files from servers, using any of the
+supported protocols. The command is designed to work without user
+interaction or any kind of interactivity.
+
+curl offers a busload of useful tricks like proxy support, user
+authentication, ftp upload, HTTP post, file transfer resume and more.
+
+Note: this version is compiled with SSL (https:) support.
+
+%prep
+rm -rf $RPM_BUILD_ROOT
+rm -rf %{builddir}
+
+%setup -n %{tarball}-%{version} 
+
+%build
+CFLAGS=$RPM_OPT_FLAGS ./configure --prefix=$RPM_BUILD_ROOT%{prefix} --with-ssl
+make CFLAGS="-DUSE_SSLEAY -I/usr/include/openssl"
+
+%install
+make install-strip
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+rm -rf %{builddir}
+
+%files
+%defattr(-,root,root)
+%attr(0755,root,root) %{prefix}/bin/curl
+%doc curl.1 README* CHANGES CONTRIBUTE FAQ FILES INSTALL LEGAL MPL-1.0.txt RESOURCES TODO perl/
+
diff --git a/curl.1 b/curl.1
new file mode 100644 (file)
index 0000000..f93bc0e
--- /dev/null
+++ b/curl.1
@@ -0,0 +1,402 @@
+.\" You can view this file with:
+.\" nroff -man curl.1
+.\" Written by Daniel Stenberg
+.\"
+.TH curl 1 "8 November 1999" "Curl 6.3" "Curl Manual"
+.SH NAME
+curl \- get a URL with FTP, TELNET, LDAP, GOPHER, DICT, FILE, HTTP or
+HTTPS syntax.
+.SH SYNOPSIS
+.B curl [options]
+.I url
+.SH DESCRIPTION
+.B curl
+is a client to get documents/files from servers, using any of the
+supported protocols. The command is designed to work without user
+interaction or any kind of interactivity.
+
+curl offers a busload of useful tricks like proxy support, user
+authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file
+transfer resume and more.
+.SH URL
+The URL syntax is protocol dependent. You'll find a detailed description in
+RFC 2396.
+
+You can specify multiple URLs or parts of URLs by writing part sets within
+braces as in:
+
+ http://site.{one,two,three}.com
+
+or you can get sequences of alphanumeric series by using [] as in:
+
+ ftp://ftp.numericals.com/file[1-100].txt
+ ftp://ftp.numericals.com/file[001-100].txt    (with leading zeros)
+ ftp://ftp.letters.com/file[a-z].txt
+
+It is possible to specify up to 9 sets or series for a URL, but no nesting is
+supported at the moment:
+
+ http://www.any.org/archive[1996-1999]/volume[1-4]part{a,b,c,index}.html
+.SH OPTIONS
+.IP "-a/--append"
+(FTP)
+When used in a ftp upload, this will tell curl to append to the target
+file instead of overwriting it. If the file doesn't exist, it will
+be created.
+.IP "-A/--user-agent <agent string>"
+(HTTP)
+Specify the User-Agent string to send to the HTTP server. Some badly done CGIs
+fail if its not set to "Mozilla/4.0".  To encode blanks in the string,
+surround the string with single quote marks.  This can also be set with the
+-H/--header flag of course.
+.IP "-b/--cookie <name=data>"
+(HTTP)
+Pass the data to the HTTP server as a cookie. It is supposedly the
+data previously received from the server in a "Set-Cookie:" line.
+The data should be in the format "NAME1=VALUE1; NAME2=VALUE2".
+
+If no '=' letter is used in the line, it is treated as a filename to use to
+read previously stored cookie lines from, which should be used in this session
+if they match. Using this method also activates the "cookie parser" which
+will make curl record incoming cookies too, which may be handy if you're using
+this in combination with the -L/--location option. The file format of the file
+to read cookies from should be plain HTTP headers or the netscape cookie file
+format.
+.IP "-B/--ftp-ascii"
+(FTP/LDAP)
+Use ASCII transfer when getting an FTP file or LDAP info. For FTP, this can
+also be enforced by using an URL that ends with ";type=A".
+.IP "-c/--continue"
+Continue/Resume a previous file transfer. This instructs curl to
+continue appending data on the file where it was previously left,
+possibly because of a broken connection to the server. There must be
+a named physical file to append to for this to work.
+Note: Upload resume is depening on a command named SIZE not always
+present in all ftp servers! Upload resume is for FTP only.
+HTTP resume is only possible with HTTP/1.1 or later servers.
+.IP "-C/--continue-at <offset>"
+Continue/Resume a previous file transfer at the given offset. The
+given offset is the exact number of bytes that will be skipped
+counted from the beginning of the source file before it is transfered
+to the destination.
+If used with uploads, the ftp server command SIZE will not be used by
+curl. Upload resume is for FTP only.
+HTTP resume is only possible with HTTP/1.1 or later servers.
+.IP "-d/--data <data>"
+(HTTP)
+Sends the specified data in a POST request to the HTTP server. Note
+that the data is sent exactly as specified with no extra processing.
+The data is expected to be "url-encoded". This will cause curl to
+pass the data to the server using the content-type
+application/x-www-form-urlencoded. Compare to -F.
+
+If you start the data with the letter @, the rest should be a file name to
+read the data from, or - if you want curl to read the data from stdin.
+The contents of the file must already be url-encoded.
+.IP "-D/--dump-header <file>"
+(HTTP/FTP)
+Write the HTTP headers to this file. Write the FTP file info to this
+file if -I/--head is used.
+.IP "-e/--referer <URL>"
+(HTTP)
+Sends the "Referer Page" information to the HTTP server. Some badly
+done CGIs fail if it's not set. This can also be set with the -H/--header
+flag of course.
+.IP "-E/--cert <certificate[:password]>"
+(HTTPS)
+Tells curl to use the specified certificate file when getting a file
+with HTTPS. The certificate must be in PEM format.
+If the optional password isn't specified, it will be queried for on
+the terminal. Note that this certificate is the private key and the private
+certificate concatenated!
+.IP "-f/--fail"
+(HTTP)
+Fail silently (no output at all) on server errors. This is mostly done
+like this to better enable scripts etc to better deal with failed
+attempts. In normal cases when a HTTP server fails to deliver a
+document, it returns a HTML document stating so (which often also
+describes why and more). This flag will prevent curl from
+outputting that and fail silently instead.
+.IP "-F/--form <name=content>"
+(HTTP)
+This lets curl emulate a filled in form in which a user has pressed
+the submit button. This causes curl to POST data using the
+content-type multipart/form-data according to RFC1867. This enables
+uploading of binary files etc. To force the 'content' part to be
+read from a file, prefix the file name with an @ sign. Example, to
+send your password file to the server, where 'password' is the
+name of the form-field to which /etc/passwd will be the input:
+
+.B curl
+-F password=@/etc/passwd www.mypasswords.com
+
+To read the file's content from stdin insted of a file, use - where the file
+name should've been.
+.IP "-h/--help"
+Usage help.
+.IP "-H/--header <header>"
+(HTTP)
+Extra header to use when getting a web page. You may specify any number of
+extra headers. Note that if you should add a custom header that has the same
+name as one of the internal ones curl would use, your externally set header
+will be used instead of the internal one. This allows you to make even
+trickier stuff than curl would normally do. You should not replace internally
+set headers without knowing perfectly well what you're doing.
+.IP "-i/--include"
+(HTTP)
+Include the HTTP-header in the output. The HTTP-header includes things
+like server-name, date of the document, HTTP-version and more...
+.IP "-I/--head"
+(HTTP/FTP)
+Fetch the HTTP-header only! HTTP-servers feature the command HEAD
+which this uses to get nothing but the header of a document. When used
+on a FTP file, curl displays the file size only.
+.IP "-K/--config <config file>"
+Specify which config file to read curl arguments from. The config
+file is a text file in which command line arguments can be written
+which then will be used as if they were written on the actual command
+line. If the first column of a config line is a '#' character, the
+rest of the line will be treated as a comment.
+
+Specify the filename as '-' to make curl read the file from stdin.
+.IP "-l/--list-only"
+(FTP)
+When listing an FTP directory, this switch forces a name-only view.
+Especially useful if you want to machine-parse the contents of an FTP
+directory since the normal directory view doesn't use a standard look
+or format.
+.IP "-L/--location"
+(HTTP/HTTPS)
+If the server reports that the requested page has a different location
+(indicated with the header line Location:) this flag will let curl
+attempt to reattempt the get on the new place. If used together with
+-i or -I, headers from all requested pages will be shown.
+.IP "-m/--max-time <seconds>"
+Maximum time in seconds that you allow the whole operation to take.
+This is useful for preventing your batch jobs from hanging for hours
+due to slow networks or links going down.
+This doesn't work properly in win32 systems.
+.IP "-M/--manual"
+Manual. Display the huge help text.
+.IP "-n/--netrc"
+Makes curl scan the
+.I .netrc
+file in the user's home directory for login name and password. This is
+typically used for ftp on unix. If used with http, curl will enable user
+authentication. See
+.BR netrc(4)
+for details on the file format. Curl will not complain if that file
+hasn't the right permissions (it should not be world nor group
+readable). The environment variable "HOME" is used to find the home
+directory.
+
+A quick and very simple example of how to setup a
+.I .netrc
+to allow curl to ftp to the machine host.domain.com with user name
+'myself' and password 'secret' should look similar to:
+
+.B "machine host.domain.com user myself password secret"
+.IP "-o/--output <file>"
+Write output to <file> instead of stdout. If you are using {} or [] to fetch
+multiple documents, you can use #<num> in the <file> specifier. That variable
+will be replaced with the current string for the URL being fetched. Like in:
+
+  curl http://{one,two}.site.com -o "file_#1.txt"
+
+or use several variables like:
+
+  curl http://{site,host}.host[1-5].com -o "#1_#2"
+.IP "-O/--remote-name"
+Write output to a local file named like the remote file we get. (Only
+the file part of the remote file is used, the path is cut off.)
+.IP "-P/--ftpport <address>"
+(FTP)
+Reverses the initiator/listenor roles when connecting with ftp. This
+switch makes Curl use the PORT command instead of PASV. In
+practice, PORT tells the server to connect to the client's specified
+address and port, while PASV asks the server for an ip address and
+port to connect to. <address> should be one of:
+ interface - i.e "eth0" to specify which interface's IP address you want to use  (Unix only)
+ IP address - i.e "192.168.10.1" to specify exact IP number
+ host name - i.e "my.host.domain" to specify machine
+ "-"       - (any single-letter string) to make it pick the machine's default
+.IP "-q"
+If used as the first parameter on the command line, the
+.I $HOME/.curlrc
+file will not be read and used as a config file.
+.IP "-Q/--quote <comand>"
+(FTP) Send an arbitrary command to the remote FTP server, by using the QUOTE
+command of the server. Not all servers support this command, and the set of
+QUOTE commands are server specific!
+.IP "-r/--range <range>"
+(HTTP/FTP)
+Retrieve a byte range (i.e a partial document) from a HTTP/1.1 or FTP
+server. Ranges can be specified in a number of ways.
+ 0-499           - specifies the first 500 bytes
+ 500-999         - specifies the second 500 bytes
+ -500            - specifies the last 500 bytes
+ 9500-           - specifies the bytes from offset 9500 and forward
+ 0-0,-1          - specifies the first and last byte only(*)(H)
+ 500-700,600-799 - specifies 300 bytes from offset 500(H)
+ 100-199,500-599 - specifies two separate 100 bytes ranges(*)(H)
+
+(*) = NOTE that this will cause the server to reply with a multipart
+response!
+
+You should also be aware that many HTTP/1.1 servers do not have this feature
+enabled, so that when you attempt to get a range, you'll instead get the whole
+document.
+
+FTP range downloads only support the simple syntax 'start-stop' (optionally
+with one of the numbers omitted). It depends on the non-RFC command SIZE.
+.IP "-s/--silent"
+Silent mode. Don't show progress meter or error messages.  Makes
+Curl mute.
+.IP "-S/--show-error"
+When used with -s it makes curl show error message if it fails.
+.IP "-t/--upload"
+Transfer the stdin data to the specified file. Curl will read
+everything from stdin until EOF and store with the supplied name. If
+this is used on a http(s) server, the PUT command will be used.
+.IP "-T/--upload-file <file>"
+Like -t, but this transfers the specified local file. If there is no
+file part in the specified URL, Curl will append the local file
+name. NOTE that you must use a trailing / on the last directory to
+really prove to Curl that there is no file name or curl will
+think that your last directory name is the remote file name to
+use. That will most likely cause the upload operation to fail. If
+this is used on a http(s) server, the PUT command will be used.
+.IP "-u/--user <user:password>"
+Specify user and password to use when fetching. See README.curl for detailed
+examples of how to use this. If no password is specified, curl will
+ask for it interactively.
+.IP "-U/--proxy-user <user:password>"
+Specify user and password to use for Proxy authentication. If no
+password is specified, curl will ask for it interactively.
+.IP "-v/--verbose"
+Makes the fetching more verbose/talkative. Mostly usable for
+debugging. Lines starting with '>' means data sent by curl, '<'
+means data received by curl that is hidden in normal cases and lines
+starting with '*' means additional info provided by curl.
+.IP "-V/--version"
+Displays the full version of curl, libcurl and other 3rd party libraries
+linked with the executable.
+.IP "-x/--proxy <proxyhost[:port]>"
+Use specified proxy. If the port number is not specified, it is assumed at
+port 1080.
+.IP "-X/--request <command>"
+(HTTP)
+Specifies a custom request to use when communicating with the HTTP server.
+The specified request will be used instead of the standard GET. Read the
+HTTP 1.1 specification for details and explanations.
+
+(FTP)
+Specifies a custom FTP command to use instead of LIST when doing file lists
+with ftp.
+.IP "-y/--speed-time <speed>"
+Speed Limit. If a download is slower than this given speed, in bytes
+per second, for Speed Time seconds it gets aborted. Speed Time is set
+with -Y and is 30 if not set.
+.IP "-Y/--speed-limit <time>"
+Speed Time. If a download is slower than Speed Limit bytes per second
+during a Speed Time period, the download gets aborted. If Speed Time
+is used, the default Speed Limit will be 1 unless set with -y.
+.IP "-z/--time-cond <date expression>"
+(HTTP)
+Request to get a file that has been modified later than the given time and
+date, or one that has been modified before that time. The date expression can
+be all sorts of date strings or if it doesn't match any internal ones, it
+tries to get the time from a given file name instead! See the
+.BR "GNU date(1)"
+man page for date expression details.
+
+Start the date expression with a dash (-) to make it request for a document
+that is older than the given date/time, default is a document that is newer
+than the specified date/time.
+.IP "-3/--sslv3"
+(HTTPS)
+Forces curl to use SSL version 3 when negotiating with a remote SSL server.
+.IP "-2/--sslv2"
+(HTTPS)
+Forces curl to use SSL version 2 when negotiating with a remote SSL server.
+.IP "-#/--progress-bar"
+Make curl display progress information as a progress bar instead of the
+default statistics.
+.IP "--crlf"
+(FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390).
+.IP "--stderr <file>"
+Redirect all writes to stderr to the specified file instead. If the file name
+is a plain '-', it is instead written to stdout. This option has no point when
+you're using a shell with decent redirecting capabilities.
+.SH FILES
+.I ~/.curlrc
+.RS
+Default config file.
+
+.SH ENVIRONMENT
+.IP "HTTP_PROXY [protocol://]<host>[:port]"
+Sets proxy server to use for HTTP.
+.IP "HTTPS_PROXY [protocol://]<host>[:port]"
+Sets proxy server to use for HTTPS.
+.IP "FTP_PROXY [protocol://]<host>[:port]"
+Sets proxy server to use for FTP.
+.IP "GOPHER_PROXY [protocol://]<host>[:port]"
+Sets proxy server to use for GOPHER.
+.IP "ALL_PROXY [protocol://]<host>[:port]"
+Sets proxy server to use if no protocol-specific proxy is set.
+.IP "NO_PROXY <comma-separated list of hosts>"
+list of host names that shouldn't go through any proxy. If set to a
+asterisk '*' only, it matches all hosts.
+.IP "COLUMNS <integer>"
+The width of the terminal.  This variable only affects curl when the
+--progress-bar option is used.
+.SH DIAGNOSTICS
+There exists a bunch of different error messages that may appear during
+bad conditions. They're all pretty verbose and descriptive and therefore
+you won't find any closer description of them here.
+.SH BUGS
+If you do find any (or have other suggestions), mail Daniel Stenberg
+<Daniel.Stenberg@haxx.nu>.
+.SH AUTHORS / CONTRIBUTORS
+ - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ - Rafael Sagula <sagula@inf.ufrgs.br>
+ - Sampo Kellomaki <sampo@iki.fi>
+ - Linas Vepstas <linas@linas.org>
+ - Bjorn Reese <breese@mail1.stofanet.dk>
+ - Johan Anderson <johan@homemail.com>
+ - Kjell Ericson <Kjell.Ericson@sth.frontec.se>
+ - Troy Engel <tengel@sonic.net>
+ - Ryan Nelson <ryan@inch.com>
+ - Bjorn Stenberg <Bjorn.Stenberg@sth.frontec.se>
+ - Angus Mackay <amackay@gus.ml.org>
+ - Eric Young <eay@cryptsoft.com>
+ - Simon Dick <simond@totally.irrelevant.org>
+ - Oren Tirosh <oren@monty.hishome.net>
+ - Steven G. Johnson <stevenj@alum.mit.edu>
+ - Gilbert Ramirez Jr. <gram@verdict.uthscsa.edu>
+ - Andrés García <ornalux@redestb.es>
+ - Douglas E. Wegscheid <wegscd@whirlpool.com>
+ - Mark Butler <butlerm@xmission.com>
+ - Eric Thelin <eric@generation-i.com>
+ - Marc Boucher <marc@mbsi.ca>
+ - Greg Onufer <Greg.Onufer@Eng.Sun.COM>
+ - Doug Kaufman <dkaufman@rahul.net>
+ - David Eriksson <david@2good.com>
+ - Ralph Beckmann <rabe@uni-paderborn.de>
+ - T. Yamada <tai@imasy.or.jp>
+ - Lars J. Aas <larsa@sim.no>
+ - Jörn Hartroth <Joern.Hartroth@telekom.de>
+ - Matthew Clarke <clamat@van.maves.ca>
+ - Linus Nielsen <Linus.Nielsen@haxx.nu>
+ - Felix von Leitner <felix@convergence.de>
+ - Dan Zitter <dzitter@zitter.net>
+ - Jongki Suwandi <Jongki.Suwandi@eng.sun.com>
+ - Chris Maltby <chris@aurema.com>
+.SH WWW
+http://curl.haxx.nu
+.SH FTP
+ftp://ftp.sunet.se/pub/www/utilities/curl/
+.SH "SEE ALSO"
+.BR ftp (1),
+.BR wget (1),
+.BR snarf (1)
diff --git a/curl.beos-patch b/curl.beos-patch
new file mode 100644 (file)
index 0000000..25a1b3b
--- /dev/null
@@ -0,0 +1,695 @@
+? Makefile.in
+? autogen.sh
+? configure
+? lib/Makefile.in
+? src/Makefile.in
+Index: config.h.in
+===================================================================
+RCS file: /cvs/curl/curl/config.h.in,v
+retrieving revision 1.10
+diff -u -r1.10 config.h.in
+--- config.h.in        1999/10/17 11:18:34     1.10
++++ config.h.in        1999/11/24 15:15:21
+@@ -109,6 +109,9 @@
+ /* Define if you have the <getopt.h> header file.  */
+ #undef HAVE_GETOPT_H
++/* Define if you have the <net/if.h> header file.  */
++#undef HAVE_NET_IF_H
++
+ /* Define if you have the <netdb.h> header file.  */
+ #undef HAVE_NETDB_H
+Index: configure.in
+===================================================================
+RCS file: /cvs/curl/curl/configure.in,v
+retrieving revision 1.35
+diff -u -r1.35 configure.in
+--- configure.in       1999/11/11 21:05:38     1.35
++++ configure.in       1999/11/24 15:15:21
+@@ -117,24 +117,26 @@
+ dnl Checks for header files.
+ AC_HEADER_STDC
+-AC_CHECK_HEADERS( unistd.h \
+-                  arpa/inet.h \
+-                  netinet/in.h \
+-                  netdb.h \
+-                  sys/select.h \
+-                  sys/socket.h \
+-                  sys/sockio.h \
+-                  sys/stat.h \
+-                  sys/types.h \
+-                  getopt.h \
+-                  sys/param.h \
+-                  termios.h \
+-                  termio.h  \
+-                  sgtty.h \
+-                  fcntl.h \
+-                dlfcn.h \
+-                  alloca.h )
+-
++AC_CHECK_HEADERS( \
++        unistd.h \
++        arpa/inet.h \
++        net/if.h \
++        netinet/in.h \
++        netdb.h \
++        sys/select.h \
++        sys/socket.h \
++        sys/sockio.h \
++        sys/stat.h \
++        sys/types.h \
++        getopt.h \
++        sys/param.h \
++        termios.h \
++        termio.h \
++        sgtty.h \
++        fcntl.h \
++        dlfcn.h \
++        alloca.h \
++)
+ dnl Check for libz header
+ dnl AC_CHECK_HEADERS(zlib.h)
+Index: include/curl/curl.h
+===================================================================
+RCS file: /cvs/curl/curl/include/curl/curl.h,v
+retrieving revision 1.5
+diff -u -r1.5 curl.h
+--- curl.h     1999/11/23 08:22:42     1.5
++++ curl.h     1999/11/24 15:15:21
+@@ -365,9 +365,13 @@
+   TIMECOND_LAST
+ } TimeCond;
++#ifdef __BEOS__
++#include <support/SupportDefs.h>
++#else
+ #ifndef __cplusplus        /* (rabe) */
+ typedef char bool;
+ #endif                     /* (rabe) */
++#endif
+ /**********************************************************************
+  *
+Index: lib/Makefile.am
+===================================================================
+RCS file: /cvs/curl/curl/lib/Makefile.am,v
+retrieving revision 1.16
+diff -u -r1.16 Makefile.am
+--- Makefile.am        1999/10/22 13:27:36     1.16
++++ Makefile.am        1999/11/24 15:15:21
+@@ -9,7 +9,7 @@
+ # Some flags needed when trying to cause warnings ;-)
+ # CFLAGS = -Wall -pedantic
+-INCLUDES = -I../include
++INCLUDES = -I$(top_srcdir)/include
+ libcurl_a_SOURCES = \
+ arpa_telnet.h  file.c         getpass.h      netrc.h        timeval.c \
+Index: lib/dict.c
+===================================================================
+RCS file: /cvs/curl/curl/lib/dict.c,v
+retrieving revision 1.5
+diff -u -r1.5 dict.c
+--- dict.c     1999/10/13 22:27:12     1.5
++++ dict.c     1999/11/24 15:15:22
+@@ -66,8 +66,12 @@
+ #include <unistd.h>
+ #endif
+ #include <netdb.h>
++#ifdef HAVE_ARPA_INET_H
+ #include <arpa/inet.h>
++#endif
++#ifdef HAVE_NET_IF_H
+ #include <net/if.h>
++#endif
+ #include <sys/ioctl.h>
+ #include <signal.h>
+Index: lib/download.c
+===================================================================
+RCS file: /cvs/curl/curl/lib/download.c,v
+retrieving revision 1.30
+diff -u -r1.30 download.c
+--- download.c 1999/11/23 08:24:26     1.30
++++ download.c 1999/11/24 15:15:23
+@@ -54,6 +54,10 @@
+ #include "urldata.h"
+ #include <curl/curl.h>
++#ifdef __BEOS__
++#include <net/socket.h>
++#endif
++
+ #ifdef WIN32
+ #if !defined( __GNUC__) || defined(__MINGW32__)
+ #include <winsock.h>
+Index: lib/file.c
+===================================================================
+RCS file: /cvs/curl/curl/lib/file.c,v
+retrieving revision 1.6
+diff -u -r1.6 file.c
+--- file.c     1999/11/19 07:25:40     1.6
++++ file.c     1999/11/24 15:15:23
+@@ -67,8 +67,12 @@
+ #include <unistd.h>
+ #endif
+ #include <netdb.h>
++#ifdef HAVE_ARPA_INET_H
+ #include <arpa/inet.h>
++#endif
++#ifdef HAVE_NET_IF_H
+ #include <net/if.h>
++#endif
+ #include <sys/ioctl.h>
+ #include <signal.h>
+Index: lib/ftp.c
+===================================================================
+RCS file: /cvs/curl/curl/lib/ftp.c,v
+retrieving revision 1.18
+diff -u -r1.18 ftp.c
+--- ftp.c      1999/11/23 08:25:06     1.18
++++ ftp.c      1999/11/24 15:15:26
+@@ -58,7 +58,9 @@
+ #else /* some kind of unix */
+ #include <sys/socket.h>
+ #include <netinet/in.h>
++#ifdef HAVE_ARPA_INET_H
+ #include <arpa/inet.h>
++#endif
+ #include <sys/utsname.h>
+ #include <netdb.h>
+ #endif
+Index: lib/getdate.c
+===================================================================
+RCS file: /cvs/curl/curl/lib/getdate.c,v
+retrieving revision 1.5
+diff -u -r1.5 getdate.c
+--- getdate.c  1999/08/12 06:43:33     1.5
++++ getdate.c  1999/11/24 15:15:31
+@@ -1,26 +1,26 @@
+ /*  A Bison parser, made from getdate.y
+- by  GNU Bison version 1.25
++ by  GNU Bison version 1.27
+   */
+ #define YYBISON 1  /* Identify Bison output.  */
+-#define       tAGO    258
+-#define       tDAY    259
+-#define       tDAY_UNIT       260
+-#define       tDAYZONE        261
+-#define       tDST    262
+-#define       tHOUR_UNIT      263
+-#define       tID     264
+-#define       tMERIDIAN       265
+-#define       tMINUTE_UNIT    266
+-#define       tMONTH  267
+-#define       tMONTH_UNIT     268
+-#define       tSEC_UNIT       269
+-#define       tSNUMBER        270
+-#define       tUNUMBER        271
+-#define       tYEAR_UNIT      272
+-#define       tZONE   273
++#define       tAGO    257
++#define       tDAY    258
++#define       tDAY_UNIT       259
++#define       tDAYZONE        260
++#define       tDST    261
++#define       tHOUR_UNIT      262
++#define       tID     263
++#define       tMERIDIAN       264
++#define       tMINUTE_UNIT    265
++#define       tMONTH  266
++#define       tMONTH_UNIT     267
++#define       tSEC_UNIT       268
++#define       tSNUMBER        269
++#define       tUNUMBER        270
++#define       tYEAR_UNIT      271
++#define       tZONE   272
+ #line 1 "getdate.y"
+@@ -211,9 +211,11 @@
+ #ifndef __cplusplus
+ #ifndef __STDC__
++#ifndef const
+ #define const
+ #endif
+ #endif
++#endif
+@@ -221,7 +223,7 @@
+ #define       YYFLAG          -32768
+ #define       YYNTBASE        22
+-#define YYTRANSLATE(x) ((unsigned)(x) <= 273 ? yytranslate[x] : 32)
++#define YYTRANSLATE(x) ((unsigned)(x) <= 272 ? yytranslate[x] : 32)
+ static const char yytranslate[] = {     0,
+      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+@@ -249,9 +251,9 @@
+      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+-     2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
+-     6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+-    16,    17,    18
++     2,     2,     2,     2,     2,     1,     3,     4,     5,     6,
++     7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
++    17,    18
+ };
+ #if YYDEBUG != 0
+@@ -370,7 +372,8 @@
+     56
+ };
+ /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+-#line 3 "/usr/lib/bison.simple"
++#line 3 "/boot/apps/GeekGadgets/share/bison.simple"
++/* This file comes from bison-1.27.  */
+ /* Skeleton output parser for bison,
+    Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+@@ -387,46 +390,66 @@
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
++   Foundation, Inc., 59 Temple Place - Suite 330,
++   Boston, MA 02111-1307, USA.  */
+ /* As a special exception, when this file is copied by Bison into a
+    Bison output file, you may use that output file without restriction.
+    This special exception was added by the Free Software Foundation
+    in version 1.24 of Bison.  */
+-#ifndef alloca
++/* This is the parser code that is written into each bison parser
++  when the %semantic_parser declaration is not specified in the grammar.
++  It was written by Richard Stallman by simplifying the hairy parser
++  used when %semantic_parser is specified.  */
++
++#ifndef YYSTACK_USE_ALLOCA
++#ifdef alloca
++#define YYSTACK_USE_ALLOCA
++#else /* alloca not defined */
+ #ifdef __GNUC__
++#define YYSTACK_USE_ALLOCA
+ #define alloca __builtin_alloca
+ #else /* not GNU C.  */
+-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
++#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
++#define YYSTACK_USE_ALLOCA
+ #include <alloca.h>
+ #else /* not sparc */
+-#if defined (MSDOS) && !defined (__TURBOC__)
++/* We think this test detects Watcom and Microsoft C.  */
++/* This used to test MSDOS, but that is a bad idea
++   since that symbol is in the user namespace.  */
++#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
++#if 0 /* No need for malloc.h, which pollutes the namespace;
++       instead, just don't use alloca.  */
+ #include <malloc.h>
++#endif
+ #else /* not MSDOS, or __TURBOC__ */
+ #if defined(_AIX)
+-#include <malloc.h>
++/* I don't know what this was needed for, but it pollutes the namespace.
++   So I turned it off.   rms, 2 May 1997.  */
++/* #include <malloc.h>  */
+  #pragma alloca
+-#else /* not MSDOS, __TURBOC__, or _AIX */
+-#ifdef __hpux
+-#ifdef __cplusplus
+-extern "C" {
+-void *alloca (unsigned int);
+-};
+-#else /* not __cplusplus */
+-void *alloca ();
+-#endif /* not __cplusplus */
++#define YYSTACK_USE_ALLOCA
++#else /* not MSDOS, or __TURBOC__, or _AIX */
++#if 0
++#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
++               and on HPUX 10.  Eventually we can turn this on.  */
++#define YYSTACK_USE_ALLOCA
++#define alloca __builtin_alloca
+ #endif /* __hpux */
++#endif
+ #endif /* not _AIX */
+ #endif /* not MSDOS, or __TURBOC__ */
+-#endif /* not sparc.  */
+-#endif /* not GNU C.  */
+-#endif /* alloca not defined.  */
++#endif /* not sparc */
++#endif /* not GNU C */
++#endif /* alloca not defined */
++#endif /* YYSTACK_USE_ALLOCA not defined */
+-/* This is the parser code that is written into each bison parser
+-  when the %semantic_parser declaration is not specified in the grammar.
+-  It was written by Richard Stallman by simplifying the hairy parser
+-  used when %semantic_parser is specified.  */
++#ifdef YYSTACK_USE_ALLOCA
++#define YYSTACK_ALLOC alloca
++#else
++#define YYSTACK_ALLOC malloc
++#endif
+ /* Note: there must be only one dollar sign in this file.
+    It is replaced by the list of actions, each action
+@@ -436,8 +459,8 @@
+ #define yyclearin     (yychar = YYEMPTY)
+ #define YYEMPTY               -2
+ #define YYEOF         0
+-#define YYACCEPT      return(0)
+-#define YYABORT       return(1)
++#define YYACCEPT      goto yyacceptlab
++#define YYABORT       goto yyabortlab
+ #define YYERROR               goto yyerrlab1
+ /* Like YYERROR except do call yyerror.
+    This remains here temporarily to ease the
+@@ -518,12 +541,12 @@
+ #ifndef YYMAXDEPTH
+ #define YYMAXDEPTH 10000
+ #endif
+-
+-/* Prevent warning if -Wstrict-prototypes.  */
+-#ifdef __GNUC__
+-int yyparse (void);
+-#endif
\f
++/* Define __yy_memcpy.  Note that the size argument
++   should be passed with type unsigned int, because that is what the non-GCC
++   definitions require.  With GCC, __builtin_memcpy takes an arg
++   of type size_t, but it can handle unsigned int.  */
++
+ #if __GNUC__ > 1              /* GNU C and GNU C++ define this.  */
+ #define __yy_memcpy(TO,FROM,COUNT)    __builtin_memcpy(TO,FROM,COUNT)
+ #else                         /* not GNU C or C++ */
+@@ -535,7 +558,7 @@
+ __yy_memcpy (to, from, count)
+      char *to;
+      char *from;
+-     int count;
++     unsigned int count;
+ {
+   register char *f = from;
+   register char *t = to;
+@@ -550,10 +573,10 @@
+ /* This is the most reliable way to avoid incompatibilities
+    in available built-in functions on various systems.  */
+ static void
+-__yy_memcpy (char *to, char *from, int count)
++__yy_memcpy (char *to, char *from, unsigned int count)
+ {
+-  register char *f = from;
+   register char *t = to;
++  register char *f = from;
+   register int i = count;
+   while (i-- > 0)
+@@ -563,7 +586,7 @@
+ #endif
+ #endif
\f
+-#line 196 "/usr/lib/bison.simple"
++#line 216 "/boot/apps/GeekGadgets/share/bison.simple"
+ /* The user can define YYPARSE_PARAM as the name of an argument to be passed
+    into yyparse.  The argument should have type void *.
+@@ -584,6 +607,15 @@
+ #define YYPARSE_PARAM_DECL
+ #endif /* not YYPARSE_PARAM */
++/* Prevent warning if -Wstrict-prototypes.  */
++#ifdef __GNUC__
++#ifdef YYPARSE_PARAM
++int yyparse (void *);
++#else
++int yyparse (void);
++#endif
++#endif
++
+ int
+ yyparse(YYPARSE_PARAM_ARG)
+      YYPARSE_PARAM_DECL
+@@ -612,6 +644,7 @@
+ #endif
+   int yystacksize = YYINITDEPTH;
++  int yyfree_stacks = 0;
+ #ifdef YYPURE
+   int yychar;
+@@ -696,18 +729,32 @@
+       if (yystacksize >= YYMAXDEPTH)
+       {
+         yyerror("parser stack overflow");
++        if (yyfree_stacks)
++          {
++            free (yyss);
++            free (yyvs);
++#ifdef YYLSP_NEEDED
++            free (yyls);
++#endif
++          }
+         return 2;
+       }
+       yystacksize *= 2;
+       if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+-      yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+-      __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
+-      yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+-      __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
++#ifndef YYSTACK_USE_ALLOCA
++      yyfree_stacks = 1;
++#endif
++      yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
++      __yy_memcpy ((char *)yyss, (char *)yyss1,
++                 size * (unsigned int) sizeof (*yyssp));
++      yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
++      __yy_memcpy ((char *)yyvs, (char *)yyvs1,
++                 size * (unsigned int) sizeof (*yyvsp));
+ #ifdef YYLSP_NEEDED
+-      yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+-      __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
++      yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
++      __yy_memcpy ((char *)yyls, (char *)yyls1,
++                 size * (unsigned int) sizeof (*yylsp));
+ #endif
+ #endif /* no yyoverflow */
+@@ -1230,7 +1277,7 @@
+     break;}
+ }
+    /* the action file gets copied in in place of this dollarsign */
+-#line 498 "/usr/lib/bison.simple"
++#line 542 "/boot/apps/GeekGadgets/share/bison.simple"
\f
+   yyvsp -= yylen;
+   yyssp -= yylen;
+@@ -1425,6 +1472,30 @@
+   yystate = yyn;
+   goto yynewstate;
++
++ yyacceptlab:
++  /* YYACCEPT comes here.  */
++  if (yyfree_stacks)
++    {
++      free (yyss);
++      free (yyvs);
++#ifdef YYLSP_NEEDED
++      free (yyls);
++#endif
++    }
++  return 0;
++
++ yyabortlab:
++  /* YYABORT comes here.  */
++  if (yyfree_stacks)
++    {
++      free (yyss);
++      free (yyvs);
++#ifdef YYLSP_NEEDED
++      free (yyls);
++#endif
++    }
++  return 1;
+ }
+ #line 451 "getdate.y"
+Index: lib/hostip.c
+===================================================================
+RCS file: /cvs/curl/curl/lib/hostip.c,v
+retrieving revision 1.8
+diff -u -r1.8 hostip.c
+--- hostip.c   1999/10/13 22:27:12     1.8
++++ hostip.c   1999/11/24 15:15:31
+@@ -53,7 +53,9 @@
+ #endif
+ #include <netinet/in.h>
+ #include <netdb.h>
++#ifdef HAVE_ARPA_INET_H
+ #include <arpa/inet.h>
++#endif
+ #endif
+ #include "urldata.h"
+Index: lib/http.c
+===================================================================
+RCS file: /cvs/curl/curl/lib/http.c,v
+retrieving revision 1.17
+diff -u -r1.17 http.c
+--- http.c     1999/10/30 15:43:52     1.17
++++ http.c     1999/11/24 15:15:31
+@@ -66,8 +66,12 @@
+ #include <unistd.h>
+ #endif
+ #include <netdb.h>
++#ifdef HAVE_ARPA_INET_H
+ #include <arpa/inet.h>
++#endif
++#ifdef HAVE_NET_IF_H
+ #include <net/if.h>
++#endif
+ #include <sys/ioctl.h>
+ #include <signal.h>
+Index: lib/if2ip.c
+===================================================================
+RCS file: /cvs/curl/curl/lib/if2ip.c,v
+retrieving revision 1.7
+diff -u -r1.7 if2ip.c
+--- if2ip.c    1999/10/13 22:27:12     1.7
++++ if2ip.c    1999/11/24 15:15:31
+@@ -48,13 +48,17 @@
+ #include <unistd.h>
+ #endif
+-#ifndef WIN32
++#if ! defined(WIN32) && ! defined(__BEOS__)
+ #include <sys/socket.h>
+ #include <netinet/in.h>
++#ifdef HAVE_ARPA_INET_H
+ #include <arpa/inet.h>
++#endif
+ #include <netinet/in.h>
++#ifdef HAVE_NET_IF_H
+ #include <net/if.h>
++#endif
+ #include <sys/ioctl.h>
+ /* -- if2ip() -- */
+Index: lib/if2ip.h
+===================================================================
+RCS file: /cvs/curl/curl/lib/if2ip.h,v
+retrieving revision 1.5
+diff -u -r1.5 if2ip.h
+--- if2ip.h    1999/10/13 22:27:12     1.5
++++ if2ip.h    1999/11/24 15:15:31
+@@ -41,7 +41,7 @@
+  ****************************************************************************/
+ #include <curl/setup.h>
+-#ifndef WIN32
++#if ! defined(WIN32) && ! defined(__BEOS__)
+ char *if2ip(char *interface);
+ #else
+ #define if2ip(x) NULL
+Index: lib/telnet.c
+===================================================================
+RCS file: /cvs/curl/curl/lib/telnet.c,v
+retrieving revision 1.9
+diff -u -r1.9 telnet.c
+--- telnet.c   1999/10/13 22:27:12     1.9
++++ telnet.c   1999/11/24 15:15:32
+@@ -74,8 +74,12 @@
+ #include <unistd.h>
+ #endif
+ #include <netdb.h>
++#ifdef HAVE_ARPA_INET_H
+ #include <arpa/inet.h>
++#endif
++#ifdef HAVE_NET_IF_H
+ #include <net/if.h>
++#endif
+ #include <sys/ioctl.h>
+ #include <signal.h>
+Index: lib/upload.c
+===================================================================
+RCS file: /cvs/curl/curl/lib/upload.c,v
+retrieving revision 1.9
+diff -u -r1.9 upload.c
+--- upload.c   1999/10/13 22:27:12     1.9
++++ upload.c   1999/11/24 15:15:32
+@@ -58,6 +58,11 @@
+ #endif
+ #include <curl/curl.h>
++
++#ifdef __BEOS__
++#include <net/socket.h>
++#endif
++
+ #include "urldata.h"
+ #include "speedcheck.h"
+ #include "sendf.h"
+Index: lib/url.c
+===================================================================
+RCS file: /cvs/curl/curl/lib/url.c,v
+retrieving revision 1.31
+diff -u -r1.31 url.c
+--- url.c      1999/11/19 07:07:10     1.31
++++ url.c      1999/11/24 15:15:36
+@@ -71,8 +71,12 @@
+ #include <unistd.h>
+ #endif
+ #include <netdb.h>
++#ifdef HAVE_ARPA_INET_H
+ #include <arpa/inet.h>
++#endif
++#ifdef HAVE_NET_IF_H
+ #include <net/if.h>
++#endif
+ #include <sys/ioctl.h>
+ #include <signal.h>
+Index: src/Makefile.am
+===================================================================
+RCS file: /cvs/curl/curl/src/Makefile.am,v
+retrieving revision 1.13
+diff -u -r1.13 Makefile.am
+--- Makefile.am        1999/10/13 22:50:30     1.13
++++ Makefile.am        1999/11/24 15:15:36
+@@ -6,7 +6,7 @@
+ # CFLAGS = -Wall -pedantic
+ CPPFLAGS = -DGLOBURL -DCURL_SEPARATORS
+-INCLUDES = -I../include
++INCLUDES = -I$(top_srcdir)/include
+ bin_PROGRAMS = curl
+@@ -22,6 +22,6 @@
+ AUTOMAKE_OPTIONS = foreign no-dependencies
+ # This generates the hugehelp.c file
+-hugehelp.c: ../README.curl ../curl.1 mkhelp.pl
++hugehelp.c: $(top_srcdir)/README.curl $(top_srcdir)/curl.1 mkhelp.pl
+       rm -f hugehelp.c
+-      $(NROFF) -man ../curl.1 | $(PERL) mkhelp.pl ../README.curl > hugehelp.c
++      $(NROFF) -man $(top_srcdir)/curl.1 | $(PERL) $(top_srcdir)/src/mkhelp.pl $(top_srcdir)/README.curl > hugehelp.c
diff --git a/curl.spec b/curl.spec
new file mode 100644 (file)
index 0000000..adf907e
--- /dev/null
+++ b/curl.spec
@@ -0,0 +1,52 @@
+%define name curl
+%define version 6.0
+%define release 1
+%define prefix /usr/local
+
+%define builddir $RPM_BUILD_DIR/%{name}-%{version}
+
+Summary: get a file from a FTP, GOPHER or HTTP server.
+Name: %{name}
+Version: %{version}
+Release: %{release}
+Copyright: MPL
+Vendor: Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+Packager: Troy Engel <tengel@sonic.net>
+Group: Utilities/Console
+Source: %{name}-%{version}.tar.gz
+URL: http://curl.haxx.nu/
+BuildRoot: /tmp/%{name}-%{version}-root
+
+%description
+curl is a client to get documents/files from servers, using any of the
+supported protocols. The command is designed to work without user
+interaction or any kind of interactivity.
+
+curl offers a busload of useful tricks like proxy support, user
+authentication, ftp upload, HTTP post, file transfer resume and more.
+
+Note: this version is compiled without SSL (https:) support.
+
+%prep
+rm -rf $RPM_BUILD_ROOT
+rm -rf %{builddir}
+
+%setup  
+
+%build
+export CFLAGS=$RPM_OPT_FLAGS 
+./configure --prefix=$RPM_BUILD_ROOT%{prefix}
+make 
+
+%install
+make install-strip
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+rm -rf %{builddir}
+
+%files
+%defattr(-,root,root)
+%attr(0755,root,root) %{prefix}/bin/curl
+%doc curl.1 README* CHANGES CONTRIBUTE FAQ FILES INSTALL LEGAL MPL-1.0.txt RESOURCES TODO perl/
+
diff --git a/curl_631_general.patch b/curl_631_general.patch
new file mode 100644 (file)
index 0000000..242e308
--- /dev/null
@@ -0,0 +1,1265 @@
+Only in curl-6.3.1: config-win32.h
+Only in curl-6.3.1: config-win32.h~
+Only in curl-6.3.1: config.cache
+Only in curl-6.3.1: config.h
+diff -cr curl-6.3.1-org/config.h.in curl-6.3.1/config.h.in
+*** curl-6.3.1-org/config.h.in Sun Oct 17 13:18:34 1999
+--- curl-6.3.1/config.h.in     Thu Dec  9 14:23:01 1999
+***************
+*** 37,42 ****
+--- 37,45 ----
+  /* The number of bytes in a long long.  */
+  #undef SIZEOF_LONG_LONG
+  
++ /* Define if you have the closesocket function.  */
++ #undef HAVE_CLOSESOCKET
++ 
+  /* Define if you have the gethostbyaddr function.  */
+  #undef HAVE_GETHOSTBYADDR
+  
+***************
+*** 109,114 ****
+--- 112,120 ----
+  /* Define if you have the <getopt.h> header file.  */
+  #undef HAVE_GETOPT_H
+  
++ /* Define if you have the <io.h> header file.  */
++ #undef HAVE_IO_H
++ 
+  /* Define if you have the <netdb.h> header file.  */
+  #undef HAVE_NETDB_H
+  
+***************
+*** 169,177 ****
+--- 175,189 ----
+  /* Define if you have the <termios.h> header file.  */
+  #undef HAVE_TERMIOS_H
+  
++ /* Define if you have the <time.h> header file.  */
++ #undef HAVE_TIME_H
++ 
+  /* Define if you have the <unistd.h> header file.  */
+  #undef HAVE_UNISTD_H
+  
++ /* Define if you have the <winsock.h> header file.  */
++ #undef HAVE_WINSOCK_H
++ 
+  /* Define if you have the <x509.h> header file.  */
+  #undef HAVE_X509_H
+  
+Only in curl-6.3.1: config.log
+Only in curl-6.3.1: config.status
+Only in curl-6.3.1: configure
+diff -cr curl-6.3.1-org/configure.in curl-6.3.1/configure.in
+*** curl-6.3.1-org/configure.in        Wed Nov 24 14:48:38 1999
+--- curl-6.3.1/configure.in    Thu Dec  9 14:34:36 1999
+***************
+*** 1,7 ****
+  dnl $Id$
+  dnl Process this file with autoconf to produce a configure script.
+  AC_INIT(lib/urldata.h)
+! AM_CONFIG_HEADER(config.h)
+  AM_INIT_AUTOMAKE(curl,"6.3.1")
+  
+  dnl Checks for programs.
+--- 1,7 ----
+  dnl $Id$
+  dnl Process this file with autoconf to produce a configure script.
+  AC_INIT(lib/urldata.h)
+! AM_CONFIG_HEADER(config.h src/config.h)
+  AM_INIT_AUTOMAKE(curl,"6.3.1")
+  
+  dnl Checks for programs.
+***************
+*** 133,139 ****
+                    sgtty.h \
+                    fcntl.h \
+                 dlfcn.h \
+!                   alloca.h )
+  
+  
+  dnl Check for libz header
+--- 133,143 ----
+                    sgtty.h \
+                    fcntl.h \
+                 dlfcn.h \
+!                   alloca.h \
+!                   winsock.h \
+!                   time.h \
+!                   io.h
+!         )
+  
+  
+  dnl Check for libz header
+***************
+*** 175,181 ****
+                  tcsetattr \
+                  tcgetattr \
+                  perror \
+!                 getpass )
+  
+  
+  
+--- 179,187 ----
+                  tcsetattr \
+                  tcgetattr \
+                  perror \
+!                 getpass \
+!                 closesocket
+! )
+  
+  
+  
+Only in curl-6.3.1: configure.in~
+Common subdirectories: curl-6.3.1-org/include and curl-6.3.1/include
+Common subdirectories: curl-6.3.1-org/lib and curl-6.3.1/lib
+Common subdirectories: curl-6.3.1-org/perl and curl-6.3.1/perl
+Common subdirectories: curl-6.3.1-org/src and curl-6.3.1/src
+Only in curl-6.3.1: stamp-h1
+Common subdirectories: curl-6.3.1-org/include/curl and curl-6.3.1/include/curl
+diff -cr curl-6.3.1-org/include/curl/curl.h curl-6.3.1/include/curl/curl.h
+*** curl-6.3.1-org/include/curl/curl.h Wed Nov 24 14:48:37 1999
+--- curl-6.3.1/include/curl/curl.h     Wed Dec  8 15:34:53 1999
+***************
+*** 352,360 ****
+--- 352,367 ----
+    /* HTTP request, for odd commands like DELETE, TRACE and others */
+    T(HTTPREQUEST, OBJECTPOINT, 35),
+  
++   /* Progress mode sets alternative progress mode displays, the only
++      one defined today is 1 which makes the #-style progress bar. */
++   T(PROGRESSMODE, LONG, 36),
++ 
+    URGTAG_LASTENTRY /* the last unusued */
+  } UrgTag;
+  
++ #define CURL_PROGRESS_STATS 0 /* default progress display */
++ #define CURL_PROGRESS_BAR   1
++ 
+  typedef enum {
+    TIMECOND_NONE,
+  
+Only in curl-6.3.1/include/curl: curl.h~
+Only in curl-6.3.1-org/include/curl: setup.h
+Only in curl-6.3.1/include/curl: setup.h~
+diff -cr curl-6.3.1-org/lib/Makefile curl-6.3.1/lib/Makefile
+*** curl-6.3.1-org/lib/Makefile        Wed Dec  8 13:38:22 1999
+--- curl-6.3.1/lib/Makefile    Thu Dec  9 15:42:21 1999
+***************
+*** 90,98 ****
+  
+  
+  DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I..
+! CPPFLAGS = 
+! LDFLAGS = 
+! LIBS = -ldl -lsocket -lnsl 
+  libcurl_a_LIBADD = 
+  libcurl_a_OBJECTS =  file.o timeval.o base64.o hostip.o progress.o \
+  formdata.o upload.o cookie.o http.o sendf.o ftp.o url.o dict.o if2ip.o \
+--- 90,98 ----
+  
+  
+  DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I..
+! CPPFLAGS = -I/homes/qradlsg/openssl-0.9.4/include
+! LDFLAGS = -L/homes/qradlsg/openssl-0.9.4
+! LIBS = -lssl -lcrypto -ldl -lsocket -lnsl 
+  libcurl_a_LIBADD = 
+  libcurl_a_OBJECTS =  file.o timeval.o base64.o hostip.o progress.o \
+  formdata.o upload.o cookie.o http.o sendf.o ftp.o url.o dict.o if2ip.o \
+***************
+*** 99,105 ****
+  speedcheck.o getdate.o download.o ldap.o ssluse.o version.o getenv.o \
+  escape.o mprintf.o telnet.o getpass.o netrc.o
+  AR = ar
+! CFLAGS = -g -O2
+  COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+  CCLD = $(CC)
+  LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+--- 99,105 ----
+  speedcheck.o getdate.o download.o ldap.o ssluse.o version.o getenv.o \
+  escape.o mprintf.o telnet.o getpass.o netrc.o
+  AR = ar
+! CFLAGS = -g -O2 -Wall -pedantic
+  COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+  CCLD = $(CC)
+  LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+Only in curl-6.3.1/lib: Makefile~
+diff -cr curl-6.3.1-org/lib/cookie.c curl-6.3.1/lib/cookie.c
+*** curl-6.3.1-org/lib/cookie.c        Fri Nov 12 15:54:59 1999
+--- curl-6.3.1/lib/cookie.c    Thu Dec  9 15:44:37 1999
+***************
+*** 60,66 ****
+  #include <ctype.h>
+  
+  #include "cookie.h"
+! #include <curl/setup.h>
+  #include "getdate.h"
+  
+  /****************************************************************************
+--- 60,66 ----
+  #include <ctype.h>
+  
+  #include "cookie.h"
+! #include "setup.h"
+  #include "getdate.h"
+  
+  /****************************************************************************
+***************
+*** 134,140 ****
+          }
+        }
+        ptr=strtok(NULL, ";");
+!       while(ptr && *ptr && isspace(*ptr))
+          ptr++;
+      }
+    }
+--- 134,140 ----
+          }
+        }
+        ptr=strtok(NULL, ";");
+!       while(ptr && *ptr && isspace((int)*ptr))
+          ptr++;
+      }
+    }
+***************
+*** 288,294 ****
+  {
+    char line[MAX_COOKIE_LINE];
+    struct CookieInfo *c;
+-   struct Cookie *co;
+    FILE *fp;
+  
+    c = (struct CookieInfo *)malloc(sizeof(struct CookieInfo));
+--- 288,293 ----
+***************
+*** 303,309 ****
+        if(strnequal("Set-Cookie:", line, 11)) {
+          /* This is a cookie line, get it! */
+          char *lineptr=&line[11];
+!         while(*lineptr && isspace(*lineptr))
+            lineptr++;
+  
+          cookie_add(c, TRUE, lineptr);
+--- 302,308 ----
+        if(strnequal("Set-Cookie:", line, 11)) {
+          /* This is a cookie line, get it! */
+          char *lineptr=&line[11];
+!         while(*lineptr && isspace((int)*lineptr))
+            lineptr++;
+  
+          cookie_add(c, TRUE, lineptr);
+***************
+*** 311,317 ****
+        else {
+          /* This might be a netscape cookie-file line, get it! */
+          char *lineptr=line;
+!         while(*lineptr && isspace(*lineptr))
+            lineptr++;
+  
+          cookie_add(c, FALSE, lineptr);
+--- 310,316 ----
+        else {
+          /* This might be a netscape cookie-file line, get it! */
+          char *lineptr=line;
+!         while(*lineptr && isspace((int)*lineptr))
+            lineptr++;
+  
+          cookie_add(c, FALSE, lineptr);
+Only in curl-6.3.1/lib: cookie.c~
+Binary files curl-6.3.1-org/lib/cookie.o and curl-6.3.1/lib/cookie.o differ
+diff -cr curl-6.3.1-org/lib/dict.c curl-6.3.1/lib/dict.c
+*** curl-6.3.1-org/lib/dict.c  Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/dict.c      Thu Dec  9 14:27:23 1999
+***************
+*** 49,55 ****
+  
+  #include <errno.h>
+  
+! #include <curl/setup.h>
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+--- 49,55 ----
+  
+  #include <errno.h>
+  
+! #include "setup.h"
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+Binary files curl-6.3.1-org/lib/dict.o and curl-6.3.1/lib/dict.o differ
+diff -cr curl-6.3.1-org/lib/download.c curl-6.3.1/lib/download.c
+*** curl-6.3.1-org/lib/download.c      Tue Nov 23 09:24:26 1999
+--- curl-6.3.1/lib/download.c  Thu Dec  9 14:27:23 1999
+***************
+*** 42,48 ****
+  #include <stdio.h>
+  #include <string.h>
+  
+! #include <curl/setup.h>
+  
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+--- 42,48 ----
+  #include <stdio.h>
+  #include <string.h>
+  
+! #include "setup.h"
+  
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+Binary files curl-6.3.1-org/lib/download.o and curl-6.3.1/lib/download.o differ
+diff -cr curl-6.3.1-org/lib/file.c curl-6.3.1/lib/file.c
+*** curl-6.3.1-org/lib/file.c  Fri Nov 19 08:25:40 1999
+--- curl-6.3.1/lib/file.c      Thu Dec  9 14:27:24 1999
+***************
+*** 49,55 ****
+  
+  #include <errno.h>
+  
+! #include <curl/setup.h>
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+--- 49,55 ----
+  
+  #include <errno.h>
+  
+! #include "setup.h"
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+Binary files curl-6.3.1-org/lib/file.o and curl-6.3.1/lib/file.o differ
+diff -cr curl-6.3.1-org/lib/formdata.c curl-6.3.1/lib/formdata.c
+*** curl-6.3.1-org/lib/formdata.c      Tue Nov 23 17:54:36 1999
+--- curl-6.3.1/lib/formdata.c  Thu Dec  9 14:27:25 1999
+***************
+*** 56,62 ****
+  
+  #include <time.h>
+  
+! #include <curl/setup.h>
+  #include <curl/curl.h>
+  #include "formdata.h"
+  
+--- 56,62 ----
+  
+  #include <time.h>
+  
+! #include "setup.h"
+  #include <curl/curl.h>
+  #include "formdata.h"
+  
+Binary files curl-6.3.1-org/lib/formdata.o and curl-6.3.1/lib/formdata.o differ
+diff -cr curl-6.3.1-org/lib/ftp.c curl-6.3.1/lib/ftp.c
+*** curl-6.3.1-org/lib/ftp.c   Tue Nov 23 09:25:06 1999
+--- curl-6.3.1/lib/ftp.c       Thu Dec  9 15:43:10 1999
+***************
+*** 44,50 ****
+  #include <ctype.h>
+  #include <errno.h>
+  
+! #include <curl/setup.h>
+  
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+--- 44,50 ----
+  #include <ctype.h>
+  #include <errno.h>
+  
+! #include "setup.h"
+  
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+***************
+*** 728,734 ****
+        char *ptr2;
+  
+        from=strtol(data->range, &ptr, 0);
+!       while(ptr && *ptr && (isspace(*ptr) || (*ptr=='-')))
+          ptr++;
+        to=strtol(ptr, &ptr2, 0);
+        if(ptr == ptr2) {
+--- 728,734 ----
+        char *ptr2;
+  
+        from=strtol(data->range, &ptr, 0);
+!       while(ptr && *ptr && (isspace((int)*ptr) || (*ptr=='-')))
+          ptr++;
+        to=strtol(ptr, &ptr2, 0);
+        if(ptr == ptr2) {
+***************
+*** 886,892 ****
+              if('(' == *bytes)
+                break;
+              /* if only skip digits, or else we're in deep trouble */
+!             if(!isdigit(*bytes)) {
+                bytes=NULL;
+                break;
+              }
+--- 886,892 ----
+              if('(' == *bytes)
+                break;
+              /* if only skip digits, or else we're in deep trouble */
+!             if(!isdigit((int)*bytes)) {
+                bytes=NULL;
+                break;
+              }
+Only in curl-6.3.1/lib: ftp.c~
+Binary files curl-6.3.1-org/lib/ftp.o and curl-6.3.1/lib/ftp.o differ
+diff -cr curl-6.3.1-org/lib/hostip.c curl-6.3.1/lib/hostip.c
+*** curl-6.3.1-org/lib/hostip.c        Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/hostip.c    Thu Dec  9 14:27:27 1999
+***************
+*** 40,46 ****
+  
+  #include <string.h>
+  
+! #include <curl/setup.h>
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+--- 40,46 ----
+  
+  #include <string.h>
+  
+! #include "setup.h"
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+Binary files curl-6.3.1-org/lib/hostip.o and curl-6.3.1/lib/hostip.o differ
+diff -cr curl-6.3.1-org/lib/http.c curl-6.3.1/lib/http.c
+*** curl-6.3.1-org/lib/http.c  Sat Oct 30 17:43:52 1999
+--- curl-6.3.1/lib/http.c      Thu Dec  9 14:27:27 1999
+***************
+*** 49,55 ****
+  
+  #include <errno.h>
+  
+! #include <curl/setup.h>
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+--- 49,55 ----
+  
+  #include <errno.h>
+  
+! #include "setup.h"
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+Binary files curl-6.3.1-org/lib/http.o and curl-6.3.1/lib/http.o differ
+diff -cr curl-6.3.1-org/lib/if2ip.c curl-6.3.1/lib/if2ip.c
+*** curl-6.3.1-org/lib/if2ip.c Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/if2ip.c     Thu Dec  9 14:27:28 1999
+***************
+*** 42,48 ****
+  #include <stdlib.h>
+  #include <string.h>
+  
+! #include <curl/setup.h>
+  
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+--- 42,48 ----
+  #include <stdlib.h>
+  #include <string.h>
+  
+! #include "setup.h"
+  
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+diff -cr curl-6.3.1-org/lib/if2ip.h curl-6.3.1/lib/if2ip.h
+*** curl-6.3.1-org/lib/if2ip.h Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/if2ip.h     Thu Dec  9 14:27:49 1999
+***************
+*** 39,45 ****
+   *
+   * ------------------------------------------------------------
+   ****************************************************************************/
+! #include <curl/setup.h>
+  
+  #ifndef WIN32
+  char *if2ip(char *interface);
+--- 39,45 ----
+   *
+   * ------------------------------------------------------------
+   ****************************************************************************/
+! #include "setup.h"
+  
+  #ifndef WIN32
+  char *if2ip(char *interface);
+Binary files curl-6.3.1-org/lib/if2ip.o and curl-6.3.1/lib/if2ip.o differ
+diff -cr curl-6.3.1-org/lib/ldap.c curl-6.3.1/lib/ldap.c
+*** curl-6.3.1-org/lib/ldap.c  Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/ldap.c      Thu Dec  9 15:44:17 1999
+***************
+*** 48,54 ****
+  #include <sys/stat.h>
+  #include <errno.h>
+  
+! #include <curl/setup.h>
+  
+  #if defined(WIN32) && !defined(__GNUC__)
+  #else
+--- 48,54 ----
+  #include <sys/stat.h>
+  #include <errno.h>
+  
+! #include "setup.h"
+  
+  #if defined(WIN32) && !defined(__GNUC__)
+  #else
+***************
+*** 125,130 ****
+--- 125,131 ----
+    struct UrlData *data = (struct UrlData *)param;
+    
+    printf("%s\n", text);
++   return 0;
+  }
+  
+  /***********************************************************************
+***************
+*** 145,155 ****
+--- 146,158 ----
+    void *server;
+    void *result;
+    void *entryIterator;
++ #if 0
+    char *dn;
+    char **attrArray;
+    char *attrIterator;
+    char *attrString;
+    void *dummy;
++ #endif
+    int ldaptext;
+    
+    infof(data, "LDAP: %s %s\n", data->url);
+Only in curl-6.3.1/lib: ldap.c~
+Binary files curl-6.3.1-org/lib/ldap.o and curl-6.3.1/lib/ldap.o differ
+Binary files curl-6.3.1-org/lib/libcurl.a and curl-6.3.1/lib/libcurl.a differ
+diff -cr curl-6.3.1-org/lib/netrc.c curl-6.3.1/lib/netrc.c
+*** curl-6.3.1-org/lib/netrc.c Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/netrc.c     Thu Dec  9 14:27:29 1999
+***************
+*** 54,60 ****
+  #include <stdlib.h>
+  #include <string.h>
+  
+! #include <curl/setup.h>
+  #include "getenv.h"
+  
+  /* Debug this single source file with:
+--- 54,60 ----
+  #include <stdlib.h>
+  #include <string.h>
+  
+! #include "setup.h"
+  #include "getenv.h"
+  
+  /* Debug this single source file with:
+Binary files curl-6.3.1-org/lib/netrc.o and curl-6.3.1/lib/netrc.o differ
+diff -cr curl-6.3.1-org/lib/progress.c curl-6.3.1/lib/progress.c
+*** curl-6.3.1-org/lib/progress.c      Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/progress.c  Thu Dec  9 14:27:29 1999
+***************
+*** 39,45 ****
+   ****************************************************************************/
+  
+  #include <string.h>
+! #include <curl/setup.h>
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #if defined(__MINGW32__)
+--- 39,45 ----
+   ****************************************************************************/
+  
+  #include <string.h>
+! #include "setup.h"
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #if defined(__MINGW32__)
+***************
+*** 56,77 ****
+  /* --- start of progress routines --- */
+  int progressmax=-1;
+  
+- static int progressmode=0;
+  static int prev = 0;
+  static int width = 0;
+  
+- void ProgressMode(int mode)
+- {
+-   progressmode=mode;
+- }
+- 
+  void ProgressInit(struct UrlData *data, int max)
+  {
+!   static char beenhere=0;
+!  
+!   if(beenhere || (data->conf&(CONF_NOPROGRESS|CONF_MUTE)))
+      return;
+!   /*beenhere=1;*/
+    prev = 0;
+  
+  /* TODO: get terminal width through ansi escapes or something similar.
+--- 56,69 ----
+  /* --- start of progress routines --- */
+  int progressmax=-1;
+  
+  static int prev = 0;
+  static int width = 0;
+  
+  void ProgressInit(struct UrlData *data, int max)
+  {
+!   if(data->conf&(CONF_NOPROGRESS|CONF_MUTE))
+      return;
+! 
+    prev = 0;
+  
+  /* TODO: get terminal width through ansi escapes or something similar.
+***************
+*** 89,95 ****
+      return;
+    }
+  
+!   if ( progressmode == URG_PROGRESS_MODE_STATS )
+      fprintf(stderr, "  %%   Received   Total  Speed   Time left  Total   Curr.Speed\n");
+  }
+  
+--- 81,87 ----
+      return;
+    }
+  
+!   if ( data->progressmode == CURL_PROGRESS_STATS )
+      fprintf(stderr, "  %%   Received   Total  Speed   Time left  Total   Curr.Speed\n");
+  }
+  
+***************
+*** 104,111 ****
+  void ProgressShow(struct UrlData *data,
+                    int point, struct timeval start, struct timeval now, bool force)
+  {
+!   switch ( progressmode ) {
+!   case URG_PROGRESS_MODE_STATS:
+      {
+        static long lastshow;
+        double percen;
+--- 96,103 ----
+  void ProgressShow(struct UrlData *data,
+                    int point, struct timeval start, struct timeval now, bool force)
+  {
+!   switch ( data->progressmode ) {
+!   case CURL_PROGRESS_STATS:
+      {
+        static long lastshow;
+        double percen;
+***************
+*** 172,178 ****
+        lastshow = now.tv_sec;
+        break;
+      }
+!   case URG_PROGRESS_MODE_BAR: /* 19990617 larsa */
+      {
+        if (point == prev) break;
+        if (progressmax == -1) {
+--- 164,170 ----
+        lastshow = now.tv_sec;
+        break;
+      }
+!   case CURL_PROGRESS_BAR: /* 19990617 larsa */
+      {
+        if (point == prev) break;
+        if (progressmax == -1) {
+Only in curl-6.3.1/lib: progress.c~
+diff -cr curl-6.3.1-org/lib/progress.h curl-6.3.1/lib/progress.h
+*** curl-6.3.1-org/lib/progress.h      Mon Sep  6 08:59:41 1999
+--- curl-6.3.1/lib/progress.h  Thu Dec  9 14:27:50 1999
+***************
+*** 51,58 ****
+  /* Don't show progress for sizes smaller than: */
+  #define LEAST_SIZE_PROGRESS BUFSIZE
+  
+- /* we want more progress info modes... */
+- #define URG_PROGRESS_MODE_STATS (0) /* default is the mode with value 0 */
+- #define URG_PROGRESS_MODE_BAR   (1)
+- 
+  #endif /* __PROGRESS_H */
+--- 51,54 ----
+Only in curl-6.3.1/lib: progress.h~
+Binary files curl-6.3.1-org/lib/progress.o and curl-6.3.1/lib/progress.o differ
+Only in curl-6.3.1/lib: replace.sh
+Only in curl-6.3.1/lib: replace.sh~
+diff -cr curl-6.3.1-org/lib/sendf.c curl-6.3.1/lib/sendf.c
+*** curl-6.3.1-org/lib/sendf.c Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/sendf.c     Thu Dec  9 14:27:30 1999
+***************
+*** 42,48 ****
+  #include <stdarg.h>
+  #include <stdlib.h>
+  
+! #include <curl/setup.h>
+  
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+--- 42,48 ----
+  #include <stdarg.h>
+  #include <stdlib.h>
+  
+! #include "setup.h"
+  
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+Binary files curl-6.3.1-org/lib/sendf.o and curl-6.3.1/lib/sendf.o differ
+Only in curl-6.3.1/lib: setup.h
+Only in curl-6.3.1/lib: setup.h~
+diff -cr curl-6.3.1-org/lib/speedcheck.h curl-6.3.1/lib/speedcheck.h
+*** curl-6.3.1-org/lib/speedcheck.h    Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/speedcheck.h        Thu Dec  9 14:27:50 1999
+***************
+*** 40,46 ****
+   * ------------------------------------------------------------
+   ****************************************************************************/
+  
+! #include <curl/setup.h>
+  
+  #include "timeval.h"
+  
+--- 40,46 ----
+   * ------------------------------------------------------------
+   ****************************************************************************/
+  
+! #include "setup.h"
+  
+  #include "timeval.h"
+  
+Binary files curl-6.3.1-org/lib/speedcheck.o and curl-6.3.1/lib/speedcheck.o differ
+diff -cr curl-6.3.1-org/lib/ssluse.c curl-6.3.1/lib/ssluse.c
+*** curl-6.3.1-org/lib/ssluse.c        Mon Sep  6 08:59:41 1999
+--- curl-6.3.1/lib/ssluse.c    Thu Dec  9 14:27:30 1999
+***************
+*** 133,138 ****
+--- 133,152 ----
+  
+  #endif
+  
++ #if SSL_VERIFY_CERT
++ int cert_verify_callback(int ok, X509_STORE_CTX *ctx)
++ {
++   X509 *err_cert;
++   char buf[256];
++ 
++   err_cert=X509_STORE_CTX_get_current_cert(ctx);
++   X509_NAME_oneline(X509_get_subject_name(err_cert),buf,256);
++ 
++   return 1;
++ }
++ 
++ #endif
++ 
+  /* ====================================================== */
+  int
+  UrgSSLConnect (struct UrlData *data)
+***************
+*** 176,182 ****
+       return 2;
+        }
+      }
+!     /* Lets make a SSL structure */
+      data->ssl = SSL_new (data->ctx);
+      SSL_set_connect_state (data->ssl);
+  
+--- 190,204 ----
+       return 2;
+        }
+      }
+! 
+! #if SSL_VERIFY_CERT
+!     SSL_CTX_set_verify(data->ctx,
+!                        SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT|
+!                        SSL_VERIFY_CLIENT_ONCE,
+!                        cert_verify_callback);
+! #endif
+! 
+!     /* Lets make an SSL structure */
+      data->ssl = SSL_new (data->ctx);
+      SSL_set_connect_state (data->ssl);
+  
+***************
+*** 227,232 ****
+--- 249,261 ----
+      /* We could do all sorts of certificate verification stuff here before
+         deallocating the certificate. */
+  
++ 
++ #if SSL_VERIFY_CERT
++     infof(data, "Verify result: %d\n", SSL_get_verify_result(data->ssl));
++ #endif
++ 
++ 
++ 
+      X509_free (data->server_cert);
+  #else /* USE_SSLEAY */
+      /* this is for "-ansi -Wall -pedantic" to stop complaining!   (rabe) */
+Only in curl-6.3.1/lib: ssluse.c~
+Binary files curl-6.3.1-org/lib/ssluse.o and curl-6.3.1/lib/ssluse.o differ
+diff -cr curl-6.3.1-org/lib/telnet.c curl-6.3.1/lib/telnet.c
+*** curl-6.3.1-org/lib/telnet.c        Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/telnet.c    Thu Dec  9 14:27:31 1999
+***************
+*** 57,63 ****
+  
+  #include <errno.h>
+  
+! #include <curl/setup.h>
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+--- 57,63 ----
+  
+  #include <errno.h>
+  
+! #include "setup.h"
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+Binary files curl-6.3.1-org/lib/telnet.o and curl-6.3.1/lib/telnet.o differ
+diff -cr curl-6.3.1-org/lib/timeval.h curl-6.3.1/lib/timeval.h
+*** curl-6.3.1-org/lib/timeval.h       Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/timeval.h   Thu Dec  9 14:27:51 1999
+***************
+*** 46,52 ****
+  #include <sys/time.h>
+  #endif
+  
+! #include <curl/setup.h>
+  
+  #ifndef HAVE_GETTIMEOFDAY
+  #if !defined(_WINSOCKAPI_) && !defined(__MINGW32__)
+--- 46,52 ----
+  #include <sys/time.h>
+  #endif
+  
+! #include "setup.h"
+  
+  #ifndef HAVE_GETTIMEOFDAY
+  #if !defined(_WINSOCKAPI_) && !defined(__MINGW32__)
+Binary files curl-6.3.1-org/lib/timeval.o and curl-6.3.1/lib/timeval.o differ
+diff -cr curl-6.3.1-org/lib/upload.c curl-6.3.1/lib/upload.c
+*** curl-6.3.1-org/lib/upload.c        Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/upload.c    Thu Dec  9 14:27:32 1999
+***************
+*** 38,44 ****
+   * ------------------------------------------------------------
+   ****************************************************************************/
+  
+! #include <curl/setup.h>
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+  #endif
+--- 38,44 ----
+   * ------------------------------------------------------------
+   ****************************************************************************/
+  
+! #include "setup.h"
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+  #endif
+Binary files curl-6.3.1-org/lib/upload.o and curl-6.3.1/lib/upload.o differ
+diff -cr curl-6.3.1-org/lib/url.c curl-6.3.1/lib/url.c
+*** curl-6.3.1-org/lib/url.c   Fri Nov 19 08:07:10 1999
+--- curl-6.3.1/lib/url.c       Thu Dec  9 14:27:32 1999
+***************
+*** 54,60 ****
+  
+  #include <errno.h>
+  
+! #include <curl/setup.h>
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+--- 54,60 ----
+  
+  #include <errno.h>
+  
+! #include "setup.h"
+  
+  #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+  #include <winsock.h>
+***************
+*** 387,392 ****
+--- 387,395 ----
+        case URGTAG_POSTFIELDS:
+          data->postfields = (char *)param_obj;
+          break;
++       case URGTAG_PROGRESSMODE:
++         data->progressmode = (long)param_long;
++         break;
+        case URGTAG_REFERER:
+          data->referer = (char *)param_obj;
+          break;
+Only in curl-6.3.1/lib: url.c~
+Binary files curl-6.3.1-org/lib/url.o and curl-6.3.1/lib/url.o differ
+diff -cr curl-6.3.1-org/lib/urldata.h curl-6.3.1/lib/urldata.h
+*** curl-6.3.1-org/lib/urldata.h       Sat Oct 30 17:44:42 1999
+--- curl-6.3.1/lib/urldata.h   Thu Dec  9 14:27:52 1999
+***************
+*** 42,48 ****
+  
+  /* This file is for lib internal stuff */
+  
+! #include <curl/setup.h>
+  
+  #ifndef MAXHOSTNAMELEN
+  #define MAXHOSTNAMELEN 256
+--- 42,48 ----
+  
+  /* This file is for lib internal stuff */
+  
+! #include "setup.h"
+  
+  #ifndef MAXHOSTNAMELEN
+  #define MAXHOSTNAMELEN 256
+***************
+*** 184,189 ****
+--- 184,190 ----
+  
+    char *headerbuff; /* allocated buffer to store headers in */
+    int headersize;   /* size of the allocation */
++   int progressmode; /* what kind of progress meter to display */
+  
+  #define MAX_CURL_USER_LENGTH 128
+  #define MAX_CURL_PASSWORD_LENGTH 128
+Only in curl-6.3.1/lib: urldata.h~
+diff -cr curl-6.3.1-org/lib/version.c curl-6.3.1/lib/version.c
+*** curl-6.3.1-org/lib/version.c       Thu Oct 14 00:27:12 1999
+--- curl-6.3.1/lib/version.c   Thu Dec  9 14:27:32 1999
+***************
+*** 41,47 ****
+  #include <string.h>
+  #include <stdio.h>
+  
+! #include <curl/setup.h>
+  #include <curl/curl.h>
+  #include "urldata.h"
+  
+--- 41,47 ----
+  #include <string.h>
+  #include <stdio.h>
+  
+! #include "setup.h"
+  #include <curl/curl.h>
+  #include "urldata.h"
+  
+Binary files curl-6.3.1-org/lib/version.o and curl-6.3.1/lib/version.o differ
+diff -cr curl-6.3.1-org/src/Makefile curl-6.3.1/src/Makefile
+*** curl-6.3.1-org/src/Makefile        Wed Dec  8 13:39:41 1999
+--- curl-6.3.1/src/Makefile    Thu Dec  9 14:47:51 1999
+***************
+*** 97,107 ****
+  
+  
+  DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I..
+! LDFLAGS = 
+! LIBS = -ldl -lsocket -lnsl 
+  curl_OBJECTS =  main.o hugehelp.o urlglob.o
+  curl_LDFLAGS = 
+! CFLAGS = -g -O2
+  COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+  CCLD = $(CC)
+  LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+--- 97,107 ----
+  
+  
+  DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I..
+! LDFLAGS = -L/homes/qradlsg/openssl-0.9.4
+! LIBS = -lssl -lcrypto -ldl -lsocket -lnsl 
+  curl_OBJECTS =  main.o hugehelp.o urlglob.o
+  curl_LDFLAGS = 
+! CFLAGS = -g -O2 -Wall
+  COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+  CCLD = $(CC)
+  LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+diff -cr curl-6.3.1-org/src/Makefile.in curl-6.3.1/src/Makefile.in
+*** curl-6.3.1-org/src/Makefile.in     Wed Dec  8 13:38:21 1999
+--- curl-6.3.1/src/Makefile.in Thu Dec  9 14:40:07 1999
+***************
+*** 101,107 ****
+  LIBS = @LIBS@
+  curl_OBJECTS =  main.o hugehelp.o urlglob.o
+  curl_LDFLAGS = 
+! CFLAGS = @CFLAGS@
+  COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+  CCLD = $(CC)
+  LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+--- 101,107 ----
+  LIBS = @LIBS@
+  curl_OBJECTS =  main.o hugehelp.o urlglob.o
+  curl_LDFLAGS = 
+! CFLAGS = @CFLAGS@ -Wall
+  COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+  CCLD = $(CC)
+  LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+Only in curl-6.3.1/src: Makefile.in~
+Only in curl-6.3.1/src: config-win32.h
+Only in curl-6.3.1/src: config-win32.h~
+Only in curl-6.3.1/src: config.h
+Only in curl-6.3.1/src: config.h.in
+Only in curl-6.3.1/src: config.h.in~
+Only in curl-6.3.1/src: curl
+Only in curl-6.3.1/src: hugehelp.c
+Binary files curl-6.3.1-org/src/hugehelp.o and curl-6.3.1/src/hugehelp.o differ
+diff -cr curl-6.3.1-org/src/main.c curl-6.3.1/src/main.c
+*** curl-6.3.1-org/src/main.c  Sat Oct 30 17:45:12 1999
+--- curl-6.3.1/src/main.c      Thu Dec  9 14:50:12 1999
+***************
+*** 45,53 ****
+  #include <sys/stat.h>
+  #include <ctype.h>
+  
+! #include "curl/setup.h"
+! #include "curl/curl.h"
+! #include "curl/mprintf.h"
+  #include "../lib/getdate.h"
+  #ifdef GLOBURL
+  #include "urlglob.h"
+--- 45,52 ----
+  #include <sys/stat.h>
+  #include <ctype.h>
+  
+! #include <curl/curl.h>
+! #include <curl/mprintf.h>
+  #include "../lib/getdate.h"
+  #ifdef GLOBURL
+  #include "urlglob.h"
+***************
+*** 54,71 ****
+  #define CURLseparator        "--_curl_--"
+  #define MIMEseparator        "_curl_"
+  #endif
+  #include "version.h"
+  
+! #ifdef WIN32
+  #include <io.h>
+! #else
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+  #endif
+- #endif
+  
+  extern void hugehelp(void);
+- extern void ProgressMode(int);
+  
+  static void helpf(char *fmt, ...)
+  {
+--- 53,73 ----
+  #define CURLseparator        "--_curl_--"
+  #define MIMEseparator        "_curl_"
+  #endif
++ 
++ /* This is now designed to have its own local setup.h */
++ #include "setup.h"
++ 
+  #include "version.h"
+  
+! #ifdef HAVE_IO_H /* typical win32 habit */
+  #include <io.h>
+! #endif
+! 
+  #ifdef HAVE_UNISTD_H
+  #include <unistd.h>
+  #endif
+  
+  extern void hugehelp(void);
+  
+  static void helpf(char *fmt, ...)
+  {
+***************
+*** 173,178 ****
+--- 175,181 ----
+    bool crlf;
+    char *cookiefile;
+    char *httprequest;
++   bool progressmode;
+  
+    FILE *errors; /* if stderr redirect is requested */
+  
+***************
+*** 412,419 ****
+        else
+          config->errors = stdout;
+        break;
+!     case '#': /* 19990617 larsa */
+!       ProgressMode(1);
+        break;
+      case '2': 
+        /* SSL version 2 */
+--- 415,422 ----
+        else
+          config->errors = stdout;
+        break;
+!     case '#': /* added 19990617 larsa */
+!       config->progressmode ^= CURL_PROGRESS_BAR;
+        break;
+      case '2': 
+        /* SSL version 2 */
+***************
+*** 833,839 ****
+    int infilesize=-1; /* -1 means unknown */
+    bool stillflags=TRUE;
+  
+!   int res;
+    int i;
+    struct Configurable config;
+  
+--- 836,842 ----
+    int infilesize=-1; /* -1 means unknown */
+    bool stillflags=TRUE;
+  
+!   int res=URG_OK;
+    int i;
+    struct Configurable config;
+  
+***************
+*** 937,943 ****
+      printf("Content-Type: multipart/mixed; boundary=%s\n\n", MIMEseparator);
+  #endif
+    }
+!   for (i = 0; url = next_url(urls); ++i) {
+      if (outfiles)
+        config.outfile = strdup(outfiles);
+  #endif
+--- 940,946 ----
+      printf("Content-Type: multipart/mixed; boundary=%s\n\n", MIMEseparator);
+  #endif
+    }
+!   for (i = 0; (url = next_url(urls)); ++i) {
+      if (outfiles)
+        config.outfile = strdup(outfiles);
+  #endif
+***************
+*** 1105,1116 ****
+                      URGTAG_CRLF, config.crlf,
+                      URGTAG_QUOTE, config.quote,
+                      URGTAG_WRITEHEADER, headerfilep,
+- 
+                      URGTAG_COOKIEFILE, config.cookiefile,
+                      URGTAG_SSLVERSION, config.ssl_version,
+                      URGTAG_TIMECONDITION, config.timecond,
+                      URGTAG_TIMEVALUE, config.condtime,
+                      URGTAG_HTTPREQUEST, config.httprequest,
+                      URGTAG_DONE); /* always terminate the list of tags */
+    if(!config.errors)
+      config.errors = stderr;
+--- 1108,1119 ----
+                      URGTAG_CRLF, config.crlf,
+                      URGTAG_QUOTE, config.quote,
+                      URGTAG_WRITEHEADER, headerfilep,
+                      URGTAG_COOKIEFILE, config.cookiefile,
+                      URGTAG_SSLVERSION, config.ssl_version,
+                      URGTAG_TIMECONDITION, config.timecond,
+                      URGTAG_TIMEVALUE, config.condtime,
+                      URGTAG_HTTPREQUEST, config.httprequest,
++                     URGTAG_PROGRESSMODE, config.progressmode,
+                      URGTAG_DONE); /* always terminate the list of tags */
+    if(!config.errors)
+      config.errors = stderr;
+Only in curl-6.3.1/src: main.c~
+Binary files curl-6.3.1-org/src/main.o and curl-6.3.1/src/main.o differ
+Only in curl-6.3.1/src: setup.h
+Only in curl-6.3.1/src: setup.h~
+Only in curl-6.3.1/src: stamp-h2
+diff -cr curl-6.3.1-org/src/urlglob.c curl-6.3.1/src/urlglob.c
+*** curl-6.3.1-org/src/urlglob.c       Thu Oct 14 00:28:43 1999
+--- curl-6.3.1/src/urlglob.c   Wed Dec  8 16:55:55 1999
+***************
+*** 41,46 ****
+--- 41,47 ----
+  #include <stdio.h>
+  #include <stdlib.h>
+  #include <string.h>
++ #include <ctype.h>
+  #include <curl/curl.h>
+  #include "urlglob.h"
+  
+***************
+*** 117,123 ****
+       - num range with leading zeros: e.g. "001-999]"
+       expression is checked for well-formedness and collected until the next ']'
+    */
+-   char* buf = glob_buffer;
+    URLPattern *pat;
+    char *c;
+    
+--- 118,123 ----
+***************
+*** 125,131 ****
+    /* patterns 0,1,2,... correspond to size=1,3,5,... */
+    ++glob_expand->size;
+  
+!   if (isalpha(*pattern)) {           /* character range detected */
+      pat->type = UPTCharRange;
+      if (sscanf(pattern, "%c-%c]", &pat->content.CharRange.min_c, &pat->content.CharRange.max_c) != 2 ||
+       pat->content.CharRange.min_c >= pat->content.CharRange.max_c ||
+--- 125,131 ----
+    /* patterns 0,1,2,... correspond to size=1,3,5,... */
+    ++glob_expand->size;
+  
+!   if (isalpha((int)*pattern)) {              /* character range detected */
+      pat->type = UPTCharRange;
+      if (sscanf(pattern, "%c-%c]", &pat->content.CharRange.min_c, &pat->content.CharRange.max_c) != 2 ||
+       pat->content.CharRange.min_c >= pat->content.CharRange.max_c ||
+***************
+*** 139,145 ****
+      return (pat->content.CharRange.max_c - pat->content.CharRange.min_c + 1) *
+        glob_word(pattern + 4, pos + 4);
+    }
+!   if (isdigit(*pattern)) {           /* numeric range detected */
+      pat->type = UPTNumRange;
+      pat->content.NumRange.padlength = 0;
+      if (sscanf(pattern, "%d-%d]", &pat->content.NumRange.min_n, &pat->content.NumRange.max_n) != 2 ||
+--- 139,145 ----
+      return (pat->content.CharRange.max_c - pat->content.CharRange.min_c + 1) *
+        glob_word(pattern + 4, pos + 4);
+    }
+!   if (isdigit((int)*pattern)) {              /* numeric range detected */
+      pat->type = UPTNumRange;
+      pat->content.NumRange.padlength = 0;
+      if (sscanf(pattern, "%d-%d]", &pat->content.NumRange.min_n, &pat->content.NumRange.max_n) != 2 ||
+***************
+*** 150,156 ****
+      }
+      if (*pattern == '0') {           /* leading zero specified */
+        c = pattern;  
+!       while (isdigit(*c++))
+       ++pat->content.NumRange.padlength;      /* padding length is set for all instances
+                                                  of this pattern */
+      }
+--- 150,156 ----
+      }
+      if (*pattern == '0') {           /* leading zero specified */
+        c = pattern;  
+!       while (isdigit((int)*c++))
+       ++pat->content.NumRange.padlength;      /* padding length is set for all instances
+                                                  of this pattern */
+      }
+***************
+*** 296,302 ****
+  
+    while (*filename != '\0') {
+      if (*filename == '#') {
+!       if (!isdigit(*++filename) ||
+         *filename == '0') {           /* only '#1' ... '#9' allowed */
+       printf("illegal matching expression\n");
+       exit(URG_URL_MALFORMAT);
+--- 296,302 ----
+  
+    while (*filename != '\0') {
+      if (*filename == '#') {
+!       if (!isdigit((int)*++filename) ||
+         *filename == '0') {           /* only '#1' ... '#9' allowed */
+       printf("illegal matching expression\n");
+       exit(URG_URL_MALFORMAT);
+Only in curl-6.3.1/src: urlglob.c~
+Binary files curl-6.3.1-org/src/urlglob.o and curl-6.3.1/src/urlglob.o differ
diff --git a/curl_63_form.patch b/curl_63_form.patch
new file mode 100644 (file)
index 0000000..03738db
--- /dev/null
@@ -0,0 +1,92 @@
+*** /homes/qradlsg/curl-org/lib/formdata.c     Thu Oct 14 00:27:12 1999
+--- formdata.c Mon Nov 22 16:55:20 1999
+***************
+*** 41,47 ****
+  /*
+    Debug the form generator stand-alone by compiling this source file with:
+  
+!   'make formdata'
+  
+    run the 'formdata' executable and make sure the output is ok!
+  
+--- 41,47 ----
+  /*
+    Debug the form generator stand-alone by compiling this source file with:
+  
+!   gcc -DHAVE_CONFIG_H -I../ -g -D_FORM_DEBUG -o formdata -I../include formdata.c
+  
+    run the 'formdata' executable and make sure the output is ok!
+  
+***************
+*** 313,320 ****
+    if(!length)
+      length = strlen((char *)line);
+  
+!   newform->line = (char *)malloc(length);
+!   memcpy(newform->line, line, length);
+    newform->length = length;
+    
+    if(*formp) {
+--- 313,320 ----
+    if(!length)
+      length = strlen((char *)line);
+  
+!   newform->line = (char *)malloc(length+1);
+!   memcpy(newform->line, line, length+1);
+    newform->length = length;
+    
+    if(*formp) {
+***************
+*** 499,504 ****
+--- 499,505 ----
+        size += AddFormDataf(&form,
+                          "\r\n--%s--",
+                          fileboundary);     
++       free(fileboundary);
+      }
+  
+    } while((post=post->next)); /* for each field */
+***************
+*** 511,518 ****
+    *sizep = size;
+  
+    free(boundary);
+-   if(fileboundary)
+-     free(fileboundary);
+  
+    return firstform;
+  }
+--- 512,517 ----
+***************
+*** 572,577 ****
+--- 571,583 ----
+  
+    form->data = form->data->next; /* advance */
+  
++   if(!gotsize && form->data) {
++     /* If we got an empty line and we have more data, we proceed to the next
++        line immediately to avoid returning zero before we've reached the end.
++        This is the bug reported November 22 1999 on curl 6.3. (Daniel) */
++     gotsize = FormReader(buffer, size, nitems, mydata);
++   }
++ 
+    return gotsize;
+  }
+  
+***************
+*** 615,621 ****
+    FormInit(&formread, form);
+  
+    while(nread = FormReader(buffer, 1, sizeof(buffer), (FILE *)&formread)) {
+!     fwrite(buffer, nread, 1, stdout);
+    }
+  
+    fprintf(stderr, "size: %d\n", size);
+--- 621,627 ----
+    FormInit(&formread, form);
+  
+    while(nread = FormReader(buffer, 1, sizeof(buffer), (FILE *)&formread)) {
+!     fwrite(buffer, nread, 1, stderr);
+    }
+  
+    fprintf(stderr, "size: %d\n", size);
diff --git a/curl_63_partialdl.patch b/curl_63_partialdl.patch
new file mode 100644 (file)
index 0000000..9df65e2
--- /dev/null
@@ -0,0 +1,106 @@
+*** /homes/qradlsg/curl-org/lib/download.c     Thu Nov 11 08:57:12 1999
+--- lib/download.c     Mon Nov 22 08:33:13 1999
+***************
+*** 455,461 ****
+  #endif
+      }
+    }
+! 
+    ProgressShow (data, bytecount, start, now, TRUE);
+  
+    *bytecountp = bytecount;
+--- 455,464 ----
+  #endif
+      }
+    }
+!   if(contentlength && (bytecount != contentlength)) {
+!     failf(data, "transfer closed with %d bytes remaining", contentlength-bytecount);
+!     return URG_PARTIAL_FILE;
+!   }
+    ProgressShow (data, bytecount, start, now, TRUE);
+  
+    *bytecountp = bytecount;
+*** /homes/qradlsg/curl-org/include/curl/curl.h        Thu Nov 11 21:58:02 1999
+--- include/curl/curl.h        Mon Nov 22 08:33:59 1999
+***************
+*** 159,165 ****
+    URG_FTP_CANT_GET_HOST,
+    URG_FTP_CANT_RECONNECT,
+    URG_FTP_COULDNT_SET_BINARY,
+!   URG_FTP_PARTIAL_FILE,
+    URG_FTP_COULDNT_RETR_FILE,
+    URG_FTP_WRITE_ERROR,
+    URG_FTP_QUOTE_ERROR,
+--- 159,165 ----
+    URG_FTP_CANT_GET_HOST,
+    URG_FTP_CANT_RECONNECT,
+    URG_FTP_COULDNT_SET_BINARY,
+!   URG_PARTIAL_FILE,
+    URG_FTP_COULDNT_RETR_FILE,
+    URG_FTP_WRITE_ERROR,
+    URG_FTP_QUOTE_ERROR,
+***************
+*** 197,202 ****
+--- 197,205 ----
+    URL_LAST
+  } UrgError;
+  
++ /* This is just to make older programs not break: */
++ #define URG_FTP_PARTIAL_FILE URG_PARTIAL_FILE
++ 
+  #define URGTAG_DONE -1
+  #define URGTAG_LAST -1
+  #define URGTAG_END -1
+*** /homes/qradlsg/curl-org/lib/ftp.c  Sat Oct 30 17:43:25 1999
+--- lib/ftp.c  Mon Nov 22 08:34:27 1999
+***************
+*** 707,713 ****
+      if((-1 != data->infilesize) && (data->infilesize != *bytecountp)) {
+        failf(data, "Wrote only partial file (%d out of %d bytes)",
+              *bytecountp, data->infilesize);
+!       return URG_FTP_PARTIAL_FILE;
+      }
+    }
+    else {
+--- 707,713 ----
+      if((-1 != data->infilesize) && (data->infilesize != *bytecountp)) {
+        failf(data, "Wrote only partial file (%d out of %d bytes)",
+              *bytecountp, data->infilesize);
+!       return URG_PARTIAL_FILE;
+      }
+    }
+    else {
+***************
+*** 908,914 ****
+          if(size <= 0) {
+            failf(data, "Offset (%d) was beyond file size (%d)",
+                  data->resume_from, data->resume_from+size);
+!           return URG_FTP_PARTIAL_FILE;
+          }
+        }
+  #endif
+--- 908,914 ----
+          if(size <= 0) {
+            failf(data, "Offset (%d) was beyond file size (%d)",
+                  data->resume_from, data->resume_from+size);
+!           return URG_PARTIAL_FILE;
+          }
+        }
+  #endif
+***************
+*** 929,935 ****
+  
+        if((-1 != size) && (size != *bytecountp)) {
+          failf(data, "Received only partial file");
+!         return URG_FTP_PARTIAL_FILE;
+        }
+        else if(0 == *bytecountp) {
+          failf(data, "No data was received!");
+--- 929,935 ----
+  
+        if((-1 != size) && (size != *bytecountp)) {
+          failf(data, "Received only partial file");
+!         return URG_PARTIAL_FILE;
+        }
+        else if(0 == *bytecountp) {
+          failf(data, "No data was received!");
diff --git a/head b/head
new file mode 100644 (file)
index 0000000..827f817
--- /dev/null
+++ b/head
@@ -0,0 +1,7 @@
+HTTP/1.1 200 OK\r
+Server: Microsoft-IIS/4.0\r
+Date: Thu, 02 Dec 1999 23:15:03 GMT\r
+Content-Type: text/html\r
+Set-Cookie: ASPSESSIONIDGQQQGGPD=HEDEOJCAIDADIKKLCFIFEJAJ; path=/\r
+Cache-control: private\r
+\r
diff --git a/include/README b/include/README
new file mode 100644 (file)
index 0000000..fc9ea91
--- /dev/null
@@ -0,0 +1,15 @@
+                                  _   _ ____  _     
+                              ___| | | |  _ \| |    
+                             / __| | | | |_) | |    
+                            | (__| |_| |  _ <| |___ 
+                             \___|\___/|_| \_\_____|
+
+Include files for libcurl, external users.
+
+They're all placed in the curl subdirectory here for better fit in any kind
+of environment. You should include files from here using...
+
+        #include <curl/curl.h>
+
+... style and point the compiler's include path to the directory holding the
+curl subdirectory. It makes it more likely to survice future modifications.
diff --git a/include/curl/curl.beos-patch b/include/curl/curl.beos-patch
new file mode 100644 (file)
index 0000000..67bab36
--- /dev/null
@@ -0,0 +1,46 @@
+Index: include/curl/curl.h
+===================================================================
+RCS file: /cvs/curl/curl/include/curl/curl.h,v
+retrieving revision 1.5
+diff -u -r1.5 curl.h
+--- curl.h     1999/11/23 08:22:42     1.5
++++ curl.h     1999/11/24 16:19:11
+@@ -365,9 +365,13 @@
+   TIMECOND_LAST
+ } TimeCond;
++#ifdef __BEOS__
++#include <support/SupportDefs.h>
++#else
+ #ifndef __cplusplus        /* (rabe) */
+ typedef char bool;
+ #endif                     /* (rabe) */
++#endif
+ /**********************************************************************
+  *
+Index: include/curl/setup.h
+===================================================================
+RCS file: /cvs/curl/curl/include/curl/setup.h,v
+retrieving revision 1.2
+diff -u -r1.2 setup.h
+--- setup.h    1999/10/17 11:18:34     1.2
++++ setup.h    1999/11/24 16:19:11
+@@ -139,10 +139,17 @@
+ #define DOT_CHAR      "_"
+ #else
++#ifdef __BEOS__
++#define sclose(x) closesocket(x)
++#define sread(x,y,z) recv(x,y,z,0)
++#define swrite(x,y,z) send(x,y,z,0)
++#define myalarm(x) alarm(x)
++#else
+ #define sclose(x) close(x)
+ #define sread(x,y,z) read(x,y,z)
+ #define swrite(x,y,z) write(x,y,z)
+ #define myalarm(x) alarm(x)
++#endif
+ #define PATH_CHAR     ":"
+ #define DIR_CHAR      "/"
diff --git a/include/curl/curl.h b/include/curl/curl.h
new file mode 100644 (file)
index 0000000..a74625d
--- /dev/null
@@ -0,0 +1,434 @@
+#ifndef __URL_H
+#define __URL_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+
+#define CONF_DEFAULT 0
+#define CONF_PROXY   (1<<0) /* set if proxy is in use */
+#define CONF_PORT    (1<<1) /* set if different port than protcol-defines is
+                               used */
+#define CONF_HTTP    (1<<2) /* http get */
+#define CONF_GOPHER  (1<<3) /* gopher get */
+#define CONF_FTP     (1<<4) /* ftp get (binary mode) */
+#define CONF_VERBOSE (1<<5) /* talk a lot */
+
+#define CONF_TELNET  (1<<6)
+
+#define CONF_HEADER  (1<<8) /* throw the header out too */
+#define CONF_USERPWD (1<<9) /* user+passwd has been specified */
+#define CONF_NOPROGRESS (1<<10) /* shut off the progress meter (auto)
+                                   see also _MUTE */
+#define CONF_NOBODY  (1<<11) /* use HEAD to get http document */
+#define CONF_FAILONERROR (1<<12) /* Makes urlget() fail with a return code
+                                    WITHOUT writing anything to the output if
+                                    a return code >=300 is returned from the
+                                    server. */
+#define CONF_RANGE (1<<13) /* Byte-range request, specified parameter is set */
+#define CONF_UPLOAD (1<<14) /* this is an upload, only supported for ftp
+                               currently */
+
+#define CONF_POST (1<<15) /* HTTP POST method */
+
+/* When getting an FTP directory, this switch makes the listing only show file
+   names and nothing else. Makes machine parsing of the output possible. This
+   enforces the NLST command to the ftp server, compared to the otherwise
+   used: LIST. */
+#define CONF_FTPLISTONLY (1<<16)
+
+/* Set the referer string */
+#define CONF_REFERER (1<<17)
+#define CONF_PROXYUSERPWD (1<<18) /* Proxy user+passwd has been specified */
+
+/* For FTP, use PORT instead of PASV! */
+#define CONF_FTPPORT (1<<19)
+
+/* FTP: Append instead of overwrite on upload! */
+#define CONF_FTPAPPEND (1<<20)
+
+#define CONF_HTTPS (1<<21)  /* Use SSLeay for encrypted communication */
+
+#define CONF_NETRC (1<<22)  /* read user+password from .netrc */
+
+#define CONF_FOLLOWLOCATION (1<<23) /* get the page that the Location: tells
+                                      us to get */
+
+#define CONF_FTPASCII (1<<24) /* use TYPE A for transfer */
+
+#define CONF_HTTPPOST (1<<25) /* this causes a multipart/form-data
+                                HTTP POST */
+#define CONF_NOPROT   (1<<26) /* host name specified without protocol */
+
+#define CONF_PUT      (1<<27) /* PUT the input file */
+
+#define CONF_MUTE     (1<<28) /* force NOPROGRESS */
+
+#define CONF_DICT     (1<<29) /* DICT:// protocol */
+
+#define CONF_FILE     (1<<30) /* FILE:// protocol */
+
+#define CONF_LDAP     (1<<31) /* LDAP:// protocol */
+
+#ifdef MULTIDOC
+struct MoreDoc {
+  struct MoreDoc *next; /* next entry in the list */
+  char *path; /* pointer to allocated path */
+  FILE *store; /* where to put the doc */
+};
+#endif
+
+struct HttpHeader {
+  struct HttpHeader *next; /* next entry in the list */
+  char *header; /* pointer to allocated line without newline */
+};
+
+struct HttpPost {
+  struct HttpPost *next; /* next entry in the list */
+  char *name;     /* pointer to allocated name */
+  char *contents; /* pointer to allocated data contents */
+  char *contenttype; /* Content-Type */
+  struct HttpPost *more; /* if one field name has more than one file, this
+                           link should link to following files */
+  long flags;     /* as defined below */
+#define HTTPPOST_FILENAME (1<<0) /* specified content is a file name */
+};
+
+
+/* All possible error codes from this version of urlget(). Future versions
+   may return other values, stay prepared. */
+
+typedef enum {
+  URG_OK = 0,
+  URG_UNSUPPORTED_PROTOCOL,
+  URG_FAILED_INIT,
+  URG_URL_MALFORMAT,
+  URG_URL_MALFORMAT_USER,
+  URG_COULDNT_RESOLVE_PROXY,
+  URG_COULDNT_RESOLVE_HOST,
+  URG_COULDNT_CONNECT,
+  URG_FTP_WEIRD_SERVER_REPLY,
+  URG_FTP_ACCESS_DENIED,
+  URG_FTP_USER_PASSWORD_INCORRECT,
+  URG_FTP_WEIRD_PASS_REPLY,
+  URG_FTP_WEIRD_USER_REPLY,
+  URG_FTP_WEIRD_PASV_REPLY,
+  URG_FTP_WEIRD_227_FORMAT,
+  URG_FTP_CANT_GET_HOST,
+  URG_FTP_CANT_RECONNECT,
+  URG_FTP_COULDNT_SET_BINARY,
+  URG_PARTIAL_FILE,
+  URG_FTP_COULDNT_RETR_FILE,
+  URG_FTP_WRITE_ERROR,
+  URG_FTP_QUOTE_ERROR,
+  URG_HTTP_NOT_FOUND,
+  URG_WRITE_ERROR,
+
+  URG_MALFORMAT_USER, /* the user name is illegally specified */
+  URG_FTP_COULDNT_STOR_FILE, /* failed FTP upload */
+  URG_READ_ERROR, /* could open/read from file */
+
+  URG_OUT_OF_MEMORY,
+  URG_OPERATION_TIMEOUTED, /* the timeout time was reached */
+  URG_FTP_COULDNT_SET_ASCII, /* TYPE A failed */
+
+  URG_FTP_PORT_FAILED, /* FTP PORT operation failed */
+
+  URG_FTP_COULDNT_USE_REST, /* the REST command failed */
+  URG_FTP_COULDNT_GET_SIZE, /* the SIZE command failed */
+
+  URG_HTTP_RANGE_ERROR, /* The RANGE "command" didn't seem to work */
+
+  URG_HTTP_POST_ERROR,
+
+  URG_SSL_CONNECT_ERROR, /* something was wrong when connecting with SSL */
+
+  URG_FTP_BAD_DOWNLOAD_RESUME, /* couldn't resume download */
+
+  URG_FILE_COULDNT_READ_FILE,
+
+  URG_LDAP_CANNOT_BIND,
+  URG_LDAP_SEARCH_FAILED,
+  URG_LIBRARY_NOT_FOUND,
+  URG_FUNCTION_NOT_FOUND,
+
+  URL_LAST
+} UrgError;
+
+/* This is just to make older programs not break: */
+#define URG_FTP_PARTIAL_FILE URG_PARTIAL_FILE
+
+#define URGTAG_DONE -1
+#define URGTAG_LAST -1
+#define URGTAG_END -1
+
+#define URLGET_ERROR_SIZE 256
+
+/* maximum URL length we deal with */
+#define URL_MAX_LENGTH 4096 
+#define URL_MAX_LENGTH_TXT "4095"
+
+/* name is uppercase URGTAG_<name>,
+   type is one of the defined URGTYPE_<type>
+   number is unique identifier */
+#define T(name,type,number) URGTAG_ ## name = URGTYPE_ ## type + number
+
+/* long may be 32 or 64 bits, but we should never depend on anything else
+   but 32 */
+#define URGTYPE_LONG          0
+#define URGTYPE_OBJECTPOINT   10000
+#define URGTYPE_FUNCTIONPOINT 20000
+
+typedef enum {
+  URGTAG_NOTHING, /* the first unused */
+  
+  /* This is the FILE * the regular output should be written to. */
+  T(FILE, OBJECTPOINT, 1),
+
+  /* The full URL to get/put */
+  T(URL,  OBJECTPOINT, 2),
+
+  /* Port number to connect to, if other than default. Specify the CONF_PORT
+     flag in the URGTAG_FLAGS to activate this */
+  T(PORT, LONG, 3),
+
+  /* Name of proxy to use. Specify the CONF_PROXY flag in the URGTAG_FLAGS to
+     activate this */
+  T(PROXY, OBJECTPOINT, 4),
+  
+  /* Name and password to use when fetching. Specify the CONF_USERPWD flag in
+     the URGTAG_FLAGS to activate this */
+  T(USERPWD, OBJECTPOINT, 5),
+
+  /* Name and password to use with Proxy. Specify the CONF_PROXYUSERPWD 
+     flag in the URGTAG_FLAGS to activate this */
+  T(PROXYUSERPWD, OBJECTPOINT, 6),
+
+  /* Range to get, specified as an ASCII string. Specify the CONF_RANGE flag
+     in the URGTAG_FLAGS to activate this */
+  T(RANGE, OBJECTPOINT, 7),
+
+  /* Configuration flags */
+  T(FLAGS, LONG, 8),
+
+  /* Specified file stream to upload from (use as input): */
+  T(INFILE, OBJECTPOINT, 9),
+
+  /* Buffer to receive error messages in, must be at least URLGET_ERROR_SIZE
+     bytes big. If this is not used, error messages go to stderr instead: */
+  T(ERRORBUFFER, OBJECTPOINT, 10),
+
+  /* Function that will be called to store the output (instead of fwrite). The
+     parameters will use fwrite() syntax, make sure to follow them. */
+  T(WRITEFUNCTION, FUNCTIONPOINT, 11),
+
+  /* Function that will be called to read the input (instead of fread). The
+     parameters will use fread() syntax, make sure to follow them. */
+  T(READFUNCTION, FUNCTIONPOINT, 12),
+
+  /* Time-out the read operation after this amount of seconds */
+  T(TIMEOUT, LONG, 13),
+
+  /* If the URGTAG_INFILE is used, this can be used to inform urlget about how
+     large the file being sent really is. That allows better error checking
+     and better verifies that the upload was succcessful. -1 means unknown
+     size. */
+  T(INFILESIZE, LONG, 14),
+
+  /* POST input fields. */
+  T(POSTFIELDS, OBJECTPOINT, 15),
+
+  /* Set the referer page (needed by some CGIs) */
+  T(REFERER, OBJECTPOINT, 16),
+
+  /* Set the FTP PORT string (interface name, named or numerical IP address)
+     Use i.e '-' to use default address. */
+  T(FTPPORT, OBJECTPOINT, 17),
+
+  /* Set the User-Agent string (examined by some CGIs) */
+  T(USERAGENT, OBJECTPOINT, 18),
+
+  /* If the download receives less than "low speed limit" bytes/second
+   * during "low speed time" seconds, the operations is aborted.
+   * You could i.e if you have a pretty high speed connection, abort if
+   * it is less than 2000 bytes/sec during 20 seconds.   
+   */
+
+  /* Set the "low speed limit" */
+  T(LOW_SPEED_LIMIT, LONG , 19),
+
+  /* Set the "low speed time" */
+  T(LOW_SPEED_TIME, LONG, 20),
+
+  /* Set the continuation offset */
+  T(RESUME_FROM, LONG, 21),
+
+  /* Set cookie in request: */
+  T(COOKIE, OBJECTPOINT, 22),
+
+  /* This points to a linked list of headers, struct HttpHeader kind */
+  T(HTTPHEADER, OBJECTPOINT, 23),
+
+  /* This points to a linked list of post entries, struct HttpPost */
+  T(HTTPPOST, OBJECTPOINT, 24),
+
+  /* name of the file keeping your private SSL-certificate */
+  T(SSLCERT, OBJECTPOINT, 25),
+
+  /* password for the SSL-certificate */
+  T(SSLCERTPASSWD, OBJECTPOINT, 26),
+  
+  /* send TYPE parameter? */
+  T(CRLF, LONG, 27),
+
+  /* send linked-list of QUOTE commands */
+  T(QUOTE, OBJECTPOINT, 28),
+
+  /* send FILE * to store headers to */
+  T(WRITEHEADER, OBJECTPOINT, 29),
+
+#ifdef MULTIDOC
+  /* send linked list of MoreDoc structs */
+  T(MOREDOCS, OBJECTPOINT, 30),
+#endif
+
+  /* point to a file to read the initial cookies from, also enables
+     "cookie awareness" */
+  T(COOKIEFILE, OBJECTPOINT, 31),
+
+  /* What version to specifly try to use.
+     3 = SSLv3, 2 = SSLv2, all else makes it try v3 first then v2 */
+  T(SSLVERSION, LONG, 32),
+
+  /* What kind of HTTP time condition to use, see defines */
+  T(TIMECONDITION, LONG, 33),
+
+  /* Time to use with the above condition. Specified in number of seconds
+     since 1 Jan 1970 */
+  T(TIMEVALUE, LONG, 34),
+
+  /* HTTP request, for odd commands like DELETE, TRACE and others */
+  /* OBSOLETE DEFINE, left for tradition only */
+  T(HTTPREQUEST, OBJECTPOINT, 35),
+
+  /* Custom request, for customizing the get command like
+     HTTP: DELETE, TRACE and others
+     FTP: to use a different list command
+     */
+  T(CUSTOMREQUEST, OBJECTPOINT, 35),
+
+  /* HTTP request, for odd commands like DELETE, TRACE and others */
+  T(STDERR, OBJECTPOINT, 36),
+
+  /* Progress mode sets alternative progress mode displays, the only
+     one defined today is 1 which makes the #-style progress bar. */
+  T(PROGRESSMODE, LONG, 37),
+
+  URGTAG_LASTENTRY /* the last unusued */
+} UrgTag;
+
+#define CURL_PROGRESS_STATS 0 /* default progress display */
+#define CURL_PROGRESS_BAR   1
+
+typedef enum {
+  TIMECOND_NONE,
+
+  TIMECOND_IFMODSINCE,
+  TIMECOND_IFUNMODSINCE,
+  TIMECOND_LASTMOD,
+
+  TIMECOND_LAST
+} TimeCond;
+
+#ifdef __BEOS__
+#include <support/SupportDefs.h>
+#else
+#ifndef __cplusplus        /* (rabe) */
+typedef char bool;
+#endif                     /* (rabe) */
+#endif
+
+/**********************************************************************
+ *
+ * >>> urlget() interface #defines changed in v5! <<<
+ *
+ * You enter parameters as tags. Tags are specified as a pair of parameters.
+ * The first parameter in a pair is the tag identifier, telling urlget what
+ * kind of tag it is, and the second is the data. The tags may come in any
+ * order but MUST ALWAYS BE TERMINATED with an ending URGTAG_DONE (which
+ * needs no data).
+ *
+ * _Very_ simple example:
+ *
+ * curl_urlget(URGTAG_URL, "http://www.fts.frontec.se/~dast/", URGTAG_DONE);
+ *
+ ***********************************************************************/
+
+UrgError curl_urlget(UrgTag, ...);
+
+/* external form function */
+int curl_FormParse(char *string,
+                   struct HttpPost **httppost,
+                   struct HttpPost **last_post);
+
+/* Unix and Win32 getenv function call */
+char *curl_GetEnv(char *variable);
+
+/* returns ascii string of the libcurl version */
+char *curl_version(void);
+
+/* This is the version number */
+#define LIBCURL_VERSION "6.3.1"
+
+/* linked-list structure for QUOTE */
+struct curl_slist {
+       char                    *data;
+       struct curl_slist       *next;
+};
+
+struct curl_slist *curl_slist_append(struct curl_slist *list, char *data);
+void curl_slist_free_all(struct curl_slist *list);
+
+#endif /* __URLGET_H */
diff --git a/include/curl/getdate.h b/include/curl/getdate.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/include/curl/mprintf.h b/include/curl/mprintf.h
new file mode 100644 (file)
index 0000000..65c64f4
--- /dev/null
@@ -0,0 +1,93 @@
+/*************************************************************************
+ *
+ * $Id$
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.0 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/ 
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License. 
+ *
+ * The Original Code is Triacle.
+ *
+ * The Initial Developers of the Original Code are Bjorn Reese and
+ * Daniel Stenberg.
+ *
+ * Portions created by Initial Developers are
+ *
+ *   Copyright (C) 1998 Bjorn Reese and Daniel Stenberg.
+ *   All Rights Reserved. 
+ *
+ * Contributor(s):
+ *
+ *************************************************************************
+ *
+ * Preliminary documentation
+ *
+ * printf conversions:
+ *
+ *  conversion ::= '%%' | '%' [position] ( number | float | string )
+ *  position ::= digits '$'
+ *  number ::= [number-flags] ( 'd' | 'i' | 'o' | 'x' | 'X' | 'u')
+ *  number-flags ::= 'h' | 'l' | 'L' ...
+ *  float ::= [float-flags] ( 'f' | 'e' | 'E' | 'g' | 'G' )
+ *  string ::= [string-flags] 's'
+ *  string-flags ::= padding | '#'
+ *  digits ::= (digit)+
+ *  digit ::= 0-9
+ *
+ *  c
+ *  p
+ *  n
+ *
+ * qualifiers
+ *
+ *  -     : left adjustment
+ *  +     : show sign
+ *  SPACE : padding
+ *  #     : alterative
+ *  .     : precision
+ *  *     : width
+ *  0     : padding / size
+ *  1-9   : size
+ *  h     : short
+ *  l     : long
+ *  ll    : longlong
+ *  L     : long double
+ *  Z     : long / longlong
+ *  q     : longlong
+ *
+ ************************************************************************/
+
+#ifndef H_MPRINTF
+#define H_MPRINTF
+
+#include <stdarg.h>
+
+int mprintf(const char *format, ...);
+int mfprintf(FILE *fd, const char *format, ...);
+int msprintf(char *buffer, const char *format, ...);
+int msnprintf(char *buffer, size_t maxlength, const char *format, ...);
+int mvprintf(const char *format, va_list args);
+int mvfprintf(FILE *fd, const char *format, va_list args);
+int mvsprintf(char *buffer, const char *format, va_list args);
+int mvsnprintf(char *buffer, size_t maxlength, const char *format, va_list args);
+char *maprintf(const char *format, ...);
+char *mvaprintf(const char *format, va_list args);
+
+#ifdef _MPRINTF_REPLACE
+# define printf mprintf
+# define fprintf mfprintf
+# define sprintf msprintf
+# define snprintf msnprintf
+# define vprintf mvprintf
+# define vfprintf mvfprintf
+# define vsprintf mvsprintf
+# define vsnprintf mvsnprintf
+#endif
+
+#endif /* H_MPRINTF */
diff --git a/include/curl/stdcheaders.h b/include/curl/stdcheaders.h
new file mode 100644 (file)
index 0000000..3027b86
--- /dev/null
@@ -0,0 +1,53 @@
+#ifndef __STDC_HEADERS_H
+#define __STDC_HEADERS_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+size_t fread (void *, size_t, size_t, FILE *);
+size_t fwrite (const void *, size_t, size_t, FILE *);
+
+int strcasecmp(const char *, const char *);
+int strncasecmp(const char *, const char *, size_t);
+
+#endif
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..e843669
--- /dev/null
@@ -0,0 +1,250 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/lib/Makefile b/lib/Makefile
new file mode 100644 (file)
index 0000000..303df53
--- /dev/null
@@ -0,0 +1,282 @@
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+#
+# $Id$
+#
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+prefix = /usr/local
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/curl
+pkglibdir = $(libdir)/curl
+pkgincludedir = $(includedir)/curl
+
+top_builddir = ..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = .././install-sh -c
+INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = sparc-sun-solaris2.6
+host_triplet = sparc-sun-solaris2.6
+CC = gcc
+MAKEINFO = makeinfo
+NROFF = /bin/nroff
+PACKAGE = curl
+PERL = /usr/local/bin/perl
+RANLIB = ranlib
+VERSION = 6.3.1
+YACC = bison -y
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
+
+noinst_LIBRARIES = libcurl.a
+
+# Some flags needed when trying to cause warnings ;-)
+# CFLAGS = -Wall -pedantic
+
+INCLUDES = -I$(top_srcdir)/include
+
+libcurl_a_SOURCES =  arpa_telnet.h  file.c         getpass.h      netrc.h        timeval.c base64.c       file.h         hostip.c       progress.c     timeval.h base64.h       formdata.c     hostip.h       progress.h     upload.c cookie.c       formdata.h     http.c         sendf.c        upload.h cookie.h       ftp.c          http.h         sendf.h        url.c dict.c         ftp.h          if2ip.c        speedcheck.c   url.h dict.h         getdate.c      if2ip.h        speedcheck.h   urldata.h download.c     getdate.h      ldap.c         ssluse.c       version.c download.h     getenv.c       ldap.h         ssluse.h       escape.c       getenv.h       mprintf.c      telnet.c       escape.h       getpass.c      netrc.c        telnet.h       
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h ../src/config.h
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I.. -I../src
+CPPFLAGS =  -I/home/dast/include/openssl -I/home/dast/include
+LDFLAGS = 
+LIBS = -lssl -lcrypto -ldl -lsocket -lnsl  -L/home/dast/lib
+libcurl_a_LIBADD = 
+libcurl_a_OBJECTS =  file.o timeval.o base64.o hostip.o progress.o \
+formdata.o upload.o cookie.o http.o sendf.o ftp.o url.o dict.o if2ip.o \
+speedcheck.o getdate.o download.o ldap.o ssluse.o version.o getenv.o \
+escape.o mprintf.o telnet.o getpass.o netrc.o
+AR = ar
+CFLAGS = -g -O2
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(libcurl_a_SOURCES)
+OBJECTS = $(libcurl_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps lib/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.c.o:
+       $(COMPILE) -c $<
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+mostlyclean-compile:
+       -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+       -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libcurl.a: $(libcurl_a_OBJECTS) $(libcurl_a_DEPENDENCIES)
+       -rm -f libcurl.a
+       $(AR) cru libcurl.a $(libcurl_a_OBJECTS) $(libcurl_a_LIBADD)
+       $(RANLIB) libcurl.a
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = lib
+
+distdir: $(DISTFILES)
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-noinstLIBRARIES mostlyclean-compile \
+               mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
+               mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstLIBRARIES distclean-compile \
+               distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstLIBRARIES \
+               maintainer-clean-compile maintainer-clean-tags \
+               maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Say $(srcdir), so GNU make does not report an ambiguity with the .y.c rule.
+$(srcdir)/getdate.c: getdate.y
+       cd $(srcdir) && \
+         $(YACC) $(YFLAGS) getdate.y; \
+         mv -f y.tab.c getdate.c
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lib/Makefile.am b/lib/Makefile.am
new file mode 100644 (file)
index 0000000..ca83f86
--- /dev/null
@@ -0,0 +1,31 @@
+#
+# $Id$
+#
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
+
+noinst_LIBRARIES = libcurl.a
+
+# Some flags needed when trying to cause warnings ;-)
+# CFLAGS = -Wall -pedantic
+
+INCLUDES = -I$(top_srcdir)/include
+
+libcurl_a_SOURCES = \
+arpa_telnet.h  file.c         getpass.h      netrc.h        timeval.c \
+base64.c       file.h         hostip.c       progress.c     timeval.h \
+base64.h       formdata.c     hostip.h       progress.h     upload.c \
+cookie.c       formdata.h     http.c         sendf.c        upload.h \
+cookie.h       ftp.c          http.h         sendf.h        url.c \
+dict.c         ftp.h          if2ip.c        speedcheck.c   url.h \
+dict.h         getdate.c      if2ip.h        speedcheck.h   urldata.h \
+download.c     getdate.h      ldap.c         ssluse.c       version.c \
+download.h     getenv.c       ldap.h         ssluse.h       \
+escape.c       getenv.h       mprintf.c      telnet.c       \
+escape.h       getpass.c      netrc.c        telnet.h       
+
+# Say $(srcdir), so GNU make does not report an ambiguity with the .y.c rule.
+$(srcdir)/getdate.c: getdate.y
+       cd $(srcdir) && \
+         $(YACC) $(YFLAGS) getdate.y; \
+         mv -f y.tab.c getdate.c
diff --git a/lib/Makefile.in b/lib/Makefile.in
new file mode 100644 (file)
index 0000000..eb39e2a
--- /dev/null
@@ -0,0 +1,282 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+#
+# $Id$
+#
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+NROFF = @NROFF@
+PACKAGE = @PACKAGE@
+PERL = @PERL@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+YACC = @YACC@
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
+
+noinst_LIBRARIES = libcurl.a
+
+# Some flags needed when trying to cause warnings ;-)
+# CFLAGS = -Wall -pedantic
+
+INCLUDES = -I$(top_srcdir)/include
+
+libcurl_a_SOURCES =  arpa_telnet.h  file.c         getpass.h      netrc.h        timeval.c base64.c       file.h         hostip.c       progress.c     timeval.h base64.h       formdata.c     hostip.h       progress.h     upload.c cookie.c       formdata.h     http.c         sendf.c        upload.h cookie.h       ftp.c          http.h         sendf.h        url.c dict.c         ftp.h          if2ip.c        speedcheck.c   url.h dict.h         getdate.c      if2ip.h        speedcheck.h   urldata.h download.c     getdate.h      ldap.c         ssluse.c       version.c download.h     getenv.c       ldap.h         ssluse.h       escape.c       getenv.h       mprintf.c      telnet.c       escape.h       getpass.c      netrc.c        telnet.h       
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h ../src/config.h
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I.. -I../src
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libcurl_a_LIBADD = 
+libcurl_a_OBJECTS =  file.o timeval.o base64.o hostip.o progress.o \
+formdata.o upload.o cookie.o http.o sendf.o ftp.o url.o dict.o if2ip.o \
+speedcheck.o getdate.o download.o ldap.o ssluse.o version.o getenv.o \
+escape.o mprintf.o telnet.o getpass.o netrc.o
+AR = ar
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(libcurl_a_SOURCES)
+OBJECTS = $(libcurl_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps lib/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.c.o:
+       $(COMPILE) -c $<
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+mostlyclean-compile:
+       -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+       -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libcurl.a: $(libcurl_a_OBJECTS) $(libcurl_a_DEPENDENCIES)
+       -rm -f libcurl.a
+       $(AR) cru libcurl.a $(libcurl_a_OBJECTS) $(libcurl_a_LIBADD)
+       $(RANLIB) libcurl.a
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags  $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = lib
+
+distdir: $(DISTFILES)
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am:  mostlyclean-noinstLIBRARIES mostlyclean-compile \
+               mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
+               mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstLIBRARIES distclean-compile \
+               distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstLIBRARIES \
+               maintainer-clean-compile maintainer-clean-tags \
+               maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Say $(srcdir), so GNU make does not report an ambiguity with the .y.c rule.
+$(srcdir)/getdate.c: getdate.y
+       cd $(srcdir) && \
+         $(YACC) $(YFLAGS) getdate.y; \
+         mv -f y.tab.c getdate.c
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lib/Makefile.m32 b/lib/Makefile.m32
new file mode 100644 (file)
index 0000000..00aa776
--- /dev/null
@@ -0,0 +1,67 @@
+#############################################################
+## Makefile for building libcurl.a with MingW32 (GCC-2.95) and
+## optionally OpenSSL (0.9.4)
+## Use: make -f Makefile.m32
+##
+## Comments to: Troy Engel <tengel@sonic.net> or
+##              Joern Hartroth <hartroth@acm.org>
+
+CC = gcc
+AR = ar
+RANLIB = ranlib
+OPENSSL_PATH = ../../openssl-0.9.4
+
+########################################################
+## Nothing more to do below this line!
+
+INCLUDES = -I. -I.. -I../include
+CFLAGS = -g -O2
+ifdef SSL
+  INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl"
+  CFLAGS += -DUSE_SSLEAY
+endif
+COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
+
+libcurl_a_LIBRARIES = libcurl.a
+
+libcurl_a_SOURCES =  base64.c getenv.c if2ip.h progress.h upload.h \
+base64.h getenv.h mprintf.c setup.h url.c download.c getpass.c \
+mprintf.h ssluse.c url.h download.h hostip.c netrc.c ssluse.h \
+urldata.h formdata.c hostip.h netrc.h stdcheaders.h formdata.h \
+if2ip.c progress.c upload.c sendf.c sendf.h speedcheck.c speedcheck.h \
+ftp.c ftp.h getpass.c getpass.h version.c timeval.c  timeval.h cookie.c \
+cookie.h escape.c escape.h getdate.c getdate.h dict.h dict.c http.c \
+http.h telnet.c telnet.h file.c file.h ldap.c ldap.h
+
+libcurl_a_OBJECTS =  base64.o getenv.o mprintf.o url.o download.o \
+getpass.o ssluse.o hostip.o netrc.o formdata.o if2ip.o progress.o \
+upload.o sendf.o speedcheck.o ftp.o getpass.o version.o timeval.o \
+cookie.o escape.o getdate.o dict.o http.o telnet.o file.o ldap.o
+
+LIBRARIES =  $(libcurl_a_LIBRARIES)
+SOURCES = $(libcurl_a_SOURCES)
+OBJECTS = $(libcurl_a_OBJECTS)
+
+
+all: libcurl.a
+
+libcurl.a: $(libcurl_a_OBJECTS) $(libcurl_a_DEPENDENCIES)
+       -@erase libcurl.a
+       $(AR) cru libcurl.a $(libcurl_a_OBJECTS)
+       $(RANLIB) libcurl.a
+
+.c.o:
+       $(COMPILE) -c $<
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+clean:
+       -@erase $(libcurl_a_OBJECTS)
+
+distrib: clean
+       -@erase $(libcurl_a_LIBRARIES)
+       
diff --git a/lib/Makefile.vc6 b/lib/Makefile.vc6
new file mode 100644 (file)
index 0000000..e7db08e
--- /dev/null
@@ -0,0 +1,315 @@
+#############################################################\r
+## Makefile for building libcurl.lib with MSVC6\r
+## Use: nmake -f makefile.vc6 [release | release-ssl | debug]\r
+##      (default is release)\r
+##\r
+## Comments to: Troy Engel <tengel@sonic.net>\r
+\r
+PROGRAM_NAME = libcurl.lib\r
+OPENSSL_PATH = ../../openssl-0.9.3a\r
+\r
+########################################################\r
+## Nothing more to do below this line!\r
+\r
+## Release\r
+CCR = cl.exe /ML /O2 /D "NDEBUG"\r
+LINKR = link.exe -lib\r
+\r
+## Debug\r
+CCD = cl.exe /MLd /Gm /ZI /Od /D "_DEBUG" /GZ\r
+LINKD = link.exe -lib\r
+\r
+## SSL Release\r
+CCRS = cl.exe /ML /O2 /D "NDEBUG" /D "USE_SSLEAY" /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"\r
+LINKRS = link.exe -lib /LIBPATH:$(OPENSSL_PATH)/out32dll\r
+\r
+CFLAGS = /nologo /W3 /GX /D "WIN32" /D "_MBCS" /D "_LIB" /YX /FD /c\r
+LFLAGS = /nologo /out:$(PROGRAM_NAME)\r
+LINKLIBS = kernel32.lib wsock32.lib\r
+LINKSLIBS = libeay32.lib ssleay32.lib RSAglue.lib\r
+\r
+RELEASE_OBJS= \\r
+       base64r.obj \\r
+       cookier.obj \\r
+       downloadr.obj \\r
+       escaper.obj \\r
+       formdatar.obj \\r
+       ftpr.obj \\r
+       httpr.obj \\r
+       dictr.obj \\r
+       telnetr.obj \\r
+       getdater.obj \\r
+       getenvr.obj \\r
+       getpassr.obj \\r
+       hostipr.obj \\r
+       if2ipr.obj \\r
+       mprintfr.obj \\r
+       netrcr.obj \\r
+       progressr.obj \\r
+       sendfr.obj \\r
+       speedcheckr.obj \\r
+       ssluser.obj \\r
+       timevalr.obj \\r
+       uploadr.obj \\r
+       urlr.obj \\r
+       filer.obj \\r
+       versionr.obj\r
+\r
+DEBUG_OBJS= \\r
+       base64d.obj \\r
+       cookied.obj \\r
+       downloadd.obj \\r
+       escaped.obj \\r
+       formdatad.obj \\r
+       ftpd.obj \\r
+       httpd.obj \\r
+       dictd.obj \\r
+       telnetd.obj \\r
+       getdated.obj \\r
+       getenvd.obj \\r
+       getpassd.obj \\r
+       hostipd.obj \\r
+       if2ipd.obj \\r
+       mprintfd.obj \\r
+       netrcd.obj \\r
+       progressd.obj \\r
+       sendfd.obj \\r
+       speedcheckd.obj \\r
+       sslused.obj \\r
+       timevald.obj \\r
+       uploadd.obj \\r
+       urld.obj \\r
+       filed.obj \\r
+       versiond.obj\r
+\r
+RELEASE_SSL_OBJS= \\r
+       base64rs.obj \\r
+       cookiers.obj \\r
+       downloadrs.obj \\r
+       escapers.obj \\r
+       formdatars.obj \\r
+       ftprs.obj \\r
+       httprs.obj \\r
+       dictrs.obj \\r
+       telnetrs.obj \\r
+       getdaters.obj \\r
+       getenvrs.obj \\r
+       getpassrs.obj \\r
+       hostiprs.obj \\r
+       if2iprs.obj \\r
+       mprintfrs.obj \\r
+       netrcrs.obj \\r
+       progressrs.obj \\r
+       sendfrs.obj \\r
+       speedcheckrs.obj \\r
+       sslusers.obj \\r
+       timevalrs.obj \\r
+       uploadrs.obj \\r
+       urlrs.obj \\r
+       filers.obj \\r
+       versionrs.obj\r
+\r
+LINK_OBJS= \\r
+       base64.obj \\r
+       cookie.obj \\r
+       download.obj \\r
+       escape.obj \\r
+       formdata.obj \\r
+       ftp.obj \\r
+       http.obj \\r
+       dict.obj \\r
+       telnet.obj \\r
+       getdate.obj \\r
+       getenv.obj \\r
+       getpass.obj \\r
+       hostip.obj \\r
+       if2ip.obj \\r
+       mprintf.obj \\r
+       netrc.obj \\r
+       progress.obj \\r
+       sendf.obj \\r
+       speedcheck.obj \\r
+       ssluse.obj \\r
+       timeval.obj \\r
+       upload.obj \\r
+       url.obj \\r
+       file.obj \\r
+       version.obj\r
+\r
+all : release\r
+\r
+release: $(RELEASE_OBJS)\r
+       $(LINKR) $(LFLAGS) $(LINKLIBS) $(LINK_OBJS)\r
+\r
+debug: $(DEBUG_OBJS)\r
+       $(LINKD) $(LFLAGS) $(LINKLIBS) $(LINK_OBJS)\r
+\r
+release-ssl: $(RELEASE_SSL_OBJS)\r
+       $(LINKRS) $(LFLAGS) $(LINKLIBS) $(LINKSLIBS) $(LINK_OBJS)\r
+\r
+\r
+## Release\r
+base64r.obj: base64.c\r
+       $(CCR) $(CFLAGS) base64.c\r
+cookier.obj: cookie.c\r
+       $(CCR) $(CFLAGS) cookie.c\r
+downloadr.obj: download.c\r
+       $(CCR) $(CFLAGS) download.c\r
+escaper.obj: escape.c\r
+       $(CCR) $(CFLAGS) escape.c\r
+formdatar.obj: formdata.c\r
+       $(CCR) $(CFLAGS) formdata.c\r
+ftpr.obj: ftp.c\r
+       $(CCR) $(CFLAGS) ftp.c\r
+httpr.obj: http.c\r
+       $(CCR) $(CFLAGS) http.c\r
+dictr.obj: dict.c\r
+       $(CCR) $(CFLAGS) dict.c\r
+telnetr.obj: telnet.c\r
+       $(CCR) $(CFLAGS) telnet.c\r
+getdater.obj: getdate.c\r
+       $(CCR) $(CFLAGS) getdate.c\r
+getenvr.obj: getenv.c\r
+       $(CCR) $(CFLAGS) getenv.c\r
+getpassr.obj: getpass.c\r
+       $(CCR) $(CFLAGS) getpass.c\r
+hostipr.obj: hostip.c\r
+       $(CCR) $(CFLAGS) hostip.c\r
+if2ipr.obj: if2ip.c\r
+       $(CCR) $(CFLAGS) if2ip.c\r
+mprintfr.obj: mprintf.c\r
+       $(CCR) $(CFLAGS) mprintf.c\r
+netrcr.obj: netrc.c\r
+       $(CCR) $(CFLAGS) netrc.c\r
+progressr.obj: progress.c\r
+       $(CCR) $(CFLAGS) progress.c\r
+sendfr.obj: sendf.c\r
+       $(CCR) $(CFLAGS) sendf.c\r
+speedcheckr.obj: speedcheck.c\r
+       $(CCR) $(CFLAGS) speedcheck.c\r
+ssluser.obj: ssluse.c\r
+       $(CCR) $(CFLAGS) ssluse.c\r
+timevalr.obj: timeval.c\r
+       $(CCR) $(CFLAGS) timeval.c\r
+uploadr.obj: upload.c\r
+       $(CCR) $(CFLAGS) upload.c\r
+urlr.obj: url.c\r
+       $(CCR) $(CFLAGS) url.c\r
+filer.obj: file.c\r
+       $(CCR) $(CFLAGS) file.c\r
+versionr.obj: version.c\r
+       $(CCR) $(CFLAGS) version.c\r
+\r
+## Debug\r
+base64d.obj: base64.c\r
+       $(CCD) $(CFLAGS) base64.c\r
+cookied.obj: cookie.c\r
+       $(CCD) $(CFLAGS) cookie.c\r
+downloadd.obj: download.c\r
+       $(CCD) $(CFLAGS) download.c\r
+escaped.obj: escape.c\r
+       $(CCD) $(CFLAGS) escape.c\r
+formdatad.obj: formdata.c\r
+       $(CCD) $(CFLAGS) formdata.c\r
+ftpd.obj: ftp.c\r
+       $(CCD) $(CFLAGS) ftp.c\r
+httpd.obj: http.c\r
+       $(CCD) $(CFLAGS) http.c\r
+dictd.obj: dict.c\r
+       $(CCD) $(CFLAGS) dict.c\r
+telnetd.obj: telnet.c\r
+       $(CCD) $(CFLAGS) telnet.c\r
+getdated.obj: getdate.c\r
+       $(CCD) $(CFLAGS) getdate.c\r
+getenvd.obj: getenv.c\r
+       $(CCD) $(CFLAGS) getenv.c\r
+getpassd.obj: getpass.c\r
+       $(CCD) $(CFLAGS) getpass.c\r
+hostipd.obj: hostip.c\r
+       $(CCD) $(CFLAGS) hostip.c\r
+if2ipd.obj: if2ip.c\r
+       $(CCD) $(CFLAGS) if2ip.c\r
+mprintfd.obj: mprintf.c\r
+       $(CCD) $(CFLAGS) mprintf.c\r
+netrcd.obj: netrc.c\r
+       $(CCD) $(CFLAGS) netrc.c\r
+progressd.obj: progress.c\r
+       $(CCD) $(CFLAGS) progress.c\r
+sendfd.obj: sendf.c\r
+       $(CCD) $(CFLAGS) sendf.c\r
+speedcheckd.obj: speedcheck.c\r
+       $(CCD) $(CFLAGS) speedcheck.c\r
+sslused.obj: ssluse.c\r
+       $(CCD) $(CFLAGS) ssluse.c\r
+timevald.obj: timeval.c\r
+       $(CCD) $(CFLAGS) timeval.c\r
+uploadd.obj: upload.c\r
+       $(CCD) $(CFLAGS) upload.c\r
+urld.obj: url.c\r
+       $(CCD) $(CFLAGS) url.c\r
+filed.obj: file.c\r
+       $(CCD) $(CFLAGS) file.c\r
+versiond.obj: version.c\r
+       $(CCD) $(CFLAGS) version.c\r
+\r
+\r
+## Release SSL\r
+base64rs.obj: base64.c\r
+       $(CCRS) $(CFLAGS) base64.c\r
+cookiers.obj: cookie.c\r
+       $(CCRS) $(CFLAGS) cookie.c\r
+downloadrs.obj: download.c\r
+       $(CCRS) $(CFLAGS) download.c\r
+escapers.obj: escape.c\r
+       $(CCRS) $(CFLAGS) escape.c\r
+formdatars.obj: formdata.c\r
+       $(CCRS) $(CFLAGS) formdata.c\r
+ftprs.obj: ftp.c\r
+       $(CCRS) $(CFLAGS) ftp.c\r
+httprs.obj: http.c\r
+       $(CCRS) $(CFLAGS) http.c\r
+dictrs.obj: dict.c\r
+       $(CCRS) $(CFLAGS) dict.c\r
+telnetrs.obj: telnet.c\r
+       $(CCRS) $(CFLAGS) telnet.c\r
+getdaters.obj: getdate.c\r
+       $(CCRS) $(CFLAGS) getdate.c\r
+getenvrs.obj: getenv.c\r
+       $(CCRS) $(CFLAGS) getenv.c\r
+getpassrs.obj: getpass.c\r
+       $(CCRS) $(CFLAGS) getpass.c\r
+hostiprs.obj: hostip.c\r
+       $(CCRS) $(CFLAGS) hostip.c\r
+if2iprs.obj: if2ip.c\r
+       $(CCRS) $(CFLAGS) if2ip.c\r
+mprintfrs.obj: mprintf.c\r
+       $(CCRS) $(CFLAGS) mprintf.c\r
+netrcrs.obj: netrc.c\r
+       $(CCRS) $(CFLAGS) netrc.c\r
+progressrs.obj: progress.c\r
+       $(CCRS) $(CFLAGS) progress.c\r
+sendfrs.obj: sendf.c\r
+       $(CCRS) $(CFLAGS) sendf.c\r
+speedcheckrs.obj: speedcheck.c\r
+       $(CCRS) $(CFLAGS) speedcheck.c\r
+sslusers.obj: ssluse.c\r
+       $(CCRS) $(CFLAGS) ssluse.c\r
+timevalrs.obj: timeval.c\r
+       $(CCRS) $(CFLAGS) timeval.c\r
+uploadrs.obj: upload.c\r
+       $(CCRS) $(CFLAGS) upload.c\r
+urlrs.obj: url.c\r
+       $(CCRS) $(CFLAGS) url.c\r
+filers.obj: file.c\r
+       $(CCRS) $(CFLAGS) file.c\r
+versionrs.obj: version.c\r
+       $(CCRS) $(CFLAGS) version.c\r
+\r
+clean:\r
+       -@erase *.obj\r
+       -@erase vc60.idb\r
+       -@erase vc60.pch\r
+\r
+distrib: clean\r
+       -@erase $(PROGRAM_NAME)\r
+\r
diff --git a/lib/arpa_telnet.h b/lib/arpa_telnet.h
new file mode 100644 (file)
index 0000000..25085b8
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * Copyright (c) 1983, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)telnet.h    8.2 (Berkeley) 12/15/93
+ */
+
+#ifndef _ARPA_TELNET_H
+#define _ARPA_TELNET_H
+
+/*
+ * Definitions for the TELNET protocol.
+ */
+#define        IAC     255             /* interpret as command: */
+#define        DONT    254             /* you are not to use option */
+#define        DO      253             /* please, you use option */
+#define        WONT    252             /* I won't use option */
+#define        WILL    251             /* I will use option */
+#define        SB      250             /* interpret as subnegotiation */
+#define        GA      249             /* you may reverse the line */
+#define        EL      248             /* erase the current line */
+#define        EC      247             /* erase the current character */
+#define        AYT     246             /* are you there */
+#define        AO      245             /* abort output--but let prog finish */
+#define        IP      244             /* interrupt process--permanently */
+#define        BREAK   243             /* break */
+#define        DM      242             /* data mark--for connect. cleaning */
+#define        NOP     241             /* nop */
+#define        SE      240             /* end sub negotiation */
+#define EOR     239             /* end of record (transparent mode) */
+#define        ABORT   238             /* Abort process */
+#define        SUSP    237             /* Suspend process */
+#define        xEOF    236             /* End of file: EOF is already used... */
+
+#define SYNCH  242             /* for telfunc calls */
+
+#ifdef TELCMDS
+char *telcmds[] = {
+       "EOF", "SUSP", "ABORT", "EOR",
+       "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC",
+       "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0,
+};
+#else
+extern char *telcmds[];
+#endif
+
+#define        TELCMD_FIRST    xEOF
+#define        TELCMD_LAST     IAC
+#define        TELCMD_OK(x)    ((unsigned int)(x) <= TELCMD_LAST && \
+                        (unsigned int)(x) >= TELCMD_FIRST)
+#define        TELCMD(x)       telcmds[(x)-TELCMD_FIRST]
+
+/* telnet options */
+#define TELOPT_BINARY  0       /* 8-bit data path */
+#define TELOPT_ECHO    1       /* echo */
+#define        TELOPT_RCP      2       /* prepare to reconnect */
+#define        TELOPT_SGA      3       /* suppress go ahead */
+#define        TELOPT_NAMS     4       /* approximate message size */
+#define        TELOPT_STATUS   5       /* give status */
+#define        TELOPT_TM       6       /* timing mark */
+#define        TELOPT_RCTE     7       /* remote controlled transmission and echo */
+#define TELOPT_NAOL    8       /* negotiate about output line width */
+#define TELOPT_NAOP    9       /* negotiate about output page size */
+#define TELOPT_NAOCRD  10      /* negotiate about CR disposition */
+#define TELOPT_NAOHTS  11      /* negotiate about horizontal tabstops */
+#define TELOPT_NAOHTD  12      /* negotiate about horizontal tab disposition */
+#define TELOPT_NAOFFD  13      /* negotiate about formfeed disposition */
+#define TELOPT_NAOVTS  14      /* negotiate about vertical tab stops */
+#define TELOPT_NAOVTD  15      /* negotiate about vertical tab disposition */
+#define TELOPT_NAOLFD  16      /* negotiate about output LF disposition */
+#define TELOPT_XASCII  17      /* extended ascic character set */
+#define        TELOPT_LOGOUT   18      /* force logout */
+#define        TELOPT_BM       19      /* byte macro */
+#define        TELOPT_DET      20      /* data entry terminal */
+#define        TELOPT_SUPDUP   21      /* supdup protocol */
+#define        TELOPT_SUPDUPOUTPUT 22  /* supdup output */
+#define        TELOPT_SNDLOC   23      /* send location */
+#define        TELOPT_TTYPE    24      /* terminal type */
+#define        TELOPT_EOR      25      /* end or record */
+#define        TELOPT_TUID     26      /* TACACS user identification */
+#define        TELOPT_OUTMRK   27      /* output marking */
+#define        TELOPT_TTYLOC   28      /* terminal location number */
+#define        TELOPT_3270REGIME 29    /* 3270 regime */
+#define        TELOPT_X3PAD    30      /* X.3 PAD */
+#define        TELOPT_NAWS     31      /* window size */
+#define        TELOPT_TSPEED   32      /* terminal speed */
+#define        TELOPT_LFLOW    33      /* remote flow control */
+#define TELOPT_LINEMODE        34      /* Linemode option */
+#define TELOPT_XDISPLOC        35      /* X Display Location */
+#define TELOPT_OLD_ENVIRON 36  /* Old - Environment variables */
+#define        TELOPT_AUTHENTICATION 37/* Authenticate */
+#define        TELOPT_ENCRYPT  38      /* Encryption option */
+#define TELOPT_NEW_ENVIRON 39  /* New - Environment variables */
+#define        TELOPT_EXOPL    255     /* extended-options-list */
+
+
+#define        NTELOPTS        (1+TELOPT_NEW_ENVIRON)
+#ifdef TELOPTS
+char *telopts[NTELOPTS+1] = {
+       "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME",
+       "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP",
+       "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS",
+       "NAOVTD", "NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO",
+       "DATA ENTRY TERMINAL", "SUPDUP", "SUPDUP OUTPUT",
+       "SEND LOCATION", "TERMINAL TYPE", "END OF RECORD",
+       "TACACS UID", "OUTPUT MARKING", "TTYLOC",
+       "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW",
+       "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION",
+       "ENCRYPT", "NEW-ENVIRON",
+       0,
+};
+#define        TELOPT_FIRST    TELOPT_BINARY
+#define        TELOPT_LAST     TELOPT_NEW_ENVIRON
+#define        TELOPT_OK(x)    ((unsigned int)(x) <= TELOPT_LAST)
+#define        TELOPT(x)       telopts[(x)-TELOPT_FIRST]
+#endif
+
+/* sub-option qualifiers */
+#define        TELQUAL_IS      0       /* option is... */
+#define        TELQUAL_SEND    1       /* send option */
+#define        TELQUAL_INFO    2       /* ENVIRON: informational version of IS */
+#define        TELQUAL_REPLY   2       /* AUTHENTICATION: client version of IS */
+#define        TELQUAL_NAME    3       /* AUTHENTICATION: client version of IS */
+
+#define        LFLOW_OFF               0       /* Disable remote flow control */
+#define        LFLOW_ON                1       /* Enable remote flow control */
+#define        LFLOW_RESTART_ANY       2       /* Restart output on any char */
+#define        LFLOW_RESTART_XON       3       /* Restart output only on XON */
+
+/*
+ * LINEMODE suboptions
+ */
+
+#define        LM_MODE         1
+#define        LM_FORWARDMASK  2
+#define        LM_SLC          3
+
+#define        MODE_EDIT       0x01
+#define        MODE_TRAPSIG    0x02
+#define        MODE_ACK        0x04
+#define MODE_SOFT_TAB  0x08
+#define MODE_LIT_ECHO  0x10
+
+#define        MODE_MASK       0x1f
+
+/* Not part of protocol, but needed to simplify things... */
+#define MODE_FLOW              0x0100
+#define MODE_ECHO              0x0200
+#define MODE_INBIN             0x0400
+#define MODE_OUTBIN            0x0800
+#define MODE_FORCE             0x1000
+
+#define        SLC_SYNCH       1
+#define        SLC_BRK         2
+#define        SLC_IP          3
+#define        SLC_AO          4
+#define        SLC_AYT         5
+#define        SLC_EOR         6
+#define        SLC_ABORT       7
+#define        SLC_EOF         8
+#define        SLC_SUSP        9
+#define        SLC_EC          10
+#define        SLC_EL          11
+#define        SLC_EW          12
+#define        SLC_RP          13
+#define        SLC_LNEXT       14
+#define        SLC_XON         15
+#define        SLC_XOFF        16
+#define        SLC_FORW1       17
+#define        SLC_FORW2       18
+
+#define        NSLC            18
+
+/*
+ * For backwards compatability, we define SLC_NAMES to be the
+ * list of names if SLC_NAMES is not defined.
+ */
+#define        SLC_NAMELIST    "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", \
+                       "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \
+                       "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
+#ifdef SLC_NAMES
+char *slc_names[] = {
+       SLC_NAMELIST
+};
+#else
+extern char *slc_names[];
+#define        SLC_NAMES SLC_NAMELIST
+#endif
+
+#define        SLC_NAME_OK(x)  ((unsigned int)(x) <= NSLC)
+#define SLC_NAME(x)    slc_names[x]
+
+#define        SLC_NOSUPPORT   0
+#define        SLC_CANTCHANGE  1
+#define        SLC_VARIABLE    2
+#define        SLC_DEFAULT     3
+#define        SLC_LEVELBITS   0x03
+
+#define        SLC_FUNC        0
+#define        SLC_FLAGS       1
+#define        SLC_VALUE       2
+
+#define        SLC_ACK         0x80
+#define        SLC_FLUSHIN     0x40
+#define        SLC_FLUSHOUT    0x20
+
+#define        OLD_ENV_VAR     1
+#define        OLD_ENV_VALUE   0
+#define        NEW_ENV_VAR     0
+#define        NEW_ENV_VALUE   1
+#define        ENV_ESC         2
+#define        ENV_USERVAR     3
+
+/*
+ * AUTHENTICATION suboptions
+ */
+
+/*
+ * Who is authenticating who ...
+ */
+#define        AUTH_WHO_CLIENT         0       /* Client authenticating server */
+#define        AUTH_WHO_SERVER         1       /* Server authenticating client */
+#define        AUTH_WHO_MASK           1
+
+/*
+ * amount of authentication done
+ */
+#define        AUTH_HOW_ONE_WAY        0
+#define        AUTH_HOW_MUTUAL         2
+#define        AUTH_HOW_MASK           2
+
+#define        AUTHTYPE_NULL           0
+#define        AUTHTYPE_KERBEROS_V4    1
+#define        AUTHTYPE_KERBEROS_V5    2
+#define        AUTHTYPE_SPX            3
+#define        AUTHTYPE_MINK           4
+#define        AUTHTYPE_CNT            5
+
+#define        AUTHTYPE_TEST           99
+
+#ifdef AUTH_NAMES
+char *authtype_names[] = {
+       "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", 0,
+};
+#else
+extern char *authtype_names[];
+#endif
+
+#define        AUTHTYPE_NAME_OK(x)     ((unsigned int)(x) < AUTHTYPE_CNT)
+#define        AUTHTYPE_NAME(x)        authtype_names[x]
+
+/*
+ * ENCRYPTion suboptions
+ */
+#define        ENCRYPT_IS              0       /* I pick encryption type ... */
+#define        ENCRYPT_SUPPORT         1       /* I support encryption types ... */
+#define        ENCRYPT_REPLY           2       /* Initial setup response */
+#define        ENCRYPT_START           3       /* Am starting to send encrypted */
+#define        ENCRYPT_END             4       /* Am ending encrypted */
+#define        ENCRYPT_REQSTART        5       /* Request you start encrypting */
+#define        ENCRYPT_REQEND          6       /* Request you send encrypting */
+#define        ENCRYPT_ENC_KEYID       7
+#define        ENCRYPT_DEC_KEYID       8
+#define        ENCRYPT_CNT             9
+
+#define        ENCTYPE_ANY             0
+#define        ENCTYPE_DES_CFB64       1
+#define        ENCTYPE_DES_OFB64       2
+#define        ENCTYPE_CNT             3
+
+#ifdef ENCRYPT_NAMES
+char *encrypt_names[] = {
+       "IS", "SUPPORT", "REPLY", "START", "END",
+       "REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID",
+       0,
+};
+char *enctype_names[] = {
+       "ANY", "DES_CFB64",  "DES_OFB64",  0,
+};
+#else
+extern char *encrypt_names[];
+extern char *enctype_names[];
+#endif
+
+
+#define        ENCRYPT_NAME_OK(x)      ((unsigned int)(x) < ENCRYPT_CNT)
+#define        ENCRYPT_NAME(x)         encrypt_names[x]
+
+#define        ENCTYPE_NAME_OK(x)      ((unsigned int)(x) < ENCTYPE_CNT)
+#define        ENCTYPE_NAME(x)         enctype_names[x]
+#endif /* _ARPA_TELNET_H */
diff --git a/lib/base64.c b/lib/base64.c
new file mode 100644 (file)
index 0000000..8758af1
--- /dev/null
@@ -0,0 +1,94 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <stdio.h>
+
+/* ---- Base64 Encoding --- */
+static char table64[]=
+  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+  
+void base64Encode(char *intext, char *output)
+{
+  unsigned char ibuf[3];
+  unsigned char obuf[4];
+  int i;
+  int inputparts;
+
+  while(*intext) {
+    for (i = inputparts = 0; i < 3; i++) { 
+      if(*intext) {
+        inputparts++;
+        ibuf[i] = *intext;
+        intext++;
+      }
+      else
+        ibuf[i] = 0;
+    }
+                       
+    obuf [0] = (ibuf [0] & 0xFC) >> 2;
+    obuf [1] = ((ibuf [0] & 0x03) << 4) | ((ibuf [1] & 0xF0) >> 4);
+    obuf [2] = ((ibuf [1] & 0x0F) << 2) | ((ibuf [2] & 0xC0) >> 6);
+    obuf [3] = ibuf [2] & 0x3F;
+
+    switch(inputparts) {
+    case 1: /* only one byte read */
+      sprintf(output, "%c%c==", 
+              table64[obuf[0]],
+              table64[obuf[1]]);
+      break;
+    case 2: /* two bytes read */
+      sprintf(output, "%c%c%c=", 
+              table64[obuf[0]],
+              table64[obuf[1]],
+              table64[obuf[2]]);
+      break;
+    default:
+      sprintf(output, "%c%c%c%c", 
+              table64[obuf[0]],
+              table64[obuf[1]],
+              table64[obuf[2]],
+              table64[obuf[3]] );
+      break;
+    }
+    output += 4;
+  }
+  *output=0;
+}
+/* ---- End of Base64 Encoding ---- */
diff --git a/lib/base64.h b/lib/base64.h
new file mode 100644 (file)
index 0000000..4609743
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef __BASE64_H
+#define __BASE64_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+void base64Encode(char *intext, char *output);
+#endif
diff --git a/lib/cookie.c b/lib/cookie.c
new file mode 100644 (file)
index 0000000..dde3350
--- /dev/null
@@ -0,0 +1,457 @@
+
+/***
+
+
+RECEIVING COOKIE INFORMATION
+============================
+
+struct CookieInfo *cookie_init(char *file);
+       
+       Inits a cookie struct to store data in a local file. This is always
+       called before any cookies are set.
+
+int cookies_set(struct CookieInfo *cookie, char *cookie_line);
+
+       The 'cookie_line' parameter is a full "Set-cookie:" line as
+       received from a server.
+
+       The function need to replace previously stored lines that this new
+       line superceeds.
+
+       It may remove lines that are expired.
+
+       It should return an indication of success/error.
+
+
+SENDING COOKIE INFORMATION
+==========================
+
+struct Cookies *cookie_getlist(struct CookieInfo *cookie,
+                               char *host, char *path, bool secure);
+
+       For a given host and path, return a linked list of cookies that
+       the client should send to the server if used now. The secure
+       boolean informs the cookie if a secure connection is achieved or
+       not.
+
+       It shall only return cookies that haven't expired.
+
+    
+Example set of cookies:
+    
+    Set-cookie: PRODUCTINFO=webxpress; domain=.fidelity.com; path=/; secure
+    Set-cookie: PERSONALIZE=none;expires=Monday, 13-Jun-1988 03:04:55 GMT;
+    domain=.fidelity.com; path=/ftgw; secure
+    Set-cookie: FidHist=none;expires=Monday, 13-Jun-1988 03:04:55 GMT;
+    domain=.fidelity.com; path=/; secure
+    Set-cookie: FidOrder=none;expires=Monday, 13-Jun-1988 03:04:55 GMT;
+    domain=.fidelity.com; path=/; secure
+    Set-cookie: DisPend=none;expires=Monday, 13-Jun-1988 03:04:55 GMT;
+    domain=.fidelity.com; path=/; secure
+    Set-cookie: FidDis=none;expires=Monday, 13-Jun-1988 03:04:55 GMT;
+    domain=.fidelity.com; path=/; secure
+    Set-cookie:
+    Session_Key@6791a9e0-901a-11d0-a1c8-9b012c88aa77=none;expires=Monday,
+    13-Jun-1988 03:04:55 GMT; domain=.fidelity.com; path=/; secure
+****/
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "cookie.h"
+#include "setup.h"
+#include "getdate.h"
+
+/****************************************************************************
+ *
+ * cookie_add()
+ *
+ * Add a single cookie line to the cookie keeping object.
+ *
+ ***************************************************************************/
+
+struct Cookie *cookie_add(struct CookieInfo *c,
+                          bool httpheader, /* TRUE if HTTP header-style line */
+                          char *lineptr) /* first non-space of the line */
+{
+  struct Cookie *clist;
+  char what[MAX_COOKIE_LINE];
+  char name[MAX_NAME];
+  char *ptr;
+  char *semiptr;
+  struct Cookie *co;
+  time_t now = time(NULL);
+  bool replace_old = FALSE;
+
+  /* First, alloc and init a new struct for it */
+  co = (struct Cookie *)malloc(sizeof(struct Cookie));
+  if(!co)
+    return NULL; /* bail out if we're this low on memory */
+
+  /* clear the whole struct first */
+  memset(co, 0, sizeof(struct Cookie));
+           
+  if(httpheader) {
+    /* This line was read off a HTTP-header */
+
+    semiptr=strchr(lineptr, ';'); /* first, find a semicolon */
+    ptr = lineptr;
+    while(semiptr) {
+      *semiptr='\0'; /* zero terminate for a while */
+      /* we have a <what>=<this> pair or a 'secure' word here */
+      if(strchr(ptr, '=')) {
+        if(2 == sscanf(ptr, "%" MAX_NAME_TXT "[^=]=%"
+                       MAX_COOKIE_LINE_TXT "[^\r\n]",
+                       name, what)) {
+          /* this is a legal <what>=<this> pair */
+          if(strequal("path", name)) {
+            co->path=strdup(what);
+          }
+          else if(strequal("domain", name)) {
+            co->domain=strdup(what);
+          }
+          else if(strequal("expires", name)) {
+            co->expirestr=strdup(what);
+            co->expires = get_date(what, &now);
+          }
+          else if(!co->name) {
+            co->name = strdup(name);
+            co->value = strdup(what);
+          }
+          else
+            ;/* this is the second (or more) name we don't know
+                about! */
+        }
+        else {
+          /* this is an "illegal" <what>=<this> pair */
+        }
+      }
+      else {
+        if(sscanf(ptr, "%" MAX_COOKIE_LINE_TXT "[^\r\n]",
+                  what)) {
+          if(strequal("secure", what))
+            co->secure = TRUE;
+          else
+            ; /* unsupported keyword without assign! */
+        }
+      }
+      *semiptr=';'; /* put the semicolon back */
+      ptr=semiptr+1;
+      while(ptr && *ptr && isspace((int)*ptr))
+        ptr++;
+      semiptr=strchr(ptr, ';'); /* now, find the next semicolon */
+    }
+  }
+  else {
+    /* This line is NOT a HTTP header style line, we do offer support for
+       reading the odd netscape cookies-file format here */
+    char *firstptr;
+    int fields;
+
+    if(lineptr[0]=='#') {
+      /* don't even try the comments */
+      free(co);
+      return NULL;
+    }
+    /* strip off the possible end-of-line characters */
+    if(ptr=strchr(lineptr, '\r'))
+      *ptr=0; /* clear it */
+    if(ptr=strchr(lineptr, '\n'))
+      *ptr=0; /* clear it */
+
+    firstptr=strtok(lineptr, "\t"); /* first tokenize it on the TAB */
+
+    /* Here's a quick check to eliminate normal HTTP-headers from this */
+    if(!firstptr || strchr(firstptr, ':')) {
+      free(co);
+      return NULL;
+    }
+
+    /* Now loop through the fields and init the struct we already have
+       allocated */
+    for(ptr=firstptr, fields=0; ptr; ptr=strtok(NULL, "\t"), fields++) {
+      switch(fields) {
+      case 0:
+        co->domain = strdup(ptr);
+        break;
+      case 1:
+        /* what _is_ this field for? */
+        break;
+      case 2:
+        co->path = strdup(ptr);
+        break;
+      case 3:
+        co->secure = strequal(ptr, "TRUE");
+        break;
+      case 4:
+        co->expires = atoi(ptr);
+        break;
+      case 5:
+        co->name = strdup(ptr);
+        break;
+      case 6:
+        co->value = strdup(ptr);
+        break;
+      }
+    }
+
+    if(7 != fields) {
+      /* we did not find the sufficient number of fields to recognize this
+         as a valid line, abort and go home */
+
+      if(co->domain)
+        free(co->domain);
+      if(co->path)
+        free(co->path);
+      if(co->name)
+        free(co->name);
+      if(co->value)
+        free(co->value);
+
+      free(co);
+      return NULL;
+    }
+
+  }
+
+  /* now, we have parsed the incoming line, we must now check if this
+     superceeds an already existing cookie, which it may if the previous have
+     the same domain and path as this */
+
+  clist = c->cookies;
+  replace_old = FALSE;
+  while(clist) {
+    if(strequal(clist->name, co->name)) {
+      /* the names are identical */
+
+      if(clist->domain && co->domain) {
+        if(strequal(clist->domain, co->domain))
+          replace_old=TRUE;
+      }
+      else if(!clist->domain && !co->domain)
+        replace_old = TRUE;
+
+      if(replace_old) {
+        /* the domains were identical */
+
+        if(clist->path && co->path) {
+          if(strequal(clist->path, co->path)) {
+            replace_old = TRUE;
+          }
+          else
+            replace_old = FALSE;
+        }
+        else if(!clist->path && !co->path)
+          replace_old = TRUE;
+        else
+          replace_old = FALSE;
+        
+      }
+
+      if(replace_old) {
+        co->next = clist->next; /* get the next-pointer first */
+
+        /* then free all the old pointers */
+        if(clist->name)
+          free(clist->name);
+        if(clist->value)
+          free(clist->value);
+        if(clist->domain)
+          free(clist->domain);
+        if(clist->path)
+          free(clist->path);
+        if(clist->expirestr)
+          free(clist->expirestr);
+
+        *clist = *co;  /* then store all the new data */
+      }
+
+    }
+    clist = clist->next;
+  }
+
+  if(!replace_old) {
+
+    /* first, point to our "next" */
+    co->next = c->cookies;
+    /* then make ourselves first in the list */
+    c->cookies = co;
+  }
+  return co;
+}
+
+/*****************************************************************************
+ *
+ * cookie_init()
+ *
+ * Inits a cookie struct to read data from a local file. This is always
+ * called before any cookies are set. File may be NULL.
+ *
+ ****************************************************************************/
+struct CookieInfo *cookie_init(char *file)
+{
+  char line[MAX_COOKIE_LINE];
+  struct CookieInfo *c;
+  FILE *fp;
+
+  c = (struct CookieInfo *)malloc(sizeof(struct CookieInfo));
+  if(!c)
+    return NULL; /* failed to get memory */
+  memset(c, 0, sizeof(struct CookieInfo));
+  c->filename = strdup(file?file:"none"); /* copy the name just in case */
+
+  fp = file?fopen(file, "r"):NULL;
+  if(fp) {
+    while(fgets(line, MAX_COOKIE_LINE, fp)) {
+      if(strnequal("Set-Cookie:", line, 11)) {
+        /* This is a cookie line, get it! */
+        char *lineptr=&line[11];
+        while(*lineptr && isspace((int)*lineptr))
+          lineptr++;
+
+        cookie_add(c, TRUE, lineptr);
+      }
+      else {
+        /* This might be a netscape cookie-file line, get it! */
+        char *lineptr=line;
+        while(*lineptr && isspace((int)*lineptr))
+          lineptr++;
+
+        cookie_add(c, FALSE, lineptr);
+      }
+    }
+    fclose(fp);
+  }
+
+  return c;
+}
+
+/*****************************************************************************
+ *
+ * cookie_getlist()
+ *
+ * For a given host and path, return a linked list of cookies that the
+ * client should send to the server if used now. The secure boolean informs
+ * the cookie if a secure connection is achieved or not.
+ *
+ * It shall only return cookies that haven't expired.
+ *
+ ****************************************************************************/
+
+struct Cookie *cookie_getlist(struct CookieInfo *c,
+                             char *host, char *path, bool secure)
+{
+   struct Cookie *newco;
+   struct Cookie *co;
+   time_t now = time(NULL);
+   int hostlen=strlen(host);
+   int domlen;
+
+   struct Cookie *mainco=NULL;
+
+   if(!c || !c->cookies)
+      return NULL; /* no cookie struct or no cookies in the struct */
+
+   co = c->cookies;
+
+   while(co) {
+      /* only process this cookie if it is not expired or had no expire
+        date AND that if the cookie requires we're secure we must only
+        continue if we are! */
+     if( (co->expires<=0 || (co->expires> now)) &&
+         (co->secure?secure:TRUE) ) {
+
+        /* now check if the domain is correct */
+        domlen=co->domain?strlen(co->domain):0;
+        if(!co->domain ||
+           ((domlen<hostlen) &&
+            strequal(host+(hostlen-domlen), co->domain)) ) {
+           /* the right part of the host matches the domain stuff in the
+              cookie data */
+
+           /* now check the left part of the path with the cookies path
+              requirement */
+           if(!co->path ||
+              strnequal(path, co->path, strlen(co->path))) {
+
+              /* and now, we know this is a match and we should create an
+                 entry for the return-linked-list */
+
+              newco = (struct Cookie *)malloc(sizeof(struct Cookie));
+              if(newco) {
+                 /* first, copy the whole source cookie: */
+                 memcpy(newco, co, sizeof(struct Cookie));
+
+                 /* then modify our next */
+                 newco->next = mainco;
+
+                 /* point the main to us */
+                 mainco = newco;
+              }
+           }
+        }
+      }
+      co = co->next;
+   }
+
+   return mainco; /* return the new list */
+}
+
+
+/*****************************************************************************
+ *
+ * cookie_freelist()
+ *
+ * Free a list previously returned by cookie_getlist();
+ *
+ ****************************************************************************/
+
+void cookie_freelist(struct Cookie *co)
+{
+   struct Cookie *next;
+   if(co) {
+      while(co) {
+        next = co->next;
+        free(co); /* we only free the struct since the "members" are all
+                     just copied! */
+        co = next;
+      }
+   }
+}
+
+/*****************************************************************************
+ *
+ * cookie_cleanup()
+ *
+ * Free a "cookie object" previous created with cookie_init().
+ *
+ ****************************************************************************/
+void cookie_cleanup(struct CookieInfo *c)
+{
+   struct Cookie *co;
+   struct Cookie *next;
+   if(c) {
+      if(c->filename)
+        free(c->filename);
+      co = c->cookies;
+
+      while(co) {
+        if(co->name)
+           free(co->name);
+        if(co->value)
+           free(co->value);
+        if(co->domain)
+           free(co->domain);
+        if(co->path)
+           free(co->path);
+        if(co->expirestr)
+           free(co->expirestr);
+
+        next = co->next;
+        free(co);
+        co = next;
+      }
+   }
+}
+
diff --git a/lib/cookie.h b/lib/cookie.h
new file mode 100644 (file)
index 0000000..466844a
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef __COOKIE_H
+#define __COOKIE_H
+
+#include <stdio.h>
+#ifdef WIN32
+#include <time.h>
+#else
+#include <sys/time.h>
+#endif
+
+#include <curl/curl.h>
+
+struct Cookie {
+   struct Cookie *next; /* next in the chain */
+   char *name;        /* <this> = value */
+   char *value;       /* name = <this> */
+   char *path;       /* path = <this> */
+   char *domain;      /* domain = <this> */
+   time_t expires;    /* expires = <this> */
+   char *expirestr;  /* the plain text version */
+   bool secure;       /* whether the 'secure' keyword was used */
+};
+
+struct CookieInfo {
+   /* linked list of cookies we know of */
+   struct Cookie *cookies;
+
+   char *filename; /* file we read from/write to */
+};
+
+/* This is the maximum line length we accept for a cookie line */
+#define MAX_COOKIE_LINE 2048
+#define MAX_COOKIE_LINE_TXT "2047"
+
+/* This is the maximum length of a cookie name we deal with: */
+#define MAX_NAME 256
+#define MAX_NAME_TXT "255"
+
+struct Cookie *cookie_add(struct CookieInfo *, bool, char *);
+struct CookieInfo *cookie_init(char *);
+struct Cookie *cookie_getlist(struct CookieInfo *, char *, char *, bool);
+void cookie_freelist(struct Cookie *);
+void cookie_cleanup(struct CookieInfo *);
+
+#endif
diff --git a/lib/dict.c b/lib/dict.c
new file mode 100644 (file)
index 0000000..e264370
--- /dev/null
@@ -0,0 +1,245 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+/* -- WIN32 approved -- */
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+
+#include "setup.h"
+
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+#include <winsock.h>
+#include <time.h>
+#include <io.h>
+#else
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <netdb.h>
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+#include <sys/ioctl.h>
+#include <signal.h>
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+
+#endif
+
+#include "urldata.h"
+#include <curl/curl.h>
+#include "download.h"
+#include "sendf.h"
+
+#include "progress.h"
+
+#define _MPRINTF_REPLACE /* use our functions only */
+#include <curl/mprintf.h>
+
+
+UrgError dict(struct UrlData *data, char *path, long *bytecount)
+{
+  int nth;
+  char *word;
+  char *ppath;
+  char *database = NULL;
+  char *strategy = NULL;
+  char *nthdef = NULL; /* This is not part of the protocol, but required
+                          by RFC 2229 */
+  UrgError result=URG_OK;
+    
+  if(data->conf & CONF_USERPWD) {
+    /* AUTH is missing */
+  }
+
+  if (strnequal(path, DICT_MATCH, sizeof(DICT_MATCH)-1) ||
+      strnequal(path, DICT_MATCH2, sizeof(DICT_MATCH2)-1) ||
+      strnequal(path, DICT_MATCH3, sizeof(DICT_MATCH3)-1)) {
+      
+    word = strchr(path, ':');
+    if (word) {
+      word++;
+      database = strchr(word, ':');
+      if (database) {
+        *database++ = (char)0;
+        strategy = strchr(database, ':');
+        if (strategy) {
+          *strategy++ = (char)0;
+          nthdef = strchr(strategy, ':');
+          if (nthdef) {
+            *nthdef++ = (char)0;
+          }
+        }
+      }
+    }
+      
+    if ((word == NULL) || (*word == (char)0)) {
+      failf(data, "lookup word is missing\n");
+    }
+    if ((database == NULL) || (*database == (char)0)) {
+      database = "!";
+    }
+    if ((strategy == NULL) || (*strategy == (char)0)) {
+      strategy = ".";
+    }
+    if ((nthdef == NULL) || (*nthdef == (char)0)) {
+      nth = 0;
+    }
+    else {
+      nth = atoi(nthdef);
+    }
+      
+    sendf(data->firstsocket, data,
+          "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\n"
+          "MATCH "
+          "%s "    /* database */
+          "%s "    /* strategy */
+          "%s\n"   /* word */
+          "QUIT\n",
+           
+          database,
+          strategy,
+          word
+          );
+    
+    result = Download(data, data->firstsocket, -1, FALSE, bytecount);
+      
+    if(result)
+      return result;
+    
+  }
+  else if (strnequal(path, DICT_DEFINE, sizeof(DICT_DEFINE)-1) ||
+           strnequal(path, DICT_DEFINE2, sizeof(DICT_DEFINE2)-1) ||
+           strnequal(path, DICT_DEFINE3, sizeof(DICT_DEFINE3)-1)) {
+    
+    word = strchr(path, ':');
+    if (word) {
+      word++;
+      database = strchr(word, ':');
+      if (database) {
+        *database++ = (char)0;
+        nthdef = strchr(database, ':');
+        if (nthdef) {
+          *nthdef++ = (char)0;
+        }
+      }
+    }
+      
+    if ((word == NULL) || (*word == (char)0)) {
+      failf(data, "lookup word is missing\n");
+    }
+    if ((database == NULL) || (*database == (char)0)) {
+      database = "!";
+    }
+    if ((nthdef == NULL) || (*nthdef == (char)0)) {
+      nth = 0;
+    }
+    else {
+      nth = atoi(nthdef);
+    }
+      
+    sendf(data->firstsocket, data,
+          "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\n"
+          "DEFINE "
+          "%s "     /* database */
+          "%s\n"    /* word */
+          "QUIT\n",
+          
+          database,
+          word
+          );
+    
+    result = Download(data, data->firstsocket, -1, FALSE, bytecount);
+      
+    if(result)
+      return result;
+      
+  }
+  else {
+      
+    ppath = strchr(path, '/');
+    if (ppath) {
+      int i;
+       
+      ppath++;
+      for (i = 0; (i < URL_MAX_LENGTH) && (ppath[i]); i++) {
+        if (ppath[i] == ':')
+          ppath[i] = ' ';
+      }
+      sendf(data->firstsocket, data,
+            "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\n"
+            "%s\n"
+            "QUIT\n",
+            ppath);
+      
+      result = Download(data, data->firstsocket, -1, FALSE, bytecount);
+      
+      if(result)
+        return result;
+      
+    }
+  }
+
+  ProgressEnd(data);
+  return URG_OK;
+}
diff --git a/lib/dict.h b/lib/dict.h
new file mode 100644 (file)
index 0000000..edff0c4
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef __DICT_H
+#define __DICT_H
+
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+UrgError dict(struct UrlData *data, char *path, long *bytecountp);
+
+#endif
diff --git a/lib/download.c b/lib/download.c
new file mode 100644 (file)
index 0000000..fb0cb60
--- /dev/null
@@ -0,0 +1,484 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "setup.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#include "urldata.h"
+#include <curl/curl.h>
+
+#ifdef __BEOS__
+#include <net/socket.h>
+#endif
+
+#ifdef WIN32
+#if !defined( __GNUC__) || defined(__MINGW32__)
+#include <winsock.h>
+#endif
+#include <time.h> /* for the time_t typedef! */
+
+#if defined(__GNUC__) && defined(TIME_WITH_SYS_TIME)
+#include <sys/time.h>
+#endif
+
+#endif
+
+#include "progress.h"
+#include "speedcheck.h"
+#include "sendf.h"
+
+#ifdef USE_ZLIB
+#include <zlib.h>
+#endif
+
+#define MAX(x,y) ((x)>(y)?(x):(y))
+
+/* --- download a stream from a socket --- */
+
+/* This newly edited version of Download() was brought to us by the friendly
+   Mark Butler <butlerm@xmission.com>. Re-indented with the indent command. */
+
+UrgError 
+Download (struct UrlData *data,
+         int sockfd,           /* socket to read from */
+         int size,             /* -1 if unknown at this point */
+         bool getheader,       /* TRUE if header parsing is wanted */
+         long *bytecountp      /* return number of bytes read */
+)
+{
+  char *buf = data->buffer;
+  size_t nread;
+  int bytecount = 0;
+  long contentlength=0;
+  struct timeval start = tvnow();
+  struct timeval now = start;
+  bool header = TRUE;
+  int headerline = 0;          /* counts header lines to better track the first one */
+
+  char *hbufp;                 /* points at *end* of header line */
+  int hbuflen = 0;
+  char *str;                   /* within buf */
+  char *str_start;             /* within buf */
+  char *end_ptr;               /* within buf */
+  char *p;                     /* within headerbuff */
+  bool content_range = FALSE;  /* set TRUE if Content-Range: was found */
+  int offset = 0;              /* possible resume offset read from the
+                                   Content-Range: header */
+  int code = 0;                        /* error code from the 'HTTP/1.? XXX' line */
+#ifdef USE_ZLIB
+  gzFile gzfile=NULL;
+#endif
+
+  /* for the low speed checks: */
+  UrgError urg;
+  time_t timeofdoc=0;
+  long bodywrites=0;
+
+  char newurl[URL_MAX_LENGTH];         /* buffer for Location: URL */
+
+  hbufp = data->headerbuff;
+
+  myalarm (0);                 /* switch off the alarm-style timeout */
+
+  now = tvnow();
+  start = now;
+
+  if (!getheader) {
+    header = FALSE;
+    ProgressInit (data, size);
+  }
+  {
+    fd_set readfd;
+    fd_set keepfd;
+    struct timeval interval;
+    bool keepon = TRUE;
+
+    /* timeout every X second
+       - makes a better progressmeter (i.e even when no data is read, the
+       meter can be updated and reflect reality)
+       - allows removal of the alarm() crap
+       - variable timeout is easier
+     */
+
+    FD_ZERO (&readfd);         /* clear it */
+    FD_SET (sockfd, &readfd);
+
+    keepfd = readfd;
+#ifdef USE_ZLIB
+    gzfile = gzdopen(sockfd, "rb");
+#endif
+    while (keepon) {
+      readfd = keepfd;         /* set this every lap in the loop */
+      interval.tv_sec = 2;
+      interval.tv_usec = 0;
+
+      switch (select (sockfd + 1, &readfd, NULL, NULL, &interval)) {
+      case -1:                 /* error, stop reading */
+       keepon = FALSE;
+       continue;
+      case 0:                  /* timeout */
+       break;
+      default:                 /* read! */
+#ifdef USE_SSLEAY
+       if (data->use_ssl) {
+         nread = SSL_read (data->ssl, buf, BUFSIZE - 1);
+       }
+       else {
+#endif
+#ifdef USE_ZLIB
+          nread = gzread(gzfile, buf, BUFSIZE -1 );
+#else
+         nread = sread (sockfd, buf, BUFSIZE - 1);
+#endif
+#ifdef USE_SSLEAY
+       }
+#endif /* USE_SSLEAY */
+
+       /* NULL terminate, allowing string ops to be used */
+       if (0 < (signed int) nread)
+         buf[nread] = 0;
+
+       /* if we receive 0 or less here, the server closed the connection and
+          we bail out from this! */
+       else if (0 >= (signed int) nread) {
+         keepon = FALSE;
+         break;
+       }
+
+       str = buf;              /* Default buffer to use when we write the
+                                   buffer, it may be changed in the flow below
+                                   before the actual storing is done. */
+
+       /* Since this is a two-state thing, we check if we are parsing
+          headers at the moment or not. */
+
+       if (header) {
+         /* we are in parse-the-header-mode */
+
+         /* header line within buffer loop */
+         do {
+            int hbufp_index;
+
+           str_start = str;    /* str_start is start of line within buf */
+
+           end_ptr = strchr (str_start, '\n');
+
+           if (!end_ptr) {
+             /* no more complete header lines within buffer */
+             /* copy what is remaining into headerbuff */
+              int str_length = (int)strlen(str);
+
+             if (hbuflen + (int)str_length >= data->headersize) {
+                char *newbuff;
+                long newsize=MAX((hbuflen+str_length)*3/2,
+                                 data->headersize*2);
+                hbufp_index = hbufp - data->headerbuff;
+                newbuff = (char *)realloc(data->headerbuff, newsize);
+                if(!newbuff) {
+                  failf (data, "Failed to alloc memory for big header!");
+                  return URG_READ_ERROR;
+                }
+                data->headersize=newsize;
+                data->headerbuff = newbuff;
+                hbufp = data->headerbuff + hbufp_index;
+             }
+             strcpy (hbufp, str);
+             hbufp += strlen (str);
+             hbuflen += strlen (str);
+             break;            /* read more and try again */
+           }
+
+           str = end_ptr + 1;  /* move just past new line */
+
+           if (hbuflen + (str - str_start) >= data->headersize) {
+              char *newbuff;
+              long newsize=MAX((hbuflen+(str-str_start))*3/2,
+                               data->headersize*2);
+              hbufp_index = hbufp - data->headerbuff;
+              newbuff = (char *)realloc(data->headerbuff, newsize);
+              if(!newbuff) {
+                failf (data, "Failed to alloc memory for big header!");
+                return URG_READ_ERROR;
+              }
+              data->headersize= newsize;
+              data->headerbuff = newbuff;
+              hbufp = data->headerbuff + hbufp_index;
+           }
+
+           /* copy to end of line */
+           strncpy (hbufp, str_start, str - str_start);
+           hbufp += str - str_start;
+           hbuflen += str - str_start;
+           *hbufp = 0;
+
+           p = data->headerbuff;
+
+           /* we now have a full line that p points to */
+           if (('\n' == *p) || ('\r' == *p)) {
+             /* Zero-length line means end of header! */
+             if (-1 != size)   /* if known */
+               size += bytecount;      /* we append the already read size */
+
+
+             if ('\r' == *p)
+               p++;            /* pass the \r byte */
+             if ('\n' == *p)
+               p++;            /* pass the \n byte */
+
+             ProgressInit (data, size);        /* init progress meter */
+             header = FALSE;   /* no more header to parse! */
+
+             /* now, only output this if the header AND body are requested: */
+             if ((data->conf & (CONF_HEADER | CONF_NOBODY)) == CONF_HEADER) {
+               if((p - data->headerbuff) !=
+                   data->fwrite (data->headerbuff, 1,
+                                 p - data->headerbuff, data->out)) {
+                  failf (data, "Failed writing output");
+                  return URG_WRITE_ERROR;
+                }
+             }
+              if(data->writeheader) {
+                /* obviously, the header is requested to be written to
+                   this file: */
+                if((p - data->headerbuff) !=
+                   fwrite (data->headerbuff, 1, p - data->headerbuff,
+                           data->writeheader)) {
+                  failf (data, "Failed writing output");
+                  return URG_WRITE_ERROR;
+                }
+              }
+             break;            /* exit header line loop */
+           }
+
+           if (!headerline++) {
+             /* This is the first header, it MUST be the error code line
+                or else we consiser this to be the body right away! */
+             if (sscanf (p, " HTTP/1.%*c %3d", &code)) {
+               /* 404 -> URL not found! */
+               if (
+                    ( ((data->conf & CONF_FOLLOWLOCATION) && (code >= 400)) ||
+                      !(data->conf & CONF_FOLLOWLOCATION) && (code >= 300))
+                    && (data->conf & CONF_FAILONERROR)) {
+                 /* If we have been told to fail hard on HTTP-errors,
+                    here is the check for that: */
+                 /* serious error, go home! */
+                 failf (data, "The requested file was not found");
+                 return URG_HTTP_NOT_FOUND;
+               }
+             }
+             else {
+               header = FALSE; /* this is not a header line */
+               break;
+             }
+           }
+           /* check for Content-Length: header lines to get size */
+           if (strnequal("Content-Length", p, 14) &&
+                sscanf (p+14, ": %ld", &contentlength))
+              size = contentlength;
+           else if (strnequal("Content-Range", p, 13) &&
+                     sscanf (p+13, ": bytes %d-", &offset)) {
+             if (data->resume_from == offset) {
+               /* we asked for a resume and we got it */
+               content_range = TRUE;
+             }
+           }
+            else if(data->cookies &&
+                    strnequal("Set-Cookie: ", p, 11)) {
+              cookie_add(data->cookies, TRUE, &p[12]);
+            }
+            else if(strnequal("Last-Modified:", p, strlen("Last-Modified:")) &&
+                    data->timecondition) {
+              time_t secs=time(NULL);
+              timeofdoc = get_date(p+strlen("Last-Modified:"), &secs);
+            }
+           else if ((code >= 300 && code < 400) &&
+                    (data->conf & CONF_FOLLOWLOCATION) &&
+                     strnequal("Location", p, 8) &&
+                    sscanf (p+8, ": %" URL_MAX_LENGTH_TXT "s", newurl)) {
+             /* this is the URL that the server advices us to get
+                instead */
+             data->newurl = strdup (newurl);
+           }
+
+           if (data->conf & CONF_HEADER) {
+             if(hbuflen != data->fwrite (p, 1, hbuflen, data->out)) {
+                failf (data, "Failed writing output");
+                return URG_WRITE_ERROR;
+              }
+           }
+            if(data->writeheader) {
+              /* the header is requested to be written to this file */
+              if(hbuflen != fwrite (p, 1, hbuflen, data->writeheader)) {
+                failf (data, "Failed writing output");
+                return URG_WRITE_ERROR;
+              }
+            }
+
+           /* reset hbufp pointer && hbuflen */
+           hbufp = data->headerbuff;
+           hbuflen = 0;
+         }
+         while (*str);         /* header line within buffer */
+
+         /* We might have reached the end of the header part here, but
+            there might be a non-header part left in the end of the read
+            buffer. */
+
+         if (!header) {
+           /* the next token and forward is not part of
+              the header! */
+
+           /* we subtract the remaining header size from the buffer */
+           nread -= (str - buf);
+         }
+
+       }                       /* end if header mode */
+
+       /* This is not an 'else if' since it may be a rest from the header
+          parsing, where the beginning of the buffer is headers and the end
+          is non-headers. */
+       if (str && !header && (nread > 0)) {
+
+          if(0 == bodywrites) {
+            /* These checks are only made the first time we are about to
+               write a chunk of the body */
+            if(data->conf&CONF_HTTP) {
+              /* HTTP-only checks */
+              if (data->resume_from && !content_range ) {
+                /* we wanted to resume a download, although the server doesn't
+                   seem to support this */
+                failf (data, "HTTP server doesn't seem to support byte ranges. Cannot resume.");
+                return URG_HTTP_RANGE_ERROR;
+              }
+              else if (data->newurl) {
+                /* abort after the headers if "follow Location" is set */
+                infof (data, "Follow to new URL: %s\n", data->newurl);
+                return URG_OK;
+              }
+              else if(data->timecondition && !data->range) {
+                /* A time condition has been set AND no ranges have been
+                   requested. This seems to be what chapter 13.3.4 of RFC 2616
+                   defines to be the correct action for a HTTP/1.1 client */
+                if((timeofdoc > 0) && (data->timevalue > 0)) {
+                  switch(data->timecondition) {
+                  case TIMECOND_IFMODSINCE:
+                  default:
+                    if(timeofdoc < data->timevalue) {
+                      infof(data, "The requested document is not new enough");
+                      return URG_OK;
+                    }
+                    break;
+                  case TIMECOND_IFUNMODSINCE:
+                    if(timeofdoc > data->timevalue) {
+                      infof(data, "The requested document is not old enough");
+                      return URG_OK;
+                    }
+                    break;
+                  } /* switch */
+                } /* two valid time strings */
+              } /* we have a time condition */
+            } /* this is HTTP */
+          } /* this is the first time we write a body part */
+          bodywrites++;
+
+          if(data->maxdownload &&
+             (bytecount + nread > data->maxdownload)) {
+            nread = data->maxdownload - bytecount;
+            if(nread < 0 ) /* this should be unusual */
+              nread = 0;
+            keepon = FALSE; /* we're done now! */
+          }
+
+         bytecount += nread;
+
+         if (nread != data->fwrite (str, 1, nread, data->out)) {
+           failf (data, "Failed writing output");
+           return URG_WRITE_ERROR;
+         }
+
+       }
+       break;
+      }
+      now = tvnow();
+      if (!header) {
+       ProgressShow (data, bytecount, start, now, FALSE);
+      }
+      urg = speedcheck (data, now);
+      if (urg)
+       return urg;
+
+      if (data->timeout && (tvdiff (now, start) > data->timeout)) {
+       failf (data, "Operation timed out with %d out of %d bytes received",
+              bytecount, size);
+       return URG_OPERATION_TIMEOUTED;
+      }
+#ifdef MULTIDOC
+      if(contentlength && bytecount >= contentlength) {
+        /* we're done with this download, now stop it */
+        break;
+      }
+#endif
+    }
+  }
+  if(contentlength && (bytecount != contentlength)) {
+    failf(data, "transfer closed with %d bytes remaining", contentlength-bytecount);
+    return URG_PARTIAL_FILE;
+  }
+  ProgressShow (data, bytecount, start, now, TRUE);
+
+  *bytecountp = bytecount;
+
+#ifdef USE_ZLIB
+  gzclose(gzfile);
+#endif
+  return URG_OK;
+}
+
+
diff --git a/lib/download.h b/lib/download.h
new file mode 100644 (file)
index 0000000..e8ca82a
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef __DOWNLOAD_H
+#define __DOWNLOAD_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+UrgError 
+Download (struct UrlData *data,
+         int sockfd,           /* socket to read from */
+         int size,             /* -1 if unknown at this point */
+         bool getheader,       /* TRUE if header parsing is wanted */
+         long *bytecountp      /* return number of bytes read */
+);
+
+#endif
diff --git a/lib/escape.c b/lib/escape.c
new file mode 100644 (file)
index 0000000..68000cd
--- /dev/null
@@ -0,0 +1,111 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+/* Escape and unescape URL encoding in strings. The functions return a new
+ * allocated string or NULL if an error occurred.  */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *curl_escape(char *string)
+{
+   int alloc=strlen(string);
+   char *ns = malloc(alloc);
+   unsigned char in;
+   int newlen = alloc;
+   int index=0;
+
+   while(*string) {
+      in = *string;
+      if(' ' == in)
+        ns[index++] = '+';
+      else if(!(in >= 'a' && in <= 'z') &&
+             !(in >= 'A' && in <= 'Z') &&
+             !(in >= '0' && in <= '9')) {
+        /* encode it */
+        newlen += 2; /* the size grows with two, since this'll become a %XX */
+        if(newlen > alloc) {
+           alloc *= 2;
+           ns = realloc(ns, alloc);
+           if(!ns)
+              return NULL;
+        }
+        sprintf(&ns[index], "%%%02X", in);
+        index+=3;
+      }
+      else {
+        /* just copy this */
+        ns[index++]=in;
+      }
+      string++;
+   }
+   ns[index]=0; /* terminate it */
+   return ns;
+}
+
+char *curl_unescape(char *string)
+{
+   int alloc = strlen(string);
+   char *ns = malloc(alloc);
+   unsigned char in;
+   int index=0;
+   int hex;
+   
+
+   while(*string) {
+      in = *string;
+      if('+' == in)
+        in = ' ';
+      else if('%' == in) {
+        /* encoded part */
+        if(sscanf(string+1, "%02X", &hex)) {
+           in = hex;
+           string+=2;
+        }
+      }
+
+      ns[index++] = in;
+      string++;
+   }
+   ns[index]=0; /* terminate it */
+   return ns;
+  
+}
diff --git a/lib/escape.h b/lib/escape.h
new file mode 100644 (file)
index 0000000..bca4d8b
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef __ESCAPE_H
+#define __ESCAPE_H
+
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+/* Escape and unescape URL encoding in strings. The functions return a new
+ * allocated string or NULL if an error occurred.  */
+
+char *curl_escape(char *string);
+char *curl_unescape(char *string);
+
+#endif
diff --git a/lib/file.c b/lib/file.c
new file mode 100644 (file)
index 0000000..b5d198e
--- /dev/null
@@ -0,0 +1,175 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1999.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+/* -- WIN32 approved -- */
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+
+#include "setup.h"
+
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+#include <winsock.h>
+#include <time.h>
+#include <io.h>
+#include <fcntl.h>
+#else
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <netdb.h>
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+#include <sys/ioctl.h>
+#include <signal.h>
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+
+#endif
+
+#include "urldata.h"
+#include <curl/curl.h>
+#include "progress.h"
+#include "sendf.h"
+#include "escape.h"
+
+#define _MPRINTF_REPLACE /* use our functions only */
+#include <curl/mprintf.h>
+
+
+UrgError file(struct UrlData *data, char *path, long *bytecountp)
+{
+  /* This implementation ignores the host name in conformance with 
+     RFC 1738. Only local files (reachable via the standard file system)
+     are supported. This means that files on remotely mounted directories
+     (via NFS, Samba, NT sharing) can be accessed through a file:// URL
+  */
+
+  struct stat statbuf;
+  size_t expected_size=-1;
+  size_t nread;
+  char *buf = data->buffer;
+  int bytecount = 0;
+  struct timeval start = tvnow();
+  struct timeval now = start;
+  int fd;
+  char *actual_path = curl_unescape(path);
+
+#ifdef WIN32
+  int i;
+
+  /* change path separators from '/' to '\\' for Windows */
+  for (i=0; actual_path[i] != '\0'; ++i)
+    if (actual_path[i] == '/')
+      actual_path[i] = '\\';
+
+  fd = open(actual_path, O_RDONLY | O_BINARY); /* no CR/LF translation! */
+#else
+  fd = open(actual_path, O_RDONLY);
+#endif
+  free(actual_path);
+
+  if(fd == -1) {
+    failf(data, "Couldn't open file %s", path);
+    return URG_FILE_COULDNT_READ_FILE;
+  }
+  if( -1 != fstat(fd, &statbuf)) {
+    /* we could stat it, then read out the size */
+    expected_size = statbuf.st_size;
+  }
+
+  /* The following is a shortcut implementation of file reading
+     this is both more efficient than the former call to download() and
+     it avoids problems with select() and recv() on file descriptors
+     in Winsock */
+  ProgressInit (data, expected_size);
+  while (1) {
+    nread = read(fd, buf, BUFSIZE-1);
+
+    if (0 <= nread)
+      buf[nread] = 0;
+
+    if (nread <= 0)
+      break;
+    bytecount += nread;
+    /* NOTE: The following call to fwrite does CR/LF translation on
+       Windows systems if the target is stdout. Use -O or -o parameters
+       to prevent CR/LF translation (this then goes to a binary mode
+       file descriptor). */
+    if(nread != data->fwrite (buf, 1, nread, data->out)) {
+      failf (data, "Failed writing output");
+      return URG_WRITE_ERROR;
+    }
+    now = tvnow();
+    ProgressShow (data, bytecount, start, now, FALSE);
+  }
+  now = tvnow();
+  ProgressShow (data, bytecount, start, now, TRUE);
+
+  close(fd);
+
+  return URG_OK;
+}
diff --git a/lib/file.h b/lib/file.h
new file mode 100644 (file)
index 0000000..eeaeef4
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef __FILE_H
+#define __FILE_H
+
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+UrgError file(struct UrlData *data, char *path, long *bytecountp);
+
+#endif
diff --git a/lib/formdata b/lib/formdata
new file mode 100755 (executable)
index 0000000..dc8e9e8
Binary files /dev/null and b/lib/formdata differ
diff --git a/lib/formdata.c b/lib/formdata.c
new file mode 100644 (file)
index 0000000..eff0212
--- /dev/null
@@ -0,0 +1,617 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+/*
+  Debug the form generator stand-alone by compiling this source file with:
+
+  gcc -DHAVE_CONFIG_H -I../ -g -D_FORM_DEBUG -o formdata -I../include formdata.c
+
+  run the 'formdata' executable and make sure the output is ok!
+
+  try './formdata "name=Daniel" "poo=noo" "foo=bar"' and similarly
+
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include <time.h>
+
+#include "setup.h"
+#include <curl/curl.h>
+#include "formdata.h"
+
+/* Length of the random boundary string. The risk of this being used
+   in binary data is very close to zero, 64^32 makes
+   6277101735386680763835789423207666416102355444464034512896
+   combinations... */
+#define BOUNDARY_LENGTH 32
+
+/* What kind of Content-Type to use on un-specified files with unrecognized
+   extensions. */
+#define HTTPPOST_CONTENTTYPE_DEFAULT "text/plain"
+
+/* This is a silly duplicate of the function in main.c to enable this source
+   to compile stand-alone for better debugging */
+static void GetStr(char **string,
+                  char *value)
+{
+  if(*string)
+    free(*string);
+  *string = strdup(value);
+}
+
+/***************************************************************************
+ *
+ * FormParse()
+ *     
+ * Reads a 'name=value' paramter and builds the appropriate linked list.
+ *
+ * Specify files to upload with 'name=@filename'. Supports specified
+ * given Content-Type of the files. Such as ';type=<content-type>'.
+ *
+ * You may specify more than one file for a single name (field). Specify
+ * multiple files by writing it like:
+ *
+ * 'name=@filename,filename2,filename3'
+ *
+ * If you want content-types specified for each too, write them like:
+ *
+ * 'name=@filename;type=image/gif,filename2,filename3'
+ *
+ ***************************************************************************/
+
+int curl_FormParse(char *input,
+                   struct HttpPost **httppost,
+                   struct HttpPost **last_post)
+{
+  return FormParse(input, httppost, last_post);
+}
+
+#define FORM_FILE_SEPARATOR ','
+#define FORM_TYPE_SEPARATOR ';'
+
+int FormParse(char *input,
+             struct HttpPost **httppost,
+             struct HttpPost **last_post)
+{
+  /* nextarg MUST be a string in the format 'name=contents' and we'll
+     build a linked list with the info */
+  char name[256];
+  char contents[1024]="";
+  char major[128];
+  char minor[128];
+  long flags = 0;
+  char *contp;
+  char *type = NULL;
+  char *prevtype = NULL;
+  char *sep;
+  char *sep2;
+  struct HttpPost *post;
+  struct HttpPost *subpost; /* a sub-node */
+  unsigned int i;
+
+  if(1 <= sscanf(input, "%255[^ =] = %1023[^\n]", name, contents)) {
+    /* the input was using the correct format */
+    contp = contents;
+
+    if('@' == contp[0]) {
+      /* we use the @-letter to indicate file name(s) */
+      
+      flags = HTTPPOST_FILENAME;
+      contp++;
+
+      post=NULL;
+
+      do {
+       /* since this was a file, it may have a content-type specifier
+          at the end too */
+
+       sep=strchr(contp, FORM_TYPE_SEPARATOR);
+       sep2=strchr(contp, FORM_FILE_SEPARATOR);
+
+       /* pick the closest */
+       if(sep2 && (sep2 < sep)) {
+         sep = sep2;
+
+         /* no type was specified! */
+       }
+       if(sep) {
+
+         /* if we got here on a comma, don't do much */
+         if(FORM_FILE_SEPARATOR != *sep)
+           type = strstr(sep+1, "type=");
+         else
+           type=NULL;
+
+         *sep=0; /* terminate file name at separator */
+
+         if(type) {
+           type += strlen("type=");
+           
+           if(2 != sscanf(type, "%127[^/]/%127[^,\n]",
+                          major, minor)) {
+             fprintf(stderr, "Illegally formatted content-type field!\n");
+             return 2; /* illegal content-type syntax! */
+           }
+           /* now point beyond the content-type specifier */
+           sep = type + strlen(major)+strlen(minor)+1;
+
+           /* find the following comma */
+           sep=strchr(sep, FORM_FILE_SEPARATOR);
+         }
+       }
+       else {
+         type=NULL;
+         sep=strchr(contp, FORM_FILE_SEPARATOR);
+       }
+       if(sep) {
+         /* the next file name starts here */
+         *sep =0;
+         sep++;
+       }
+       if(!type) {
+         /*
+          * No type was specified, we scan through a few well-known
+          * extensions and pick the first we match!
+          */
+         struct ContentType {
+           char *extension;
+           char *type;
+         };
+         static struct ContentType ctts[]={
+           {".gif",  "image/gif"},
+           {".jpg",  "image/jpeg"},
+           {".jpeg", "image/jpeg"},
+           {".txt",  "text/plain"},
+           {".html", "text/plain"}
+         };
+
+         if(prevtype)
+           /* default to the previously set/used! */
+           type = prevtype;
+         else
+           /* It seems RFC1867 defines no Content-Type to default to
+              text/plain so we don't actually need to set this: */
+           type = HTTPPOST_CONTENTTYPE_DEFAULT;
+
+         for(i=0; i<sizeof(ctts)/sizeof(ctts[0]); i++) {
+           if(strlen(contp) >= strlen(ctts[i].extension)) {
+             if(strequal(contp +
+                         strlen(contp) - strlen(ctts[i].extension),
+                         ctts[i].extension)) {
+               type = ctts[i].type;
+               break;
+             }       
+           }
+         }
+         /* we have a type by now */
+       }
+
+       if(NULL == post) {
+         /* For the first file name, we allocate and initiate the main list
+            node */
+
+         post = (struct HttpPost *)malloc(sizeof(struct HttpPost));
+         if(post) {
+           memset(post, 0, sizeof(struct HttpPost));
+           GetStr(&post->name, name);      /* get the name */
+           GetStr(&post->contents, contp); /* get the contents */
+           post->flags = flags;
+           if(type) {
+             GetStr(&post->contenttype, type); /* get type */
+             prevtype=post->contenttype; /* point to the allocated string! */
+           }
+           /* make the previous point to this */
+           if(*last_post)
+             (*last_post)->next = post;
+           else
+             (*httppost) = post;
+
+           (*last_post) = post;          
+         }
+
+       }
+       else {
+         /* we add a file name to the previously allocated node, known as
+             'post' now */
+         subpost =(struct HttpPost *)malloc(sizeof(struct HttpPost));
+         if(subpost) {
+            memset(subpost, 0, sizeof(struct HttpPost));
+            GetStr(&subpost->name, name);      /* get the name */
+            GetStr(&subpost->contents, contp); /* get the contents */
+            subpost->flags = flags;
+            if(type) {
+              GetStr(&subpost->contenttype, type); /* get type */
+              prevtype=subpost->contenttype; /* point to the allocated string! */
+            }
+            /* now, point our 'more' to the original 'more' */
+            subpost->more = post->more;
+
+            /* then move the original 'more' to point to ourselves */
+            post->more = subpost;           
+         }
+       }
+       contp = sep; /* move the contents pointer to after the separator */
+      } while(sep && *sep); /* loop if there's another file name */
+    }
+    else {
+      post = (struct HttpPost *)malloc(sizeof(struct HttpPost));
+      if(post) {
+       memset(post, 0, sizeof(struct HttpPost));
+       GetStr(&post->name, name);      /* get the name */
+       GetStr(&post->contents, contp); /* get the contents */
+       post->flags = 0;
+
+       /* make the previous point to this */
+       if(*last_post)
+         (*last_post)->next = post;
+       else
+         (*httppost) = post;
+
+       (*last_post) = post;      
+      }
+
+    }
+
+  }
+  else {
+    fprintf(stderr, "Illegally formatted input field!\n");
+    return 1;
+  }
+  return 0;
+}
+
+static int AddFormData(struct FormData **formp,
+                       void *line,
+                       long length)
+{
+  struct FormData *newform = (struct FormData *)
+    malloc(sizeof(struct FormData));
+  newform->next = NULL;
+
+  /* we make it easier for plain strings: */
+  if(!length)
+    length = strlen((char *)line);
+
+  newform->line = (char *)malloc(length+1);
+  memcpy(newform->line, line, length+1);
+  newform->length = length;
+  
+  if(*formp) {
+    (*formp)->next = newform;
+    *formp = newform;
+  }
+  else
+    *formp = newform;
+
+  return length;
+}
+
+
+static int AddFormDataf(struct FormData **formp,
+                        char *fmt, ...)
+{
+  char s[1024];
+  va_list ap;
+  va_start(ap, fmt);
+  vsprintf(s, fmt, ap);
+  va_end(ap);
+
+  return AddFormData(formp, s, 0);
+}
+
+
+char *MakeFormBoundary(void)
+{
+  char *retstring;
+  static int randomizer=0; /* this is just so that two boundaries within
+                             the same form won't be identical */
+  int i;
+
+  static char table64[]=
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+  retstring = (char *)malloc(BOUNDARY_LENGTH);
+
+  if(!retstring)
+    return NULL; /* failed */
+
+  srand(time(NULL)+randomizer++); /* seed */
+
+  strcpy(retstring, "curl"); /* bonus commercials 8*) */
+
+  for(i=4; i<(BOUNDARY_LENGTH-1); i++) {
+    retstring[i] = table64[rand()%64];
+  }
+  retstring[BOUNDARY_LENGTH-1]=0; /* zero terminate */
+
+  return retstring;
+}
+
+void FormFree(struct FormData *form)
+{
+  struct FormData *next;
+  do {
+    next=form->next;  /* the following form line */
+    free(form->line); /* free the line */
+    free(form);       /* free the struct */
+
+  } while(form=next); /* continue */
+}
+
+struct FormData *getFormData(struct HttpPost *post,
+                            int *sizep)
+{
+  struct FormData *form = NULL;
+  struct FormData *firstform;
+
+  struct HttpPost *file;
+
+  int size =0;
+  char *boundary;
+  char *fileboundary=NULL;
+
+  if(!post)
+    return NULL; /* no input => no output! */
+
+  boundary = MakeFormBoundary();
+  
+  /* Make the first line of the output */
+  AddFormDataf(&form,
+               "Content-Type: multipart/form-data;"
+               " boundary=%s\r\n",
+               boundary);
+  /* we DO NOT count that line since that'll be part of the header! */
+
+  firstform = form;
+  
+  do {
+
+    /* boundary */
+    size += AddFormDataf(&form, "\r\n--%s\r\n", boundary);
+
+    size += AddFormDataf(&form,
+                        "Content-Disposition: form-data; name=\"%s\"",
+                        post->name);
+
+    if(post->more) {
+      /* If used, this is a link to more file names, we must then do
+         the magic to include several files with the same field name */
+
+      fileboundary = MakeFormBoundary();
+
+      size += AddFormDataf(&form,
+                          "\r\nContent-Type: multipart/mixed,"
+                          " boundary=%s\r\n",
+                          fileboundary);
+    }
+
+    file = post;
+
+    do {
+      if(post->more) {
+       /* if multiple-file */
+       size += AddFormDataf(&form,
+                            "\r\n--%s\r\nContent-Disposition: attachment; filename=\"%s\"",
+                            fileboundary, file->contents);
+      }
+      else if(post->flags & HTTPPOST_FILENAME) {
+       size += AddFormDataf(&form,
+                            "; filename=\"%s\"",
+                            post->contents);
+      }
+      
+      if(file->contenttype) {
+       /* we have a specified type */
+       size += AddFormDataf(&form,
+                            "\r\nContent-Type: %s",
+                            file->contenttype);
+      }
+      if(file->contenttype &&
+        !strnequal("text/", file->contenttype, 5)) {
+       /* this is not a text content, mention our binary encoding */
+       size += AddFormDataf(&form,
+                            "\r\nContent-Transfer-Encoding: binary");
+      }
+
+
+      size += AddFormDataf(&form,
+                          "\r\n\r\n");
+
+      if(post->flags & HTTPPOST_FILENAME) {
+       /* we should include the contents from the specified file */
+       FILE *fileread;
+       char buffer[1024];
+       int nread;
+
+       fileread = strequal("-", file->contents)?stdin:
+          /* binary read for win32 crap */
+          fopen(file->contents, "rb");
+       if(fileread) {
+         while((nread = fread(buffer, 1, 1024, fileread))) {
+           size += AddFormData(&form,
+                               buffer,
+                               nread);
+         }
+          if(fileread != stdin)
+            fclose(fileread);
+       }
+       else {
+         size += AddFormDataf(&form, "[File wasn't found by client]");
+       }
+      }
+      else {
+       /* include the contents we got */
+       size += AddFormDataf(&form,
+                            post->contents);
+      }
+    } while((file = file->more)); /* for each specified file for this field */
+
+    if(post->more) {
+      /* this was a multiple-file inclusion, make a termination file
+         boundary: */
+      size += AddFormDataf(&form,
+                          "\r\n--%s--",
+                          fileboundary);     
+      free(fileboundary);
+    }
+
+  } while((post=post->next)); /* for each field */
+
+  /* end-boundary for everything */
+  size += AddFormDataf(&form,
+                      "\r\n--%s--\r\n",
+                      boundary);
+
+  *sizep = size;
+
+  free(boundary);
+
+  return firstform;
+}
+
+int FormInit(struct Form *form, struct FormData *formdata )
+{
+  form->data = formdata;
+  form->sent = 0;
+
+  if(!formdata)
+    return 1; /* error */
+
+  return 0;
+}
+
+/* fread() emulation */
+int FormReader(char *buffer,
+              size_t size,
+              size_t nitems,
+              FILE *mydata)
+{
+  struct Form *form;
+  int wantedsize;
+  int gotsize;
+
+  form=(struct Form *)mydata;
+
+  wantedsize = size * nitems;
+
+  if(!form->data)
+    return 0; /* nothing, error, empty */
+
+  do {
+  
+    if( (form->data->length - form->sent ) > wantedsize ) {
+
+      memcpy(buffer, form->data->line + form->sent, wantedsize);
+
+      form->sent += wantedsize;
+
+      return wantedsize;
+    }
+
+    memcpy(buffer,
+           form->data->line + form->sent,
+           gotsize = (form->data->length - form->sent) );
+
+    form->sent = 0;
+
+    form->data = form->data->next; /* advance */
+
+  } while(!gotsize && form->data);
+  /* If we got an empty line and we have more data, we proceed to the next
+     line immediately to avoid returning zero before we've reached the end.
+     This is the bug reported November 22 1999 on curl 6.3. (Daniel) */
+
+  return gotsize;
+}
+
+
+#ifdef _FORM_DEBUG
+
+int main(int argc, char **argv)
+{
+#if 0
+  char *testargs[]={
+    "name1 = data in number one",
+    "name2 = number two data",
+    "test = @upload"
+  };
+#endif
+  int i;
+  char *nextarg;
+  struct HttpPost *httppost=NULL;
+  struct HttpPost *last_post=NULL;
+  struct HttpPost *post;
+  int size;
+  int nread;
+  char buffer[4096];
+
+  struct FormData *form;
+  struct Form formread;
+
+  for(i=1; i<argc; i++) {
+
+    if( FormParse( argv[i],
+                  &httppost,
+                  &last_post)) {
+      fprintf(stderr, "Illegally formatted input field: '%s'!\n",
+             argv[i]);
+      return 1;
+    }
+  }
+
+  form=getFormData(httppost, &size);
+
+  FormInit(&formread, form);
+
+  while(nread = FormReader(buffer, 1, sizeof(buffer), (FILE *)&formread)) {
+    fwrite(buffer, nread, 1, stderr);
+  }
+
+  fprintf(stderr, "size: %d\n", size);
+
+  return 0;
+}
+
+#endif
diff --git a/lib/formdata.h b/lib/formdata.h
new file mode 100644 (file)
index 0000000..6b08a05
--- /dev/null
@@ -0,0 +1,103 @@
+#ifndef __FORMDATA_H
+#define __FORMDATA_H
+
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ *  Contributor(s):
+ *   Rafael Sagula <sagula@inf.ufrgs.br>
+ *   Sampo Kellomaki <sampo@iki.fi>
+ *   Linas Vepstas <linas@linas.org>
+ *   Bjorn Reese <breese@imada.ou.dk>
+ *   Johan Anderson <johan@homemail.com>
+ *   Kjell Ericson <Kjell.Ericson@haxx.nu>
+ *   Troy Engel <tengel@palladium.net>
+ *   Ryan Nelson <ryan@inch.com>
+ *   Bjorn Stenberg <Bjorn.Stenberg@haxx.nu>
+ *   Angus Mackay <amackay@gus.ml.org>
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ * $Log$
+ * Revision 1.1  1999-12-29 14:21:22  bagder
+ * Initial revision
+ *
+ * Revision 1.4  1999/09/06 06:59:40  dast
+ * Changed email info
+ *
+ * Revision 1.3  1999/08/13 07:34:47  dast
+ * Changed the URL in the header
+ *
+ * Revision 1.2  1999/07/30 12:59:47  dast
+ * FormFree() was added to properly cleanup after a form was posted.
+ *
+ * Revision 1.1.1.1  1999/03/11 22:23:34  dast
+ * Imported sources
+ *
+ ****************************************************************************/
+/* plain and simple linked list with lines to send */
+struct FormData {
+  struct FormData *next;
+  char *line;
+  long length;
+};
+
+struct Form {
+  struct FormData *data; /* current form line to send */
+  int sent; /* number of bytes of the current line that has already
+              been sent in a previous invoke */
+};
+
+int FormParse(char *string,
+             struct HttpPost **httppost,
+             struct HttpPost **last_post);
+
+int FormInit(struct Form *form, struct FormData *formdata );
+
+struct FormData *getFormData(struct HttpPost *post,
+                            int *size);
+
+/* fread() emulation */
+int FormReader(char *buffer,
+              size_t size,
+              size_t nitems,
+              FILE *mydata);
+
+char *MakeFormBoundary(void);
+
+void FormFree(struct FormData *);
+
+#endif
diff --git a/lib/ftp.c b/lib/ftp.c
new file mode 100644 (file)
index 0000000..d628912
--- /dev/null
+++ b/lib/ftp.c
@@ -0,0 +1,1046 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "setup.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+#include <winsock.h>
+#else /* some kind of unix */
+#include <sys/socket.h>
+#include <netinet/in.h>
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#include <sys/utsname.h>
+#include <netdb.h>
+#endif
+
+#if defined(WIN32) && defined(__GNUC__) || defined(__MINGW32__)
+#include <errno.h>
+#endif
+
+
+#include <curl/curl.h>
+#include "urldata.h"
+#include "sendf.h"
+
+#include "if2ip.h"
+#include "hostip.h"
+#include "progress.h"
+#include "upload.h"
+#include "download.h"
+
+
+/* returns last node in linked list */
+static struct curl_slist *slist_get_last(struct curl_slist *list)
+{
+       struct curl_slist       *item;
+
+       /* if caller passed us a NULL, return now */
+       if (!list)
+               return NULL;
+
+       /* loop through to find the last item */
+       item = list;
+       while (item->next) {
+               item = item->next;
+       }
+       return item;
+}
+
+/* append a struct to the linked list. It always retunrs the address of the
+ * first record, so that you can sure this function as an initialization
+ * function as well as an append function. If you find this bothersome,
+ * then simply create a separate _init function and call it appropriately from
+ * within the proram. */
+struct curl_slist *curl_slist_append(struct curl_slist *list, char *data)
+{
+       struct curl_slist       *last;
+       struct curl_slist       *new_item;
+
+       new_item = (struct curl_slist *) malloc(sizeof(struct curl_slist));
+       if (new_item) {
+               new_item->next = NULL;
+               new_item->data = strdup(data);
+       }
+       else {
+               fprintf(stderr, "Cannot allocate memory for QUOTE list.\n");
+               exit(-1);
+       }
+
+       if (list) {
+               last = slist_get_last(list);
+               last->next = new_item;
+               return list;
+       }
+
+       /* if this is the first item, then new_item *is* the list */
+       return new_item;
+}
+
+/* be nice and clean up resources */
+void curl_slist_free_all(struct curl_slist *list)
+{
+       struct curl_slist       *next;
+       struct curl_slist       *item;
+
+       if (!list)
+               return;
+
+       item = list;
+       do {
+               next = item->next;
+               
+               if (item->data) {
+                       free(item->data);
+               }
+               free(item);
+               item = next;
+       } while (next);
+}
+
+
+static UrgError AllowServerConnect(struct UrlData *data,
+                                   int sock)
+{
+  fd_set rdset;
+  struct timeval dt;
+  
+  FD_ZERO(&rdset);
+
+  FD_SET(sock, &rdset);
+
+  /* we give the server 10 seconds to connect to us */
+  dt.tv_sec = 10;
+  dt.tv_usec = 0;
+
+  switch ( select(sock+1, &rdset, NULL, NULL, &dt)) {
+  case -1: /* error */
+    /* let's die here */
+    failf(data, "Error while waiting for server connect");
+    return URG_FTP_PORT_FAILED;
+  case 0:  /* timeout */
+    /* let's die here */
+    failf(data, "Timeout while waiting for server connect");
+    return URG_FTP_PORT_FAILED;
+  default:
+    /* we have received data here */
+    {
+      int s;
+      size_t size = sizeof(struct sockaddr_in);
+      struct sockaddr_in add;
+
+      getsockname(sock, (struct sockaddr *) &add, (int *)&size);
+      s=accept(sock, (struct sockaddr *) &add, (int *)&size);
+
+      if( -1 == s) {
+       /* DIE! */
+       failf(data, "Error accept()ing server connect");
+       return URG_FTP_PORT_FAILED;
+      }
+      infof(data, "Connection accepted from server\n");
+
+      data->secondarysocket = s;
+    }
+    break;
+  }
+  return URG_OK;
+}
+
+
+/* --- parse FTP server responses --- */
+
+#define lastline(line) (isdigit((int)line[0]) && isdigit((int)line[1]) && \
+                       isdigit((int)line[2]) && (' ' == line[3]))
+
+static int GetLastResponse(int sockfd, char *buf,
+                          struct UrlData *data)
+{
+  int nread;
+  int read_rc=1;
+  char *ptr;
+  do {
+    ptr=buf;
+
+    /* get us a full line, terminated with a newline */
+    for(nread=0;
+        (nread<BUFSIZE) && read_rc;
+        nread++, ptr++) {
+#ifdef USE_SSLEAY
+      if (data->use_ssl) {
+        read_rc = SSL_read(data->ssl, ptr, 1);
+      }
+      else {
+#endif
+        read_rc = sread(sockfd, ptr, 1);
+#ifdef USE_SSLEAY
+      }
+#endif /* USE_SSLEAY */
+      if (*ptr == '\n')
+        break;
+    }
+    *ptr=0; /* zero terminate */
+
+    if(data->conf & CONF_VERBOSE) {
+      fputs("< ", data->err);
+      fwrite(buf, 1, nread, data->err);
+      fputs("\n", data->err);
+    }
+  } while(read_rc &&
+         (nread<4 || !lastline(buf)) );
+  return nread;
+}
+
+/* -- who are we? -- */
+char *getmyhost(void)
+{
+  static char myhost[256];
+#if !defined(WIN32) && !defined(HAVE_UNAME) && !defined(HAVE_GETHOSTNAME)
+  /* We have no means of finding the local host name! */
+  strcpy(myhost, "localhost");
+#endif
+#if defined(WIN32) || !defined(HAVE_UNAME)
+  gethostname(myhost, 256);
+#else
+  struct utsname ugnm;
+
+  if (uname(&ugnm) < 0)
+    return "localhost";
+
+  (void) strncpy(myhost, ugnm.nodename, 255);
+  myhost[255] = '\0';
+#endif
+  return myhost;
+}
+
+#if 0
+/*
+ * URLfix()
+ *
+ * This function returns a string converted FROM the input URL format to a
+ * format that is more likely usable for the remote server. That is, all
+ * special characters (found as %XX-codes) will be eascaped with \<letter>.
+ */
+
+static char *URLfix(char *string)
+{
+  /* The length of the new string can't be longer than twice the original
+     string, if all letters are '+'... */
+  int alloc = strlen(string)*2;
+  char *ns = malloc(alloc);
+  unsigned char in;
+  int index=0;
+  int hex;
+   
+  while(*string) {
+    in = *string;
+    switch(in) {
+    case '+':
+      ns[index++] = '\\';
+      ns[index++] = ' ';
+      string++;
+      continue;
+
+    case '%':
+      /* encoded part */
+      if(sscanf(string+1, "%02X", &hex)) {
+        ns[index++] = '\\';
+        ns[index++] = hex;
+        string+=3;
+        continue;
+      }
+      /* FALLTHROUGH */
+    default:
+      ns[index++] = in;
+      string++;
+    }
+  }
+  ns[index]=0; /* terminate it */
+  return ns;
+}
+#endif
+
+static
+UrgError _ftp(struct UrlData *data,
+              long *bytecountp,
+              char *ftpuser,
+              char *ftppasswd,
+              char *ppath)
+{
+  /* this is FTP and no proxy */
+  size_t nread;
+  UrgError result;
+  char *buf = data->buffer; /* this is our buffer */
+  /* for the ftp PORT mode */
+  int portsock=-1;
+  struct sockaddr_in serv_addr;
+
+  struct curl_slist *qitem; /* QUOTE item */
+
+  /* The first thing we do is wait for the "220*" line: */
+  nread = GetLastResponse(data->firstsocket, buf, data);
+  if(strncmp(buf, "220", 3)) {
+    failf(data, "This doesn't seem like a nice ftp-server response");
+    return URG_FTP_WEIRD_SERVER_REPLY;
+  }
+
+  /* send USER */
+  sendf(data->firstsocket, data, "USER %s\r\n", ftpuser);
+
+  /* wait for feedback */
+  nread = GetLastResponse(data->firstsocket, buf, data);
+
+  if(!strncmp(buf, "530", 3)) {
+    /* 530 User ... access denied
+       (the server denies to log the specified user) */
+    failf(data, "Access denied: %s", &buf[4]);
+    return URG_FTP_ACCESS_DENIED;
+  }
+  else if(!strncmp(buf, "331", 3)) {
+    /* 331 Password required for ...
+       (the server requires to send the user's password too) */
+    sendf(data->firstsocket, data, "PASS %s\r\n", ftppasswd);
+    nread = GetLastResponse(data->firstsocket, buf, data);
+
+    if(!strncmp(buf, "530", 3)) {
+      /* 530 Login incorrect.
+         (the username and/or the password are incorrect) */
+      failf(data, "the username and/or the password are incorrect");
+      return URG_FTP_USER_PASSWORD_INCORRECT;
+    }
+    else if(!strncmp(buf, "230", 3)) {
+      /* 230 User ... logged in.
+         (user successfully logged in) */
+        
+      infof(data, "We have successfully logged in\n");
+    }
+    else {
+      failf(data, "Odd return code after PASS");
+      return URG_FTP_WEIRD_PASS_REPLY;
+    }
+  }
+  else if(! strncmp(buf, "230", 3)) {
+    /* 230 User ... logged in.
+       (the user logged in without password) */
+    infof(data, "We have successfully logged in\n");
+  }
+  else {
+    failf(data, "Odd return code after USER");
+    return URG_FTP_WEIRD_USER_REPLY;
+  }
+
+  /* Send any QUOTE strings? */
+  if(data->quote) {
+    qitem = data->quote;
+    /* Send all QUOTE strings in same order as on command-line */
+    while (qitem) {
+      /* Send string */
+      if (qitem->data) {
+        sendf(data->firstsocket, data, "%s\r\n", qitem->data);
+
+        nread = GetLastResponse(data->firstsocket, buf, data);
+
+        if (buf[0] != '2') {
+          failf(data, "QUOT string not accepted: %s",
+                qitem->data);
+          return URG_FTP_QUOTE_ERROR;
+        }
+      }
+      qitem = qitem->next;
+    }
+  }
+
+  /* If we have selected NOBODY, it means that we only want file information.
+     Which in FTP can't be much more than the file size! */
+  if(data->conf & CONF_NOBODY) {
+    /* The SIZE command is _not_ RFC 959 specified, and therefor many servers
+       may not support it! It is however the only way we have to get a file's
+       size! */
+    int filesize;
+    sendf(data->firstsocket, data, "SIZE %s\r\n", ppath);
+
+    nread = GetLastResponse(data->firstsocket, buf, data);
+
+    if(strncmp(buf, "213", 3)) {
+      failf(data, "Couldn't get file size: %s", buf+4);
+      return URG_FTP_COULDNT_GET_SIZE;
+    }
+    /* get the size from the ascii string: */
+    filesize = atoi(buf+4);
+
+    sprintf(buf, "Content-Length: %d\n", filesize);
+
+    if(strlen(buf) != data->fwrite(buf, 1, strlen(buf), data->out)) {
+      failf (data, "Failed writing output");
+      return URG_WRITE_ERROR;
+    }
+    if(data->writeheader) {
+      /* the header is requested to be written to this file */
+      if(strlen(buf) != fwrite (buf, 1, strlen(buf), data->writeheader)) {
+        failf (data, "Failed writing output");
+        return URG_WRITE_ERROR;
+      }
+    }
+    return URG_OK;
+  }
+
+  /* We have chosen to use the PORT command */
+  if(data->conf & CONF_FTPPORT) {
+    struct sockaddr_in sa;
+    struct hostent *h=NULL;
+    size_t size;
+    unsigned short porttouse;
+
+    char *myhost=NULL;
+      
+    if(data->ftpport) {
+      myhost = if2ip(data->ftpport);
+      if(myhost) {
+        h = GetHost(data, myhost);
+      }
+      else {
+        if(strlen(data->ftpport)>1)
+          h = GetHost(data, data->ftpport);
+        if(h)
+          myhost=data->ftpport;
+      }
+    }
+    if(!myhost) {
+      myhost = getmyhost();
+      h=GetHost(data, myhost);
+    }
+    infof(data, "We connect from %s\n", myhost);
+
+    if ( h ) {
+      if( (portsock = socket(AF_INET, SOCK_STREAM, 0)) >= 0 ) {
+        memset((char *)&sa, 0, sizeof(sa));
+        memcpy((char *)&sa.sin_addr,
+               h->h_addr,
+               h->h_length);
+        sa.sin_family = AF_INET;
+        sa.sin_addr.s_addr = INADDR_ANY;
+        sa.sin_port = 0;
+        size = sizeof(sa);
+
+        if(bind(portsock, (struct sockaddr *)&sa, size) >= 0) {
+          /* we succeeded to bind */
+          struct sockaddr_in add;
+          size = sizeof(add);
+
+          if(getsockname(portsock, (struct sockaddr *) &add,
+                         (int *)&size)<0) {
+            failf(data, "getsockname() failed");
+            return URG_FTP_PORT_FAILED;
+          }
+          porttouse = ntohs(add.sin_port);
+
+          if ( listen(portsock, 1) < 0 ) {
+            failf(data, "listen(2) failed on socket");
+            return URG_FTP_PORT_FAILED;
+          }
+        }
+        else {
+          failf(data, "bind(2) failed on socket");
+          return URG_FTP_PORT_FAILED;
+        }
+      }
+      else {
+        failf(data, "socket(2) failed (%s)");
+        return URG_FTP_PORT_FAILED;
+      }
+    }
+    else {
+      failf(data, "could't find my own IP address (%s)", myhost);
+      return URG_FTP_PORT_FAILED;
+    }
+    {
+      struct in_addr in;
+      unsigned short ip[5];
+      (void) memcpy(&in.s_addr, *h->h_addr_list, sizeof (in.s_addr));
+      sscanf( inet_ntoa(in), "%hu.%hu.%hu.%hu",
+              &ip[0], &ip[1], &ip[2], &ip[3]);
+      sendf(data->firstsocket, data, "PORT %d,%d,%d,%d,%d,%d\n",
+            ip[0], ip[1], ip[2], ip[3],
+            porttouse >> 8,
+            porttouse & 255);
+    }
+
+    nread = GetLastResponse(data->firstsocket, buf, data);
+
+    if(strncmp(buf, "200", 3)) {
+      failf(data, "Server does not grok PORT, try without it!");
+      return URG_FTP_PORT_FAILED;
+    }     
+  }
+  else { /* we use the PASV command */
+
+    sendf(data->firstsocket, data, "PASV\r\n");
+
+    nread = GetLastResponse(data->firstsocket, buf, data);
+
+    if(strncmp(buf, "227", 3)) {
+      failf(data, "Odd return code after PASV");
+      return URG_FTP_WEIRD_PASV_REPLY;
+    }
+    else {
+      int ip[4];
+      int port[2];
+      unsigned short newport;
+      char newhost[32];
+      struct hostent *he;
+      char *str=buf;
+
+      /*
+       * New 227-parser June 3rd 1999.
+       * It now scans for a sequence of six comma-separated numbers and
+       * will take them as IP+port indicators.
+       *
+       * Found reply-strings include:
+       * "227 Entering Passive Mode (127,0,0,1,4,51)"
+       * "227 Data transfer will passively listen to 127,0,0,1,4,51"
+       * "227 Entering passive mode. 127,0,0,1,4,51"
+       */
+      
+      while(*str) {
+        if (6 == sscanf(str, "%d,%d,%d,%d,%d,%d",
+                        &ip[0], &ip[1], &ip[2], &ip[3],
+                        &port[0], &port[1]))
+           break;
+        str++;
+      }
+      if(!*str) {
+        failf(data, "Couldn't interpret this 227-reply: %s", buf);
+        return URG_FTP_WEIRD_227_FORMAT;
+      }
+      sprintf(newhost, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
+      he = GetHost(data, newhost);
+      if(!he) {
+        failf(data, "Can't resolve new host %s", newhost);
+        return URG_FTP_CANT_GET_HOST;
+      }
+
+       
+      newport = (port[0]<<8) + port[1];
+      data->secondarysocket = socket(AF_INET, SOCK_STREAM, 0);
+
+      memset((char *) &serv_addr, '\0', sizeof(serv_addr));
+      memcpy((char *)&(serv_addr.sin_addr), he->h_addr, he->h_length);
+      serv_addr.sin_family = he->h_addrtype;
+      serv_addr.sin_port = htons(newport);
+
+      if(data->conf & CONF_VERBOSE) {
+        struct in_addr in;
+#if 1
+        struct hostent * answer;
+
+        unsigned long address;
+#if defined(HAVE_INET_ADDR) || defined(WIN32)
+        address = inet_addr(newhost);
+        answer = gethostbyaddr((char *) &address, sizeof(address), 
+                               AF_INET);
+#else
+        answer = NULL;
+#endif
+        (void) memcpy(&in.s_addr, *he->h_addr_list, sizeof (in.s_addr));
+        infof(data, "Connecting to %s (%s) port %u\n",
+              answer?answer->h_name:newhost, inet_ntoa(in), newport);
+#else
+        (void) memcpy(&in.s_addr, *he->h_addr_list, sizeof (in.s_addr));
+        infof(data, "Connecting to %s (%s) port %u\n",
+              he->h_name, inet_ntoa(in), newport);
+#endif
+      }
+       
+      if (connect(data->secondarysocket, (struct sockaddr *) &serv_addr,
+                  sizeof(serv_addr)) < 0) {
+        switch(errno) {
+#ifdef ECONNREFUSED
+          /* this should be made nicer */
+        case ECONNREFUSED:
+          failf(data, "Connection refused by ftp server");
+          break;
+#endif
+#ifdef EINTR
+        case EINTR:
+          failf(data, "Connection timeouted to ftp server");
+          break;
+#endif
+        default:
+          failf(data, "Can't connect to ftp server");
+          break;
+        }
+        return URG_FTP_CANT_RECONNECT;
+      }
+    }
+
+  }
+  /* we have the (new) data connection ready */
+
+  if(data->conf & CONF_UPLOAD) {
+
+    /* Set type to binary (unless specified ASCII) */
+    sendf(data->firstsocket, data, "TYPE %s\r\n",
+          (data->conf&CONF_FTPASCII)?"A":"I");
+
+    nread = GetLastResponse(data->firstsocket, buf, data);
+
+    if(strncmp(buf, "200", 3)) {
+      failf(data, "Couldn't set %s mode",
+            (data->conf&CONF_FTPASCII)?"ASCII":"binary");
+      return (data->conf&CONF_FTPASCII)? URG_FTP_COULDNT_SET_ASCII:
+        URG_FTP_COULDNT_SET_BINARY;
+    }
+
+    if(data->resume_from) {
+      /* we're about to continue the uploading of a file */
+      /* 1. get already existing file's size. We use the SIZE
+         command for this which may not exist in the server!
+         The SIZE command is not in RFC959. */
+
+      /* 2. This used to set REST. But since we can do append, we
+         don't another ftp command. We just skip the source file
+         offset and then we APPEND the rest on the file instead */
+
+      /* 3. pass file-size number of bytes in the source file */
+      /* 4. lower the infilesize counter */
+      /* => transfer as usual */
+
+      if(data->resume_from < 0 ) {
+        /* we could've got a specified offset from the command line,
+           but now we know we didn't */
+
+        sendf(data->firstsocket, data, "SIZE %s\r\n", ppath);
+
+        nread = GetLastResponse(data->firstsocket, buf, data);
+
+        if(strncmp(buf, "213", 3)) {
+          failf(data, "Couldn't get file size: %s", buf+4);
+          return URG_FTP_COULDNT_GET_SIZE;
+        }
+
+        /* get the size from the ascii string: */
+        data->resume_from = atoi(buf+4);
+      }
+
+      if(data->resume_from) {
+        /* do we still game? */
+        int passed=0;
+#if 0
+        /* Set resume file transfer offset */
+        infof(data, "Instructs server to resume from offset %d\n",
+              data->resume_from);
+
+        sendf(data->firstsocket, data, "REST %d\r\n", data->resume_from);
+
+        nread = GetLastResponse(data->firstsocket, buf, data);
+
+        if(strncmp(buf, "350", 3)) {
+          failf(data, "Couldn't use REST: %s", buf+4);
+          return URG_FTP_COULDNT_USE_REST;
+        }
+#else
+        /* enable append instead */
+        data->conf |= CONF_FTPAPPEND;
+#endif
+        /* Now, let's read off the proper amount of bytes from the
+           input. If we knew it was a proper file we could've just
+           fseek()ed but we only have a stream here */
+        do {
+          int readthisamountnow = (data->resume_from - passed);
+          int actuallyread;
+
+          if(readthisamountnow > BUFSIZE)
+            readthisamountnow = BUFSIZE;
+
+          actuallyread =
+            data->fread(data->buffer, 1, readthisamountnow, data->in);
+
+          passed += actuallyread;
+          if(actuallyread != readthisamountnow) {
+            failf(data, "Could only read %d bytes from the input\n",
+                  passed);
+            return URG_FTP_COULDNT_USE_REST;
+          }
+        }
+        while(passed != data->resume_from);
+
+        /* now, decrease the size of the read */
+        if(data->infilesize>0) {
+          data->infilesize -= data->resume_from;
+
+          if(data->infilesize <= 0) {
+            infof(data, "File already completely uploaded\n");
+            return URG_OK;
+          }
+        }
+        /* we've passed, proceed as normal */
+      }
+    }
+
+    /* Send everything on data->in to the socket */
+    if(data->conf & CONF_FTPAPPEND)
+      /* we append onto the file instead of rewriting it */
+      sendf(data->firstsocket, data, "APPE %s\r\n", ppath);
+    else
+      sendf(data->firstsocket, data, "STOR %s\r\n", ppath);
+
+    nread = GetLastResponse(data->firstsocket, buf, data);
+
+    if(atoi(buf)>=400) {
+      failf(data, "Failed FTP upload:%s", buf+3);
+      /* oops, we never close the sockets! */
+      return URG_FTP_COULDNT_STOR_FILE;
+    }
+
+    if(data->conf & CONF_FTPPORT) {
+      result = AllowServerConnect(data, portsock);
+      if( result )
+        return result;
+    }
+
+    *bytecountp=0;
+
+    /* When we know we're uploading a specified file, we can get the file
+       size prior to the actual upload. */
+
+    ProgressInit(data, data->infilesize);
+    result = Upload(data, data->secondarysocket, bytecountp);
+    if(result)
+      return result;
+      
+    if((-1 != data->infilesize) && (data->infilesize != *bytecountp)) {
+      failf(data, "Wrote only partial file (%d out of %d bytes)",
+            *bytecountp, data->infilesize);
+      return URG_PARTIAL_FILE;
+    }
+  }
+  else {
+    /* Retrieve file or directory */
+    bool dirlist=FALSE;
+    long downloadsize=-1;
+
+    if(data->conf&CONF_RANGE && data->range) {
+      int from, to;
+      int totalsize=-1;
+      char *ptr;
+      char *ptr2;
+
+      from=strtol(data->range, &ptr, 0);
+      while(ptr && *ptr && (isspace((int)*ptr) || (*ptr=='-')))
+        ptr++;
+      to=strtol(ptr, &ptr2, 0);
+      if(ptr == ptr2) {
+        /* we didn't get any digit */
+        to=-1;
+      }
+      if(-1 == to) {
+        /* X - */
+        data->resume_from = from;
+      }
+      else if(from < 0) {
+        /* -Y */
+        from = 0;
+        to = -from;
+        totalsize = to-from;
+        data->maxdownload = totalsize;
+      }
+      else {
+        /* X- */
+        totalsize = to-from;
+        data->maxdownload = totalsize;
+      }
+      infof(data, "range-download from %d to %d, totally %d bytes\n",
+            from, to, totalsize);
+    }
+
+    if(!ppath[0])
+      /* make sure this becomes a valid name */
+      ppath="./";
+
+    if((data->conf & CONF_FTPLISTONLY) ||
+       ('/' == ppath[strlen(ppath)-1] )) {
+      /* The specified path ends with a slash, and therefore we think this
+         is a directory that is requested, use LIST. But before that we
+         need to set ASCII transfer mode. */
+      dirlist = TRUE;
+
+      /* Set type to ASCII */
+      sendf(data->firstsocket, data, "TYPE A\r\n");
+       
+      nread = GetLastResponse(data->firstsocket, buf, data);
+       
+      if(strncmp(buf, "200", 3)) {
+        failf(data, "Couldn't set ascii mode");
+        return URG_FTP_COULDNT_SET_ASCII;
+      }
+
+      /* if this output is to be machine-parsed, the NLST command will be
+         better used since the LIST command output is not specified or
+         standard in any way */
+
+      sendf(data->firstsocket, data, "%s %s\r\n",
+            data->customrequest?data->customrequest:
+            (data->conf&CONF_FTPLISTONLY?"NLST":"LIST"),
+            ppath);
+    }
+    else {
+      /* Set type to binary (unless specified ASCII) */
+      sendf(data->firstsocket, data, "TYPE %s\r\n",
+            (data->conf&CONF_FTPASCII)?"A":"I");
+
+      nread = GetLastResponse(data->firstsocket, buf, data);
+
+      if(strncmp(buf, "200", 3)) {
+        failf(data, "Couldn't set %s mode",
+              (data->conf&CONF_FTPASCII)?"ASCII":"binary");
+        return (data->conf&CONF_FTPASCII)? URG_FTP_COULDNT_SET_ASCII:
+          URG_FTP_COULDNT_SET_BINARY;
+      }
+
+      if(data->resume_from) {
+
+        /* Daniel: (August 4, 1999)
+         *
+         * We start with trying to use the SIZE command to figure out the size
+         * of the file we're gonna get. If we can get the size, this is by far
+         * the best way to know if we're trying to resume beyond the EOF.  */
+
+        sendf(data->firstsocket, data, "SIZE %s\r\n", ppath);
+
+        nread = GetLastResponse(data->firstsocket, buf, data);
+
+        if(strncmp(buf, "213", 3)) {
+          infof(data, "server doesn't support SIZE: %s", buf+4);
+          /* We couldn't get the size and therefore we can't know if there
+             really is a part of the file left to get, although the server
+             will just close the connection when we start the connection so it
+             won't cause us any harm, just not make us exit as nicely. */
+        }
+        else {
+          int foundsize=atoi(buf+4);
+          /* We got a file size report, so we check that there actually is a
+             part of the file left to get, or else we go home.  */
+          if(foundsize <= data->resume_from) {
+            failf(data, "Offset (%d) was beyond file size (%d)",
+                  data->resume_from, foundsize);
+            return URG_FTP_BAD_DOWNLOAD_RESUME;
+          }
+          /* Now store the number of bytes we are expected to download */
+          downloadsize = foundsize-data->resume_from;
+        }
+
+        /* Set resume file transfer offset */
+        infof(data, "Instructs server to resume from offset %d\n",
+              data->resume_from);
+
+        sendf(data->firstsocket, data, "REST %d\r\n", data->resume_from);
+
+        nread = GetLastResponse(data->firstsocket, buf, data);
+
+        if(strncmp(buf, "350", 3)) {
+          failf(data, "Couldn't use REST: %s", buf+4);
+          return URG_FTP_COULDNT_USE_REST;
+        }
+      }
+
+      sendf(data->firstsocket, data, "RETR %s\r\n", ppath);
+    }
+
+    nread = GetLastResponse(data->firstsocket, buf, data);
+
+    if(!strncmp(buf, "150", 3) || !strncmp(buf, "125", 3)) {
+
+      /*
+        A;
+        150 Opening BINARY mode data connection for /etc/passwd (2241
+        bytes).  (ok, the file is being transfered)
+       
+        B:
+        150 Opening ASCII mode data connection for /bin/ls 
+
+        C:
+        150 ASCII data connection for /bin/ls (137.167.104.91,37445) (0 bytes).
+
+        D:
+        150 Opening ASCII mode data connection for /linux/fisk/kpanelrc (0.0.0.0,0) (545 bytes).
+          
+        E:
+        125 Data connection already open; Transfer starting. */
+
+      int size=-1; /* default unknown size */
+
+      if(!dirlist && (-1 == downloadsize)) {
+        /*
+         * It seems directory listings either don't show the size or very
+         * often uses size 0 anyway.
+         * Example D above makes this parsing a little tricky
+         */
+        char *bytes;
+        bytes=strstr(buf, " bytes");
+        if(bytes--) {
+          int index=bytes-buf;
+          /* this is a hint there is size information in there! ;-) */
+          while(--index) {
+            /* scan for the parenthesis and break there */
+            if('(' == *bytes)
+              break;
+            /* if only skip digits, or else we're in deep trouble */
+            if(!isdigit((int)*bytes)) {
+              bytes=NULL;
+              break;
+            }
+            /* one more estep backwards */
+            bytes--;
+          }
+          /* only if we have nothing but digits: */
+          if(bytes++) {
+            /* get the number! */
+            size = atoi(bytes);
+          }
+            
+        }
+#if 0
+        if(2 != sscanf(buf, "%*[^(](%d bytes%c", &size, &paren))
+          size=-1;
+#endif
+      }
+      else if(downloadsize > -1)
+        size = downloadsize;
+
+#if 0
+      if((size > -1) && (data->resume_from>0)) {
+        size -= data->resume_from;
+        if(size <= 0) {
+          failf(data, "Offset (%d) was beyond file size (%d)",
+                data->resume_from, data->resume_from+size);
+          return URG_PARTIAL_FILE;
+        }
+      }
+#endif
+
+      if(data->conf & CONF_FTPPORT) {
+        result = AllowServerConnect(data, portsock);
+        if( result )
+          return result;
+      }
+
+      infof(data, "Getting file with size: %d\n", size);
+
+      /* FTP download: */
+      result=Download(data, data->secondarysocket, size, FALSE,
+                      bytecountp);
+      if(result)
+        return result;
+
+      if((-1 != size) && (size != *bytecountp)) {
+        failf(data, "Received only partial file");
+        return URG_PARTIAL_FILE;
+      }
+      else if(0 == *bytecountp) {
+        failf(data, "No data was received!");
+        return URG_FTP_COULDNT_RETR_FILE;
+      }
+    }
+    else {
+      failf(data, "%s", buf+4);
+      return URG_FTP_COULDNT_RETR_FILE;
+    }
+       
+  }
+  /* end of transfer */
+  ProgressEnd(data);
+
+  /* shut down the socket to inform the server we're done */
+  sclose(data->secondarysocket);
+  data->secondarysocket = -1;
+    
+  /* now let's see what the server says about the transfer we
+     just performed: */
+  nread = GetLastResponse(data->firstsocket, buf, data);
+
+  /* 226 Transfer complete */
+  if(strncmp(buf, "226", 3)) {
+    failf(data, "%s", buf+4);
+    return URG_FTP_WRITE_ERROR;
+  }
+
+  return URG_OK;
+}
+
+/* -- deal with the ftp server!  -- */
+
+UrgError ftp(struct UrlData *data,
+             long *bytecountp,
+             char *ftpuser,
+             char *ftppasswd,
+             char *urlpath)
+{
+  char *realpath;
+  UrgError retcode;
+
+#if 0
+  realpath = URLfix(urlpath);
+#else
+  realpath = curl_unescape(urlpath);
+#endif
+  if(realpath) {
+    retcode = _ftp(data, bytecountp, ftpuser, ftppasswd, realpath);
+    free(realpath);
+  }
+  else
+    /* then we try the original path */
+    retcode = _ftp(data, bytecountp, ftpuser, ftppasswd, urlpath);
+
+  return retcode;
+}
+
diff --git a/lib/ftp.h b/lib/ftp.h
new file mode 100644 (file)
index 0000000..b7d2659
--- /dev/null
+++ b/lib/ftp.h
@@ -0,0 +1,52 @@
+#ifndef __FTP_H
+#define __FTP_H
+
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+UrgError ftp(struct UrlData *data,
+             long *bytecountp,
+             char *ftpuser,
+             char *ftppasswd,
+             char *ppath);
+
+struct curl_slist *curl_slist_append(struct curl_slist *list, char *data);
+void curl_slist_free_all(struct curl_slist *list);
+
+#endif
diff --git a/lib/getdate.c b/lib/getdate.c
new file mode 100644 (file)
index 0000000..e3342ff
--- /dev/null
@@ -0,0 +1,2101 @@
+
+/*  A Bison parser, made from getdate.y
+ by  GNU Bison version 1.27
+  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define        tAGO    257
+#define        tDAY    258
+#define        tDAY_UNIT       259
+#define        tDAYZONE        260
+#define        tDST    261
+#define        tHOUR_UNIT      262
+#define        tID     263
+#define        tMERIDIAN       264
+#define        tMINUTE_UNIT    265
+#define        tMONTH  266
+#define        tMONTH_UNIT     267
+#define        tSEC_UNIT       268
+#define        tSNUMBER        269
+#define        tUNUMBER        270
+#define        tYEAR_UNIT      271
+#define        tZONE   272
+
+#line 1 "getdate.y"
+
+/*
+**  Originally written by Steven M. Bellovin <smb@research.att.com> while
+**  at the University of North Carolina at Chapel Hill.  Later tweaked by
+**  a couple of people on Usenet.  Completely overhauled by Rich $alz
+**  <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990.
+**
+**  This code is in the public domain and has no copyright.
+*/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+# ifdef HAVE_ALLOCA_H
+#  include <alloca.h>
+# endif
+#endif
+
+/* Since the code of getdate.y is not included in the Emacs executable
+   itself, there is no need to #define static in this file.  Even if
+   the code were included in the Emacs executable, it probably
+   wouldn't do any harm to #undef it here; this will only cause
+   problems if we try to write to a static variable, which I don't
+   think this code needs to do.  */
+#ifdef emacs
+# undef static
+#endif
+
+#include <malloc.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#if HAVE_STDLIB_H
+# include <stdlib.h> /* for `free'; used by Bison 1.27 */
+#endif
+
+#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
+# define IN_CTYPE_DOMAIN(c) 1
+#else
+# define IN_CTYPE_DOMAIN(c) isascii(c)
+#endif
+
+#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))
+#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c))
+#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))
+#define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))
+
+/* ISDIGIT differs from ISDIGIT_LOCALE, as follows:
+   - Its arg may be any int or unsigned int; it need not be an unsigned char.
+   - It's guaranteed to evaluate its argument exactly once.
+   - It's typically faster.
+   Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
+   only '0' through '9' are digits.  Prefer ISDIGIT to ISDIGIT_LOCALE unless
+   it's important to use the locale's definition of `digit' even when the
+   host does not conform to Posix.  */
+#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
+
+#if defined (STDC_HEADERS) || defined (USG)
+# include <string.h>
+#endif
+
+#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __attribute__(x)
+#endif
+
+#ifndef ATTRIBUTE_UNUSED
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif
+
+/* Some old versions of bison generate parsers that use bcopy.
+   That loses on systems that don't provide the function, so we have
+   to redefine it here.  */
+#if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy)
+# define bcopy(from, to, len) memcpy ((to), (from), (len))
+#endif
+
+/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
+   as well as gratuitiously global symbol names, so we can have multiple
+   yacc generated parsers in the same program.  Note that these are only
+   the variables produced by yacc.  If other parser generators (bison,
+   byacc, etc) produce additional global names that conflict at link time,
+   then those parser generators need to be fixed instead of adding those
+   names to this list. */
+
+#define yymaxdepth gd_maxdepth
+#define yyparse gd_parse
+#define yylex   gd_lex
+#define yyerror gd_error
+#define yylval  gd_lval
+#define yychar  gd_char
+#define yydebug gd_debug
+#define yypact  gd_pact
+#define yyr1    gd_r1
+#define yyr2    gd_r2
+#define yydef   gd_def
+#define yychk   gd_chk
+#define yypgo   gd_pgo
+#define yyact   gd_act
+#define yyexca  gd_exca
+#define yyerrflag gd_errflag
+#define yynerrs gd_nerrs
+#define yyps    gd_ps
+#define yypv    gd_pv
+#define yys     gd_s
+#define yy_yys  gd_yys
+#define yystate gd_state
+#define yytmp   gd_tmp
+#define yyv     gd_v
+#define yy_yyv  gd_yyv
+#define yyval   gd_val
+#define yylloc  gd_lloc
+#define yyreds  gd_reds          /* With YYDEBUG defined */
+#define yytoks  gd_toks          /* With YYDEBUG defined */
+#define yylhs   gd_yylhs
+#define yylen   gd_yylen
+#define yydefred gd_yydefred
+#define yydgoto gd_yydgoto
+#define yysindex gd_yysindex
+#define yyrindex gd_yyrindex
+#define yygindex gd_yygindex
+#define yytable  gd_yytable
+#define yycheck  gd_yycheck
+
+static int yylex ();
+static int yyerror ();
+
+#define EPOCH          1970
+#define HOUR(x)                ((x) * 60)
+
+#define MAX_BUFF_LEN    128   /* size of buffer to read the date into */
+
+/*
+**  An entry in the lexical lookup table.
+*/
+typedef struct _TABLE {
+    const char *name;
+    int                type;
+    int                value;
+} TABLE;
+
+
+/*
+**  Meridian:  am, pm, or 24-hour style.
+*/
+typedef enum _MERIDIAN {
+    MERam, MERpm, MER24
+} MERIDIAN;
+
+
+/*
+**  Global variables.  We could get rid of most of these by using a good
+**  union as the yacc stack.  (This routine was originally written before
+**  yacc had the %union construct.)  Maybe someday; right now we only use
+**  the %union very rarely.
+*/
+static const char      *yyInput;
+static int     yyDayOrdinal;
+static int     yyDayNumber;
+static int     yyHaveDate;
+static int     yyHaveDay;
+static int     yyHaveRel;
+static int     yyHaveTime;
+static int     yyHaveZone;
+static int     yyTimezone;
+static int     yyDay;
+static int     yyHour;
+static int     yyMinutes;
+static int     yyMonth;
+static int     yySeconds;
+static int     yyYear;
+static MERIDIAN        yyMeridian;
+static int     yyRelDay;
+static int     yyRelHour;
+static int     yyRelMinutes;
+static int     yyRelMonth;
+static int     yyRelSeconds;
+static int     yyRelYear;
+
+
+#line 184 "getdate.y"
+typedef union {
+    int                        Number;
+    enum _MERIDIAN     Meridian;
+} YYSTYPE;
+#include <stdio.h>
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#ifndef const
+#define const
+#endif
+#endif
+#endif
+
+
+
+#define        YYFINAL         61
+#define        YYFLAG          -32768
+#define        YYNTBASE        22
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 272 ? yytranslate[x] : 32)
+
+static const char yytranslate[] = {     0,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,    20,     2,     2,    21,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,    19,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     1,     3,     4,     5,     6,
+     7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+    17,    18
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = {     0,
+     0,     1,     4,     6,     8,    10,    12,    14,    16,    19,
+    24,    29,    36,    43,    45,    47,    50,    52,    55,    58,
+    62,    68,    72,    76,    79,    84,    87,    91,    94,    96,
+    99,   102,   104,   107,   110,   112,   115,   118,   120,   123,
+   126,   128,   131,   134,   136,   139,   142,   144,   146,   147
+};
+
+static const short yyrhs[] = {    -1,
+    22,    23,     0,    24,     0,    25,     0,    27,     0,    26,
+     0,    28,     0,    30,     0,    16,    10,     0,    16,    19,
+    16,    31,     0,    16,    19,    16,    15,     0,    16,    19,
+    16,    19,    16,    31,     0,    16,    19,    16,    19,    16,
+    15,     0,    18,     0,     6,     0,    18,     7,     0,     4,
+     0,     4,    20,     0,    16,     4,     0,    16,    21,    16,
+     0,    16,    21,    16,    21,    16,     0,    16,    15,    15,
+     0,    16,    12,    15,     0,    12,    16,     0,    12,    16,
+    20,    16,     0,    16,    12,     0,    16,    12,    16,     0,
+    29,     3,     0,    29,     0,    16,    17,     0,    15,    17,
+     0,    17,     0,    16,    13,     0,    15,    13,     0,    13,
+     0,    16,     5,     0,    15,     5,     0,     5,     0,    16,
+     8,     0,    15,     8,     0,     8,     0,    16,    11,     0,
+    15,    11,     0,    11,     0,    16,    14,     0,    15,    14,
+     0,    14,     0,    16,     0,     0,    10,     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+   200,   201,   204,   207,   210,   213,   216,   219,   222,   228,
+   234,   243,   249,   261,   264,   267,   273,   277,   281,   287,
+   291,   309,   315,   321,   325,   330,   334,   341,   349,   352,
+   355,   358,   361,   364,   367,   370,   373,   376,   379,   382,
+   385,   388,   391,   394,   397,   400,   403,   408,   441,   445
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = {   "$","error","$undefined.","tAGO","tDAY",
+"tDAY_UNIT","tDAYZONE","tDST","tHOUR_UNIT","tID","tMERIDIAN","tMINUTE_UNIT",
+"tMONTH","tMONTH_UNIT","tSEC_UNIT","tSNUMBER","tUNUMBER","tYEAR_UNIT","tZONE",
+"':'","','","'/'","spec","item","time","zone","day","date","rel","relunit","number",
+"o_merid", NULL
+};
+#endif
+
+static const short yyr1[] = {     0,
+    22,    22,    23,    23,    23,    23,    23,    23,    24,    24,
+    24,    24,    24,    25,    25,    25,    26,    26,    26,    27,
+    27,    27,    27,    27,    27,    27,    27,    28,    28,    29,
+    29,    29,    29,    29,    29,    29,    29,    29,    29,    29,
+    29,    29,    29,    29,    29,    29,    29,    30,    31,    31
+};
+
+static const short yyr2[] = {     0,
+     0,     2,     1,     1,     1,     1,     1,     1,     2,     4,
+     4,     6,     6,     1,     1,     2,     1,     2,     2,     3,
+     5,     3,     3,     2,     4,     2,     3,     2,     1,     2,
+     2,     1,     2,     2,     1,     2,     2,     1,     2,     2,
+     1,     2,     2,     1,     2,     2,     1,     1,     0,     1
+};
+
+static const short yydefact[] = {     1,
+     0,    17,    38,    15,    41,    44,     0,    35,    47,     0,
+    48,    32,    14,     2,     3,     4,     6,     5,     7,    29,
+     8,    18,    24,    37,    40,    43,    34,    46,    31,    19,
+    36,    39,     9,    42,    26,    33,    45,     0,    30,     0,
+     0,    16,    28,     0,    23,    27,    22,    49,    20,    25,
+    50,    11,     0,    10,     0,    49,    21,    13,    12,     0,
+     0
+};
+
+static const short yydefgoto[] = {     1,
+    14,    15,    16,    17,    18,    19,    20,    21,    54
+};
+
+static const short yypact[] = {-32768,
+     0,   -19,-32768,-32768,-32768,-32768,   -13,-32768,-32768,    30,
+    15,-32768,    14,-32768,-32768,-32768,-32768,-32768,-32768,    19,
+-32768,-32768,     4,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,    -6,-32768,-32768,    16,-32768,    17,
+    23,-32768,-32768,    24,-32768,-32768,-32768,    27,    28,-32768,
+-32768,-32768,    29,-32768,    32,    -8,-32768,-32768,-32768,    50,
+-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,    -5
+};
+
+
+#define        YYLAST          51
+
+
+static const short yytable[] = {    60,
+    22,    51,    23,     2,     3,     4,    58,     5,    45,    46,
+     6,     7,     8,     9,    10,    11,    12,    13,    30,    31,
+    42,    43,    32,    44,    33,    34,    35,    36,    37,    38,
+    47,    39,    48,    40,    24,    41,    51,    25,    49,    50,
+    26,    52,    27,    28,    56,    53,    29,    57,    55,    61,
+    59
+};
+
+static const short yycheck[] = {     0,
+    20,    10,    16,     4,     5,     6,    15,     8,    15,    16,
+    11,    12,    13,    14,    15,    16,    17,    18,     4,     5,
+     7,     3,     8,    20,    10,    11,    12,    13,    14,    15,
+    15,    17,    16,    19,     5,    21,    10,     8,    16,    16,
+    11,    15,    13,    14,    16,    19,    17,    16,    21,     0,
+    56
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/boot/apps/GeekGadgets/share/bison.simple"
+/* This file comes from bison-1.27.  */
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+#ifndef YYSTACK_USE_ALLOCA
+#ifdef alloca
+#define YYSTACK_USE_ALLOCA
+#else /* alloca not defined */
+#ifdef __GNUC__
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
+#define YYSTACK_USE_ALLOCA
+#include <alloca.h>
+#else /* not sparc */
+/* We think this test detects Watcom and Microsoft C.  */
+/* This used to test MSDOS, but that is a bad idea
+   since that symbol is in the user namespace.  */
+#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
+#if 0 /* No need for malloc.h, which pollutes the namespace;
+        instead, just don't use alloca.  */
+#include <malloc.h>
+#endif
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+/* I don't know what this was needed for, but it pollutes the namespace.
+   So I turned it off.   rms, 2 May 1997.  */
+/* #include <malloc.h>  */
+ #pragma alloca
+#define YYSTACK_USE_ALLOCA
+#else /* not MSDOS, or __TURBOC__, or _AIX */
+#if 0
+#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
+                and on HPUX 10.  Eventually we can turn this on.  */
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#endif /* __hpux */
+#endif
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc */
+#endif /* not GNU C */
+#endif /* alloca not defined */
+#endif /* YYSTACK_USE_ALLOCA not defined */
+
+#ifdef YYSTACK_USE_ALLOCA
+#define YYSTACK_ALLOC alloca
+#else
+#define YYSTACK_ALLOC malloc
+#endif
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT        goto yyabortlab
+#define YYERROR                goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL         goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    { yychar = (token), yylval = (value);                      \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    { yyerror ("syntax error: cannot back up"); YYERROR; }     \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+#ifndef YYPURE
+#define YYLEX          yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX          yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX          yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX          yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX          yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int    yychar;                 /*  the lookahead symbol                */
+YYSTYPE        yylval;                 /*  the semantic value of the           */
+                               /*  lookahead symbol                    */
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;                        /*  location data for the lookahead     */
+                               /*  symbol                              */
+#endif
+
+int yynerrs;                   /*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug;                   /*  nonzero means print parse trace     */
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks      */
+
+#ifndef        YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+\f
+/* Define __yy_memcpy.  Note that the size argument
+   should be passed with type unsigned int, because that is what the non-GCC
+   definitions require.  With GCC, __builtin_memcpy takes an arg
+   of type size_t, but it can handle unsigned int.  */
+
+#if __GNUC__ > 1               /* GNU C and GNU C++ define this.  */
+#define __yy_memcpy(TO,FROM,COUNT)     __builtin_memcpy(TO,FROM,COUNT)
+#else                          /* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (to, from, count)
+     char *to;
+     char *from;
+     unsigned int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (char *to, char *from, unsigned int count)
+{
+  register char *t = to;
+  register char *f = from;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+\f
+#line 216 "/boot/apps/GeekGadgets/share/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+#ifdef YYPARSE_PARAM
+int yyparse (void *);
+#else
+int yyparse (void);
+#endif
+#endif
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;     /*  number of tokens to shift before error messages enabled */
+  int yychar1 = 0;             /*  lookahead token as an internal (translated) token number */
+
+  short        yyssa[YYINITDEPTH];     /*  the state stack                     */
+  YYSTYPE yyvsa[YYINITDEPTH];  /*  the semantic value stack            */
+
+  short *yyss = yyssa;         /*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;       /*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylsa[YYINITDEPTH];  /*  the location stack                  */
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+
+#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+  int yyfree_stacks = 0;
+
+#ifdef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;               /*  the variable used to return         */
+                               /*  semantic values from the action     */
+                               /*  routines                            */
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+        the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+        but that might be undefined if yyoverflow is a macro.  */
+      yyoverflow("parser stack overflow",
+                &yyss1, size * sizeof (*yyssp),
+                &yyvs1, size * sizeof (*yyvsp),
+                &yyls1, size * sizeof (*yylsp),
+                &yystacksize);
+#else
+      yyoverflow("parser stack overflow",
+                &yyss1, size * sizeof (*yyssp),
+                &yyvs1, size * sizeof (*yyvsp),
+                &yystacksize);
+#endif
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       {
+         yyerror("parser stack overflow");
+         if (yyfree_stacks)
+           {
+             free (yyss);
+             free (yyvs);
+#ifdef YYLSP_NEEDED
+             free (yyls);
+#endif
+           }
+         return 2;
+       }
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+#ifndef YYSTACK_USE_ALLOCA
+      yyfree_stacks = 1;
+#endif
+      yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
+      __yy_memcpy ((char *)yyss, (char *)yyss1,
+                  size * (unsigned int) sizeof (*yyssp));
+      yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
+      __yy_memcpy ((char *)yyvs, (char *)yyvs1,
+                  size * (unsigned int) sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
+      __yy_memcpy ((char *)yyls, (char *)yyls1,
+                  size * (unsigned int) sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+  goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)             /* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+       {
+         fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+         /* Give the individual parser a way to print the precise meaning
+            of a token, for further debugging info.  */
+#ifdef YYPRINT
+         YYPRINT (stderr, yychar, yylval);
+#endif
+         fprintf (stderr, ")\n");
+       }
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  if (yylen > 0)
+    yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+              yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+       fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 3:
+#line 204 "getdate.y"
+{
+           yyHaveTime++;
+       ;
+    break;}
+case 4:
+#line 207 "getdate.y"
+{
+           yyHaveZone++;
+       ;
+    break;}
+case 5:
+#line 210 "getdate.y"
+{
+           yyHaveDate++;
+       ;
+    break;}
+case 6:
+#line 213 "getdate.y"
+{
+           yyHaveDay++;
+       ;
+    break;}
+case 7:
+#line 216 "getdate.y"
+{
+           yyHaveRel++;
+       ;
+    break;}
+case 9:
+#line 222 "getdate.y"
+{
+           yyHour = yyvsp[-1].Number;
+           yyMinutes = 0;
+           yySeconds = 0;
+           yyMeridian = yyvsp[0].Meridian;
+       ;
+    break;}
+case 10:
+#line 228 "getdate.y"
+{
+           yyHour = yyvsp[-3].Number;
+           yyMinutes = yyvsp[-1].Number;
+           yySeconds = 0;
+           yyMeridian = yyvsp[0].Meridian;
+       ;
+    break;}
+case 11:
+#line 234 "getdate.y"
+{
+           yyHour = yyvsp[-3].Number;
+           yyMinutes = yyvsp[-1].Number;
+           yyMeridian = MER24;
+           yyHaveZone++;
+           yyTimezone = (yyvsp[0].Number < 0
+                         ? -yyvsp[0].Number % 100 + (-yyvsp[0].Number / 100) * 60
+                         : - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60));
+       ;
+    break;}
+case 12:
+#line 243 "getdate.y"
+{
+           yyHour = yyvsp[-5].Number;
+           yyMinutes = yyvsp[-3].Number;
+           yySeconds = yyvsp[-1].Number;
+           yyMeridian = yyvsp[0].Meridian;
+       ;
+    break;}
+case 13:
+#line 249 "getdate.y"
+{
+           yyHour = yyvsp[-5].Number;
+           yyMinutes = yyvsp[-3].Number;
+           yySeconds = yyvsp[-1].Number;
+           yyMeridian = MER24;
+           yyHaveZone++;
+           yyTimezone = (yyvsp[0].Number < 0
+                         ? -yyvsp[0].Number % 100 + (-yyvsp[0].Number / 100) * 60
+                         : - (yyvsp[0].Number % 100 + (yyvsp[0].Number / 100) * 60));
+       ;
+    break;}
+case 14:
+#line 261 "getdate.y"
+{
+           yyTimezone = yyvsp[0].Number;
+       ;
+    break;}
+case 15:
+#line 264 "getdate.y"
+{
+           yyTimezone = yyvsp[0].Number - 60;
+       ;
+    break;}
+case 16:
+#line 268 "getdate.y"
+{
+           yyTimezone = yyvsp[-1].Number - 60;
+       ;
+    break;}
+case 17:
+#line 273 "getdate.y"
+{
+           yyDayOrdinal = 1;
+           yyDayNumber = yyvsp[0].Number;
+       ;
+    break;}
+case 18:
+#line 277 "getdate.y"
+{
+           yyDayOrdinal = 1;
+           yyDayNumber = yyvsp[-1].Number;
+       ;
+    break;}
+case 19:
+#line 281 "getdate.y"
+{
+           yyDayOrdinal = yyvsp[-1].Number;
+           yyDayNumber = yyvsp[0].Number;
+       ;
+    break;}
+case 20:
+#line 287 "getdate.y"
+{
+           yyMonth = yyvsp[-2].Number;
+           yyDay = yyvsp[0].Number;
+       ;
+    break;}
+case 21:
+#line 291 "getdate.y"
+{
+         /* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY.
+            The goal in recognizing YYYY/MM/DD is solely to support legacy
+            machine-generated dates like those in an RCS log listing.  If
+            you want portability, use the ISO 8601 format.  */
+         if (yyvsp[-4].Number >= 1000)
+           {
+             yyYear = yyvsp[-4].Number;
+             yyMonth = yyvsp[-2].Number;
+             yyDay = yyvsp[0].Number;
+           }
+         else
+           {
+             yyMonth = yyvsp[-4].Number;
+             yyDay = yyvsp[-2].Number;
+             yyYear = yyvsp[0].Number;
+           }
+       ;
+    break;}
+case 22:
+#line 309 "getdate.y"
+{
+           /* ISO 8601 format.  yyyy-mm-dd.  */
+           yyYear = yyvsp[-2].Number;
+           yyMonth = -yyvsp[-1].Number;
+           yyDay = -yyvsp[0].Number;
+       ;
+    break;}
+case 23:
+#line 315 "getdate.y"
+{
+           /* e.g. 17-JUN-1992.  */
+           yyDay = yyvsp[-2].Number;
+           yyMonth = yyvsp[-1].Number;
+           yyYear = -yyvsp[0].Number;
+       ;
+    break;}
+case 24:
+#line 321 "getdate.y"
+{
+           yyMonth = yyvsp[-1].Number;
+           yyDay = yyvsp[0].Number;
+       ;
+    break;}
+case 25:
+#line 325 "getdate.y"
+{
+           yyMonth = yyvsp[-3].Number;
+           yyDay = yyvsp[-2].Number;
+           yyYear = yyvsp[0].Number;
+       ;
+    break;}
+case 26:
+#line 330 "getdate.y"
+{
+           yyMonth = yyvsp[0].Number;
+           yyDay = yyvsp[-1].Number;
+       ;
+    break;}
+case 27:
+#line 334 "getdate.y"
+{
+           yyMonth = yyvsp[-1].Number;
+           yyDay = yyvsp[-2].Number;
+           yyYear = yyvsp[0].Number;
+       ;
+    break;}
+case 28:
+#line 341 "getdate.y"
+{
+           yyRelSeconds = -yyRelSeconds;
+           yyRelMinutes = -yyRelMinutes;
+           yyRelHour = -yyRelHour;
+           yyRelDay = -yyRelDay;
+           yyRelMonth = -yyRelMonth;
+           yyRelYear = -yyRelYear;
+       ;
+    break;}
+case 30:
+#line 352 "getdate.y"
+{
+           yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 31:
+#line 355 "getdate.y"
+{
+           yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 32:
+#line 358 "getdate.y"
+{
+           yyRelYear += yyvsp[0].Number;
+       ;
+    break;}
+case 33:
+#line 361 "getdate.y"
+{
+           yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 34:
+#line 364 "getdate.y"
+{
+           yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 35:
+#line 367 "getdate.y"
+{
+           yyRelMonth += yyvsp[0].Number;
+       ;
+    break;}
+case 36:
+#line 370 "getdate.y"
+{
+           yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 37:
+#line 373 "getdate.y"
+{
+           yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 38:
+#line 376 "getdate.y"
+{
+           yyRelDay += yyvsp[0].Number;
+       ;
+    break;}
+case 39:
+#line 379 "getdate.y"
+{
+           yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 40:
+#line 382 "getdate.y"
+{
+           yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 41:
+#line 385 "getdate.y"
+{
+           yyRelHour += yyvsp[0].Number;
+       ;
+    break;}
+case 42:
+#line 388 "getdate.y"
+{
+           yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 43:
+#line 391 "getdate.y"
+{
+           yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 44:
+#line 394 "getdate.y"
+{
+           yyRelMinutes += yyvsp[0].Number;
+       ;
+    break;}
+case 45:
+#line 397 "getdate.y"
+{
+           yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 46:
+#line 400 "getdate.y"
+{
+           yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;
+       ;
+    break;}
+case 47:
+#line 403 "getdate.y"
+{
+           yyRelSeconds += yyvsp[0].Number;
+       ;
+    break;}
+case 48:
+#line 409 "getdate.y"
+{
+           if (yyHaveTime && yyHaveDate && !yyHaveRel)
+             yyYear = yyvsp[0].Number;
+           else
+             {
+               if (yyvsp[0].Number>10000)
+                 {
+                   yyHaveDate++;
+                   yyDay= (yyvsp[0].Number)%100;
+                   yyMonth= (yyvsp[0].Number/100)%100;
+                   yyYear = yyvsp[0].Number/10000;
+                 }
+               else
+                 {
+                   yyHaveTime++;
+                   if (yyvsp[0].Number < 100)
+                     {
+                       yyHour = yyvsp[0].Number;
+                       yyMinutes = 0;
+                     }
+                   else
+                     {
+                       yyHour = yyvsp[0].Number / 100;
+                       yyMinutes = yyvsp[0].Number % 100;
+                     }
+                   yySeconds = 0;
+                   yyMeridian = MER24;
+                 }
+             }
+         ;
+    break;}
+case 49:
+#line 442 "getdate.y"
+{
+           yyval.Meridian = MER24;
+         ;
+    break;}
+case 50:
+#line 446 "getdate.y"
+{
+           yyval.Meridian = yyvsp[0].Meridian;
+         ;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 542 "/boot/apps/GeekGadgets/share/bison.simple"
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+       fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+       {
+         int size = 0;
+         char *msg;
+         int x, count;
+
+         count = 0;
+         /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
+         for (x = (yyn < 0 ? -yyn : 0);
+              x < (sizeof(yytname) / sizeof(char *)); x++)
+           if (yycheck[x + yyn] == x)
+             size += strlen(yytname[x]) + 15, count++;
+         msg = (char *) malloc(size + 15);
+         if (msg != 0)
+           {
+             strcpy(msg, "parse error");
+
+             if (count < 5)
+               {
+                 count = 0;
+                 for (x = (yyn < 0 ? -yyn : 0);
+                      x < (sizeof(yytname) / sizeof(char *)); x++)
+                   if (yycheck[x + yyn] == x)
+                     {
+                       strcat(msg, count == 0 ? ", expecting `" : " or `");
+                       strcat(msg, yytname[x]);
+                       strcat(msg, "'");
+                       count++;
+                     }
+               }
+             yyerror(msg);
+             free(msg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exceeded");
+       }
+      else
+#endif /* YYERROR_VERBOSE */
+       yyerror("parse error");
+    }
+
+  goto yyerrlab1;
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+       YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;             /* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+       fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+
+ yyacceptlab:
+  /* YYACCEPT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 0;
+
+ yyabortlab:
+  /* YYABORT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 1;
+}
+#line 451 "getdate.y"
+
+
+/* Include this file down here because bison inserts code above which
+   may define-away `const'.  We want the prototype for get_date to have
+   the same signature as the function definition does. */
+#include "getdate.h"
+
+extern struct tm       *gmtime ();
+extern struct tm       *localtime ();
+extern time_t          mktime ();
+
+/* Month and day table. */
+static TABLE const MonthDayTable[] = {
+    { "january",       tMONTH,  1 },
+    { "february",      tMONTH,  2 },
+    { "march",         tMONTH,  3 },
+    { "april",         tMONTH,  4 },
+    { "may",           tMONTH,  5 },
+    { "june",          tMONTH,  6 },
+    { "july",          tMONTH,  7 },
+    { "august",                tMONTH,  8 },
+    { "september",     tMONTH,  9 },
+    { "sept",          tMONTH,  9 },
+    { "october",       tMONTH, 10 },
+    { "november",      tMONTH, 11 },
+    { "december",      tMONTH, 12 },
+    { "sunday",                tDAY, 0 },
+    { "monday",                tDAY, 1 },
+    { "tuesday",       tDAY, 2 },
+    { "tues",          tDAY, 2 },
+    { "wednesday",     tDAY, 3 },
+    { "wednes",                tDAY, 3 },
+    { "thursday",      tDAY, 4 },
+    { "thur",          tDAY, 4 },
+    { "thurs",         tDAY, 4 },
+    { "friday",                tDAY, 5 },
+    { "saturday",      tDAY, 6 },
+    { NULL, 0, 0 }
+};
+
+/* Time units table. */
+static TABLE const UnitsTable[] = {
+    { "year",          tYEAR_UNIT,     1 },
+    { "month",         tMONTH_UNIT,    1 },
+    { "fortnight",     tDAY_UNIT,      14 },
+    { "week",          tDAY_UNIT,      7 },
+    { "day",           tDAY_UNIT,      1 },
+    { "hour",          tHOUR_UNIT,     1 },
+    { "minute",                tMINUTE_UNIT,   1 },
+    { "min",           tMINUTE_UNIT,   1 },
+    { "second",                tSEC_UNIT,      1 },
+    { "sec",           tSEC_UNIT,      1 },
+    { NULL, 0, 0 }
+};
+
+/* Assorted relative-time words. */
+static TABLE const OtherTable[] = {
+    { "tomorrow",      tMINUTE_UNIT,   1 * 24 * 60 },
+    { "yesterday",     tMINUTE_UNIT,   -1 * 24 * 60 },
+    { "today",         tMINUTE_UNIT,   0 },
+    { "now",           tMINUTE_UNIT,   0 },
+    { "last",          tUNUMBER,       -1 },
+    { "this",          tMINUTE_UNIT,   0 },
+    { "next",          tUNUMBER,       1 },
+    { "first",         tUNUMBER,       1 },
+/*  { "second",                tUNUMBER,       2 }, */
+    { "third",         tUNUMBER,       3 },
+    { "fourth",                tUNUMBER,       4 },
+    { "fifth",         tUNUMBER,       5 },
+    { "sixth",         tUNUMBER,       6 },
+    { "seventh",       tUNUMBER,       7 },
+    { "eighth",                tUNUMBER,       8 },
+    { "ninth",         tUNUMBER,       9 },
+    { "tenth",         tUNUMBER,       10 },
+    { "eleventh",      tUNUMBER,       11 },
+    { "twelfth",       tUNUMBER,       12 },
+    { "ago",           tAGO,   1 },
+    { NULL, 0, 0 }
+};
+
+/* The timezone table. */
+static TABLE const TimezoneTable[] = {
+    { "gmt",   tZONE,     HOUR ( 0) }, /* Greenwich Mean */
+    { "ut",    tZONE,     HOUR ( 0) }, /* Universal (Coordinated) */
+    { "utc",   tZONE,     HOUR ( 0) },
+    { "wet",   tZONE,     HOUR ( 0) }, /* Western European */
+    { "bst",   tDAYZONE,  HOUR ( 0) }, /* British Summer */
+    { "wat",   tZONE,     HOUR ( 1) }, /* West Africa */
+    { "at",    tZONE,     HOUR ( 2) }, /* Azores */
+#if    0
+    /* For completeness.  BST is also British Summer, and GST is
+     * also Guam Standard. */
+    { "bst",   tZONE,     HOUR ( 3) }, /* Brazil Standard */
+    { "gst",   tZONE,     HOUR ( 3) }, /* Greenland Standard */
+#endif
+#if 0
+    { "nft",   tZONE,     HOUR (3.5) },        /* Newfoundland */
+    { "nst",   tZONE,     HOUR (3.5) },        /* Newfoundland Standard */
+    { "ndt",   tDAYZONE,  HOUR (3.5) },        /* Newfoundland Daylight */
+#endif
+    { "ast",   tZONE,     HOUR ( 4) }, /* Atlantic Standard */
+    { "adt",   tDAYZONE,  HOUR ( 4) }, /* Atlantic Daylight */
+    { "est",   tZONE,     HOUR ( 5) }, /* Eastern Standard */
+    { "edt",   tDAYZONE,  HOUR ( 5) }, /* Eastern Daylight */
+    { "cst",   tZONE,     HOUR ( 6) }, /* Central Standard */
+    { "cdt",   tDAYZONE,  HOUR ( 6) }, /* Central Daylight */
+    { "mst",   tZONE,     HOUR ( 7) }, /* Mountain Standard */
+    { "mdt",   tDAYZONE,  HOUR ( 7) }, /* Mountain Daylight */
+    { "pst",   tZONE,     HOUR ( 8) }, /* Pacific Standard */
+    { "pdt",   tDAYZONE,  HOUR ( 8) }, /* Pacific Daylight */
+    { "yst",   tZONE,     HOUR ( 9) }, /* Yukon Standard */
+    { "ydt",   tDAYZONE,  HOUR ( 9) }, /* Yukon Daylight */
+    { "hst",   tZONE,     HOUR (10) }, /* Hawaii Standard */
+    { "hdt",   tDAYZONE,  HOUR (10) }, /* Hawaii Daylight */
+    { "cat",   tZONE,     HOUR (10) }, /* Central Alaska */
+    { "ahst",  tZONE,     HOUR (10) }, /* Alaska-Hawaii Standard */
+    { "nt",    tZONE,     HOUR (11) }, /* Nome */
+    { "idlw",  tZONE,     HOUR (12) }, /* International Date Line West */
+    { "cet",   tZONE,     -HOUR (1) }, /* Central European */
+    { "met",   tZONE,     -HOUR (1) }, /* Middle European */
+    { "mewt",  tZONE,     -HOUR (1) }, /* Middle European Winter */
+    { "mest",  tDAYZONE,  -HOUR (1) }, /* Middle European Summer */
+    { "mesz",  tDAYZONE,  -HOUR (1) }, /* Middle European Summer */
+    { "swt",   tZONE,     -HOUR (1) }, /* Swedish Winter */
+    { "sst",   tDAYZONE,  -HOUR (1) }, /* Swedish Summer */
+    { "fwt",   tZONE,     -HOUR (1) }, /* French Winter */
+    { "fst",   tDAYZONE,  -HOUR (1) }, /* French Summer */
+    { "eet",   tZONE,     -HOUR (2) }, /* Eastern Europe, USSR Zone 1 */
+    { "bt",    tZONE,     -HOUR (3) }, /* Baghdad, USSR Zone 2 */
+#if 0
+    { "it",    tZONE,     -HOUR (3.5) },/* Iran */
+#endif
+    { "zp4",   tZONE,     -HOUR (4) }, /* USSR Zone 3 */
+    { "zp5",   tZONE,     -HOUR (5) }, /* USSR Zone 4 */
+#if 0
+    { "ist",   tZONE,     -HOUR (5.5) },/* Indian Standard */
+#endif
+    { "zp6",   tZONE,     -HOUR (6) }, /* USSR Zone 5 */
+#if    0
+    /* For completeness.  NST is also Newfoundland Standard, and SST is
+     * also Swedish Summer. */
+    { "nst",   tZONE,     -HOUR (6.5) },/* North Sumatra */
+    { "sst",   tZONE,     -HOUR (7) }, /* South Sumatra, USSR Zone 6 */
+#endif /* 0 */
+    { "wast",  tZONE,     -HOUR (7) }, /* West Australian Standard */
+    { "wadt",  tDAYZONE,  -HOUR (7) }, /* West Australian Daylight */
+#if 0
+    { "jt",    tZONE,     -HOUR (7.5) },/* Java (3pm in Cronusland!) */
+#endif
+    { "cct",   tZONE,     -HOUR (8) }, /* China Coast, USSR Zone 7 */
+    { "jst",   tZONE,     -HOUR (9) }, /* Japan Standard, USSR Zone 8 */
+#if 0
+    { "cast",  tZONE,     -HOUR (9.5) },/* Central Australian Standard */
+    { "cadt",  tDAYZONE,  -HOUR (9.5) },/* Central Australian Daylight */
+#endif
+    { "east",  tZONE,     -HOUR (10) },        /* Eastern Australian Standard */
+    { "eadt",  tDAYZONE,  -HOUR (10) },        /* Eastern Australian Daylight */
+    { "gst",   tZONE,     -HOUR (10) },        /* Guam Standard, USSR Zone 9 */
+    { "nzt",   tZONE,     -HOUR (12) },        /* New Zealand */
+    { "nzst",  tZONE,     -HOUR (12) },        /* New Zealand Standard */
+    { "nzdt",  tDAYZONE,  -HOUR (12) },        /* New Zealand Daylight */
+    { "idle",  tZONE,     -HOUR (12) },        /* International Date Line East */
+    {  NULL, 0, 0  }
+};
+
+/* Military timezone table. */
+static TABLE const MilitaryTable[] = {
+    { "a",     tZONE,  HOUR (  1) },
+    { "b",     tZONE,  HOUR (  2) },
+    { "c",     tZONE,  HOUR (  3) },
+    { "d",     tZONE,  HOUR (  4) },
+    { "e",     tZONE,  HOUR (  5) },
+    { "f",     tZONE,  HOUR (  6) },
+    { "g",     tZONE,  HOUR (  7) },
+    { "h",     tZONE,  HOUR (  8) },
+    { "i",     tZONE,  HOUR (  9) },
+    { "k",     tZONE,  HOUR ( 10) },
+    { "l",     tZONE,  HOUR ( 11) },
+    { "m",     tZONE,  HOUR ( 12) },
+    { "n",     tZONE,  HOUR (- 1) },
+    { "o",     tZONE,  HOUR (- 2) },
+    { "p",     tZONE,  HOUR (- 3) },
+    { "q",     tZONE,  HOUR (- 4) },
+    { "r",     tZONE,  HOUR (- 5) },
+    { "s",     tZONE,  HOUR (- 6) },
+    { "t",     tZONE,  HOUR (- 7) },
+    { "u",     tZONE,  HOUR (- 8) },
+    { "v",     tZONE,  HOUR (- 9) },
+    { "w",     tZONE,  HOUR (-10) },
+    { "x",     tZONE,  HOUR (-11) },
+    { "y",     tZONE,  HOUR (-12) },
+    { "z",     tZONE,  HOUR (  0) },
+    { NULL, 0, 0 }
+};
+
+\f
+
+
+/* ARGSUSED */
+static int
+yyerror (s)
+     char *s ATTRIBUTE_UNUSED;
+{
+  return 0;
+}
+
+static int
+ToHour (Hours, Meridian)
+     int Hours;
+     MERIDIAN Meridian;
+{
+  switch (Meridian)
+    {
+    case MER24:
+      if (Hours < 0 || Hours > 23)
+       return -1;
+      return Hours;
+    case MERam:
+      if (Hours < 1 || Hours > 12)
+       return -1;
+      if (Hours == 12)
+       Hours = 0;
+      return Hours;
+    case MERpm:
+      if (Hours < 1 || Hours > 12)
+       return -1;
+      if (Hours == 12)
+       Hours = 0;
+      return Hours + 12;
+    default:
+      abort ();
+    }
+  /* NOTREACHED */
+}
+
+static int
+ToYear (Year)
+     int Year;
+{
+  if (Year < 0)
+    Year = -Year;
+
+  /* XPG4 suggests that years 00-68 map to 2000-2068, and
+     years 69-99 map to 1969-1999.  */
+  if (Year < 69)
+    Year += 2000;
+  else if (Year < 100)
+    Year += 1900;
+
+  return Year;
+}
+
+static int
+LookupWord (buff)
+     char *buff;
+{
+  register char *p;
+  register char *q;
+  register const TABLE *tp;
+  int i;
+  int abbrev;
+
+  /* Make it lowercase. */
+  for (p = buff; *p; p++)
+    if (ISUPPER ((unsigned char) *p))
+      *p = tolower (*p);
+
+  if (strcmp (buff, "am") == 0 || strcmp (buff, "a.m.") == 0)
+    {
+      yylval.Meridian = MERam;
+      return tMERIDIAN;
+    }
+  if (strcmp (buff, "pm") == 0 || strcmp (buff, "p.m.") == 0)
+    {
+      yylval.Meridian = MERpm;
+      return tMERIDIAN;
+    }
+
+  /* See if we have an abbreviation for a month. */
+  if (strlen (buff) == 3)
+    abbrev = 1;
+  else if (strlen (buff) == 4 && buff[3] == '.')
+    {
+      abbrev = 1;
+      buff[3] = '\0';
+    }
+  else
+    abbrev = 0;
+
+  for (tp = MonthDayTable; tp->name; tp++)
+    {
+      if (abbrev)
+       {
+         if (strncmp (buff, tp->name, 3) == 0)
+           {
+             yylval.Number = tp->value;
+             return tp->type;
+           }
+       }
+      else if (strcmp (buff, tp->name) == 0)
+       {
+         yylval.Number = tp->value;
+         return tp->type;
+       }
+    }
+
+  for (tp = TimezoneTable; tp->name; tp++)
+    if (strcmp (buff, tp->name) == 0)
+      {
+       yylval.Number = tp->value;
+       return tp->type;
+      }
+
+  if (strcmp (buff, "dst") == 0)
+    return tDST;
+
+  for (tp = UnitsTable; tp->name; tp++)
+    if (strcmp (buff, tp->name) == 0)
+      {
+       yylval.Number = tp->value;
+       return tp->type;
+      }
+
+  /* Strip off any plural and try the units table again. */
+  i = strlen (buff) - 1;
+  if (buff[i] == 's')
+    {
+      buff[i] = '\0';
+      for (tp = UnitsTable; tp->name; tp++)
+       if (strcmp (buff, tp->name) == 0)
+         {
+           yylval.Number = tp->value;
+           return tp->type;
+         }
+      buff[i] = 's';           /* Put back for "this" in OtherTable. */
+    }
+
+  for (tp = OtherTable; tp->name; tp++)
+    if (strcmp (buff, tp->name) == 0)
+      {
+       yylval.Number = tp->value;
+       return tp->type;
+      }
+
+  /* Military timezones. */
+  if (buff[1] == '\0' && ISALPHA ((unsigned char) *buff))
+    {
+      for (tp = MilitaryTable; tp->name; tp++)
+       if (strcmp (buff, tp->name) == 0)
+         {
+           yylval.Number = tp->value;
+           return tp->type;
+         }
+    }
+
+  /* Drop out any periods and try the timezone table again. */
+  for (i = 0, p = q = buff; *q; q++)
+    if (*q != '.')
+      *p++ = *q;
+    else
+      i++;
+  *p = '\0';
+  if (i)
+    for (tp = TimezoneTable; tp->name; tp++)
+      if (strcmp (buff, tp->name) == 0)
+       {
+         yylval.Number = tp->value;
+         return tp->type;
+       }
+
+  return tID;
+}
+
+static int
+yylex ()
+{
+  register unsigned char c;
+  register char *p;
+  char buff[20];
+  int Count;
+  int sign;
+
+  for (;;)
+    {
+      while (ISSPACE ((unsigned char) *yyInput))
+       yyInput++;
+
+      if (ISDIGIT (c = *yyInput) || c == '-' || c == '+')
+       {
+         if (c == '-' || c == '+')
+           {
+             sign = c == '-' ? -1 : 1;
+             if (!ISDIGIT (*++yyInput))
+               /* skip the '-' sign */
+               continue;
+           }
+         else
+           sign = 0;
+         for (yylval.Number = 0; ISDIGIT (c = *yyInput++);)
+           yylval.Number = 10 * yylval.Number + c - '0';
+         yyInput--;
+         if (sign < 0)
+           yylval.Number = -yylval.Number;
+         return sign ? tSNUMBER : tUNUMBER;
+       }
+      if (ISALPHA (c))
+       {
+         for (p = buff; (c = *yyInput++, ISALPHA (c)) || c == '.';)
+           if (p < &buff[sizeof buff - 1])
+             *p++ = c;
+         *p = '\0';
+         yyInput--;
+         return LookupWord (buff);
+       }
+      if (c != '(')
+       return *yyInput++;
+      Count = 0;
+      do
+       {
+         c = *yyInput++;
+         if (c == '\0')
+           return c;
+         if (c == '(')
+           Count++;
+         else if (c == ')')
+           Count--;
+       }
+      while (Count > 0);
+    }
+}
+
+#define TM_YEAR_ORIGIN 1900
+
+/* Yield A - B, measured in seconds.  */
+static long
+difftm (struct tm *a, struct tm *b)
+{
+  int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
+  int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
+  long days = (
+  /* difference in day of year */
+               a->tm_yday - b->tm_yday
+  /* + intervening leap days */
+               + ((ay >> 2) - (by >> 2))
+               - (ay / 100 - by / 100)
+               + ((ay / 100 >> 2) - (by / 100 >> 2))
+  /* + difference in years * 365 */
+               + (long) (ay - by) * 365
+  );
+  return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
+               + (a->tm_min - b->tm_min))
+         + (a->tm_sec - b->tm_sec));
+}
+
+time_t
+get_date (const char *p, const time_t *now)
+{
+  struct tm tm, tm0, *tmp;
+  time_t Start;
+
+  yyInput = p;
+  Start = now ? *now : time ((time_t *) NULL);
+  tmp = localtime (&Start);
+  if (!tmp)
+    return -1;
+  yyYear = tmp->tm_year + TM_YEAR_ORIGIN;
+  yyMonth = tmp->tm_mon + 1;
+  yyDay = tmp->tm_mday;
+  yyHour = tmp->tm_hour;
+  yyMinutes = tmp->tm_min;
+  yySeconds = tmp->tm_sec;
+  tm.tm_isdst = tmp->tm_isdst;
+  yyMeridian = MER24;
+  yyRelSeconds = 0;
+  yyRelMinutes = 0;
+  yyRelHour = 0;
+  yyRelDay = 0;
+  yyRelMonth = 0;
+  yyRelYear = 0;
+  yyHaveDate = 0;
+  yyHaveDay = 0;
+  yyHaveRel = 0;
+  yyHaveTime = 0;
+  yyHaveZone = 0;
+
+  if (yyparse ()
+      || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1)
+    return -1;
+
+  tm.tm_year = ToYear (yyYear) - TM_YEAR_ORIGIN + yyRelYear;
+  tm.tm_mon = yyMonth - 1 + yyRelMonth;
+  tm.tm_mday = yyDay + yyRelDay;
+  if (yyHaveTime || (yyHaveRel && !yyHaveDate && !yyHaveDay))
+    {
+      tm.tm_hour = ToHour (yyHour, yyMeridian);
+      if (tm.tm_hour < 0)
+       return -1;
+      tm.tm_min = yyMinutes;
+      tm.tm_sec = yySeconds;
+    }
+  else
+    {
+      tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
+    }
+  tm.tm_hour += yyRelHour;
+  tm.tm_min += yyRelMinutes;
+  tm.tm_sec += yyRelSeconds;
+
+  /* Let mktime deduce tm_isdst if we have an absolute timestamp,
+     or if the relative timestamp mentions days, months, or years.  */
+  if (yyHaveDate | yyHaveDay | yyHaveTime | yyRelDay | yyRelMonth | yyRelYear)
+    tm.tm_isdst = -1;
+
+  tm0 = tm;
+
+  Start = mktime (&tm);
+
+  if (Start == (time_t) -1)
+    {
+
+      /* Guard against falsely reporting errors near the time_t boundaries
+         when parsing times in other time zones.  For example, if the min
+         time_t value is 1970-01-01 00:00:00 UTC and we are 8 hours ahead
+         of UTC, then the min localtime value is 1970-01-01 08:00:00; if
+         we apply mktime to 1970-01-01 00:00:00 we will get an error, so
+         we apply mktime to 1970-01-02 08:00:00 instead and adjust the time
+         zone by 24 hours to compensate.  This algorithm assumes that
+         there is no DST transition within a day of the time_t boundaries.  */
+      if (yyHaveZone)
+       {
+         tm = tm0;
+         if (tm.tm_year <= EPOCH - TM_YEAR_ORIGIN)
+           {
+             tm.tm_mday++;
+             yyTimezone -= 24 * 60;
+           }
+         else
+           {
+             tm.tm_mday--;
+             yyTimezone += 24 * 60;
+           }
+         Start = mktime (&tm);
+       }
+
+      if (Start == (time_t) -1)
+       return Start;
+    }
+
+  if (yyHaveDay && !yyHaveDate)
+    {
+      tm.tm_mday += ((yyDayNumber - tm.tm_wday + 7) % 7
+                    + 7 * (yyDayOrdinal - (0 < yyDayOrdinal)));
+      Start = mktime (&tm);
+      if (Start == (time_t) -1)
+       return Start;
+    }
+
+  if (yyHaveZone)
+    {
+      long delta;
+      struct tm *gmt = gmtime (&Start);
+      if (!gmt)
+       return -1;
+      delta = yyTimezone * 60L + difftm (&tm, gmt);
+      if ((Start + delta < Start) != (delta < 0))
+       return -1;              /* time_t overflow */
+      Start += delta;
+    }
+
+  return Start;
+}
+
+#if    defined (TEST)
+
+/* ARGSUSED */
+int
+main (ac, av)
+     int ac;
+     char *av[];
+{
+  char buff[MAX_BUFF_LEN + 1];
+  time_t d;
+
+  (void) printf ("Enter date, or blank line to exit.\n\t> ");
+  (void) fflush (stdout);
+
+  buff[MAX_BUFF_LEN] = 0;
+  while (fgets (buff, MAX_BUFF_LEN, stdin) && buff[0])
+    {
+      d = get_date (buff, (time_t *) NULL);
+      if (d == -1)
+       (void) printf ("Bad format - couldn't convert.\n");
+      else
+       (void) printf ("%s", ctime (&d));
+      (void) printf ("\t> ");
+      (void) fflush (stdout);
+    }
+  exit (0);
+  /* NOTREACHED */
+}
+#endif /* defined (TEST) */
diff --git a/lib/getdate.h b/lib/getdate.h
new file mode 100644 (file)
index 0000000..674c474
--- /dev/null
@@ -0,0 +1,46 @@
+/*  Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifndef PARAMS
+# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
+#  define PARAMS(Args) Args
+# else
+#  define PARAMS(Args) ()
+# endif
+#endif
+
+#ifdef vms
+# include <types.h>
+# include <time.h>
+#else
+# include <sys/types.h>
+# if TIME_WITH_SYS_TIME
+#  include <sys/time.h>
+#  include <time.h>
+# else
+#  if HAVE_SYS_TIME_H
+#   include <sys/time.h>
+#  else
+#   include <time.h>
+#  endif
+# endif
+#endif /* defined (vms) */
+
+time_t get_date PARAMS ((const char *p, const time_t *now));
diff --git a/lib/getdate.y b/lib/getdate.y
new file mode 100644 (file)
index 0000000..d60be3c
--- /dev/null
@@ -0,0 +1,1051 @@
+%{
+/*
+**  Originally written by Steven M. Bellovin <smb@research.att.com> while
+**  at the University of North Carolina at Chapel Hill.  Later tweaked by
+**  a couple of people on Usenet.  Completely overhauled by Rich $alz
+**  <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990.
+**
+**  This code is in the public domain and has no copyright.
+*/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+# ifdef HAVE_ALLOCA_H
+#  include <alloca.h>
+# endif
+#endif
+
+/* Since the code of getdate.y is not included in the Emacs executable
+   itself, there is no need to #define static in this file.  Even if
+   the code were included in the Emacs executable, it probably
+   wouldn't do any harm to #undef it here; this will only cause
+   problems if we try to write to a static variable, which I don't
+   think this code needs to do.  */
+#ifdef emacs
+# undef static
+#endif
+
+#include <malloc.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#if HAVE_STDLIB_H
+# include <stdlib.h> /* for `free'; used by Bison 1.27 */
+#endif
+
+#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
+# define IN_CTYPE_DOMAIN(c) 1
+#else
+# define IN_CTYPE_DOMAIN(c) isascii(c)
+#endif
+
+#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))
+#define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c))
+#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))
+#define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))
+
+/* ISDIGIT differs from ISDIGIT_LOCALE, as follows:
+   - Its arg may be any int or unsigned int; it need not be an unsigned char.
+   - It's guaranteed to evaluate its argument exactly once.
+   - It's typically faster.
+   Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
+   only '0' through '9' are digits.  Prefer ISDIGIT to ISDIGIT_LOCALE unless
+   it's important to use the locale's definition of `digit' even when the
+   host does not conform to Posix.  */
+#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
+
+#if defined (STDC_HEADERS) || defined (USG)
+# include <string.h>
+#endif
+
+#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __attribute__(x)
+#endif
+
+#ifndef ATTRIBUTE_UNUSED
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif
+
+/* Some old versions of bison generate parsers that use bcopy.
+   That loses on systems that don't provide the function, so we have
+   to redefine it here.  */
+#if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy)
+# define bcopy(from, to, len) memcpy ((to), (from), (len))
+#endif
+
+/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
+   as well as gratuitiously global symbol names, so we can have multiple
+   yacc generated parsers in the same program.  Note that these are only
+   the variables produced by yacc.  If other parser generators (bison,
+   byacc, etc) produce additional global names that conflict at link time,
+   then those parser generators need to be fixed instead of adding those
+   names to this list. */
+
+#define yymaxdepth gd_maxdepth
+#define yyparse gd_parse
+#define yylex   gd_lex
+#define yyerror gd_error
+#define yylval  gd_lval
+#define yychar  gd_char
+#define yydebug gd_debug
+#define yypact  gd_pact
+#define yyr1    gd_r1
+#define yyr2    gd_r2
+#define yydef   gd_def
+#define yychk   gd_chk
+#define yypgo   gd_pgo
+#define yyact   gd_act
+#define yyexca  gd_exca
+#define yyerrflag gd_errflag
+#define yynerrs gd_nerrs
+#define yyps    gd_ps
+#define yypv    gd_pv
+#define yys     gd_s
+#define yy_yys  gd_yys
+#define yystate gd_state
+#define yytmp   gd_tmp
+#define yyv     gd_v
+#define yy_yyv  gd_yyv
+#define yyval   gd_val
+#define yylloc  gd_lloc
+#define yyreds  gd_reds          /* With YYDEBUG defined */
+#define yytoks  gd_toks          /* With YYDEBUG defined */
+#define yylhs   gd_yylhs
+#define yylen   gd_yylen
+#define yydefred gd_yydefred
+#define yydgoto gd_yydgoto
+#define yysindex gd_yysindex
+#define yyrindex gd_yyrindex
+#define yygindex gd_yygindex
+#define yytable  gd_yytable
+#define yycheck  gd_yycheck
+
+static int yylex ();
+static int yyerror ();
+
+#define EPOCH          1970
+#define HOUR(x)                ((x) * 60)
+
+#define MAX_BUFF_LEN    128   /* size of buffer to read the date into */
+
+/*
+**  An entry in the lexical lookup table.
+*/
+typedef struct _TABLE {
+    const char *name;
+    int                type;
+    int                value;
+} TABLE;
+
+
+/*
+**  Meridian:  am, pm, or 24-hour style.
+*/
+typedef enum _MERIDIAN {
+    MERam, MERpm, MER24
+} MERIDIAN;
+
+
+/*
+**  Global variables.  We could get rid of most of these by using a good
+**  union as the yacc stack.  (This routine was originally written before
+**  yacc had the %union construct.)  Maybe someday; right now we only use
+**  the %union very rarely.
+*/
+static const char      *yyInput;
+static int     yyDayOrdinal;
+static int     yyDayNumber;
+static int     yyHaveDate;
+static int     yyHaveDay;
+static int     yyHaveRel;
+static int     yyHaveTime;
+static int     yyHaveZone;
+static int     yyTimezone;
+static int     yyDay;
+static int     yyHour;
+static int     yyMinutes;
+static int     yyMonth;
+static int     yySeconds;
+static int     yyYear;
+static MERIDIAN        yyMeridian;
+static int     yyRelDay;
+static int     yyRelHour;
+static int     yyRelMinutes;
+static int     yyRelMonth;
+static int     yyRelSeconds;
+static int     yyRelYear;
+
+%}
+
+/* This grammar has 13 shift/reduce conflicts. */
+%expect 13
+
+%union {
+    int                        Number;
+    enum _MERIDIAN     Meridian;
+}
+
+%token tAGO tDAY tDAY_UNIT tDAYZONE tDST tHOUR_UNIT tID
+%token tMERIDIAN tMINUTE_UNIT tMONTH tMONTH_UNIT
+%token tSEC_UNIT tSNUMBER tUNUMBER tYEAR_UNIT tZONE
+
+%type  <Number>        tDAY tDAY_UNIT tDAYZONE tHOUR_UNIT tMINUTE_UNIT
+%type  <Number>        tMONTH tMONTH_UNIT
+%type  <Number>        tSEC_UNIT tSNUMBER tUNUMBER tYEAR_UNIT tZONE
+%type  <Meridian>      tMERIDIAN o_merid
+
+%%
+
+spec   : /* NULL */
+       | spec item
+       ;
+
+item   : time {
+           yyHaveTime++;
+       }
+       | zone {
+           yyHaveZone++;
+       }
+       | date {
+           yyHaveDate++;
+       }
+       | day {
+           yyHaveDay++;
+       }
+       | rel {
+           yyHaveRel++;
+       }
+       | number
+       ;
+
+time   : tUNUMBER tMERIDIAN {
+           yyHour = $1;
+           yyMinutes = 0;
+           yySeconds = 0;
+           yyMeridian = $2;
+       }
+       | tUNUMBER ':' tUNUMBER o_merid {
+           yyHour = $1;
+           yyMinutes = $3;
+           yySeconds = 0;
+           yyMeridian = $4;
+       }
+       | tUNUMBER ':' tUNUMBER tSNUMBER {
+           yyHour = $1;
+           yyMinutes = $3;
+           yyMeridian = MER24;
+           yyHaveZone++;
+           yyTimezone = ($4 < 0
+                         ? -$4 % 100 + (-$4 / 100) * 60
+                         : - ($4 % 100 + ($4 / 100) * 60));
+       }
+       | tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid {
+           yyHour = $1;
+           yyMinutes = $3;
+           yySeconds = $5;
+           yyMeridian = $6;
+       }
+       | tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER {
+           yyHour = $1;
+           yyMinutes = $3;
+           yySeconds = $5;
+           yyMeridian = MER24;
+           yyHaveZone++;
+           yyTimezone = ($6 < 0
+                         ? -$6 % 100 + (-$6 / 100) * 60
+                         : - ($6 % 100 + ($6 / 100) * 60));
+       }
+       ;
+
+zone   : tZONE {
+           yyTimezone = $1;
+       }
+       | tDAYZONE {
+           yyTimezone = $1 - 60;
+       }
+       |
+         tZONE tDST {
+           yyTimezone = $1 - 60;
+       }
+       ;
+
+day    : tDAY {
+           yyDayOrdinal = 1;
+           yyDayNumber = $1;
+       }
+       | tDAY ',' {
+           yyDayOrdinal = 1;
+           yyDayNumber = $1;
+       }
+       | tUNUMBER tDAY {
+           yyDayOrdinal = $1;
+           yyDayNumber = $2;
+       }
+       ;
+
+date   : tUNUMBER '/' tUNUMBER {
+           yyMonth = $1;
+           yyDay = $3;
+       }
+       | tUNUMBER '/' tUNUMBER '/' tUNUMBER {
+         /* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY.
+            The goal in recognizing YYYY/MM/DD is solely to support legacy
+            machine-generated dates like those in an RCS log listing.  If
+            you want portability, use the ISO 8601 format.  */
+         if ($1 >= 1000)
+           {
+             yyYear = $1;
+             yyMonth = $3;
+             yyDay = $5;
+           }
+         else
+           {
+             yyMonth = $1;
+             yyDay = $3;
+             yyYear = $5;
+           }
+       }
+       | tUNUMBER tSNUMBER tSNUMBER {
+           /* ISO 8601 format.  yyyy-mm-dd.  */
+           yyYear = $1;
+           yyMonth = -$2;
+           yyDay = -$3;
+       }
+       | tUNUMBER tMONTH tSNUMBER {
+           /* e.g. 17-JUN-1992.  */
+           yyDay = $1;
+           yyMonth = $2;
+           yyYear = -$3;
+       }
+       | tMONTH tUNUMBER {
+           yyMonth = $1;
+           yyDay = $2;
+       }
+       | tMONTH tUNUMBER ',' tUNUMBER {
+           yyMonth = $1;
+           yyDay = $2;
+           yyYear = $4;
+       }
+       | tUNUMBER tMONTH {
+           yyMonth = $2;
+           yyDay = $1;
+       }
+       | tUNUMBER tMONTH tUNUMBER {
+           yyMonth = $2;
+           yyDay = $1;
+           yyYear = $3;
+       }
+       ;
+
+rel    : relunit tAGO {
+           yyRelSeconds = -yyRelSeconds;
+           yyRelMinutes = -yyRelMinutes;
+           yyRelHour = -yyRelHour;
+           yyRelDay = -yyRelDay;
+           yyRelMonth = -yyRelMonth;
+           yyRelYear = -yyRelYear;
+       }
+       | relunit
+       ;
+
+relunit        : tUNUMBER tYEAR_UNIT {
+           yyRelYear += $1 * $2;
+       }
+       | tSNUMBER tYEAR_UNIT {
+           yyRelYear += $1 * $2;
+       }
+       | tYEAR_UNIT {
+           yyRelYear += $1;
+       }
+       | tUNUMBER tMONTH_UNIT {
+           yyRelMonth += $1 * $2;
+       }
+       | tSNUMBER tMONTH_UNIT {
+           yyRelMonth += $1 * $2;
+       }
+       | tMONTH_UNIT {
+           yyRelMonth += $1;
+       }
+       | tUNUMBER tDAY_UNIT {
+           yyRelDay += $1 * $2;
+       }
+       | tSNUMBER tDAY_UNIT {
+           yyRelDay += $1 * $2;
+       }
+       | tDAY_UNIT {
+           yyRelDay += $1;
+       }
+       | tUNUMBER tHOUR_UNIT {
+           yyRelHour += $1 * $2;
+       }
+       | tSNUMBER tHOUR_UNIT {
+           yyRelHour += $1 * $2;
+       }
+       | tHOUR_UNIT {
+           yyRelHour += $1;
+       }
+       | tUNUMBER tMINUTE_UNIT {
+           yyRelMinutes += $1 * $2;
+       }
+       | tSNUMBER tMINUTE_UNIT {
+           yyRelMinutes += $1 * $2;
+       }
+       | tMINUTE_UNIT {
+           yyRelMinutes += $1;
+       }
+       | tUNUMBER tSEC_UNIT {
+           yyRelSeconds += $1 * $2;
+       }
+       | tSNUMBER tSEC_UNIT {
+           yyRelSeconds += $1 * $2;
+       }
+       | tSEC_UNIT {
+           yyRelSeconds += $1;
+       }
+       ;
+
+number : tUNUMBER
+          {
+           if (yyHaveTime && yyHaveDate && !yyHaveRel)
+             yyYear = $1;
+           else
+             {
+               if ($1>10000)
+                 {
+                   yyHaveDate++;
+                   yyDay= ($1)%100;
+                   yyMonth= ($1/100)%100;
+                   yyYear = $1/10000;
+                 }
+               else
+                 {
+                   yyHaveTime++;
+                   if ($1 < 100)
+                     {
+                       yyHour = $1;
+                       yyMinutes = 0;
+                     }
+                   else
+                     {
+                       yyHour = $1 / 100;
+                       yyMinutes = $1 % 100;
+                     }
+                   yySeconds = 0;
+                   yyMeridian = MER24;
+                 }
+             }
+         }
+       ;
+
+o_merid        : /* NULL */
+         {
+           $$ = MER24;
+         }
+       | tMERIDIAN
+         {
+           $$ = $1;
+         }
+       ;
+
+%%
+
+/* Include this file down here because bison inserts code above which
+   may define-away `const'.  We want the prototype for get_date to have
+   the same signature as the function definition does. */
+#include "getdate.h"
+
+extern struct tm       *gmtime ();
+extern struct tm       *localtime ();
+extern time_t          mktime ();
+
+/* Month and day table. */
+static TABLE const MonthDayTable[] = {
+    { "january",       tMONTH,  1 },
+    { "february",      tMONTH,  2 },
+    { "march",         tMONTH,  3 },
+    { "april",         tMONTH,  4 },
+    { "may",           tMONTH,  5 },
+    { "june",          tMONTH,  6 },
+    { "july",          tMONTH,  7 },
+    { "august",                tMONTH,  8 },
+    { "september",     tMONTH,  9 },
+    { "sept",          tMONTH,  9 },
+    { "october",       tMONTH, 10 },
+    { "november",      tMONTH, 11 },
+    { "december",      tMONTH, 12 },
+    { "sunday",                tDAY, 0 },
+    { "monday",                tDAY, 1 },
+    { "tuesday",       tDAY, 2 },
+    { "tues",          tDAY, 2 },
+    { "wednesday",     tDAY, 3 },
+    { "wednes",                tDAY, 3 },
+    { "thursday",      tDAY, 4 },
+    { "thur",          tDAY, 4 },
+    { "thurs",         tDAY, 4 },
+    { "friday",                tDAY, 5 },
+    { "saturday",      tDAY, 6 },
+    { NULL, 0, 0 }
+};
+
+/* Time units table. */
+static TABLE const UnitsTable[] = {
+    { "year",          tYEAR_UNIT,     1 },
+    { "month",         tMONTH_UNIT,    1 },
+    { "fortnight",     tDAY_UNIT,      14 },
+    { "week",          tDAY_UNIT,      7 },
+    { "day",           tDAY_UNIT,      1 },
+    { "hour",          tHOUR_UNIT,     1 },
+    { "minute",                tMINUTE_UNIT,   1 },
+    { "min",           tMINUTE_UNIT,   1 },
+    { "second",                tSEC_UNIT,      1 },
+    { "sec",           tSEC_UNIT,      1 },
+    { NULL, 0, 0 }
+};
+
+/* Assorted relative-time words. */
+static TABLE const OtherTable[] = {
+    { "tomorrow",      tMINUTE_UNIT,   1 * 24 * 60 },
+    { "yesterday",     tMINUTE_UNIT,   -1 * 24 * 60 },
+    { "today",         tMINUTE_UNIT,   0 },
+    { "now",           tMINUTE_UNIT,   0 },
+    { "last",          tUNUMBER,       -1 },
+    { "this",          tMINUTE_UNIT,   0 },
+    { "next",          tUNUMBER,       1 },
+    { "first",         tUNUMBER,       1 },
+/*  { "second",                tUNUMBER,       2 }, */
+    { "third",         tUNUMBER,       3 },
+    { "fourth",                tUNUMBER,       4 },
+    { "fifth",         tUNUMBER,       5 },
+    { "sixth",         tUNUMBER,       6 },
+    { "seventh",       tUNUMBER,       7 },
+    { "eighth",                tUNUMBER,       8 },
+    { "ninth",         tUNUMBER,       9 },
+    { "tenth",         tUNUMBER,       10 },
+    { "eleventh",      tUNUMBER,       11 },
+    { "twelfth",       tUNUMBER,       12 },
+    { "ago",           tAGO,   1 },
+    { NULL, 0, 0 }
+};
+
+/* The timezone table. */
+static TABLE const TimezoneTable[] = {
+    { "gmt",   tZONE,     HOUR ( 0) }, /* Greenwich Mean */
+    { "ut",    tZONE,     HOUR ( 0) }, /* Universal (Coordinated) */
+    { "utc",   tZONE,     HOUR ( 0) },
+    { "wet",   tZONE,     HOUR ( 0) }, /* Western European */
+    { "bst",   tDAYZONE,  HOUR ( 0) }, /* British Summer */
+    { "wat",   tZONE,     HOUR ( 1) }, /* West Africa */
+    { "at",    tZONE,     HOUR ( 2) }, /* Azores */
+#if    0
+    /* For completeness.  BST is also British Summer, and GST is
+     * also Guam Standard. */
+    { "bst",   tZONE,     HOUR ( 3) }, /* Brazil Standard */
+    { "gst",   tZONE,     HOUR ( 3) }, /* Greenland Standard */
+#endif
+#if 0
+    { "nft",   tZONE,     HOUR (3.5) },        /* Newfoundland */
+    { "nst",   tZONE,     HOUR (3.5) },        /* Newfoundland Standard */
+    { "ndt",   tDAYZONE,  HOUR (3.5) },        /* Newfoundland Daylight */
+#endif
+    { "ast",   tZONE,     HOUR ( 4) }, /* Atlantic Standard */
+    { "adt",   tDAYZONE,  HOUR ( 4) }, /* Atlantic Daylight */
+    { "est",   tZONE,     HOUR ( 5) }, /* Eastern Standard */
+    { "edt",   tDAYZONE,  HOUR ( 5) }, /* Eastern Daylight */
+    { "cst",   tZONE,     HOUR ( 6) }, /* Central Standard */
+    { "cdt",   tDAYZONE,  HOUR ( 6) }, /* Central Daylight */
+    { "mst",   tZONE,     HOUR ( 7) }, /* Mountain Standard */
+    { "mdt",   tDAYZONE,  HOUR ( 7) }, /* Mountain Daylight */
+    { "pst",   tZONE,     HOUR ( 8) }, /* Pacific Standard */
+    { "pdt",   tDAYZONE,  HOUR ( 8) }, /* Pacific Daylight */
+    { "yst",   tZONE,     HOUR ( 9) }, /* Yukon Standard */
+    { "ydt",   tDAYZONE,  HOUR ( 9) }, /* Yukon Daylight */
+    { "hst",   tZONE,     HOUR (10) }, /* Hawaii Standard */
+    { "hdt",   tDAYZONE,  HOUR (10) }, /* Hawaii Daylight */
+    { "cat",   tZONE,     HOUR (10) }, /* Central Alaska */
+    { "ahst",  tZONE,     HOUR (10) }, /* Alaska-Hawaii Standard */
+    { "nt",    tZONE,     HOUR (11) }, /* Nome */
+    { "idlw",  tZONE,     HOUR (12) }, /* International Date Line West */
+    { "cet",   tZONE,     -HOUR (1) }, /* Central European */
+    { "met",   tZONE,     -HOUR (1) }, /* Middle European */
+    { "mewt",  tZONE,     -HOUR (1) }, /* Middle European Winter */
+    { "mest",  tDAYZONE,  -HOUR (1) }, /* Middle European Summer */
+    { "mesz",  tDAYZONE,  -HOUR (1) }, /* Middle European Summer */
+    { "swt",   tZONE,     -HOUR (1) }, /* Swedish Winter */
+    { "sst",   tDAYZONE,  -HOUR (1) }, /* Swedish Summer */
+    { "fwt",   tZONE,     -HOUR (1) }, /* French Winter */
+    { "fst",   tDAYZONE,  -HOUR (1) }, /* French Summer */
+    { "eet",   tZONE,     -HOUR (2) }, /* Eastern Europe, USSR Zone 1 */
+    { "bt",    tZONE,     -HOUR (3) }, /* Baghdad, USSR Zone 2 */
+#if 0
+    { "it",    tZONE,     -HOUR (3.5) },/* Iran */
+#endif
+    { "zp4",   tZONE,     -HOUR (4) }, /* USSR Zone 3 */
+    { "zp5",   tZONE,     -HOUR (5) }, /* USSR Zone 4 */
+#if 0
+    { "ist",   tZONE,     -HOUR (5.5) },/* Indian Standard */
+#endif
+    { "zp6",   tZONE,     -HOUR (6) }, /* USSR Zone 5 */
+#if    0
+    /* For completeness.  NST is also Newfoundland Standard, and SST is
+     * also Swedish Summer. */
+    { "nst",   tZONE,     -HOUR (6.5) },/* North Sumatra */
+    { "sst",   tZONE,     -HOUR (7) }, /* South Sumatra, USSR Zone 6 */
+#endif /* 0 */
+    { "wast",  tZONE,     -HOUR (7) }, /* West Australian Standard */
+    { "wadt",  tDAYZONE,  -HOUR (7) }, /* West Australian Daylight */
+#if 0
+    { "jt",    tZONE,     -HOUR (7.5) },/* Java (3pm in Cronusland!) */
+#endif
+    { "cct",   tZONE,     -HOUR (8) }, /* China Coast, USSR Zone 7 */
+    { "jst",   tZONE,     -HOUR (9) }, /* Japan Standard, USSR Zone 8 */
+#if 0
+    { "cast",  tZONE,     -HOUR (9.5) },/* Central Australian Standard */
+    { "cadt",  tDAYZONE,  -HOUR (9.5) },/* Central Australian Daylight */
+#endif
+    { "east",  tZONE,     -HOUR (10) },        /* Eastern Australian Standard */
+    { "eadt",  tDAYZONE,  -HOUR (10) },        /* Eastern Australian Daylight */
+    { "gst",   tZONE,     -HOUR (10) },        /* Guam Standard, USSR Zone 9 */
+    { "nzt",   tZONE,     -HOUR (12) },        /* New Zealand */
+    { "nzst",  tZONE,     -HOUR (12) },        /* New Zealand Standard */
+    { "nzdt",  tDAYZONE,  -HOUR (12) },        /* New Zealand Daylight */
+    { "idle",  tZONE,     -HOUR (12) },        /* International Date Line East */
+    {  NULL, 0, 0  }
+};
+
+/* Military timezone table. */
+static TABLE const MilitaryTable[] = {
+    { "a",     tZONE,  HOUR (  1) },
+    { "b",     tZONE,  HOUR (  2) },
+    { "c",     tZONE,  HOUR (  3) },
+    { "d",     tZONE,  HOUR (  4) },
+    { "e",     tZONE,  HOUR (  5) },
+    { "f",     tZONE,  HOUR (  6) },
+    { "g",     tZONE,  HOUR (  7) },
+    { "h",     tZONE,  HOUR (  8) },
+    { "i",     tZONE,  HOUR (  9) },
+    { "k",     tZONE,  HOUR ( 10) },
+    { "l",     tZONE,  HOUR ( 11) },
+    { "m",     tZONE,  HOUR ( 12) },
+    { "n",     tZONE,  HOUR (- 1) },
+    { "o",     tZONE,  HOUR (- 2) },
+    { "p",     tZONE,  HOUR (- 3) },
+    { "q",     tZONE,  HOUR (- 4) },
+    { "r",     tZONE,  HOUR (- 5) },
+    { "s",     tZONE,  HOUR (- 6) },
+    { "t",     tZONE,  HOUR (- 7) },
+    { "u",     tZONE,  HOUR (- 8) },
+    { "v",     tZONE,  HOUR (- 9) },
+    { "w",     tZONE,  HOUR (-10) },
+    { "x",     tZONE,  HOUR (-11) },
+    { "y",     tZONE,  HOUR (-12) },
+    { "z",     tZONE,  HOUR (  0) },
+    { NULL, 0, 0 }
+};
+
+\f
+
+
+/* ARGSUSED */
+static int
+yyerror (s)
+     char *s ATTRIBUTE_UNUSED;
+{
+  return 0;
+}
+
+static int
+ToHour (Hours, Meridian)
+     int Hours;
+     MERIDIAN Meridian;
+{
+  switch (Meridian)
+    {
+    case MER24:
+      if (Hours < 0 || Hours > 23)
+       return -1;
+      return Hours;
+    case MERam:
+      if (Hours < 1 || Hours > 12)
+       return -1;
+      if (Hours == 12)
+       Hours = 0;
+      return Hours;
+    case MERpm:
+      if (Hours < 1 || Hours > 12)
+       return -1;
+      if (Hours == 12)
+       Hours = 0;
+      return Hours + 12;
+    default:
+      abort ();
+    }
+  /* NOTREACHED */
+}
+
+static int
+ToYear (Year)
+     int Year;
+{
+  if (Year < 0)
+    Year = -Year;
+
+  /* XPG4 suggests that years 00-68 map to 2000-2068, and
+     years 69-99 map to 1969-1999.  */
+  if (Year < 69)
+    Year += 2000;
+  else if (Year < 100)
+    Year += 1900;
+
+  return Year;
+}
+
+static int
+LookupWord (buff)
+     char *buff;
+{
+  register char *p;
+  register char *q;
+  register const TABLE *tp;
+  int i;
+  int abbrev;
+
+  /* Make it lowercase. */
+  for (p = buff; *p; p++)
+    if (ISUPPER ((unsigned char) *p))
+      *p = tolower (*p);
+
+  if (strcmp (buff, "am") == 0 || strcmp (buff, "a.m.") == 0)
+    {
+      yylval.Meridian = MERam;
+      return tMERIDIAN;
+    }
+  if (strcmp (buff, "pm") == 0 || strcmp (buff, "p.m.") == 0)
+    {
+      yylval.Meridian = MERpm;
+      return tMERIDIAN;
+    }
+
+  /* See if we have an abbreviation for a month. */
+  if (strlen (buff) == 3)
+    abbrev = 1;
+  else if (strlen (buff) == 4 && buff[3] == '.')
+    {
+      abbrev = 1;
+      buff[3] = '\0';
+    }
+  else
+    abbrev = 0;
+
+  for (tp = MonthDayTable; tp->name; tp++)
+    {
+      if (abbrev)
+       {
+         if (strncmp (buff, tp->name, 3) == 0)
+           {
+             yylval.Number = tp->value;
+             return tp->type;
+           }
+       }
+      else if (strcmp (buff, tp->name) == 0)
+       {
+         yylval.Number = tp->value;
+         return tp->type;
+       }
+    }
+
+  for (tp = TimezoneTable; tp->name; tp++)
+    if (strcmp (buff, tp->name) == 0)
+      {
+       yylval.Number = tp->value;
+       return tp->type;
+      }
+
+  if (strcmp (buff, "dst") == 0)
+    return tDST;
+
+  for (tp = UnitsTable; tp->name; tp++)
+    if (strcmp (buff, tp->name) == 0)
+      {
+       yylval.Number = tp->value;
+       return tp->type;
+      }
+
+  /* Strip off any plural and try the units table again. */
+  i = strlen (buff) - 1;
+  if (buff[i] == 's')
+    {
+      buff[i] = '\0';
+      for (tp = UnitsTable; tp->name; tp++)
+       if (strcmp (buff, tp->name) == 0)
+         {
+           yylval.Number = tp->value;
+           return tp->type;
+         }
+      buff[i] = 's';           /* Put back for "this" in OtherTable. */
+    }
+
+  for (tp = OtherTable; tp->name; tp++)
+    if (strcmp (buff, tp->name) == 0)
+      {
+       yylval.Number = tp->value;
+       return tp->type;
+      }
+
+  /* Military timezones. */
+  if (buff[1] == '\0' && ISALPHA ((unsigned char) *buff))
+    {
+      for (tp = MilitaryTable; tp->name; tp++)
+       if (strcmp (buff, tp->name) == 0)
+         {
+           yylval.Number = tp->value;
+           return tp->type;
+         }
+    }
+
+  /* Drop out any periods and try the timezone table again. */
+  for (i = 0, p = q = buff; *q; q++)
+    if (*q != '.')
+      *p++ = *q;
+    else
+      i++;
+  *p = '\0';
+  if (i)
+    for (tp = TimezoneTable; tp->name; tp++)
+      if (strcmp (buff, tp->name) == 0)
+       {
+         yylval.Number = tp->value;
+         return tp->type;
+       }
+
+  return tID;
+}
+
+static int
+yylex ()
+{
+  register unsigned char c;
+  register char *p;
+  char buff[20];
+  int Count;
+  int sign;
+
+  for (;;)
+    {
+      while (ISSPACE ((unsigned char) *yyInput))
+       yyInput++;
+
+      if (ISDIGIT (c = *yyInput) || c == '-' || c == '+')
+       {
+         if (c == '-' || c == '+')
+           {
+             sign = c == '-' ? -1 : 1;
+             if (!ISDIGIT (*++yyInput))
+               /* skip the '-' sign */
+               continue;
+           }
+         else
+           sign = 0;
+         for (yylval.Number = 0; ISDIGIT (c = *yyInput++);)
+           yylval.Number = 10 * yylval.Number + c - '0';
+         yyInput--;
+         if (sign < 0)
+           yylval.Number = -yylval.Number;
+         return sign ? tSNUMBER : tUNUMBER;
+       }
+      if (ISALPHA (c))
+       {
+         for (p = buff; (c = *yyInput++, ISALPHA (c)) || c == '.';)
+           if (p < &buff[sizeof buff - 1])
+             *p++ = c;
+         *p = '\0';
+         yyInput--;
+         return LookupWord (buff);
+       }
+      if (c != '(')
+       return *yyInput++;
+      Count = 0;
+      do
+       {
+         c = *yyInput++;
+         if (c == '\0')
+           return c;
+         if (c == '(')
+           Count++;
+         else if (c == ')')
+           Count--;
+       }
+      while (Count > 0);
+    }
+}
+
+#define TM_YEAR_ORIGIN 1900
+
+/* Yield A - B, measured in seconds.  */
+static long
+difftm (struct tm *a, struct tm *b)
+{
+  int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
+  int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
+  long days = (
+  /* difference in day of year */
+               a->tm_yday - b->tm_yday
+  /* + intervening leap days */
+               + ((ay >> 2) - (by >> 2))
+               - (ay / 100 - by / 100)
+               + ((ay / 100 >> 2) - (by / 100 >> 2))
+  /* + difference in years * 365 */
+               + (long) (ay - by) * 365
+  );
+  return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
+               + (a->tm_min - b->tm_min))
+         + (a->tm_sec - b->tm_sec));
+}
+
+time_t
+get_date (const char *p, const time_t *now)
+{
+  struct tm tm, tm0, *tmp;
+  time_t Start;
+
+  yyInput = p;
+  Start = now ? *now : time ((time_t *) NULL);
+  tmp = localtime (&Start);
+  if (!tmp)
+    return -1;
+  yyYear = tmp->tm_year + TM_YEAR_ORIGIN;
+  yyMonth = tmp->tm_mon + 1;
+  yyDay = tmp->tm_mday;
+  yyHour = tmp->tm_hour;
+  yyMinutes = tmp->tm_min;
+  yySeconds = tmp->tm_sec;
+  tm.tm_isdst = tmp->tm_isdst;
+  yyMeridian = MER24;
+  yyRelSeconds = 0;
+  yyRelMinutes = 0;
+  yyRelHour = 0;
+  yyRelDay = 0;
+  yyRelMonth = 0;
+  yyRelYear = 0;
+  yyHaveDate = 0;
+  yyHaveDay = 0;
+  yyHaveRel = 0;
+  yyHaveTime = 0;
+  yyHaveZone = 0;
+
+  if (yyparse ()
+      || yyHaveTime > 1 || yyHaveZone > 1 || yyHaveDate > 1 || yyHaveDay > 1)
+    return -1;
+
+  tm.tm_year = ToYear (yyYear) - TM_YEAR_ORIGIN + yyRelYear;
+  tm.tm_mon = yyMonth - 1 + yyRelMonth;
+  tm.tm_mday = yyDay + yyRelDay;
+  if (yyHaveTime || (yyHaveRel && !yyHaveDate && !yyHaveDay))
+    {
+      tm.tm_hour = ToHour (yyHour, yyMeridian);
+      if (tm.tm_hour < 0)
+       return -1;
+      tm.tm_min = yyMinutes;
+      tm.tm_sec = yySeconds;
+    }
+  else
+    {
+      tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
+    }
+  tm.tm_hour += yyRelHour;
+  tm.tm_min += yyRelMinutes;
+  tm.tm_sec += yyRelSeconds;
+
+  /* Let mktime deduce tm_isdst if we have an absolute timestamp,
+     or if the relative timestamp mentions days, months, or years.  */
+  if (yyHaveDate | yyHaveDay | yyHaveTime | yyRelDay | yyRelMonth | yyRelYear)
+    tm.tm_isdst = -1;
+
+  tm0 = tm;
+
+  Start = mktime (&tm);
+
+  if (Start == (time_t) -1)
+    {
+
+      /* Guard against falsely reporting errors near the time_t boundaries
+         when parsing times in other time zones.  For example, if the min
+         time_t value is 1970-01-01 00:00:00 UTC and we are 8 hours ahead
+         of UTC, then the min localtime value is 1970-01-01 08:00:00; if
+         we apply mktime to 1970-01-01 00:00:00 we will get an error, so
+         we apply mktime to 1970-01-02 08:00:00 instead and adjust the time
+         zone by 24 hours to compensate.  This algorithm assumes that
+         there is no DST transition within a day of the time_t boundaries.  */
+      if (yyHaveZone)
+       {
+         tm = tm0;
+         if (tm.tm_year <= EPOCH - TM_YEAR_ORIGIN)
+           {
+             tm.tm_mday++;
+             yyTimezone -= 24 * 60;
+           }
+         else
+           {
+             tm.tm_mday--;
+             yyTimezone += 24 * 60;
+           }
+         Start = mktime (&tm);
+       }
+
+      if (Start == (time_t) -1)
+       return Start;
+    }
+
+  if (yyHaveDay && !yyHaveDate)
+    {
+      tm.tm_mday += ((yyDayNumber - tm.tm_wday + 7) % 7
+                    + 7 * (yyDayOrdinal - (0 < yyDayOrdinal)));
+      Start = mktime (&tm);
+      if (Start == (time_t) -1)
+       return Start;
+    }
+
+  if (yyHaveZone)
+    {
+      long delta;
+      struct tm *gmt = gmtime (&Start);
+      if (!gmt)
+       return -1;
+      delta = yyTimezone * 60L + difftm (&tm, gmt);
+      if ((Start + delta < Start) != (delta < 0))
+       return -1;              /* time_t overflow */
+      Start += delta;
+    }
+
+  return Start;
+}
+
+#if    defined (TEST)
+
+/* ARGSUSED */
+int
+main (ac, av)
+     int ac;
+     char *av[];
+{
+  char buff[MAX_BUFF_LEN + 1];
+  time_t d;
+
+  (void) printf ("Enter date, or blank line to exit.\n\t> ");
+  (void) fflush (stdout);
+
+  buff[MAX_BUFF_LEN] = 0;
+  while (fgets (buff, MAX_BUFF_LEN, stdin) && buff[0])
+    {
+      d = get_date (buff, (time_t *) NULL);
+      if (d == -1)
+       (void) printf ("Bad format - couldn't convert.\n");
+      else
+       (void) printf ("%s", ctime (&d));
+      (void) printf ("\t> ");
+      (void) fflush (stdout);
+    }
+  exit (0);
+  /* NOTREACHED */
+}
+#endif /* defined (TEST) */
diff --git a/lib/getenv.c b/lib/getenv.c
new file mode 100644 (file)
index 0000000..404f1c9
--- /dev/null
@@ -0,0 +1,95 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ *  Contributor(s):
+ *   Rafael Sagula <sagula@inf.ufrgs.br>
+ *   Sampo Kellomaki <sampo@iki.fi>
+ *   Linas Vepstas <linas@linas.org>
+ *   Bjorn Reese <breese@imada.ou.dk>
+ *   Johan Anderson <johan@homemail.com>
+ *   Kjell Ericson <Kjell.Ericson@haxx.nu>
+ *   Troy Engel <tengel@palladium.net>
+ *   Ryan Nelson <ryan@inch.com>
+ *   Bjorn Stenberg <Bjorn.Stenberg@haxx.nu>
+ *   Angus Mackay <amackay@gus.ml.org>
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ * $Log$
+ * Revision 1.1  1999-12-29 14:21:29  bagder
+ * Initial revision
+ *
+ * Revision 1.4  1999/09/06 06:59:40  dast
+ * Changed email info
+ *
+ * Revision 1.3  1999/08/13 07:34:48  dast
+ * Changed the URL in the header
+ *
+ * Revision 1.2  1999/03/13 00:56:09  dast
+ * Big changes done due to url.c being split up in X smaller files and that
+ * the lib is now more stand-alone.
+ *
+ * Revision 1.1.1.1  1999/03/11 22:23:34  dast
+ * Imported sources
+ *
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+char *GetEnv(char *variable)
+{
+#ifdef WIN32
+  /* This shit requires windows.h (HUGE) to be included */
+  static char env[MAX_PATH]; /* MAX_PATH is from windef.h */
+  char *temp = getenv(variable);
+  env[0] = '\0';
+  ExpandEnvironmentStrings(temp, env, sizeof(env));
+#else
+  /* no length control */
+  char *env = getenv(variable);
+#endif
+  return env;
+}
+
+char *curl_GetEnv(char *v)
+{
+  return GetEnv(v);
+}
diff --git a/lib/getenv.h b/lib/getenv.h
new file mode 100644 (file)
index 0000000..83b9495
--- /dev/null
@@ -0,0 +1,71 @@
+#ifndef __GETENV_H
+#define __GETENV_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ *  Contributor(s):
+ *   Rafael Sagula <sagula@inf.ufrgs.br>
+ *   Sampo Kellomaki <sampo@iki.fi>
+ *   Linas Vepstas <linas@linas.org>
+ *   Bjorn Reese <breese@imada.ou.dk>
+ *   Johan Anderson <johan@homemail.com>
+ *   Kjell Ericson <Kjell.Ericson@haxx.nu>
+ *   Troy Engel <tengel@palladium.net>
+ *   Ryan Nelson <ryan@inch.com>
+ *   Bjorn Stenberg <Bjorn.Stenberg@haxx.nu>
+ *   Angus Mackay <amackay@gus.ml.org>
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ * $Log$
+ * Revision 1.1  1999-12-29 14:21:30  bagder
+ * Initial revision
+ *
+ * Revision 1.3  1999/09/06 06:59:40  dast
+ * Changed email info
+ *
+ * Revision 1.2  1999/08/13 07:34:48  dast
+ * Changed the URL in the header
+ *
+ * Revision 1.1.1.1  1999/03/11 22:23:34  dast
+ * Imported sources
+ *
+ ****************************************************************************/
+
+/* Unix and Win32 getenv function call */
+char *GetEnv(char *variable);
+
+#endif
diff --git a/lib/getpass.c b/lib/getpass.c
new file mode 100644 (file)
index 0000000..c0c7bf9
--- /dev/null
@@ -0,0 +1,185 @@
+/* ============================================================================
+ * Copyright (C) 1998 Angus Mackay. All rights reserved; 
+ *
+ * Redistribution and use are freely permitted provided that:
+ *
+ *   1) This header remain in tact.
+ *   2) The prototype for getpass is not changed from:
+ *         char *getpass(const char *prompt)
+ *   3) This source code is not used outside of this(getpass.c) file.
+ *   3) Any changes to this(getpass.c) source code are made publicly available.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ * ============================================================================
+ *
+ * $Id$
+ *
+ * The spirit of this license is to allow use of this source code in any
+ * project be it open or closed but still encourage the use of the open,
+ * library based equivilents.
+ *
+ * Author(s):
+ *   Angus Mackay <amackay@gus.ml.org>
+ *
+ * Contributor(s):
+ *   Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ */
+
+#ifndef WIN32
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#ifdef HAVE_TERMIOS_H
+#  if !defined(HAVE_TCGETATTR) && !defined(HAVE_TCSETATTR) 
+#    undef HAVE_TERMIOS_H
+#  endif
+#endif
+
+#define INPUT_BUFFER 128
+
+#ifndef RETSIGTYPE
+#  define RETSIGTYPE void
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdio.h>
+#include <signal.h>
+#ifdef HAVE_TERMIOS_H
+#  include <termios.h>
+#else
+#  ifdef HAVE_TERMIO_H
+#  include <termio.h>
+#  else
+#  endif
+#endif
+
+/* no perror? make an fprintf! */
+#ifndef HAVE_PERROR
+#  define perror(x) fprintf(stderr, "Error in: %s\n", x)
+#endif
+
+char *getpass(const char *prompt)
+{
+  FILE *infp;
+  FILE *outfp;
+  static char buf[INPUT_BUFFER];
+  RETSIGTYPE (*sigint)();
+  RETSIGTYPE (*sigtstp)();
+  size_t bytes_read;
+  int infd;
+  int outfd;
+#ifdef HAVE_TERMIOS_H
+  struct termios orig;
+  struct termios noecho;
+#else
+#  ifdef HAVE_TERMIO_H
+  struct termio orig;
+  struct termio noecho;  
+#  else
+#  endif
+#endif
+
+  sigint = signal(SIGINT, SIG_IGN);
+  sigtstp = signal(SIGTSTP, SIG_IGN);
+
+  if( (infp=fopen("/dev/tty", "r")) == NULL )
+  {
+    infp = stdin;
+  }
+  if( (outfp=fopen("/dev/tty", "w")) == NULL )
+  {
+    outfp = stderr;
+  }
+  infd = fileno(infp);
+  outfd = fileno(outfp);
+
+  /* dissable echo */
+#ifdef HAVE_TERMIOS_H
+  if(tcgetattr(outfd, &orig) != 0)
+  {
+    perror("tcgetattr");
+  }
+  noecho = orig;
+  noecho.c_lflag &= ~ECHO;
+  if(tcsetattr(outfd, TCSANOW, &noecho) != 0)
+  {
+    perror("tcgetattr");
+  }
+#else
+#  ifdef HAVE_TERMIO_H
+  if(ioctl(outfd, TCGETA, &orig) != 0)
+  {
+    perror("ioctl");
+  }
+  noecho = orig;
+  noecho.c_lflag &= ~ECHO;
+  if(ioctl(outfd, TCSETA, &noecho) != 0)
+  {
+    perror("ioctl");
+  }
+#  else
+#  endif
+#endif
+
+  fputs(prompt, outfp);
+  fflush(outfp);
+
+  bytes_read=read(infd, buf, INPUT_BUFFER);
+  buf[bytes_read > 0 ? (bytes_read -1) : 0] = '\0';
+
+  /* print a new line if needed */
+#ifdef HAVE_TERMIOS_H
+  fputs("\n", outfp);
+#else
+#  ifdef HAVE_TERMIO_H
+  fputs("\n", outfp);
+#  else
+#  endif
+#endif
+
+  /*
+   * reset term charectaristics, use TCSAFLUSH incase the
+   * user types more than INPUT_BUFFER
+   */
+#ifdef HAVE_TERMIOS_H
+  if(tcsetattr(outfd, TCSAFLUSH, &orig) != 0)
+  {
+    perror("tcgetattr");
+  }
+#else
+#  ifdef HAVE_TERMIO_H
+  if(ioctl(outfd, TCSETA, &orig) != 0)
+  {
+    perror("ioctl");
+  }
+#  else
+#  endif
+#endif
+  
+  signal(SIGINT, sigint);
+  signal(SIGTSTP, sigtstp);
+
+  return(buf);
+}
+#else
+#include <stdio.h>
+char *getpass(const char *prompt)
+{
+       static char password[80];
+       printf(prompt);
+       gets(password);
+       return password;
+}
+#endif /* don't do anything if WIN32 */
diff --git a/lib/getpass.h b/lib/getpass.h
new file mode 100644 (file)
index 0000000..33dfed6
--- /dev/null
@@ -0,0 +1 @@
+char *getpass(const char *prompt);
diff --git a/lib/hostip.c b/lib/hostip.c
new file mode 100644 (file)
index 0000000..453d8a3
--- /dev/null
@@ -0,0 +1,111 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <string.h>
+
+#include "setup.h"
+
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+#include <winsock.h>
+#else
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#include <netinet/in.h>
+#include <netdb.h>
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#endif
+
+#include "urldata.h"
+#include "sendf.h"
+
+/* --- resolve name or IP-number --- */
+
+char *MakeIP(unsigned long num)
+{
+#ifdef HAVE_INET_NTOA
+  struct in_addr in;
+
+  in.s_addr = htonl(num);
+  return (inet_ntoa(in));
+#else
+  static char addr[128];
+  unsigned char *paddr;
+
+  num = htonl(num);  /* htonl() added to avoid endian probs */
+  paddr = (unsigned char *)&num;
+  sprintf(addr, "%u.%u.%u.%u", paddr[0], paddr[1], paddr[2], paddr[3]);
+  return (addr);
+#endif
+}
+
+/* Stolen from Dancer source code, written by
+   Bjorn Reese <breese@imada.ou.dk> */
+#ifndef INADDR_NONE
+#define INADDR_NONE (unsigned long) ~0
+#endif
+struct hostent *GetHost(struct UrlData *data, char *hostname)
+{
+  struct hostent *h = NULL;
+  unsigned long in;
+  static struct hostent he;
+  static char name[MAXHOSTNAMELEN];
+  static char *addrlist[2];
+  static struct in_addr addrentry;
+
+  if ( (in=inet_addr(hostname)) != INADDR_NONE ) {
+    addrentry.s_addr = in;
+    addrlist[0] = (char *)&addrentry;
+    addrlist[1] = NULL;
+    he.h_name = strncpy(name, MakeIP(ntohl(in)), MAXHOSTNAMELEN);
+    he.h_addrtype = AF_INET;
+    he.h_length = sizeof(struct in_addr);
+    he.h_addr_list = addrlist;
+    h = &he;
+  } else if ( (h=gethostbyname(hostname)) == NULL ) {
+    infof(data, "gethostbyname(2) failed for %s\n", hostname);
+  }
+  return (h);
+}
diff --git a/lib/hostip.h b/lib/hostip.h
new file mode 100644 (file)
index 0000000..8753e39
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef __HOSTIP_H
+#define __HOSTIP_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+struct hostent *GetHost(struct UrlData *data, char *hostname);
+char *MakeIP(unsigned long num);
+
+#endif
diff --git a/lib/http.c b/lib/http.c
new file mode 100644 (file)
index 0000000..2dd3802
--- /dev/null
@@ -0,0 +1,381 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+/* -- WIN32 approved -- */
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+
+#include "setup.h"
+
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+#include <winsock.h>
+#include <time.h>
+#include <io.h>
+#else
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <netdb.h>
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+#include <sys/ioctl.h>
+#include <signal.h>
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+
+#endif
+
+#include "urldata.h"
+#include <curl/curl.h>
+#include "download.h"
+#include "sendf.h"
+#include "formdata.h"
+#include "progress.h"
+#include "base64.h"
+#include "upload.h"
+#include "cookie.h"
+
+#define _MPRINTF_REPLACE /* use our functions only */
+#include <curl/mprintf.h>
+
+/*
+ * This function checks the linked list of custom HTTP headers for a particular
+ * header (prefix).
+ */
+bool static checkheaders(struct UrlData *data, char *thisheader)
+{
+  struct HttpHeader *head;
+  size_t thislen = strlen(thisheader);
+
+  for(head = data->headers; head; head=head->next) {
+    if(strnequal(head->header, thisheader, thislen)) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+UrgError http(struct UrlData *data, char *ppath, char *host, long *bytecount)
+{
+  /* Send the GET line to the HTTP server */
+
+  struct FormData *sendit=NULL;
+  int postsize=0;
+  UrgError result;
+  char *buf;
+  struct Cookie *co = NULL;
+  char *p_pragma = NULL;
+  char *p_accept = NULL;
+
+  buf = data->buffer; /* this is our buffer */
+
+  if ( (data->conf&(CONF_HTTP|CONF_FTP)) &&
+       (data->conf&CONF_UPLOAD)) {
+    data->conf |= CONF_PUT;
+  }
+#if 0 /* old version */
+  if((data->conf&(CONF_HTTP|CONF_UPLOAD)) ==
+     (CONF_HTTP|CONF_UPLOAD)) {
+    /* enable PUT! */
+    data->conf |= CONF_PUT;
+  }
+#endif
+  
+  /* The User-Agent string has been built in url.c already, because it might
+     have been used in the proxy connect, but if we have got a header with
+     the user-agent string specified, we erase the previosly made string
+     here. */
+  if(checkheaders(data, "User-Agent:") && data->ptr_uagent) {
+    free(data->ptr_uagent);
+    data->ptr_uagent=NULL;
+  }
+
+  if((data->conf & CONF_USERPWD) && !checkheaders(data, "Authorization:")) {
+    char authorization[512];
+    sprintf(data->buffer, "%s:%s", data->user, data->passwd);
+    base64Encode(data->buffer, authorization);
+    data->ptr_userpwd = maprintf( "Authorization: Basic %s\015\012",
+                                  authorization);
+  }
+  if((data->conf & CONF_RANGE) && !checkheaders(data, "Range:")) {
+    data->ptr_rangeline = maprintf("Range: bytes=%s\015\012", data->range);
+  }
+  if((data->conf & CONF_REFERER) && !checkheaders(data, "Referer:")) {
+    data->ptr_ref = maprintf("Referer: %s\015\012", data->referer);
+  }
+  if(data->cookie && !checkheaders(data, "Cookie:")) {
+    data->ptr_cookie = maprintf("Cookie: %s\015\012", data->cookie);
+  }
+
+  if(data->cookies) {
+    co = cookie_getlist(data->cookies,
+                        host,
+                        ppath,
+                        data->conf&CONF_HTTPS?TRUE:FALSE);
+  }
+  if ((data->conf & CONF_PROXY) && (!(data->conf & CONF_HTTPS)))  {
+    /* The path sent to the proxy is in fact the entire URL */
+    strncpy(ppath, data->url, URL_MAX_LENGTH-1);
+  }
+  if(data->conf & CONF_HTTPPOST) {
+    /* we must build the whole darned post sequence first, so that we have
+       a size of the whole shebang before we start to send it */
+    sendit = getFormData(data->httppost, &postsize);
+  }
+
+  if(!checkheaders(data, "Host:"))
+    data->ptr_host = maprintf("Host: %s\r\n", host);
+
+
+  if(!checkheaders(data, "Pragma:"))
+    p_pragma = "Pragma: no-cache\r\n";
+
+  if(!checkheaders(data, "Accept:"))
+    p_accept = "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n";
+
+  do {
+    sendf(data->firstsocket, data,
+          "%s " /* GET/HEAD/POST/PUT */
+          "%s HTTP/1.0\r\n" /* path */
+          "%s" /* proxyuserpwd */
+          "%s" /* userpwd */
+          "%s" /* range */
+          "%s" /* user agent */
+          "%s" /* cookie */
+          "%s" /* host */
+          "%s" /* pragma */
+          "%s" /* accept */
+          "%s", /* referer */
+
+          data->customrequest?data->customrequest:
+          (data->conf&CONF_NOBODY?"HEAD":
+           (data->conf&(CONF_POST|CONF_HTTPPOST))?"POST":
+           (data->conf&CONF_PUT)?"PUT":"GET"),
+          ppath,
+          (data->conf&CONF_PROXYUSERPWD && data->ptr_proxyuserpwd)?data->ptr_proxyuserpwd:"",
+          (data->conf&CONF_USERPWD && data->ptr_userpwd)?data->ptr_userpwd:"",
+          (data->conf&CONF_RANGE && data->ptr_rangeline)?data->ptr_rangeline:"",
+          (data->useragent && *data->useragent && data->ptr_uagent)?data->ptr_uagent:"",
+          (data->ptr_cookie?data->ptr_cookie:""), /* Cookie: <data> */
+          (data->ptr_host?data->ptr_host:""), /* Host: host */
+          p_pragma?p_pragma:"",
+          p_accept?p_accept:"",
+          (data->conf&CONF_REFERER && data->ptr_ref)?data->ptr_ref:"" /* Referer: <data> <CRLF> */
+          );
+
+    if(co) {
+      int count=0;
+      /* now loop through all cookies that matched */
+      while(co) {
+        if(0 == count) {
+          sendf(data->firstsocket, data,
+                "Cookie: ");
+        }
+        count++;
+        sendf(data->firstsocket, data,
+              "%s=%s;", co->name, co->value);
+        co = co->next; /* next cookie please */
+      }
+      if(count) {
+        sendf(data->firstsocket, data,
+              "\r\n");
+      }
+      cookie_freelist(co); /* free the cookie list */
+      co=NULL;
+    }
+
+    if(data->timecondition) {
+      struct tm *thistime;
+
+      thistime = localtime(&data->timevalue);
+
+#if defined(HAVE_STRFTIME) || defined(WIN32)
+      /* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
+      strftime(buf, BUFSIZE-1, "%a, %d %b %Y %H:%M:%S %Z", thistime);
+#else
+      /* Right, we *could* write a replacement here */
+      strcpy(buf, "no strftime() support");
+#endif
+      switch(data->timecondition) {
+      case TIMECOND_IFMODSINCE:
+      default:
+        sendf(data->firstsocket, data,
+              "If-Modified-Since: %s\r\n", buf);
+        break;
+      case TIMECOND_IFUNMODSINCE:
+        sendf(data->firstsocket, data,
+              "If-Unmodified-Since: %s\r\n", buf);
+        break;
+      case TIMECOND_LASTMOD:
+        sendf(data->firstsocket, data,
+              "Last-Modified: %s\r\n", buf);
+        break;
+      }
+    }
+
+    while(data->headers) {
+      sendf(data->firstsocket, data,
+            "%s\015\012",
+            data->headers->header);
+      data->headers = data->headers->next;
+    }
+
+    if(data->conf&(CONF_POST|CONF_HTTPPOST)) {
+      if(data->conf & CONF_POST) {
+        /* this is the simple x-www-form-urlencoded style */
+        sendf(data->firstsocket, data,
+              "Content-Length: %d\015\012"
+              "Content-Type: application/x-www-form-urlencoded\r\n\r\n"
+              "%s\015\012",
+              strlen(data->postfields),
+              data->postfields );
+      }
+      else {
+        struct Form form;
+        size_t (*storefread)(char *, size_t , size_t , FILE *);
+        FILE *in;
+        long conf;
+
+        if(FormInit(&form, sendit)) {
+          failf(data, "Internal HTTP POST error!\n");
+          return URG_HTTP_POST_ERROR;
+        }
+
+        storefread = data->fread; /* backup */
+        in = data->in; /* backup */
+          
+        data->fread =
+          (size_t (*)(char *, size_t, size_t, FILE *))
+          FormReader; /* set the read function to read from the
+                         generated form data */
+        data->in = (FILE *)&form;
+
+        sendf(data->firstsocket, data,
+              "Content-Length: %d\r\n",
+              postsize-2);
+       
+        conf = data->conf;
+        data->conf &= ~CONF_NOPROGRESS; /* enable progress meter */
+        ProgressInit(data, postsize);
+
+        result = Upload(data, data->firstsocket, bytecount);
+
+        FormFree(sendit); /* Now free that whole lot */
+
+        data->conf = conf; /* restore conf values for the download */
+          
+        if(result)
+          return result;
+       
+        data->fread = storefread; /* restore */
+        data->in = in; /* restore */
+
+       sendf(data->firstsocket, data,
+             "\r\n\r\n");
+      }
+    }
+    else if(data->conf&CONF_PUT) {
+      /* Let's PUT the data to the server! */
+      long conf;
+
+      if(data->infilesize>0) {
+        sendf(data->firstsocket, data,
+              "Content-Length: %d\r\n\r\n", /* file size */
+              data->infilesize );
+      }
+      else
+        sendf(data->firstsocket, data,
+              "\015\012");
+        
+      conf = data->conf;
+      data->conf &= ~CONF_NOPROGRESS; /* enable progress meter */
+
+      ProgressInit(data, data->infilesize);
+
+      result = Upload(data, data->firstsocket, bytecount);
+        
+      data->conf = conf;
+
+      if(result)
+        return result;
+
+      /* reset the byte counter */
+      *bytecount=0;
+    }
+    else {
+      sendf(data->firstsocket, data, "\r\n");
+    }
+    /* HTTP GET/HEAD download: */
+    result = Download(data, data->firstsocket, -1, TRUE, bytecount);
+
+    if(result)
+      return result;
+      
+    ProgressEnd(data);
+  } while (0); /* this is just a left-over from the multiple document download
+                  attempts */
+
+  return URG_OK;
+}
+
diff --git a/lib/http.h b/lib/http.h
new file mode 100644 (file)
index 0000000..be35842
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef __HTTP_H
+#define __HTTP_H
+
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+UrgError http(struct UrlData *data, char *path, char *host, long *bytecountp);
+
+#endif
diff --git a/lib/if2ip.c b/lib/if2ip.c
new file mode 100644 (file)
index 0000000..f8a37bb
--- /dev/null
@@ -0,0 +1,110 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "setup.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if ! defined(WIN32) && ! defined(__BEOS__)
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#include <netinet/in.h>
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+#include <sys/ioctl.h>
+
+/* -- if2ip() -- */
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+
+#ifdef HAVE_SYS_SOCKIO_H
+#include <sys/sockio.h>
+#endif
+
+#define SYS_ERROR -1
+
+char *if2ip(char *interface)
+{
+  int dummy;
+  char *ip=NULL;
+  
+  if(!interface)
+    return NULL;
+
+  dummy = socket(AF_INET, SOCK_STREAM, 0);
+  if (SYS_ERROR == dummy) {
+    return NULL;
+  }
+  else {
+    struct ifreq req;
+    memset(&req, 0, sizeof(req));
+    strcpy(req.ifr_name, interface);
+    req.ifr_addr.sa_family = AF_INET;
+    if (SYS_ERROR == ioctl(dummy, SIOCGIFADDR, &req, sizeof(req))) {
+      return NULL;
+    }
+    else {
+      struct in_addr in;
+
+      struct sockaddr_in *s = (struct sockaddr_in *)&req.ifr_dstaddr;
+      memcpy(&in, &(s->sin_addr.s_addr), sizeof(in));
+      ip = (char *)strdup(inet_ntoa(in));
+    }
+    close(dummy);
+  }
+  return ip;
+}
+
+/* -- end of if2ip() -- */
+#else
+#define if2ip(x) NULL
+#endif
diff --git a/lib/if2ip.h b/lib/if2ip.h
new file mode 100644 (file)
index 0000000..0b658f9
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef __IF2IP_H
+#define __IF2IP_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+#include "setup.h"
+
+#if ! defined(WIN32) && ! defined(__BEOS__)
+char *if2ip(char *interface);
+#else
+#define if2ip(x) NULL
+#endif
+
+#endif
diff --git a/lib/ldap.c b/lib/ldap.c
new file mode 100644 (file)
index 0000000..7f0e025
--- /dev/null
@@ -0,0 +1,226 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Contributor(s):
+ *  Bjørn Reese <breese@mail1.stofanet.dk>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+/* -- WIN32 approved -- */
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#include "setup.h"
+
+#if defined(WIN32) && !defined(__GNUC__)
+#else
+# ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+# endif
+# ifdef HAVE_DLFCN_H
+#  include <dlfcn.h>
+# endif
+#endif
+
+#include "urldata.h"
+#include <curl/curl.h>
+#include "sendf.h"
+#include "escape.h"
+
+#define _MPRINTF_REPLACE /* use our functions only */
+#include <curl/mprintf.h>
+
+
+#define DYNA_GET_FUNCTION(type, fnc) \
+  (fnc) = (type)DynaGetFunction(#fnc); \
+  if ((fnc) == NULL) { \
+    return URG_FUNCTION_NOT_FOUND; \
+  } \
+
+/***********************************************************************
+ */
+static void *libldap = NULL;
+static void *liblber = NULL;
+
+static void DynaOpen(void)
+{
+#if defined(HAVE_DLOPEN) || defined(HAVE_LIBDL)
+  if (libldap == NULL) {
+    /*
+     * libldap.so should be able to resolve its dependency on
+     * liblber.so automatically, but since it does not we will
+     * handle it here by opening liblber.so as global.
+     */
+    dlopen("liblber.so", RTLD_LAZY | RTLD_GLOBAL);
+    libldap = dlopen("libldap.so", RTLD_LAZY);
+  }
+#endif
+}
+
+static void DynaClose(void)
+{
+#if defined(HAVE_DLOPEN) || defined(HAVE_LIBDL)
+  if (libldap) {
+    dlclose(libldap);
+  }
+  if (liblber) {
+    dlclose(liblber);
+  }
+#endif
+}
+
+static void * DynaGetFunction(char *name)
+{
+  void *func = NULL;
+
+#if defined(HAVE_DLOPEN) || defined(HAVE_LIBDL)
+  if (libldap) {
+    func = dlsym(libldap, name);
+  }
+#endif
+  
+  return func;
+}
+
+static int WriteProc(void *param, char *text, int len)
+{
+  struct UrlData *data = (struct UrlData *)param;
+  
+  printf("%s\n", text);
+  return 0;
+}
+
+/***********************************************************************
+ */
+UrgError ldap(struct UrlData *data, char *path, long *bytecount)
+{
+  UrgError status = URG_OK;
+  int rc;
+  void *(*ldap_open)(char *, int);
+  int (*ldap_simple_bind_s)(void *, char *, char *);
+  int (*ldap_unbind_s)(void *);
+  int (*ldap_url_search_s)(void *, char *, int, void **);
+  void *(*ldap_first_entry)(void *, void *);
+  void *(*ldap_next_entry)(void *, void *);
+  char *(*ldap_err2string)(int);
+  int (*ldap_entry2text)(void *, char *, void *, void *, char **, char **, int (*)(void *, char *, int), void *, char *, int, unsigned long);
+  int (*ldap_entry2html)(void *, char *, void *, void *, char **, char **, int (*)(void *, char *, int), void *, char *, int, unsigned long, char *, char *);
+  void *server;
+  void *result;
+  void *entryIterator;
+#if 0
+  char *dn;
+  char **attrArray;
+  char *attrIterator;
+  char *attrString;
+  void *dummy;
+#endif
+  int ldaptext;
+  
+  infof(data, "LDAP: %s %s\n", data->url);
+
+  DynaOpen();
+  if (libldap == NULL) {
+    failf(data, "The needed LDAP library/libraries couldn't be opened");
+    return URG_LIBRARY_NOT_FOUND;
+  }
+
+  ldaptext = data->conf & CONF_FTPASCII; /* This is a dirty hack */
+  
+  /* The types are needed because ANSI C distinguishes between
+   * pointer-to-object (data) and pointer-to-function.
+   */
+  DYNA_GET_FUNCTION(void *(*)(char *, int), ldap_open);
+  DYNA_GET_FUNCTION(int (*)(void *, char *, char *), ldap_simple_bind_s);
+  DYNA_GET_FUNCTION(int (*)(void *), ldap_unbind_s);
+  DYNA_GET_FUNCTION(int (*)(void *, char *, int, void **), ldap_url_search_s);
+  DYNA_GET_FUNCTION(void *(*)(void *, void *), ldap_first_entry);
+  DYNA_GET_FUNCTION(void *(*)(void *, void *), ldap_next_entry);
+  DYNA_GET_FUNCTION(char *(*)(int), ldap_err2string);
+  DYNA_GET_FUNCTION(int (*)(void *, char *, void *, void *, char **, char **, int (*)(void *, char *, int), void *, char *, int, unsigned long), ldap_entry2text);
+  DYNA_GET_FUNCTION(int (*)(void *, char *, void *, void *, char **, char **, int (*)(void *, char *, int), void *, char *, int, unsigned long, char *, char *), ldap_entry2html);
+  
+  server = ldap_open(data->hostname, data->port);
+  if (server == NULL) {
+    failf(data, "LDAP: Cannot connect to %s:%d",
+         data->hostname, data->port);
+    status = URG_COULDNT_CONNECT;
+  } else {
+    rc = ldap_simple_bind_s(server, data->user, data->passwd);
+    if (rc != 0) {
+      failf(data, "LDAP: %s", ldap_err2string(rc));
+      status = URG_LDAP_CANNOT_BIND;
+    } else {
+      rc = ldap_url_search_s(server, data->url, 0, &result);
+      if (rc != 0) {
+       failf(data, "LDAP: %s", ldap_err2string(rc));
+       status = URG_LDAP_SEARCH_FAILED;
+      } else {
+       for (entryIterator = ldap_first_entry(server, result);
+            entryIterator;
+            entryIterator = ldap_next_entry(server, entryIterator))
+         {
+           if (ldaptext) {
+             rc = ldap_entry2text(server, NULL, entryIterator, NULL,
+                                  NULL, NULL, WriteProc, data,
+                                  "", 0, 0);
+             if (rc != 0) {
+               failf(data, "LDAP: %s", ldap_err2string(rc));
+               status = URG_LDAP_SEARCH_FAILED;
+             }
+           } else {
+             rc = ldap_entry2html(server, NULL, entryIterator, NULL,
+                                  NULL, NULL, WriteProc, data,
+                                  "", 0, 0, NULL, NULL);
+             if (rc != 0) {
+               failf(data, "LDAP: %s", ldap_err2string(rc));
+               status = URG_LDAP_SEARCH_FAILED;
+             }
+           }
+         }
+      }
+      ldap_unbind_s(server);
+    }
+  }
+  DynaClose();
+  
+  return status;
+}
diff --git a/lib/ldap.h b/lib/ldap.h
new file mode 100644 (file)
index 0000000..d88880e
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef __LDAP_H
+#define __LDAP_H
+
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://www.fts.frontec.se/~dast/curl/
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+UrgError ldap(struct UrlData *data, char *path, long *bytecount);
+
+#endif /* __LDAP_H */
diff --git a/lib/mprintf.c b/lib/mprintf.c
new file mode 100644 (file)
index 0000000..237a21a
--- /dev/null
@@ -0,0 +1,1253 @@
+/****************************************************************************
+ *
+ * $Id$
+ *
+ *************************************************************************
+ *
+ * Purpose:
+ *  A merge of Bjorn Reese's format() function and Daniel's dsprintf()
+ *  1.0. A full blooded printf() clone with full support for <num>$
+ *  everywhere (parameters, widths and precisions) including variabled
+ *  sized parameters (like doubles, long longs, long doubles and even
+ *  void * in 64-bit architectures).
+ *
+ * Current restrictions:
+ * - Max 128 parameters
+ * - No 'long double' support.
+ *
+ *************************************************************************
+ *
+ *
+ * 1998/01/10  (v2.8)
+ *   Daniel
+ *   - Updated version number.
+ *   - Corrected a static non-zero prefixed width problem.
+ *
+ * 1998/11/17 - Daniel
+ *   Added daprintf() and dvaprintf() for allocated printf() and vprintf().
+ *   They return an allocated buffer with the result inside. The result must
+ *   be free()ed!
+ *
+ * 1998/08/23 - breese
+ *
+ *   Converted all non-printable (and non-whitespace) characters into
+ *   their decimal ASCII value preceeded by a '\' character
+ *   (this only applies to snprintf family so far)
+ *
+ *   Added %S (which is the same as %#s)
+ *
+ * 1998/05/05 (v2.7)
+ *
+ *   Fixed precision and width qualifiers (%.*s)
+ *
+ *   Added support for snprintf()
+ *
+ *   Quoting (%#s) is disabled for the (nil) pointer
+ *
+ * 1997/06/09 (v2.6)
+ *
+ *   %#s means that the string will be quoted with "
+ *   (I was getting tired of writing \"%s\" all the time)
+ *
+ *   [ERR] for strings changed to (nil)
+ *
+ * v2.5
+ * - Added C++ support
+ * - Prepended all internal functions with dprintf_
+ * - Defined the booleans
+ *
+ * v2.4
+ * - Added dvsprintf(), dvfprintf() and dvprintf().
+ * - Made the formatting function available with the name _formatf() to enable
+ *   other *printf()-inspired functions. (I considered adding a dmsprintf()
+ *   that works like sprintf() but allocates the destination string and
+ *   possibly enlarges it itself, but things like that should be done with the
+ *   new _formatf() instead.)
+ *
+ * v2.3
+ * - Small modifications to make it compile nicely at both Daniel's and
+ *   Bjorn's place.
+ *
+ * v2.2
+ * - Made it work with text to the right of the last %!
+ * - Introduced dprintf(), dsprintf() and dfprintf().
+ * - Float/double support enabled. This system is currently using the ordinary
+ *   sprintf() function. NOTE that positional parameters, widths and precisions
+ *   will still work like it should since the d-system takes care of that and
+ *   passes that information re-formatted to the old sprintf().
+ *
+ * v2.1
+ * - Fixed space padding (i.e %d was extra padded previously)
+ * - long long output is supported
+ * - alternate output is done correct like in %#08x
+ *
+ ****************************************************************************/
+
+static const char rcsid[] = "@(#)$Id$";
+
+/*
+ * To test:
+ *
+ * Use WIDTH, PRECISION and NUMBERED ARGUMENT combined.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <string.h>
+
+
+#define BUFFSIZE 256 /* buffer for long-to-str and float-to-str calcs */
+#define MAX_PARAMETERS 128 /* lame static limit */
+
+#undef TRUE
+#undef FALSE
+#undef BOOL
+#ifdef __cplusplus
+# define TRUE true
+# define FALSE false
+# define BOOL bool
+#else
+# define TRUE  ((char)(1 == 1))
+# define FALSE ((char)(0 == 1))
+# define BOOL char
+#endif
+
+
+/* Lower-case digits.  */
+static const char lower_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+/* Upper-case digits.  */
+static const char upper_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+#define        OUTCHAR(x) done+=(stream(x, (FILE *)data)==-1?0:1)
+
+/* Data type to read from the arglist */
+typedef enum  {
+  FORMAT_UNKNOWN = 0,
+  FORMAT_STRING,
+  FORMAT_PTR,
+  FORMAT_INT,
+  FORMAT_INTPTR,
+  FORMAT_LONG,
+  FORMAT_LONGLONG,
+  FORMAT_DOUBLE,
+  FORMAT_LONGDOUBLE,
+  FORMAT_WIDTH /* For internal use */
+} FormatType;
+
+/* convertion and display flags */
+enum {
+  FLAGS_NEW        = 0,
+  FLAGS_SPACE      = 1<<0,
+  FLAGS_SHOWSIGN   = 1<<1,
+  FLAGS_LEFT       = 1<<2,
+  FLAGS_ALT        = 1<<3,
+  FLAGS_SHORT      = 1<<4,
+  FLAGS_LONG       = 1<<5,
+  FLAGS_LONGLONG   = 1<<6,
+  FLAGS_LONGDOUBLE = 1<<7,
+  FLAGS_PAD_NIL    = 1<<8,
+  FLAGS_UNSIGNED   = 1<<9,
+  FLAGS_OCTAL      = 1<<10,
+  FLAGS_HEX        = 1<<11,
+  FLAGS_UPPER      = 1<<12,
+  FLAGS_WIDTH      = 1<<13, /* '*' or '*<num>$' used */
+  FLAGS_WIDTHPARAM = 1<<14, /* width PARAMETER was specified */
+  FLAGS_PREC       = 1<<15, /* precision was specified */
+  FLAGS_PRECPARAM  = 1<<16, /* precision PARAMETER was specified */
+  FLAGS_CHAR       = 1<<17, /* %c story */
+  FLAGS_FLOATE     = 1<<18, /* %e or %E */
+  FLAGS_FLOATG     = 1<<19  /* %g or %G */
+};
+
+typedef struct {
+  FormatType type;
+  int flags;
+  int width;     /* width OR width parameter number */
+  int precision; /* precision OR precision parameter number */
+  union {
+    char *str;
+    void *ptr;
+    long num;
+#if SIZEOF_LONG_LONG /* if this is non-zero */
+    long long lnum;
+#endif
+    double dnum;
+#if SIZEOF_LONG_DOUBLE
+    long double ldnum;
+#endif
+  } data;
+} va_stack_t;
+
+struct nsprintf {
+  char *buffer;
+  size_t length;
+  size_t max;
+};
+
+struct asprintf {
+  char *buffer; /* allocated buffer */
+  size_t len;   /* length of string */
+  size_t alloc; /* length of alloc */
+};
+
+int msprintf(char *buffer, const char *format, ...);
+
+static int dprintf_DollarString(char *input, char **end)
+{
+  int number=0;
+  while(isdigit((int)*input)) {
+    number *= 10;
+    number += *input-'0';
+    input++;
+  }
+  if(number && ('$'==*input++)) {
+    *end = input;
+    return number;
+  }
+  return 0;
+}
+
+static BOOL dprintf_IsQualifierNoDollar(char c)
+{
+  switch (c) {
+  case '-': case '+': case ' ': case '#': case '.':
+  case '0': case '1': case '2': case '3': case '4':
+  case '5': case '6': case '7': case '8': case '9':
+  case 'h': case 'l': case 'L': case 'Z': case 'q':
+    return TRUE;
+  default:
+    return FALSE;
+  }
+}
+
+#ifdef DPRINTF_DEBUG2
+int dprintf_Pass1Report(va_stack_t *vto, int max)
+{
+  int i;
+  char buffer[128];
+  int bit;
+  int flags;
+
+  for(i=0; i<max; i++) {
+    char *type;
+    switch(vto[i].type) {
+    case FORMAT_UNKNOWN:
+      type = "unknown";
+      break;
+    case FORMAT_STRING:
+      type ="string";
+      break;
+    case FORMAT_PTR:
+      type ="pointer";
+      break;
+    case FORMAT_INT:
+      type = "int";
+      break;
+    case FORMAT_LONG:
+      type = "long";
+      break;
+    case FORMAT_LONGLONG:
+      type = "long long";
+      break;
+    case FORMAT_DOUBLE:
+      type = "double";
+      break;
+    case FORMAT_LONGDOUBLE:
+      type = "long double";
+      break;      
+    }
+
+
+    buffer[0]=0;
+
+    for(bit=0; bit<31; bit++) {
+      flags = vto[i].flags & (1<<bit);
+
+      if(flags & FLAGS_SPACE)
+       strcat(buffer, "space ");
+      else if(flags & FLAGS_SHOWSIGN)
+       strcat(buffer, "plus ");
+      else if(flags & FLAGS_LEFT)
+       strcat(buffer, "left ");
+      else if(flags & FLAGS_ALT)
+       strcat(buffer, "alt ");
+      else if(flags & FLAGS_SHORT)
+       strcat(buffer, "short ");
+      else if(flags & FLAGS_LONG)
+       strcat(buffer, "long ");
+      else if(flags & FLAGS_LONGLONG)
+       strcat(buffer, "longlong ");
+      else if(flags & FLAGS_LONGDOUBLE)
+       strcat(buffer, "longdouble ");
+      else if(flags & FLAGS_PAD_NIL)
+       strcat(buffer, "padnil ");
+      else if(flags & FLAGS_UNSIGNED)
+       strcat(buffer, "unsigned ");
+      else if(flags & FLAGS_OCTAL)
+       strcat(buffer, "octal ");
+      else if(flags & FLAGS_HEX)
+       strcat(buffer, "hex ");
+      else if(flags & FLAGS_UPPER)
+       strcat(buffer, "upper ");
+      else if(flags & FLAGS_WIDTH)
+       strcat(buffer, "width ");
+      else if(flags & FLAGS_WIDTHPARAM)
+       strcat(buffer, "widthparam ");
+      else if(flags & FLAGS_PREC)
+       strcat(buffer, "precision ");
+      else if(flags & FLAGS_PRECPARAM)
+       strcat(buffer, "precparam ");
+      else if(flags & FLAGS_CHAR)
+       strcat(buffer, "char ");
+      else if(flags & FLAGS_FLOATE)
+       strcat(buffer, "floate ");
+      else if(flags & FLAGS_FLOATG)
+       strcat(buffer, "floatg ");
+    }
+    printf("REPORT: %d. %s [%s]\n", i, type, buffer);
+
+  }
+
+
+}
+#endif
+
+/******************************************************************
+ *
+ * Pass 1:
+ * Create an index with the type of each parameter entry and its
+ * value (may vary in size)
+ *
+ ******************************************************************/
+
+static int dprintf_Pass1(char *format, va_stack_t *vto, char **endpos, va_list arglist)
+{
+  char *fmt = format;
+  int param_num = 0;
+  int this_param;
+  int width;
+  int precision;
+  int flags;
+  int max_param=0;
+  int i;
+
+  while (*fmt) {
+    if (*fmt++ == '%') {
+      if (*fmt == '%') {
+       fmt++;
+       continue; /* while */
+      }
+
+      flags = FLAGS_NEW;
+
+      /* Handle the positional case (N$) */
+
+      param_num++;
+      
+      this_param = dprintf_DollarString(fmt, &fmt);
+      if (0 == this_param)
+       /* we got no positional, get the next counter */
+       this_param = param_num;
+
+      if (this_param > max_param)
+       max_param = this_param;
+
+      /*
+       * The parameter with number 'i' should be used. Next, we need
+       * to get SIZE and TYPE of the parameter. Add the information
+       * to our array.
+       */
+
+      width = 0;
+      precision = 0;
+
+      /* Handle the flags */
+
+      while (dprintf_IsQualifierNoDollar(*fmt)) {
+       switch (*fmt++) {
+       case ' ':
+         flags |= FLAGS_SPACE;
+         break;
+       case '+':
+         flags |= FLAGS_SHOWSIGN;
+         break;
+       case '-':
+         flags |= FLAGS_LEFT;
+         flags &= ~FLAGS_PAD_NIL;
+         break;
+       case '#':
+         flags |= FLAGS_ALT;
+         break;
+       case '.':
+         flags |= FLAGS_PREC;
+         if ('*' == *fmt) {
+           /* The precision is picked from a specified parameter */
+
+           flags |= FLAGS_PRECPARAM;
+           fmt++;
+           param_num++;
+
+           i = dprintf_DollarString(fmt, &fmt);
+           if (i)
+             precision = i;
+           else
+             precision = param_num;
+
+           if (precision > max_param)
+             max_param = precision;
+                 }
+         else {
+           flags |= FLAGS_PREC;
+           precision = strtol(fmt, &fmt, 10);
+         }
+         break;
+       case 'h':
+         flags |= FLAGS_SHORT;
+         break;
+       case 'l':
+         if (flags & FLAGS_LONG)
+           flags |= FLAGS_LONGLONG;
+         else
+           flags |= FLAGS_LONG;
+         break;
+       case 'L':
+         flags |= FLAGS_LONGDOUBLE;
+         break;
+       case 'q':
+         flags |= FLAGS_LONGLONG;
+         break;
+       case 'Z':
+         if (sizeof(size_t) > sizeof(unsigned long int))
+           flags |= FLAGS_LONGLONG;
+         if (sizeof(size_t) > sizeof(unsigned int))
+           flags |= FLAGS_LONG;
+         break;
+       case '0':
+         if (!(flags & FLAGS_LEFT))
+           flags |= FLAGS_PAD_NIL;
+         /* FALLTHROUGH */
+       case '1': case '2': case '3': case '4':
+       case '5': case '6': case '7': case '8': case '9':
+         flags |= FLAGS_WIDTH;
+         width = strtol(--fmt, &fmt, 10);
+         break;
+       case '*':  /* Special case */
+         flags |= FLAGS_WIDTHPARAM;
+         param_num++;
+         
+         i = dprintf_DollarString(fmt, &fmt);
+         if(i)
+           width = i;
+         else
+           width = param_num;
+         if(width > max_param)
+           max_param=width;
+         break;
+       default:
+         break;
+       }
+      } /* switch */
+
+      /* Handle the specifier */
+
+      i = this_param - 1;
+
+      switch (*fmt) {
+      case 'S':
+       flags |= FLAGS_ALT;
+       /* FALLTHROUGH */
+      case 's':
+       vto[i].type = FORMAT_STRING;
+       break;
+      case 'n':
+       vto[i].type = FORMAT_INTPTR;
+       break;
+      case 'p':
+       vto[i].type = FORMAT_PTR;
+       break;
+      case 'd': case 'i':
+       vto[i].type = FORMAT_INT;
+       break;
+      case 'u':
+       vto[i].type = FORMAT_INT;
+       flags |= FLAGS_UNSIGNED;
+       break;
+      case 'o':
+       vto[i].type = FORMAT_INT;
+       flags |= FLAGS_OCTAL;
+       break;
+      case 'x':
+       vto[i].type = FORMAT_INT;
+       flags |= FLAGS_HEX;
+       break;
+      case 'X':
+       vto[i].type = FORMAT_INT;
+       flags |= FLAGS_HEX|FLAGS_UPPER;
+       break;
+      case 'c':
+       vto[i].type = FORMAT_INT;
+       flags |= FLAGS_CHAR;
+       break;  
+      case 'f':
+       vto[i].type = FORMAT_DOUBLE;
+       break;
+      case 'e': case 'E':
+       vto[i].type = FORMAT_DOUBLE;
+       flags |= FLAGS_FLOATE| (('E' == *fmt)?FLAGS_UPPER:0);
+       break;
+      case 'g': case 'G':
+       vto[i].type = FORMAT_DOUBLE;
+       flags |= FLAGS_FLOATG| (('G' == *fmt)?FLAGS_UPPER:0);
+       break;  
+      default:
+       vto[i].type = FORMAT_UNKNOWN;
+       break;
+      } /* switch */
+
+      vto[i].flags = flags;
+      vto[i].width = width;
+      vto[i].precision = precision;
+      
+      if (flags & FLAGS_WIDTHPARAM) {
+       /* we have the width specified from a parameter, so we make that
+          parameter's info setup properly */
+       vto[i].width = width - 1;
+       i = width - 1;
+       vto[i].type = FORMAT_WIDTH;
+       vto[i].flags = FLAGS_NEW;
+       vto[i].precision = vto[i].width = 0; /* can't use width or precision
+                                               of width! */    
+      }
+      if (flags & FLAGS_PRECPARAM) {
+       /* we have the precision specified from a parameter, so we make that
+          parameter's info setup properly */
+       vto[i].precision = precision - 1;
+       i = precision - 1;
+       vto[i].type = FORMAT_WIDTH;
+       vto[i].flags = FLAGS_NEW;
+       vto[i].precision = vto[i].width = 0; /* can't use width or precision
+                                               of width! */
+      }
+      *endpos++ = fmt + 1; /* end of this sequence */
+    }
+  }
+
+#ifdef DPRINTF_DEBUG2
+  dprintf_Pass1Report(vto, max_param);
+#endif
+
+  /* Read the arg list parameters into our data list */
+  for (i=0; i<max_param; i++) {
+    if ((i + 1 < max_param) && (vto[i + 1].type == FORMAT_WIDTH))
+      {
+       /* Width/precision arguments must be read before the main argument
+        * they are attached to
+        */
+       vto[i + 1].data.num = va_arg(arglist, int);
+      }
+
+    switch (vto[i].type)
+      {
+      case FORMAT_STRING:
+       vto[i].data.str = va_arg(arglist, char *);
+       break;
+       
+      case FORMAT_INTPTR:
+      case FORMAT_UNKNOWN:
+      case FORMAT_PTR:
+       vto[i].data.ptr = va_arg(arglist, void *);
+       break;
+       
+      case FORMAT_INT:
+#if SIZEOF_LONG_LONG
+       if(vto[i].flags & FLAGS_LONGLONG)
+         vto[i].data.lnum = va_arg(arglist, long long);
+       else
+#endif
+         if(vto[i].flags & FLAGS_LONG)
+           vto[i].data.num = va_arg(arglist, long);
+       else
+         vto[i].data.num = va_arg(arglist, int);
+       break;
+       
+      case FORMAT_DOUBLE:
+#if SIZEOF_LONG_DOUBLE
+       if(vto[i].flags & FLAGS_LONG)
+         vto[i].data.ldnum = va_arg(arglist, long double);
+       else
+#endif
+         vto[i].data.dnum = va_arg(arglist, double);
+       break;
+       
+      case FORMAT_WIDTH:
+       /* Argument has been read. Silently convert it into an integer
+        * for later use
+        */
+       vto[i].type = FORMAT_INT;
+       break;
+       
+      default:
+       break;
+      }
+  }
+
+  return max_param;
+
+}
+
+static int dprintf_formatf(
+             void *data, /* untouched by format(), just sent to the
+                            stream() function in the first argument */
+            int (*stream)(int, FILE *), /* function pointer called for each
+                                           output character */
+            const char *format,    /* %-formatted string */
+            va_list ap_save) /* list of parameters */
+{
+  /* Base-36 digits for numbers.  */
+  const char *digits = lower_digits;
+
+  /* Pointer into the format string.  */
+  char *f;
+
+  /* Number of characters written.  */
+  register size_t done = 0;
+
+  long param; /* current parameter to read */
+  long param_num=0; /* parameter counter */
+
+  va_stack_t vto[MAX_PARAMETERS];
+  char *endpos[MAX_PARAMETERS];
+  char **end;
+
+  char work[BUFFSIZE];
+
+  va_stack_t *p;
+
+  /* Do the actual %-code parsing */
+  dprintf_Pass1((char *)format, vto, endpos, ap_save);
+
+  end = &endpos[0]; /* the initial end-position from the list dprintf_Pass1()
+                       created for us */
+  
+  f = (char *)format;
+  while (*f != '\0') {
+    /* Format spec modifiers.  */
+    char alt;
+    
+    /* Width of a field.  */
+    register long width;
+    /* Precision of a field.  */
+    long prec;
+    
+    /* Decimal integer is negative.  */
+    char is_neg;
+    
+    /* Base of a number to be written.  */
+    long base;
+
+    /* Integral values to be written.  */
+#if SIZEOF_LONG_LONG
+    unsigned long long num;
+#else
+    unsigned long num;
+#endif
+    long signed_num;
+    
+    if (*f != '%') {
+      /* This isn't a format spec, so write everything out until the next one
+        OR end of string is reached.  */
+      do {
+       OUTCHAR(*f);
+      } while(*++f && ('%' != *f));
+      continue;
+    }
+    
+    ++f;
+    
+    /* Check for "%%".  Note that although the ANSI standard lists
+       '%' as a conversion specifier, it says "The complete format
+       specification shall be `%%'," so we can avoid all the width
+       and precision processing.  */
+    if (*f == '%') {
+      ++f;
+      OUTCHAR('%');
+      continue;
+    }
+
+    /* If this is a positional parameter, the position must follow imediately
+       after the %, thus create a %<num>$ sequence */
+    param=dprintf_DollarString(f, &f);
+
+    if(!param)
+      param = param_num;
+    else
+      --param;
+    
+    param_num++; /* increase this always to allow "%2$s %1$s %s" and then the
+                   third %s will pick the 3rd argument */
+
+    p = &vto[param];
+
+    /* pick up the specified width */
+    if(p->flags & FLAGS_WIDTHPARAM)
+      width = vto[p->width].data.num;
+    else
+      width = p->width;
+
+    /* pick up the specified precision */
+    if(p->flags & FLAGS_PRECPARAM)
+      prec = vto[p->precision].data.num;
+    else if(p->flags & FLAGS_PREC)
+      prec = p->precision;
+    else
+      prec = -1;
+
+    alt = p->flags & FLAGS_ALT;
+    
+    switch (p->type) {
+    case FORMAT_INT:
+      num = p->data.num;
+      if(p->flags & FLAGS_CHAR) {
+       /* Character.  */
+       if (!(p->flags & FLAGS_LEFT))
+         while (--width > 0)
+           OUTCHAR(' ');
+       OUTCHAR((char) num);
+       if (p->flags & FLAGS_LEFT)
+         while (--width > 0)
+           OUTCHAR(' ');
+       break;
+      }
+      if(p->flags & FLAGS_UNSIGNED) {
+       /* Decimal unsigned integer.  */
+       base = 10;
+       goto unsigned_number;
+      }
+      if(p->flags & FLAGS_OCTAL) {
+       /* Octal unsigned integer.  */
+       base = 8;
+       goto unsigned_number;
+      }
+      if(p->flags & FLAGS_HEX) {
+       /* Hexadecimal unsigned integer.  */
+
+       digits = (p->flags & FLAGS_UPPER)? upper_digits : lower_digits;
+       base = 16;
+       goto unsigned_number;
+      }
+
+      /* Decimal integer.  */
+      base = 10;
+
+#if SIZEOF_LONG_LONG
+      if(p->flags & FLAGS_LONGLONG) {
+        /* long long */
+       num = p->data.lnum;
+       is_neg = num < 0;
+       num = is_neg ? (- num) : num;
+      }
+      else
+#endif
+      {
+       signed_num = (long) num;
+      
+       is_neg = signed_num < 0;
+       num = is_neg ? (- signed_num) : signed_num;
+      }
+      goto number;
+      
+    unsigned_number:;
+      /* Unsigned number of base BASE.  */
+      is_neg = 0;
+      
+    number:;
+      /* Number of base BASE.  */
+      {
+       char *workend = &work[sizeof(work) - 1];
+       register char *w;
+       
+       /* Supply a default precision if none was given.  */
+       if (prec == -1)
+         prec = 1;
+       
+       /* Put the number in WORK.  */
+       w = workend;
+       while (num > 0) {
+         *w-- = digits[num % base];
+         num /= base;
+       }
+       width -= workend - w;
+       prec -= workend - w;
+       
+       if (alt && base == 8 && prec <= 0) {
+         *w-- = '0';
+         --width;
+       }
+       
+       if (prec > 0) {
+         width -= prec;
+         while (prec-- > 0)
+           *w-- = '0';
+       }
+       
+       if (alt && base == 16)
+         width -= 2;
+       
+       if (is_neg || (p->flags & FLAGS_SHOWSIGN) || (p->flags & FLAGS_SPACE))
+         --width;
+       
+       if (!(p->flags & FLAGS_LEFT) && !(p->flags & FLAGS_PAD_NIL))
+         while (width-- > 0)
+           OUTCHAR(' ');
+       
+       if (is_neg)
+         OUTCHAR('-');
+       else if (p->flags & FLAGS_SHOWSIGN)
+         OUTCHAR('+');
+       else if (p->flags & FLAGS_SPACE)
+         OUTCHAR(' ');
+       
+       if (alt && base == 16) {
+         OUTCHAR('0');
+         if(p->flags & FLAGS_UPPER)
+           OUTCHAR('X');
+         else
+           OUTCHAR('x');
+       }
+
+       if (!(p->flags & FLAGS_LEFT) && (p->flags & FLAGS_PAD_NIL))
+         while (width-- > 0)
+           OUTCHAR('0');
+       
+       /* Write the number.  */
+       while (++w <= workend) {
+         OUTCHAR(*w);
+       }
+       
+       if (p->flags & FLAGS_LEFT)
+         while (width-- > 0)
+           OUTCHAR(' ');
+      }
+      break;
+      
+    case FORMAT_STRING:
+           /* String.  */
+      {
+       static char null[] = "(nil)";
+       char *str;
+       size_t len;
+       
+       str = (char *) p->data.str;
+       if ( str == NULL) {
+         /* Write null[] if there's space.  */
+         if (prec == -1 || prec >= (long) sizeof(null) - 1) {
+           str = null;
+           len = sizeof(null) - 1;
+           /* Disable quotes around (nil) */
+           p->flags &= (~FLAGS_ALT);
+         }
+         else {
+           str = "";
+           len = 0;
+         }
+       }
+       else
+         len = strlen(str);
+       
+       if (prec != -1 && (size_t) prec < len)
+         len = prec;
+       width -= len;
+
+       if (p->flags & FLAGS_ALT)
+         OUTCHAR('"');
+
+       if (!(p->flags&FLAGS_LEFT))
+         while (width-- > 0)
+           OUTCHAR(' ');
+       
+       while (len-- > 0)
+         OUTCHAR(*str++);
+       if (p->flags&FLAGS_LEFT)
+         while (width-- > 0)
+           OUTCHAR(' ');
+
+       if (p->flags & FLAGS_ALT)
+         OUTCHAR('"');
+      }
+      break;
+      
+    case FORMAT_PTR:
+      /* Generic pointer.  */
+      {
+       void *ptr;
+       ptr = (void *) p->data.ptr;
+       if (ptr != NULL) {
+         /* If the pointer is not NULL, write it as a %#x spec.  */
+         base = 16;
+         digits = (p->flags & FLAGS_UPPER)? upper_digits : lower_digits;
+         alt = 1;
+         num = (unsigned long) ptr;
+         is_neg = 0;
+         goto number;
+       }
+       else {
+         /* Write "(nil)" for a nil pointer.  */
+         static char nil[] = "(nil)";
+         register char *point;
+         
+         width -= sizeof(nil) - 1;
+         if (p->flags & FLAGS_LEFT)
+           while (width-- > 0)
+             OUTCHAR(' ');
+         for (point = nil; *point != '\0'; ++point)
+           OUTCHAR(*point);
+         if (! (p->flags & FLAGS_LEFT))
+           while (width-- > 0)
+             OUTCHAR(' ');
+       }
+      }
+      break;
+
+    case FORMAT_DOUBLE:
+      {
+       char formatbuf[32]="%";
+       char *fptr;
+       
+       width = -1;
+       if (p->flags & FLAGS_WIDTH)
+         width = p->width;
+       else if (p->flags & FLAGS_WIDTHPARAM)
+         width = vto[p->width].data.num;
+
+       prec = -1;
+       if (p->flags & FLAGS_PREC)
+         prec = p->precision;
+       else if (p->flags & FLAGS_PRECPARAM)
+         prec = vto[p->precision].data.num;
+
+       if (p->flags & FLAGS_LEFT)
+         strcat(formatbuf, "-");
+       if (p->flags & FLAGS_SHOWSIGN)
+         strcat(formatbuf, "+");
+       if (p->flags & FLAGS_SPACE)
+         strcat(formatbuf, " ");
+       if (p->flags & FLAGS_ALT)
+         strcat(formatbuf, "#");
+
+       fptr=&formatbuf[strlen(formatbuf)];
+
+       if(width >= 0) {
+         /* RECURSIVE USAGE */
+         fptr += msprintf(fptr, "%d", width);
+       }
+       if(prec >= 0) {
+         /* RECURSIVE USAGE */
+         fptr += msprintf(fptr, ".%d", prec);
+       }
+       if (p->flags & FLAGS_LONG)
+         strcat(fptr, "l");
+
+       if (p->flags & FLAGS_FLOATE)
+         strcat(fptr, p->flags&FLAGS_UPPER?"E":"e");
+       else if (p->flags & FLAGS_FLOATG)
+         strcat(fptr, (p->flags & FLAGS_UPPER) ? "G" : "g");
+       else
+         strcat(fptr, "f");
+
+       /* NOTE NOTE NOTE!! Not all sprintf() implementations returns number
+          of output characters */
+#if SIZEOF_LONG_DOUBLE
+       if (p->flags & FLAGS_LONG)
+         /* This is for support of the 'long double' type */
+         (sprintf)(work, formatbuf, p->data.ldnum);
+       else
+#endif
+         (sprintf)(work, formatbuf, p->data.dnum);
+
+       for(fptr=work; *fptr; fptr++)
+         OUTCHAR(*fptr);
+      }
+      break;
+
+    case FORMAT_INTPTR:
+      /* Answer the count of characters written.  */
+#if SIZEOF_LONG_LONG
+      if (p->flags & FLAGS_LONGLONG)
+       *(long long int *) p->data.ptr = done;
+      else
+#endif
+       if (p->flags & FLAGS_LONG)
+         *(long int *) p->data.ptr = done;
+      else if (!(p->flags & FLAGS_SHORT))
+       *(int *) p->data.ptr = done;
+      else
+       *(short int *) p->data.ptr = done;
+      break;
+
+    default:
+      break;
+    }
+    f = *end++; /* goto end of %-code */
+
+  }
+  return done;
+}
+
+static int StoreNonPrintable(int output, struct nsprintf *infop)
+{
+  /* If the character isn't printable then we convert it */
+  char work[64], *w;
+  int num = output;
+
+  w = &work[sizeof(work)];
+  *(--w) = (char)0;
+  for(; num > 0; num /= 10) {
+    *(--w) = lower_digits[num % 10];
+  }
+  if (infop->length + strlen(w) + 1 < infop->max)
+    {
+      infop->buffer[0] = '\\';
+      infop->buffer++;
+      infop->length++;
+      for (; *w; w++)
+       {
+         infop->buffer[0] = *w;
+         infop->buffer++;
+         infop->length++;
+       }
+      return output;
+    }
+  return -1;
+}
+
+/* fputc() look-alike */
+static int addbyter(int output, FILE *data)
+{
+  struct nsprintf *infop=(struct nsprintf *)data;
+  if(infop->length < infop->max) {
+    /* only do this if we haven't reached max length yet */
+    if (isprint(output) || isspace(output))
+      {
+       infop->buffer[0] = (char)output; /* store */
+       infop->buffer++; /* increase pointer */
+       infop->length++; /* we are now one byte larger */
+      }
+    else
+      {
+       return StoreNonPrintable(output, infop);
+      }
+    return output; /* fputc() returns like this on success */
+  }
+  return -1;
+}
+
+int msnprintf(char *buffer, size_t maxlength, const char *format, ...)
+{
+  va_list ap_save; /* argument pointer */
+  int retcode;
+  struct nsprintf info;
+
+  info.buffer = buffer;
+  info.length = 0;
+  info.max = maxlength;
+
+  va_start(ap_save, format);
+  retcode = dprintf_formatf(&info, addbyter, format, ap_save);
+  va_end(ap_save);
+  info.buffer[0] = 0; /* we terminate this with a zero byte */
+
+  /* we could even return things like */
+  
+  return retcode;
+}
+
+int mvsnprintf(char *buffer, size_t maxlength, const char *format, va_list ap_save)
+{
+  int retcode;
+  struct nsprintf info;
+
+  info.buffer = buffer;
+  info.length = 0;
+  info.max = maxlength;
+
+  retcode = dprintf_formatf(&info, addbyter, format, ap_save);
+  info.buffer[0] = 0; /* we terminate this with a zero byte */
+  return retcode;
+}
+
+
+/* fputc() look-alike */
+static int alloc_addbyter(int output, FILE *data)
+{
+  struct asprintf *infop=(struct asprintf *)data;
+  if(!infop->buffer) {
+    infop->buffer=(char *)malloc(32);
+    if(!infop->buffer)
+      return -1; /* fail */
+    infop->alloc = 32;
+    infop->len =0;
+  }
+  else if(infop->len+1 >= infop->alloc) {
+    char *newptr;
+
+    newptr = (char *)realloc(infop->buffer, infop->alloc*2);
+
+    if(!newptr) {
+      return -1;
+    }
+    infop->buffer = newptr;
+    infop->alloc *= 2;
+  }
+
+  infop->buffer[ infop->len ] = output;
+
+  infop->len++;
+
+  return output; /* fputc() returns like this on success */
+
+}
+
+char *maprintf(const char *format, ...)
+{
+  va_list ap_save; /* argument pointer */
+  int retcode;
+  struct asprintf info;
+
+  info.buffer = NULL;
+  info.len = 0;
+  info.alloc = 0;
+
+  va_start(ap_save, format);
+  retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save);
+  va_end(ap_save);
+  if(info.len) {
+    info.buffer[info.len] = 0; /* we terminate this with a zero byte */
+    return info.buffer;
+  }
+  else
+    return NULL;
+}
+
+char *mvaprintf(const char *format, va_list ap_save)
+{
+  int retcode;
+  struct asprintf info;
+
+  info.buffer = NULL;
+  info.len = 0;
+  info.alloc = 0;
+
+  retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save);
+  info.buffer[info.len] = 0; /* we terminate this with a zero byte */
+  if(info.len) {
+    info.buffer[info.len] = 0; /* we terminate this with a zero byte */
+    return info.buffer;
+  }
+  else
+    return NULL;
+}
+
+static int storebuffer(int output, FILE *data)
+{
+  char **buffer = (char **)data;
+  **buffer = (char)output;
+  (*buffer)++;
+  return output; /* act like fputc() ! */
+}
+
+int msprintf(char *buffer, const char *format, ...)
+{
+  va_list ap_save; /* argument pointer */
+  int retcode;
+  va_start(ap_save, format);
+  retcode = dprintf_formatf(&buffer, storebuffer, format, ap_save);
+  va_end(ap_save);
+  *buffer=0; /* we terminate this with a zero byte */
+  return retcode;
+}
+
+extern int fputc(int, FILE *);
+
+int mprintf(const char *format, ...)
+{
+  int retcode;
+  va_list ap_save; /* argument pointer */
+  va_start(ap_save, format);
+  retcode = dprintf_formatf(stdout, fputc, format, ap_save);
+  va_end(ap_save);
+  return retcode;
+}
+
+int mfprintf(FILE *whereto, const char *format, ...)
+{
+  int retcode;
+  va_list ap_save; /* argument pointer */
+  va_start(ap_save, format);
+  retcode = dprintf_formatf(whereto, fputc, format, ap_save);
+  va_end(ap_save);
+  return retcode;
+}
+
+int mvsprintf(char *buffer, const char *format, va_list ap_save)
+{
+  int retcode;
+  retcode = dprintf_formatf(&buffer, storebuffer, format, ap_save);
+  *buffer=0; /* we terminate this with a zero byte */
+  return retcode;
+}
+
+int mvprintf(const char *format, va_list ap_save)
+{
+  return dprintf_formatf(stdout, fputc, format, ap_save);
+}
+
+int mvfprintf(FILE *whereto, const char *format, va_list ap_save)
+{
+  return dprintf_formatf(whereto, fputc, format, ap_save);
+}
+
+#ifdef DPRINTF_DEBUG
+int main()
+{
+  char buffer[129];
+  char *ptr;
+#ifdef SIZEOF_LONG_LONG
+  long long hullo;
+  dprintf("%3$12s %1$s %2$qd %4$d\n", "daniel", hullo, "stenberg", 65);
+#endif
+
+  mprintf("%3d %5d\n", 10, 1998);
+  
+  ptr=maprintf("test this then baby %s%s%s%s%s%s %d %d %d loser baby get a hit in yer face now!", "", "pretty long string pretty long string pretty long string pretty long string pretty long string", "/", "/", "/", "pretty long string", 1998, 1999, 2001);
+
+  puts(ptr);
+
+  memset(ptr, 55, strlen(ptr)+1);
+
+  free(ptr);
+
+#if 1
+  mprintf(buffer, "%s %s %d", "daniel", "stenberg", 19988);
+  puts(buffer);
+
+  mfprintf(stderr, "%s %#08x\n", "dummy", 65);
+
+  printf("%s %#08x\n", "dummy", 65);
+  {
+    double tryout = 3.14156592;
+    mprintf(buffer, "%.2g %G %f %e %E", tryout, tryout, tryout, tryout, tryout);
+    puts(buffer);
+    printf("%.2g %G %f %e %E\n", tryout, tryout, tryout, tryout, tryout);
+  }
+#endif
+
+  return 0;
+}
+
+#endif
diff --git a/lib/netrc.c b/lib/netrc.c
new file mode 100644 (file)
index 0000000..f0e1382
--- /dev/null
@@ -0,0 +1,182 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ *  Contributor(s):
+ *   Rafael Sagula <sagula@inf.ufrgs.br>
+ *   Sampo Kellomaki <sampo@iki.fi>
+ *   Linas Vepstas <linas@linas.org>
+ *   Bjorn Reese <breese@imada.ou.dk>
+ *   Johan Anderson <johan@homemail.com>
+ *   Kjell Ericson <Kjell.Ericson@haxx.nu>
+ *   Troy Engel <tengel@palladium.net>
+ *   Ryan Nelson <ryan@inch.com>
+ *   Bjorn Stenberg <Bjorn.Stenberg@haxx.nu>
+ *   Angus Mackay <amackay@gus.ml.org>
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "setup.h"
+#include "getenv.h"
+
+/* Debug this single source file with:
+   'make netrc' then run './netrc'!
+
+   Oh, make sure you have a .netrc file too ;-)
+ */
+
+/* Get user and password from .netrc when given a machine name */
+
+enum {
+  NOTHING,
+  HOSTFOUND,    /* the 'machine' keyword was found */
+  HOSTCOMPLETE, /* the machine name following the keyword was found too */
+  HOSTVALID,    /* this is "our" machine! */
+
+  HOSTEND /* LAST enum */
+};
+
+/* make sure we have room for at least this size: */
+#define LOGINSIZE 64
+#define PASSWORDSIZE 64
+
+int ParseNetrc(char *host,
+              char *login,
+              char *password)
+{
+  FILE *file;
+  char netrcbuffer[256];
+  int retcode=1;
+  
+  char *home = GetEnv("HOME"); /* portable environment reader */
+  int state=NOTHING;
+
+  char state_login=0;
+  char state_password=0;
+
+#define NETRC DOT_CHAR "netrc"
+
+  if(!home || (strlen(home)>(sizeof(netrcbuffer)-strlen(NETRC))))
+    return -1;
+
+  sprintf(netrcbuffer, "%s%s%s", home, DIR_CHAR, NETRC);
+
+  file = fopen(netrcbuffer, "r");
+  if(file) {
+    char *tok;
+    while(fgets(netrcbuffer, sizeof(netrcbuffer), file)) {
+      tok=strtok(netrcbuffer, " \t\n");
+      while(tok) {
+       switch(state) {
+       case NOTHING:
+         if(strequal("machine", tok)) {
+           /* the next tok is the machine name, this is in itself the
+              delimiter that starts the stuff entered for this machine,
+              after this we need to search for 'login' and
+              'password'. */
+           state=HOSTFOUND;
+         }
+         break;
+       case HOSTFOUND:
+         if(strequal(host, tok)) {
+           /* and yes, this is our host! */
+           state=HOSTVALID;
+#ifdef _NETRC_DEBUG
+           printf("HOST: %s\n", tok);
+#endif
+           retcode=0; /* we did find our host */
+         }
+         else
+           /* not our host */
+           state=NOTHING;
+         break;
+       case HOSTVALID:
+         /* we are now parsing sub-keywords concerning "our" host */
+         if(state_login) {
+           strncpy(login, tok, LOGINSIZE-1);
+#ifdef _NETRC_DEBUG
+           printf("LOGIN: %s\n", login);
+#endif
+           state_login=0;
+         }
+         else if(state_password) {
+           strncpy(password, tok, PASSWORDSIZE-1);
+#if _NETRC_DEBUG
+           printf("PASSWORD: %s\n", password);
+#endif
+           state_password=0;
+         }
+         else if(strequal("login", tok))
+           state_login=1;
+         else if(strequal("password", tok))
+           state_password=1;
+         else if(strequal("machine", tok)) {
+           /* ok, there's machine here go => */
+           state = HOSTFOUND;
+         }
+         break;
+       } /* switch (state) */
+       tok = strtok(NULL, " \t\n");
+      } /* while (tok) */
+    } /* while fgets() */
+
+    fclose(file);
+  }
+
+  return retcode;
+}
+
+#ifdef _NETRC_DEBUG
+int main(int argc, char **argv)
+{
+  char login[64]="";
+  char password[64]="";
+
+  if(argc<2)
+    return -1;
+
+  if(0 == ParseNetrc(argv[1], login, password)) {
+    printf("HOST: %s LOGIN: %s PASSWORD: %s\n",
+          argv[1], login, password);
+  }
+}
+
+#endif
diff --git a/lib/netrc.h b/lib/netrc.h
new file mode 100644 (file)
index 0000000..2875cbc
--- /dev/null
@@ -0,0 +1,70 @@
+#ifndef __NETRC_H
+#define __NETRC_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ *  Contributor(s):
+ *   Rafael Sagula <sagula@inf.ufrgs.br>
+ *   Sampo Kellomaki <sampo@iki.fi>
+ *   Linas Vepstas <linas@linas.org>
+ *   Bjorn Reese <breese@imada.ou.dk>
+ *   Johan Anderson <johan@homemail.com>
+ *   Kjell Ericson <Kjell.Ericson@haxx.nu>
+ *   Troy Engel <tengel@palladium.net>
+ *   Ryan Nelson <ryan@inch.com>
+ *   Bjorn Stenberg <Bjorn.Stenberg@haxx.nu>
+ *   Angus Mackay <amackay@gus.ml.org>
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ * $Log$
+ * Revision 1.1  1999-12-29 14:21:35  bagder
+ * Initial revision
+ *
+ * Revision 1.3  1999/09/06 06:59:41  dast
+ * Changed email info
+ *
+ * Revision 1.2  1999/08/13 07:34:48  dast
+ * Changed the URL in the header
+ *
+ * Revision 1.1.1.1  1999/03/11 22:23:34  dast
+ * Imported sources
+ *
+ ****************************************************************************/
+int ParseNetrc(char *host,
+              char *login,
+              char *password);
+#endif
diff --git a/lib/progress.c b/lib/progress.c
new file mode 100644 (file)
index 0000000..6a08337
--- /dev/null
@@ -0,0 +1,221 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <string.h>
+#include "setup.h"
+
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+#if defined(__MINGW32__)
+#include <winsock.h>
+#endif
+#include <time.h>
+#endif
+
+#include <curl/curl.h>
+#include "urldata.h"
+
+#include "progress.h"
+
+/* --- start of progress routines --- */
+int progressmax=-1;
+
+static int prev = 0;
+static int width = 0;
+
+void ProgressInit(struct UrlData *data, int max)
+{
+  if(data->conf&(CONF_NOPROGRESS|CONF_MUTE))
+    return;
+
+  prev = 0;
+
+/* TODO: get terminal width through ansi escapes or something similar.
+         try to update width when xterm is resized... - 19990617 larsa */
+  if (curl_GetEnv("COLUMNS") != NULL)
+    width = atoi(curl_GetEnv("COLUMNS"));
+  else
+    width = 80;
+
+  progressmax = max;
+  if(-1 == max)
+    return;
+  if(progressmax <= LEAST_SIZE_PROGRESS) {
+    progressmax = -1; /* disable */
+    return;
+  }
+
+  if ( data->progressmode == CURL_PROGRESS_STATS )
+    fprintf(data->err,
+            "  %%   Received   Total  Speed   Time left  Total   Curr.Speed\n");
+}
+
+void time2str(char *r, int t)
+{
+  int h = (t/3600);
+  int m = (t-(h*3600))/60;
+  int s = (t-(h*3600)-(m*60));
+  sprintf(r,"%3d:%02d:%02d",h,m,s);
+}
+
+void ProgressShow(struct UrlData *data,
+                  int point, struct timeval start, struct timeval now, bool force)
+{
+  switch ( data->progressmode ) {
+  case CURL_PROGRESS_STATS:
+    {
+      static long lastshow;
+      double percen;
+
+      double spent;
+      double speed;
+
+#define CURR_TIME 5
+
+      static int speeder[ CURR_TIME ];
+      static int speeder_c=0;
+
+      int nowindex = speeder_c% CURR_TIME;
+      int checkindex;
+      int count;
+
+      if(!force && (point != progressmax) && (lastshow == tvlong(now)))
+        return; /* never update this more than once a second if the end isn't 
+                   reached */
+
+      spent = tvdiff (now, start);
+      speed = point/(spent!=0.0?spent:1.0);
+      if(!speed)
+        speed=1;
+
+      /* point is where we are right now */
+      speeder[ nowindex ] = point;
+      speeder_c++; /* increase */
+      count = ((speeder_c>=CURR_TIME)?CURR_TIME:speeder_c) - 1;
+      checkindex = (speeder_c>=CURR_TIME)?speeder_c%CURR_TIME:0;
+
+      /* find out the average speed the last CURR_TIME seconds */
+      data->current_speed = (speeder[nowindex]-speeder[checkindex])/(count?count:1);
+
+#if 0
+      printf("NOW %d(%d) THEN %d(%d) DIFF %lf COUNT %d\n",
+            speeder[nowindex], nowindex,
+            speeder[checkindex], checkindex,
+            data->current_speed, count);
+#endif
+
+      if(data->conf&(CONF_NOPROGRESS|CONF_MUTE))
+        return;
+
+      if(-1 != progressmax) {
+        char left[20],estim[20];
+        int estimate = progressmax/(int) speed;
+    
+        time2str(left,estimate-(int) spent); 
+        time2str(estim,estimate);
+
+        percen=(double)point/progressmax;
+        percen=percen*100;
+
+        fprintf(data->err, "\r%3d %8d  %8d %6.0lf %s %s %6.0lf   ",
+                (int)percen, point, progressmax,
+                speed, left, estim, data->current_speed);
+      }
+      else
+        fprintf(data->err,
+                "\r%d bytes received in %.3lf seconds (%.0lf bytes/sec)",
+                point, spent, speed);
+
+      lastshow = now.tv_sec;
+      break;
+    }
+  case CURL_PROGRESS_BAR: /* 19990617 larsa */
+    {
+      if (point == prev) break;
+      if (progressmax == -1) {
+        int prevblock = prev / 1024;
+        int thisblock = point / 1024;
+        while ( thisblock > prevblock ) {
+            fprintf( data->err, "#" );
+            prevblock++;
+        }
+        prev = point;
+      } else {
+        char line[256];
+        char outline[256];
+        char format[40];
+        float frac = (float) point / (float) progressmax;
+        float percent = frac * 100.0f;
+        int barwidth = width - 7;
+        int num = (int) (((float)barwidth) * frac);
+        int i = 0;
+        for ( i = 0; i < num; i++ ) {
+            line[i] = '#';
+        }
+        line[i] = '\0';
+        sprintf( format, "%%-%ds %%5.1f%%%%", barwidth );
+        sprintf( outline, format, line, percent );
+        fprintf( data->err, "\r%s", outline );
+      }
+      prev = point;
+      break;
+    }
+  default: /* 19990617 larsa */
+    {
+      int prevblock = prev / 1024;
+      int thisblock = point / 1024;
+      if (prev == point) break;
+      while ( thisblock > prevblock ) {
+        fprintf( data->err, "#" );
+        prevblock++;
+      }
+      prev = point;
+      break;
+    }
+  }
+}
+
+void ProgressEnd(struct UrlData *data)
+{
+  if(data->conf&(CONF_NOPROGRESS|CONF_MUTE))
+    return;
+  fputs("\n", data->err);
+}
+
+/* --- end of progress routines --- */
diff --git a/lib/progress.h b/lib/progress.h
new file mode 100644 (file)
index 0000000..6babd89
--- /dev/null
@@ -0,0 +1,54 @@
+#ifndef __PROGRESS_H
+#define __PROGRESS_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include "timeval.h"
+
+void ProgressInit(struct UrlData *data, int max);
+void ProgressShow(struct UrlData *data,
+                  int point, struct timeval start, struct timeval now, bool force);
+void ProgressEnd(struct UrlData *data);
+void ProgressMode(int mode);
+
+/* Don't show progress for sizes smaller than: */
+#define LEAST_SIZE_PROGRESS BUFSIZE
+
+#endif /* __PROGRESS_H */
diff --git a/lib/sendf.c b/lib/sendf.c
new file mode 100644 (file)
index 0000000..387984d
--- /dev/null
@@ -0,0 +1,115 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "setup.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+#include <winsock.h>
+#endif
+
+#include <curl/curl.h>
+#include "urldata.h"
+
+#include <curl/mprintf.h>
+
+/* infof() is for info message along the way */
+
+void infof(struct UrlData *data, char *fmt, ...)
+{
+  va_list ap;
+  if(data->conf & CONF_VERBOSE) {
+    va_start(ap, fmt);
+    fputs("* ", data->err);
+    vfprintf(data->err, fmt, ap);
+    va_end(ap);
+  }
+}
+
+/* failf() is for messages stating why we failed, the LAST one will be
+   returned for the user (if requested) */
+
+void failf(struct UrlData *data, char *fmt, ...)
+{
+  va_list ap;
+  va_start(ap, fmt);
+  if(data->errorbuffer)
+    vsprintf(data->errorbuffer, fmt, ap);
+  else /* no errorbuffer receives this, write to data->err instead */
+    vfprintf(data->err, fmt, ap);
+  va_end(ap);
+}
+
+/* sendf() sends the formated data to the server */
+
+int sendf(int fd, struct UrlData *data, char *fmt, ...)
+{
+  size_t bytes_written;
+  char *s;
+  va_list ap;
+  va_start(ap, fmt);
+  s = mvaprintf(fmt, ap);
+  va_end(ap);
+  if(!s)
+    return 0; /* failure */
+  if(data->conf & CONF_VERBOSE)
+    fprintf(data->err, "> %s", s);
+#ifndef USE_SSLEAY
+   bytes_written = swrite(fd, s, strlen(s));
+#else
+  if (data->use_ssl) {
+    bytes_written = SSL_write(data->ssl, s, strlen(s));
+  } else {
+    bytes_written = swrite(fd, s, strlen(s));
+  }
+#endif /* USE_SSLEAY */
+  free(s); /* free the output string */
+  return(bytes_written);
+}
+
+
+
+
diff --git a/lib/sendf.h b/lib/sendf.h
new file mode 100644 (file)
index 0000000..de65719
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef __SENDF_H
+#define __SENDF_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+int sendf(int fd, struct UrlData *, char *fmt, ...);
+void infof(struct UrlData *, char *fmt, ...);
+void failf(struct UrlData *, char *fmt, ...);
+
+#endif
diff --git a/lib/setup.h b/lib/setup.h
new file mode 100644 (file)
index 0000000..6770ec6
--- /dev/null
@@ -0,0 +1,169 @@
+#ifndef __SETUP_H
+#define __SETUP_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <stdio.h>
+
+#if !defined(WIN32) && defined(_WIN32)
+/* This _might_ be a good Borland fix. Please report whether this works or
+   not! */
+#define WIN32
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h" /* the configure script results */
+#else
+#ifdef WIN32
+/* include the hand-modified win32 adjusted config.h! */
+#include "../config-win32.h"
+#endif
+#endif
+
+
+
+#ifndef OS
+#ifdef WIN32
+#define OS "win32"
+#else
+#define OS "unknown"
+#endif
+#endif
+
+#if defined(HAVE_X509_H) && defined(HAVE_SSL_H) && defined(HAVE_RSA_H) && \
+defined(HAVE_PEM_H) && defined(HAVE_ERR_H) && defined(HAVE_CRYPTO_H) && \
+defined(HAVE_LIBSSL) && defined(HAVE_LIBCRYPTO)
+  /* the six important includes files all exist and so do both libs,
+     defined SSLeay usage */
+#define USE_SSLEAY 1
+#endif
+#if defined(HAVE_OPENSSL_X509_H) && defined(HAVE_OPENSSL_SSL_H) && \
+defined(HAVE_OPENSSL_RSA_H) && defined(HAVE_OPENSSL_PEM_H) && \
+defined(HAVE_OPENSSL_ERR_H) && defined(HAVE_OPENSSL_CRYPTO_H) && \
+defined(HAVE_LIBSSL) && defined(HAVE_LIBCRYPTO)
+  /* the six important includes files all exist and so do both libs,
+     defined SSLeay usage */
+#define USE_SSLEAY 1
+#define USE_OPENSSL 1
+#endif
+
+#ifndef STDC_HEADERS /* no standard C headers! */
+#include "stdcheaders.h"
+#else
+#ifdef _AIX
+#include "stdcheaders.h"
+#endif
+#endif
+
+#if 0 /* zlib experiments are halted 17th october, 1999 (Daniel) */
+#if defined(HAVE_ZLIB_H) && defined(HAVE_LIBZ)
+     /* Both lib and header file exist, we have libz! */
+#define USE_ZLIB
+#endif
+#endif
+
+#ifdef HAVE_STRCASECMP
+#define strnequal(x,y,z) !(strncasecmp)(x,y,z)
+#define strequal(x,y) !(strcasecmp)(x,y)
+
+#else
+#define strnequal(x,y,z) !strnicmp(x,y,z)
+#define strequal(x,y) !stricmp(x,y)
+#endif
+
+/* Below we define four functions. They should
+   1. close a socket
+   2. read from a socket
+   3. write to a socket
+   (Hopefully, only win32-crap do this weird name changing)
+
+   4. set the SIGALRM signal timeout
+   5. set dir/file naming defines
+   */
+
+#ifdef WIN32
+#if !defined(__GNUC__) || defined(__MINGW32__)
+#define sclose(x) closesocket(x)
+#define sread(x,y,z) recv(x,y,z,0)
+#define swrite(x,y,z) (size_t)send(x,y,z,0)
+#define myalarm(x) /* win32 is a silly system */
+#else
+     /* gcc-for-win is still good :) */
+#define sclose(x) close(x)
+#define sread(x,y,z) read(x,y,z)
+#define swrite(x,y,z) write(x,y,z)
+#define myalarm(x) alarm(x)
+#endif
+
+#define PATH_CHAR     ";"
+#define DIR_CHAR      "\\"
+#define DOT_CHAR      "_"
+
+#else
+#define sclose(x) close(x)
+#define sread(x,y,z) read(x,y,z)
+#define swrite(x,y,z) write(x,y,z)
+#define myalarm(x) alarm(x)
+
+#define PATH_CHAR     ":"
+#define DIR_CHAR      "/"
+#define DOT_CHAR      "."
+
+#ifdef HAVE_STRCASECMP
+/* this is for "-ansi -Wall -pedantic" to stop complaining! */
+extern int (strcasecmp)(const char *s1, const char *s2);
+extern int (strncasecmp)(const char *s1, const char *s2, size_t n);
+#ifndef fileno /* sunos 4 have this as a macro! */
+int fileno( FILE *stream);
+#endif
+#endif
+
+#endif
+
+/*
+ * FIXME: code for getting a passwd in windows/non termcap/signal systems?
+ */
+#ifndef WIN32
+#define get_password(x) getpass(x)
+#else
+#define get_password(x) 
+#endif
+
+#endif /* __CONFIG_H */
diff --git a/lib/speedcheck.c b/lib/speedcheck.c
new file mode 100644 (file)
index 0000000..5647b50
--- /dev/null
@@ -0,0 +1,81 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <stdio.h>
+#if defined(__MINGW32__)
+#include <winsock.h>
+#endif
+
+#include <curl/curl.h>
+#include "urldata.h"
+#include "sendf.h"
+#include "speedcheck.h"
+
+UrgError speedcheck(struct UrlData *data,
+                    struct timeval now)
+{
+  static struct timeval keeps_speed;
+
+  if((data->current_speed >= 0) &&
+     data->low_speed_time &&
+     (tvlong(keeps_speed) != 0) &&
+     (data->current_speed < data->low_speed_limit)) {
+
+    /* We are now below the "low speed limit". If we are below it
+       for "low speed time" seconds we consider that enough reason
+       to abort the download. */
+    
+    if( tvdiff(now, keeps_speed) > data->low_speed_time) {
+      /* we have been this slow for long enough, now die */
+      failf(data,
+           "Operation too slow. "
+           "Less than %d bytes/sec transfered the last %d seconds",
+           data->low_speed_limit,
+           data->low_speed_time);
+      return URG_OPERATION_TIMEOUTED;
+    }
+  }
+  else {
+    /* we keep up the required speed all right */
+    keeps_speed = now;
+  }
+  return URG_OK;
+}
+
diff --git a/lib/speedcheck.h b/lib/speedcheck.h
new file mode 100644 (file)
index 0000000..27e7ba2
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef __SPEEDCHECK_H
+#define __SPEEDCHECK_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include "setup.h"
+
+#include "timeval.h"
+
+UrgError speedcheck(struct UrlData *data,
+                    struct timeval now);
+
+#endif
diff --git a/lib/ssluse.c b/lib/ssluse.c
new file mode 100644 (file)
index 0000000..bb78df0
--- /dev/null
@@ -0,0 +1,265 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "urldata.h"
+#include "sendf.h"
+
+#ifdef USE_SSLEAY
+
+static char global_passwd[64];
+
+static int passwd_callback(char *buf, int num, int verify
+#if OPENSSL_VERSION_NUMBER >= 0x00904100L
+                           /* This was introduced in 0.9.4, we can set this
+                              using SSL_CTX_set_default_passwd_cb_userdata()
+                              */
+                           , void *userdata
+#endif
+                           )
+{
+  if(verify)
+    fprintf(stderr, "%s\n", buf);
+  else {
+    if(num > strlen(global_passwd)) {
+      strcpy(buf, global_passwd);
+      return strlen(buf);
+    }
+  }  
+  return 0;
+}
+
+/* This function is *highly* inspired by (and parts are directly stolen
+ * from) source from the SSLeay package written by Eric Young
+ * (eay@cryptsoft.com).  */
+
+int SSL_cert_stuff(struct UrlData *data, 
+                  char *cert_file,
+                  char *key_file)
+{
+  if (cert_file != NULL) {
+    SSL *ssl;
+    X509 *x509;
+
+    if(data->cert_passwd) {
+      /*
+       * If password has been given, we store that in the global
+       * area (*shudder*) for a while:
+       */
+      strcpy(global_passwd, data->cert_passwd);
+      /* Set passwd callback: */
+      SSL_CTX_set_default_passwd_cb(data->ctx, passwd_callback);
+    }
+
+    if (SSL_CTX_use_certificate_file(data->ctx,
+                                    cert_file,
+                                    SSL_FILETYPE_PEM) <= 0) {
+      failf(data, "unable to set certificate file (wrong password?)\n");
+      return(0);
+    }
+    if (key_file == NULL)
+      key_file=cert_file;
+
+    if (SSL_CTX_use_PrivateKey_file(data->ctx,
+                                   key_file,
+                                   SSL_FILETYPE_PEM) <= 0) {
+      failf(data, "unable to set public key file\n");
+      return(0);
+    }
+    
+    ssl=SSL_new(data->ctx);
+    x509=SSL_get_certificate(ssl);
+    
+    if (x509 != NULL)
+      EVP_PKEY_copy_parameters(X509_get_pubkey(x509),
+                              SSL_get_privatekey(ssl));
+    SSL_free(ssl);
+
+    /* If we are using DSA, we can copy the parameters from
+     * the private key */
+               
+    
+    /* Now we know that a key and cert have been set against
+     * the SSL context */
+    if (!SSL_CTX_check_private_key(data->ctx)) {
+      failf(data, "Private key does not match the certificate public key\n");
+      return(0);
+    }
+    
+    /* erase it now */
+    memset(global_passwd, 0, sizeof(global_passwd));
+  }
+  return(1);
+}
+
+#endif
+
+#if SSL_VERIFY_CERT
+int cert_verify_callback(int ok, X509_STORE_CTX *ctx)
+{
+  X509 *err_cert;
+  char buf[256];
+
+  err_cert=X509_STORE_CTX_get_current_cert(ctx);
+  X509_NAME_oneline(X509_get_subject_name(err_cert),buf,256);
+
+  return 1;
+}
+
+#endif
+
+/* ====================================================== */
+int
+UrgSSLConnect (struct UrlData *data)
+{
+#ifdef USE_SSLEAY
+    int err;
+    char * str;
+    SSL_METHOD *req_method;
+
+    /* mark this is being ssl enabled from here on out. */
+    data->use_ssl = 1;
+
+    /* Lets get nice error messages */
+    SSL_load_error_strings();
+
+    /* Setup all the global SSL stuff */
+    SSLeay_add_ssl_algorithms();
+
+    switch(data->ssl_version) {
+    default:
+      req_method = SSLv23_client_method();
+      break;
+    case 2:
+      req_method = SSLv2_client_method();
+      break;
+    case 3:
+      req_method = SSLv3_client_method();
+      break;
+    }
+    
+    data->ctx = SSL_CTX_new(req_method);
+
+    if(!data->ctx) {
+      failf(data, "SSL: couldn't create a context!");
+      return 1;
+    }
+    
+    if(data->cert) {
+      if (!SSL_cert_stuff(data, data->cert, data->cert)) {
+       failf(data, "couldn't use certificate!\n");
+       return 2;
+      }
+    }
+
+#if SSL_VERIFY_CERT
+    SSL_CTX_set_verify(data->ctx,
+                       SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT|
+                       SSL_VERIFY_CLIENT_ONCE,
+                       cert_verify_callback);
+#endif
+
+    /* Lets make an SSL structure */
+    data->ssl = SSL_new (data->ctx);
+    SSL_set_connect_state (data->ssl);
+
+    data->server_cert = 0x0;
+
+    /* pass the raw socket into the SSL layers */
+    SSL_set_fd (data->ssl, data->firstsocket);
+    err = SSL_connect (data->ssl);
+
+    if (-1 == err) {
+      err = ERR_get_error(); 
+      failf(data, "SSL: %s", ERR_error_string(err, NULL));
+      return 10;
+    }
+
+
+    infof (data, "SSL connection using %s\n", SSL_get_cipher (data->ssl));
+  
+    /* Get server's certificate (note: beware of dynamic allocation) - opt */
+    /* major serious hack alert -- we should check certificates
+     * to authenticate the server; otherwise we risk man-in-the-middle
+     * attack
+     */
+
+    data->server_cert = SSL_get_peer_certificate (data->ssl);
+    if(!data->server_cert) {
+      failf(data, "SSL: couldn't get peer certificate!");
+      return 3;
+    }
+    infof (data, "Server certificate:\n");
+  
+    str = X509_NAME_oneline (X509_get_subject_name (data->server_cert), NULL, 0);
+    if(!str) {
+      failf(data, "SSL: couldn't get X509-subject!");
+      return 4;
+    }
+    infof (data, "\t subject: %s\n", str);
+    Free (str);
+
+    str = X509_NAME_oneline (X509_get_issuer_name  (data->server_cert), NULL, 0);
+    if(!str) {
+      failf(data, "SSL: couldn't get X509-issuer name!");
+      return 5;
+    }
+    infof (data, "\t issuer: %s\n", str);
+    Free (str);
+
+    /* We could do all sorts of certificate verification stuff here before
+       deallocating the certificate. */
+
+
+#if SSL_VERIFY_CERT
+    infof(data, "Verify result: %d\n", SSL_get_verify_result(data->ssl));
+#endif
+
+
+
+    X509_free (data->server_cert);
+#else /* USE_SSLEAY */
+    /* this is for "-ansi -Wall -pedantic" to stop complaining!   (rabe) */
+    (void) data;
+#endif
+    return 0;
+}
diff --git a/lib/ssluse.h b/lib/ssluse.h
new file mode 100644 (file)
index 0000000..c1996b2
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef __SSLUSE_H
+#define __SSLUSE_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+int SSL_cert_stuff(struct UrlData *data, 
+                  char *cert_file,
+                  char *key_file);
+int UrgSSLConnect (struct UrlData *data);
+#endif
diff --git a/lib/sta01005 b/lib/sta01005
new file mode 100644 (file)
index 0000000..31cd282
Binary files /dev/null and b/lib/sta01005 differ
diff --git a/lib/sta18057 b/lib/sta18057
new file mode 100644 (file)
index 0000000..36d824b
Binary files /dev/null and b/lib/sta18057 differ
diff --git a/lib/telnet.c b/lib/telnet.c
new file mode 100644 (file)
index 0000000..8ca1245
--- /dev/null
@@ -0,0 +1,937 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ *
+ * This implementation of the TELNET protocol is written by
+ * Linus Nielsen <Linus.Nielsen@haxx.nu>,
+ * with some code snippets stolen from the BSD Telnet client.
+ *
+ * The negotiation is performed according to RFC 1143 (D. Bernstein,
+ * "The Q Method of Implementing TELNET Option Negotiation")
+ *
+ ****************************************************************************/
+
+/* -- WIN32 approved -- */
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+
+#include "setup.h"
+
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+#include <winsock.h>
+#include <time.h>
+#include <io.h>
+#else
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <netdb.h>
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+#include <sys/ioctl.h>
+#include <signal.h>
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+
+#endif
+
+#include "urldata.h"
+#include <curl/curl.h>
+#include "download.h"
+#include "sendf.h"
+#include "formdata.h"
+#include "progress.h"
+
+#define _MPRINTF_REPLACE /* use our functions only */
+#include <curl/mprintf.h>
+
+#define  TELOPTS
+#define  TELCMDS
+#define  SLC_NAMES
+
+#include "arpa_telnet.h"
+
+#define SUBBUFSIZE 512
+
+#define  SB_CLEAR()  subpointer = subbuffer;
+#define  SB_TERM()   { subend = subpointer; SB_CLEAR(); }
+#define  SB_ACCUM(c) if (subpointer < (subbuffer+sizeof subbuffer)) { \
+            *subpointer++ = (c); \
+         }
+
+#define  SB_GET() ((*subpointer++)&0xff)
+#define  SB_PEEK()   ((*subpointer)&0xff)
+#define  SB_EOF() (subpointer >= subend)
+#define  SB_LEN() (subend - subpointer)
+
+void telwrite(struct UrlData *data,
+             unsigned char *buffer,    /* Data to write */
+             int count);               /* Number of bytes to write */
+
+void telrcv(struct UrlData *data,
+           unsigned char *inbuf,       /* Data received from socket */
+           int count);                 /* Number of bytes received */
+
+static void printoption(struct UrlData *data,
+                       const char *direction,
+                       int cmd, int option);
+
+static void negotiate(struct UrlData *data);
+static void send_negotiation(struct UrlData *data, int cmd, int option);
+static void set_local_option(struct UrlData *data, int cmd, int option);
+static void set_remote_option(struct UrlData *data, int cmd, int option);
+
+static void printsub(struct UrlData *data,
+                    int direction, unsigned char *pointer, int length);
+static void suboption(struct UrlData *data);
+
+/* suboptions */
+static char subbuffer[SUBBUFSIZE];
+static char *subpointer, *subend;    /* buffer for sub-options */
+
+/*
+ * Telnet receiver states for fsm
+ */
+static enum
+{
+   TS_DATA = 0,
+   TS_IAC,
+   TS_WILL,
+   TS_WONT,
+   TS_DO,
+   TS_DONT,
+   TS_CR,
+   TS_SB,   /* sub-option collection */
+   TS_SE   /* looking for sub-option end */
+} telrcv_state;
+
+/* For negotiation compliant to RFC 1143 */
+#define NO     0
+#define YES    1
+#define WANTYES        2
+#define WANTNO 3
+
+#define EMPTY   0
+#define OPPOSITE 1
+
+static int us[256]; 
+static int usq[256]; 
+static int us_preferred[256]; 
+static int him[256]; 
+static int himq[256]; 
+static int him_preferred[256]; 
+
+void init_telnet(struct UrlData *data)
+{
+   telrcv_state = TS_DATA;
+
+   /* Init suboptions */
+   SB_CLEAR();
+
+   /* Set all options to NO */
+   memset(us, NO, 256);
+   memset(usq, NO, 256);
+   memset(us_preferred, NO, 256);
+   memset(him, NO, 256);
+   memset(himq, NO, 256);
+   memset(him_preferred, NO, 256);
+
+   /* Set the options we want */
+   us_preferred[TELOPT_BINARY] = YES;
+   us_preferred[TELOPT_SGA] = YES;
+   him_preferred[TELOPT_BINARY] = YES;
+   him_preferred[TELOPT_SGA] = YES;
+
+   /* Start negotiating */
+   negotiate(data);
+}
+
+static void negotiate(struct UrlData *data)
+{
+   int i;
+   
+   for(i = 0;i < NTELOPTS;i++)
+   {
+      if(us_preferred[i] == YES)
+        set_local_option(data, i, YES);
+      
+      if(him_preferred[i] == YES)
+        set_remote_option(data, i, YES);
+   }
+}
+
+static void printoption(struct UrlData *data,
+                       const char *direction, int cmd, int option)
+{
+   char *fmt;
+   char *opt;
+   
+   if (data->conf & CONF_VERBOSE)
+   {
+      if (cmd == IAC)
+      {
+         if (TELCMD_OK(option))
+            printf("%s IAC %s\n", direction, TELCMD(option));
+         else
+            printf("%s IAC %d\n", direction, option);
+      }
+      else
+      {
+         fmt = (cmd == WILL) ? "WILL" : (cmd == WONT) ? "WONT" :
+            (cmd == DO) ? "DO" : (cmd == DONT) ? "DONT" : 0;
+         if (fmt)
+         {
+            if (TELOPT_OK(option))
+               opt = TELOPT(option);
+            else if (option == TELOPT_EXOPL)
+               opt = "EXOPL";
+            else
+               opt = NULL;
+
+            if(opt)
+               printf("%s %s %s\n", direction, fmt, opt);
+            else
+               printf("%s %s %d\n", direction, fmt, option);
+         }
+         else
+            printf("%s %d %d\n", direction, cmd, option);
+      }
+   }
+}
+
+static void send_negotiation(struct UrlData *data, int cmd, int option)
+{
+   unsigned char buf[3];
+
+   buf[0] = IAC;
+   buf[1] = cmd;
+   buf[2] = option;
+   
+   swrite(data->firstsocket, buf, 3);
+   
+   printoption(data, "SENT", cmd, option);
+}
+
+void set_remote_option(struct UrlData *data, int option, int newstate)
+{
+   if(newstate == YES)
+   {
+      switch(him[option])
+      {
+      case NO:
+        him[option] = WANTYES;
+        send_negotiation(data, DO, option);
+        break;
+        
+      case YES:
+        /* Already enabled */
+        break;
+        
+      case WANTNO:
+        switch(himq[option])
+        {
+        case EMPTY:
+           /* Already negotiating for YES, queue the request */
+           himq[option] = OPPOSITE;
+           break;
+        case OPPOSITE:
+           /* Error: already queued an enable request */
+           break;
+        }
+        break;
+        
+      case WANTYES:
+        switch(himq[option])
+        {
+        case EMPTY:
+           /* Error: already negotiating for enable */
+           break;
+        case OPPOSITE:
+           himq[option] = EMPTY;
+           break;
+        }
+        break;
+      }
+   }
+   else /* NO */
+   {
+      switch(him[option])
+      {
+      case NO:
+        /* Already disabled */
+        break;
+        
+      case YES:
+        him[option] = WANTNO;
+        send_negotiation(data, DONT, option);
+        break;
+        
+      case WANTNO:
+        switch(himq[option])
+        {
+        case EMPTY:
+           /* Already negotiating for NO */
+           break;
+        case OPPOSITE:
+           himq[option] = EMPTY;
+           break;
+        }
+        break;
+        
+      case WANTYES:
+        switch(himq[option])
+        {
+        case EMPTY:
+           himq[option] = OPPOSITE;
+           break;
+        case OPPOSITE:
+           break;
+        }
+        break;
+      }
+   }
+}
+
+void rec_will(struct UrlData *data, int option)
+{
+   switch(him[option])
+   {
+   case NO:
+      if(him_preferred[option] == YES)
+      {
+        him[option] = YES;
+        send_negotiation(data, DO, option);
+      }
+      else
+      {
+        send_negotiation(data, DONT, option);
+      }
+      break;
+        
+   case YES:
+      /* Already enabled */
+      break;
+        
+   case WANTNO:
+      switch(himq[option])
+      {
+      case EMPTY:
+        /* Error: DONT answered by WILL */
+        him[option] = NO;
+        break;
+      case OPPOSITE:
+        /* Error: DONT answered by WILL */
+        him[option] = YES;
+        himq[option] = EMPTY;
+        break;
+      }
+      break;
+        
+   case WANTYES:
+      switch(himq[option])
+      {
+      case EMPTY:
+        him[option] = YES;
+        break;
+      case OPPOSITE:
+        him[option] = WANTNO;
+        himq[option] = EMPTY;
+        send_negotiation(data, DONT, option);
+        break;
+      }
+      break;
+   }
+}
+   
+void rec_wont(struct UrlData *data, int option)
+{
+   switch(him[option])
+   {
+   case NO:
+      /* Already disabled */
+      break;
+        
+   case YES:
+      him[option] = NO;
+      send_negotiation(data, DONT, option);
+      break;
+        
+   case WANTNO:
+      switch(himq[option])
+      {
+      case EMPTY:
+        him[option] = NO;
+        break;
+        
+      case OPPOSITE:
+        him[option] = WANTYES;
+        himq[option] = EMPTY;
+        send_negotiation(data, DO, option);
+        break;
+      }
+      break;
+        
+   case WANTYES:
+      switch(himq[option])
+      {
+      case EMPTY:
+        him[option] = NO;
+        break;
+      case OPPOSITE:
+        him[option] = NO;
+        himq[option] = EMPTY;
+        break;
+      }
+      break;
+   }
+}
+   
+void set_local_option(struct UrlData *data, int option, int newstate)
+{
+   if(newstate == YES)
+   {
+      switch(us[option])
+      {
+      case NO:
+        us[option] = WANTYES;
+        send_negotiation(data, WILL, option);
+        break;
+        
+      case YES:
+        /* Already enabled */
+        break;
+        
+      case WANTNO:
+        switch(usq[option])
+        {
+        case EMPTY:
+           /* Already negotiating for YES, queue the request */
+           usq[option] = OPPOSITE;
+           break;
+        case OPPOSITE:
+           /* Error: already queued an enable request */
+           break;
+        }
+        break;
+        
+      case WANTYES:
+        switch(usq[option])
+        {
+        case EMPTY:
+           /* Error: already negotiating for enable */
+           break;
+        case OPPOSITE:
+           usq[option] = EMPTY;
+           break;
+        }
+        break;
+      }
+   }
+   else /* NO */
+   {
+      switch(us[option])
+      {
+      case NO:
+        /* Already disabled */
+        break;
+        
+      case YES:
+        us[option] = WANTNO;
+        send_negotiation(data, WONT, option);
+        break;
+        
+      case WANTNO:
+        switch(usq[option])
+        {
+        case EMPTY:
+           /* Already negotiating for NO */
+           break;
+        case OPPOSITE:
+           usq[option] = EMPTY;
+           break;
+        }
+        break;
+        
+      case WANTYES:
+        switch(usq[option])
+        {
+        case EMPTY:
+           usq[option] = OPPOSITE;
+           break;
+        case OPPOSITE:
+           break;
+        }
+        break;
+      }
+   }
+}
+
+void rec_do(struct UrlData *data, int option)
+{
+   switch(us[option])
+   {
+   case NO:
+      if(us_preferred[option] == YES)
+      {
+        us[option] = YES;
+        send_negotiation(data, WILL, option);
+      }
+      else
+      {
+        send_negotiation(data, WONT, option);
+      }
+      break;
+        
+   case YES:
+      /* Already enabled */
+      break;
+        
+   case WANTNO:
+      switch(usq[option])
+      {
+      case EMPTY:
+        /* Error: DONT answered by WILL */
+        us[option] = NO;
+        break;
+      case OPPOSITE:
+        /* Error: DONT answered by WILL */
+        us[option] = YES;
+        usq[option] = EMPTY;
+        break;
+      }
+      break;
+        
+   case WANTYES:
+      switch(usq[option])
+      {
+      case EMPTY:
+        us[option] = YES;
+        break;
+      case OPPOSITE:
+        us[option] = WANTNO;
+        himq[option] = EMPTY;
+        send_negotiation(data, WONT, option);
+        break;
+      }
+      break;
+   }
+}
+   
+void rec_dont(struct UrlData *data, int option)
+{
+   switch(us[option])
+   {
+   case NO:
+      /* Already disabled */
+      break;
+        
+   case YES:
+      us[option] = NO;
+      send_negotiation(data, WONT, option);
+      break;
+        
+   case WANTNO:
+      switch(usq[option])
+      {
+      case EMPTY:
+        us[option] = NO;
+        break;
+        
+      case OPPOSITE:
+        us[option] = WANTYES;
+        usq[option] = EMPTY;
+        send_negotiation(data, WILL, option);
+        break;
+      }
+      break;
+        
+   case WANTYES:
+      switch(usq[option])
+      {
+      case EMPTY:
+        us[option] = NO;
+        break;
+      case OPPOSITE:
+        us[option] = NO;
+        usq[option] = EMPTY;
+        break;
+      }
+      break;
+   }
+}
+
+
+static void printsub(struct UrlData *data,
+                    int direction,             /* '<' or '>' */
+                    unsigned char *pointer,    /* where suboption data is */
+                    int length)                /* length of suboption data */
+
+{
+   int i = 0;
+
+   if (data->conf & CONF_VERBOSE)
+   {
+      if (direction)
+      {
+         printf("%s IAC SB ", (direction == '<')? "RCVD":"SENT");
+         if (length >= 3)
+         {
+            int j;
+
+            i = pointer[length-2];
+            j = pointer[length-1];
+
+            if (i != IAC || j != SE)
+            {
+               printf("(terminated by ");
+               if (TELOPT_OK(i))
+                  printf("%s ", TELOPT(i));
+               else if (TELCMD_OK(i))
+                  printf("%s ", TELCMD(i));
+               else
+                  printf("%d ", i);
+               if (TELOPT_OK(j))
+                  printf("%s", TELOPT(j));
+               else if (TELCMD_OK(j))
+                  printf("%s", TELCMD(j));
+               else
+                  printf("%d", j);
+               printf(", not IAC SE!) ");
+            }
+         }
+         length -= 2;
+      }
+      if (length < 1)
+      {
+         printf("(Empty suboption?)");
+         return;
+      }
+
+      if (TELOPT_OK(pointer[0]))
+        printf("%s (unknown)", TELOPT(pointer[0]));
+      else
+        printf("%d (unknown)", pointer[i]);
+      for (i = 1; i < length; i++)
+        printf(" %d", pointer[i]);
+      
+      if (direction)
+      {
+         printf("\n");
+      }
+   }
+}
+
+/*
+ * suboption()
+ *
+ * Look at the sub-option buffer, and try to be helpful to the other
+ * side.
+ * No suboptions are supported yet.
+ */
+
+static void suboption(struct UrlData *data)
+{
+   printsub(data, '<', (unsigned char *)subbuffer, SB_LEN()+2);
+   return;
+}
+
+void telrcv(struct UrlData *data,
+           unsigned char *inbuf,       /* Data received from socket */
+           int count)                  /* Number of bytes received */
+{
+   unsigned char c;
+   int index = 0;
+
+   while(count--)
+   {
+      c = inbuf[index++];
+
+      switch (telrcv_state)
+      {
+      case TS_CR:
+        telrcv_state = TS_DATA;
+        if (c == '\0')
+        {
+           break;   /* Ignore \0 after CR */
+        }
+        
+        data->fwrite((char *)&c, 1, 1, data->out);
+        continue;
+
+      case TS_DATA:
+        if (c == IAC)
+        {
+           telrcv_state = TS_IAC;
+           break;
+        }
+        else if(c == '\r')
+        {
+           telrcv_state = TS_CR;
+        }
+
+        data->fwrite((char *)&c, 1, 1, data->out);
+        continue;
+
+      case TS_IAC:
+       process_iac:
+       switch (c)
+       {
+       case WILL:
+          telrcv_state = TS_WILL;
+          continue;
+       case WONT:
+          telrcv_state = TS_WONT;
+          continue;
+       case DO:
+          telrcv_state = TS_DO;
+          continue;
+       case DONT:
+          telrcv_state = TS_DONT;
+          continue;
+       case SB:
+          SB_CLEAR();
+          telrcv_state = TS_SB;
+          continue;
+       case IAC:
+          data->fwrite((char *)&c, 1, 1, data->out);
+          break;
+       case DM:
+       case NOP:
+       case GA:
+       default:
+          printoption(data, "RCVD", IAC, c);
+          break;
+       }
+       telrcv_state = TS_DATA;
+       continue;
+
+      case TS_WILL:
+        printoption(data, "RCVD", WILL, c);
+        rec_will(data, c);
+        telrcv_state = TS_DATA;
+        continue;
+      
+      case TS_WONT:
+        printoption(data, "RCVD", WONT, c);
+        rec_wont(data, c);
+        telrcv_state = TS_DATA;
+        continue;
+      
+      case TS_DO:
+        printoption(data, "RCVD", DO, c);
+        rec_do(data, c);
+        telrcv_state = TS_DATA;
+        continue;
+      
+      case TS_DONT:
+        printoption(data, "RCVD", DONT, c);
+        rec_dont(data, c);
+        telrcv_state = TS_DATA;
+        continue;
+
+      case TS_SB:
+        if (c == IAC)
+        {
+           telrcv_state = TS_SE;
+        }
+        else
+        {
+           SB_ACCUM(c);
+        }
+        continue;
+
+      case TS_SE:
+        if (c != SE)
+        {
+           if (c != IAC)
+           {
+              /*
+               * This is an error.  We only expect to get
+               * "IAC IAC" or "IAC SE".  Several things may
+               * have happend.  An IAC was not doubled, the
+               * IAC SE was left off, or another option got
+               * inserted into the suboption are all possibilities.
+               * If we assume that the IAC was not doubled,
+               * and really the IAC SE was left off, we could
+               * get into an infinate loop here.  So, instead,
+               * we terminate the suboption, and process the
+               * partial suboption if we can.
+               */
+              SB_ACCUM((unsigned char)IAC);
+              SB_ACCUM(c);
+              subpointer -= 2;
+              SB_TERM();
+           
+              printoption(data, "In SUBOPTION processing, RCVD", IAC, c);
+              suboption(data);   /* handle sub-option */
+              telrcv_state = TS_IAC;
+              goto process_iac;
+           }
+           SB_ACCUM(c);
+           telrcv_state = TS_SB;
+        }
+        else
+        {
+           SB_ACCUM((unsigned char)IAC);
+           SB_ACCUM((unsigned char)SE);
+           subpointer -= 2;
+           SB_TERM();
+           suboption(data);   /* handle sub-option */
+           telrcv_state = TS_DATA;
+        }
+        break;
+      }
+   }
+}
+
+void telwrite(struct UrlData *data,
+             unsigned char *buffer,    /* Data to write */
+             int count)                /* Number of bytes to write */
+{
+   unsigned char outbuf[2];
+   int out_count = 0;
+   int bytes_written;
+
+   while(count--)
+   {
+      outbuf[0] = *buffer++;
+      out_count = 1;
+      if(outbuf[0] == IAC)
+        outbuf[out_count++] = IAC;
+      
+#ifndef USE_SSLEAY
+      bytes_written = swrite(data->firstsocket, outbuf, out_count);
+#else
+      if (data->use_ssl) {
+        bytes_written = SSL_write(data->ssl, (char *)outbuf, out_count);
+      }
+      else {
+        bytes_written = swrite(data->firstsocket, outbuf, out_count);
+      }
+#endif /* USE_SSLEAY */
+   }
+}
+
+UrgError telnet(struct UrlData *data)
+{
+   int sockfd = data->firstsocket;
+   fd_set readfd;
+   fd_set keepfd;
+
+   bool keepon = TRUE;
+   char *buf = data->buffer;
+   int nread;
+
+   init_telnet(data);
+   
+   FD_ZERO (&readfd);          /* clear it */
+   FD_SET (sockfd, &readfd);
+   FD_SET (1, &readfd);
+
+   keepfd = readfd;
+
+   while (keepon)
+   {
+      readfd = keepfd;         /* set this every lap in the loop */
+
+      switch (select (sockfd + 1, &readfd, NULL, NULL, NULL))
+      {
+      case -1:                 /* error, stop reading */
+        keepon = FALSE;
+        continue;
+      case 0:                  /* timeout */
+        break;
+      default:                 /* read! */
+        if(FD_ISSET(1, &readfd))
+        {
+           nread = read(1, buf, 255);
+           telwrite(data, (unsigned char *)buf, nread);
+        }
+
+        if(FD_ISSET(sockfd, &readfd))
+        {
+#ifndef USE_SSLEAY
+           nread = sread (sockfd, buf, BUFSIZE - 1);
+#else
+           if (data->use_ssl) {
+              nread = SSL_read (data->ssl, buf, BUFSIZE - 1);
+           }
+           else {
+              nread = sread (sockfd, buf, BUFSIZE - 1);
+           }
+#endif /* USE_SSLEAY */
+        }
+
+        /* if we receive 0 or less here, the server closed the connection and
+          we bail out from this! */
+       if (nread <= 0) {
+         keepon = FALSE;
+         break;
+       }
+
+        telrcv(data, (unsigned char *)buf, nread);
+      }
+   }
+   return URG_OK;
+}
+
+
diff --git a/lib/telnet.h b/lib/telnet.h
new file mode 100644 (file)
index 0000000..25b7f2d
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef __TELNET_H
+#define __TELNET_H
+
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+UrgError telnet(struct UrlData *data);
+
+#endif
diff --git a/lib/timeval.c b/lib/timeval.c
new file mode 100644 (file)
index 0000000..8ad2532
--- /dev/null
@@ -0,0 +1,93 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+#include "timeval.h"
+
+#ifndef HAVE_GETTIMEOFDAY
+
+#ifdef WIN32
+int
+gettimeofday (struct timeval *tp, void *nothing)
+{
+ SYSTEMTIME st;
+ time_t tt;
+ struct tm tmtm;
+ /* mktime converts local to UTC */
+ GetLocalTime (&st);
+ tmtm.tm_sec = st.wSecond;
+ tmtm.tm_min = st.wMinute;
+ tmtm.tm_hour = st.wHour;
+ tmtm.tm_mday = st.wDay;
+ tmtm.tm_mon = st.wMonth - 1;
+ tmtm.tm_year = st.wYear - 1900;
+ tmtm.tm_isdst = -1;
+ tt = mktime (&tmtm);
+ tp->tv_sec = tt;
+ tp->tv_usec = st.wMilliseconds * 1000;
+ return 1;
+}
+#define HAVE_GETTIMEOFDAY
+#endif
+#endif
+
+struct timeval tvnow ()
+{
+ struct timeval now;
+#ifdef HAVE_GETTIMEOFDAY
+ gettimeofday (&now, NULL);
+#else
+ now.tv_sec = (long) time(NULL);
+ now.tv_usec = 0;
+#endif
+ return now;
+}
+
+double tvdiff (struct timeval t1, struct timeval t2)
+{
+ return (double)(t1.tv_sec - t2.tv_sec) + ((t1.tv_usec-t2.tv_usec)/1000000.0);
+}
+
+long tvlong (struct timeval t1)
+{
+ return t1.tv_sec;
+}
diff --git a/lib/timeval.h b/lib/timeval.h
new file mode 100644 (file)
index 0000000..fe99e28
--- /dev/null
@@ -0,0 +1,64 @@
+#ifndef __TIMEVAL_H
+#define __TIMEVAL_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+#include <time.h>
+#else
+#include <sys/time.h>
+#endif
+
+#include "setup.h"
+
+#ifndef HAVE_GETTIMEOFDAY
+#if !defined(_WINSOCKAPI_) && !defined(__MINGW32__)
+struct timeval {
+ long tv_sec;
+ long tv_usec;
+};
+#endif
+#endif
+
+struct timeval tvnow ();
+double tvdiff (struct timeval t1, struct timeval t2);
+long tvlong (struct timeval t1);
+
+#endif
diff --git a/lib/upload.c b/lib/upload.c
new file mode 100644 (file)
index 0000000..0673382
--- /dev/null
@@ -0,0 +1,178 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include "setup.h"
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+#ifdef WIN32
+#if !defined(__GNUC__) || defined(__MINGW32__)
+#include <winsock.h>
+#endif
+#include <time.h> /* for the time_t typedef! */
+
+#if defined(__GNUC__) && defined(TIME_WITH_SYS_TIME)
+#include <sys/time.h>
+#endif
+
+#endif
+
+#include <curl/curl.h>
+
+#ifdef __BEOS__
+#include <net/socket.h>
+#endif
+
+#include "urldata.h"
+#include "speedcheck.h"
+#include "sendf.h"
+#include "progress.h"
+
+/* --- upload a stream to a socket --- */
+
+UrgError Upload(struct UrlData *data,
+                int sockfd,
+                long *bytecountp)
+{
+  fd_set writefd;
+  fd_set keepfd;
+  struct timeval interval;
+  bool keepon=TRUE;
+  char *buf = data->buffer;
+  size_t nread;
+  long bytecount=0;
+  struct timeval start;
+  struct timeval now;
+  UrgError urg;
+  char scratch[BUFSIZE * 2];
+  int i, si;
+      
+  /* timeout every X second
+     - makes a better progressmeter (i.e even when no data is sent, the
+       meter can be updated and reflect reality)
+     - allows removal of the alarm() crap
+     - variable timeout is easier
+     */
+            
+  myalarm(0); /* switch off the alarm-style timeout */
+
+  start = tvnow();
+  now = start;
+
+  FD_ZERO(&writefd); /* clear it */
+  FD_SET(sockfd, &writefd);
+      
+  keepfd = writefd;
+
+  while(keepon) {
+    size_t bytes_written = 0;
+
+    writefd = keepfd; /* set this every lap in the loop */
+    interval.tv_sec = 2;
+    interval.tv_usec = 0;
+
+    switch(select(sockfd+1, NULL, &writefd, NULL, &interval)) {
+    case -1: /* error, stop writing */
+      keepon=FALSE;
+      continue;
+    case 0: /* timeout */
+      break;
+    default: /* write! */
+      if(data->crlf)
+        buf = data->buffer; /* put it back on the buffer */
+
+      nread = data->fread(buf, 1, BUFSIZE, data->in);
+      bytecount += nread;
+
+      if (nread==0) {
+        /* done */
+        keepon = FALSE; 
+        break;
+      }
+
+      /* convert LF to CRLF if so asked */
+      if (data->crlf) {
+       for(i = 0, si = 0; i < (int)nread; i++, si++) {
+          if (buf[i] == 0x0a) {
+            scratch[si++] = 0x0d;
+            scratch[si] = 0x0a;
+          }
+          else {
+            scratch[si] = buf[i];
+          }
+       }
+       nread = si;
+        buf = scratch; /* point to the new buffer */
+      }
+
+      /* write to socket */
+#ifndef USE_SSLEAY
+      bytes_written = swrite(sockfd, buf, nread);
+#else
+      if (data->use_ssl) {
+        bytes_written = SSL_write(data->ssl, buf, nread);
+      } else {
+        bytes_written = swrite(sockfd, buf, nread);
+      }
+#endif /* USE_SSLEAY */
+      if(nread != bytes_written) {
+        failf(data, "Failed uploading file");
+        return URG_FTP_WRITE_ERROR;
+      }
+    }
+    now = tvnow();
+    ProgressShow(data, bytecount, start, now, FALSE);
+    urg=speedcheck(data, now);
+    if(urg)
+      return urg;
+    if(data->timeout && (tvdiff(now,start)>data->timeout)) {
+      failf(data, "Upload timed out with %d bytes sent", bytecount);
+      return URG_OPERATION_TIMEOUTED;
+    }
+
+  }
+  ProgressShow(data, bytecount, start, now, TRUE);
+  *bytecountp = bytecount;
+
+  return URG_OK;
+}
diff --git a/lib/upload.h b/lib/upload.h
new file mode 100644 (file)
index 0000000..dbb6600
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef __UPLOAD_H
+#define __UPLOAD_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+UrgError Upload(struct UrlData *data,
+                int sockfd,
+                long *bytecountp);
+
+#endif
diff --git a/lib/url.c b/lib/url.c
new file mode 100644 (file)
index 0000000..b520898
--- /dev/null
+++ b/lib/url.c
@@ -0,0 +1,1181 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+/*
+ * SSL code intially written by
+ * Linas Vepstas <linas@linas.org> and Sampo Kellomaki <sampo@iki.fi>
+ */
+
+/* -- WIN32 approved -- */
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+
+#include "setup.h"
+
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+#include <winsock.h>
+#include <time.h>
+#include <io.h>
+#else
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#include <netinet/in.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <netdb.h>
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#ifdef HAVE_NET_IF_H
+#include <net/if.h>
+#endif
+#include <sys/ioctl.h>
+#include <signal.h>
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#ifndef HAVE_VPRINTF
+#error "We can't compile without vprintf() support!"
+#endif
+#ifndef HAVE_SELECT
+#error "We can't compile without select() support!"
+#endif
+#ifndef HAVE_SOCKET
+#error "We can't compile without socket() support!"
+#endif
+
+#endif
+
+#include "urldata.h"
+#include <curl/curl.h>
+#include "netrc.h"
+
+#include "formdata.h"
+#include "getenv.h"
+#include "base64.h"
+#include "ssluse.h"
+#include "hostip.h"
+#include "if2ip.h"
+#include "upload.h"
+#include "download.h"
+#include "sendf.h"
+#include "speedcheck.h"
+#include "getpass.h"
+#include "progress.h"
+#include "cookie.h"
+
+/* And now for the protocols */
+#include "ftp.h"
+#include "dict.h"
+#include "telnet.h"
+#include "http.h"
+#include "file.h"
+#include "ldap.h"
+
+#define _MPRINTF_REPLACE /* use our functions only */
+#include <curl/mprintf.h>
+
+/* -- -- */
+
+/***********************************************************************
+ * Start with some silly functions to make win32-systems survive
+ ***********************************************************************/
+#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
+static void cleanup(void)
+{
+  WSACleanup();
+}
+
+static int init(void)
+{
+  WORD wVersionRequested;  
+  WSADATA wsaData; 
+  int err; 
+  wVersionRequested = MAKEWORD(1, 1); 
+    
+  err = WSAStartup(wVersionRequested, &wsaData); 
+    
+  if (err != 0) 
+    /* Tell the user that we couldn't find a useable */ 
+    /* winsock.dll.     */ 
+    return 1; 
+    
+  /* Confirm that the Windows Sockets DLL supports 1.1.*/ 
+  /* Note that if the DLL supports versions greater */ 
+  /* than 1.1 in addition to 1.1, it will still return */ 
+  /* 1.1 in wVersion since that is the version we */ 
+  /* requested. */ 
+    
+  if ( LOBYTE( wsaData.wVersion ) != 1 || 
+       HIBYTE( wsaData.wVersion ) != 1 ) { 
+    /* Tell the user that we couldn't find a useable */ 
+
+    /* winsock.dll. */ 
+    WSACleanup(); 
+    return 1; 
+  }
+  return 0;
+}
+/* The Windows Sockets DLL is acceptable. Proceed. */ 
+#else
+static int init(void) { return 0; }
+static void cleanup(void) {}
+#endif
+
+static UrgError _urlget(struct UrlData *data);
+
+
+void urlfree(struct UrlData *data, bool totally)
+{
+#ifdef USE_SSLEAY
+  if (data->use_ssl) {
+    if(data->ssl) {
+      SSL_shutdown(data->ssl);
+      SSL_set_connect_state(data->ssl);
+
+      SSL_free (data->ssl);
+      data->ssl = NULL;
+    }
+    if(data->ctx) {
+      SSL_CTX_free (data->ctx);
+      data->ctx = NULL;
+    }
+    data->use_ssl = FALSE; /* get back to ordinary socket usage */
+  }
+#endif /* USE_SSLEAY */
+
+  /* close possibly still open sockets */
+  if(-1 != data->secondarysocket) {
+    sclose(data->secondarysocket);
+    data->secondarysocket = -1;        
+  }
+  if(-1 != data->firstsocket) {
+    sclose(data->firstsocket);
+    data->firstsocket=-1;
+  }
+
+
+  if(data->ptr_proxyuserpwd) {
+    free(data->ptr_proxyuserpwd);
+    data->ptr_proxyuserpwd=NULL;
+  }
+  if(data->ptr_uagent) {
+    free(data->ptr_uagent);
+    data->ptr_uagent=NULL;
+  }
+  if(data->ptr_userpwd) {
+    free(data->ptr_userpwd);
+    data->ptr_userpwd=NULL;
+  }
+  if(data->ptr_rangeline) {
+    free(data->ptr_rangeline);
+    data->ptr_rangeline=NULL;
+  }
+  if(data->ptr_ref) {
+    free(data->ptr_ref);
+    data->ptr_ref=NULL;
+  }
+  if(data->ptr_cookie) {
+    free(data->ptr_cookie);
+    data->ptr_cookie=NULL;
+  }
+  if(data->ptr_host) {
+    free(data->ptr_host);
+    data->ptr_host=NULL;
+  }
+
+  if(totally) {
+    /* we let the switch decide whether we're doing a part or total
+       cleanup */
+
+    /* check for allocated [URL] memory to free: */
+    if(data->freethis)
+      free(data->freethis);
+
+    if(data->headerbuff)
+      free(data->headerbuff);
+
+    cookie_cleanup(data->cookies);
+
+    free(data);
+
+    /* winsock crap cleanup */
+    cleanup();
+  }
+}
+
+typedef int (*func_T)(void);
+
+UrgError curl_urlget(UrgTag tag, ...)
+{
+  va_list arg;
+  func_T param_func = (func_T)0;
+  long param_long = 0;
+  void *param_obj = NULL;
+  UrgError res;
+  char *cookiefile;
+
+  struct UrlData *data;
+
+  /* this is for the lame win32 socket crap */
+  if(init())
+    return URG_FAILED_INIT;
+
+  data = (struct UrlData *)malloc(sizeof(struct UrlData));
+  if(data) {
+
+    memset(data, 0, sizeof(struct UrlData));
+
+    /* Let's set some default values: */
+    data->out = stdout; /* default output to stdout */
+    data->in  = stdin;  /* default input from stdin */
+    data->err  = stderr;  /* default stderr to stderr */
+    data->firstsocket = -1; /* no file descriptor */
+    data->secondarysocket = -1; /* no file descriptor */
+
+    /* use fwrite as default function to store output */
+    data->fwrite = (size_t (*)(char *, size_t, size_t, FILE *))fwrite;
+
+    /* use fread as default function to read input */
+    data->fread = (size_t (*)(char *, size_t, size_t, FILE *))fread;
+
+    data->infilesize = -1; /* we don't know any size */
+
+    data->current_speed = -1; /* init to negative == impossible */
+
+    va_start(arg, tag);
+
+    while(tag != URGTAG_DONE) {
+      /* PORTING NOTE:
+        Ojbect pointers can't necessarily be casted to function pointers and
+        therefore we need to know what type it is and read the correct type
+        at once. This should also correct problems with different sizes of
+        the types.
+         */
+
+      if(tag < URGTYPE_OBJECTPOINT) {
+       /* This is a LONG type */
+       param_long = va_arg(arg, long);
+      }
+      else if(tag < URGTYPE_FUNCTIONPOINT) {
+       /* This is a object pointer type */
+       param_obj = va_arg(arg, void *);
+      }
+      else
+       param_func = va_arg(arg, func_T );
+
+      /* printf("tag: %d\n", tag); */
+     
+
+      switch(tag) {
+#ifdef MULTIDOC
+      case URGTAG_MOREDOCS:
+        data->moredoc = (struct MoreDoc *)param_obj;
+        break;
+#endif
+      case URGTAG_TIMECONDITION:
+        data->timecondition = (long)param_long;
+        break;
+
+      case URGTAG_TIMEVALUE:
+        data->timevalue = (long)param_long;
+        break;
+
+      case URGTAG_SSLVERSION:
+        data->ssl_version = (int)param_long;
+        break;
+
+      case URGTAG_COOKIEFILE:
+        cookiefile = (char *)param_obj;
+        if(cookiefile) {
+          data->cookies = cookie_init(cookiefile);
+        }
+        break;
+      case URGTAG_WRITEHEADER:
+       data->writeheader = (FILE *)param_obj;
+       break;
+      case URGTAG_COOKIE:
+       data->cookie = (char *)param_obj;
+       break;
+      case URGTAG_ERRORBUFFER:
+        data->errorbuffer = (char *)param_obj;
+        break;
+      case URGTAG_FILE:
+        data->out = (FILE *)param_obj;
+        break;
+      case URGTAG_FTPPORT:
+        data->ftpport = (char *)param_obj;
+        break;
+      case URGTAG_HTTPHEADER:
+       data->headers = (struct HttpHeader *)param_obj;
+       break;
+      case URGTAG_CUSTOMREQUEST:
+       data->customrequest = (char *)param_obj;
+       break;
+      case URGTAG_HTTPPOST:
+       data->httppost = (struct HttpPost *)param_obj;
+       break;
+      case URGTAG_INFILE:
+        data->in = (FILE *)param_obj;
+        break;
+      case URGTAG_INFILESIZE:
+        data->infilesize = (long)param_long;
+        break;
+      case URGTAG_LOW_SPEED_LIMIT:
+       data->low_speed_limit=(long)param_long;
+       break;
+      case URGTAG_LOW_SPEED_TIME:
+       data->low_speed_time=(long)param_long;
+       break;
+      case URGTAG_URL:
+        data->url = (char *)param_obj;
+        break;
+      case URGTAG_PORT:
+        /* this typecast is used to fool the compiler to NOT warn for a
+           "cast from pointer to integer of different size" */
+        data->port = (unsigned short)((long)param_long);
+        break;
+      case URGTAG_POSTFIELDS:
+        data->postfields = (char *)param_obj;
+        break;
+      case URGTAG_PROGRESSMODE:
+        data->progressmode = (long)param_long;
+        break;
+      case URGTAG_REFERER:
+        data->referer = (char *)param_obj;
+        break;
+      case URGTAG_PROXY:
+        data->proxy = (char *)param_obj;
+        break;
+      case URGTAG_FLAGS:
+        data->conf = (long)param_long;
+        break;
+      case URGTAG_TIMEOUT:
+        data->timeout = (long)param_long;
+        break;
+      case URGTAG_USERAGENT:
+        data->useragent = (char *)param_obj;
+        break;
+      case URGTAG_USERPWD:
+        data->userpwd = (char *)param_obj;
+        break;
+      case URGTAG_PROXYUSERPWD:
+        data->proxyuserpwd = (char *)param_obj;
+        break;
+      case URGTAG_RANGE:
+        data->range = (char *)param_obj;
+        break;
+      case URGTAG_RESUME_FROM:
+       data->resume_from = (long)param_long;
+       break;
+      case URGTAG_STDERR:
+       data->err = (FILE *)param_obj;
+       break;
+      case URGTAG_WRITEFUNCTION:
+        data->fwrite = (size_t (*)(char *, size_t, size_t, FILE *))param_func;
+        break;
+      case URGTAG_READFUNCTION:
+        data->fread = (size_t (*)(char *, size_t, size_t, FILE *))param_func;
+        break;
+      case URGTAG_SSLCERT:
+       data->cert = (char *)param_obj;
+       break;
+      case URGTAG_SSLCERTPASSWD:
+       data->cert_passwd = (char *)param_obj;
+       break;
+      case URGTAG_CRLF:
+       data->crlf = (long)param_long;
+       break;
+      case URGTAG_QUOTE:
+        data->quote = (struct curl_slist *)param_obj;
+        break;
+      case URGTAG_DONE: /* done with the parsing, fall through */
+        continue;
+      default:
+        /* unknown tag and its companion, just ignore: */
+        break;
+      }
+      tag = va_arg(arg, UrgTag);
+    }
+
+    va_end(arg);
+
+    data-> headerbuff=(char*)malloc(HEADERSIZE);
+    if(!data->headerbuff)
+      return URG_FAILED_INIT;
+
+    data-> headersize=HEADERSIZE;
+
+    res = _urlget(data); /* fetch the URL please */
+
+    while((res == URG_OK) && data->newurl) {
+      /* Location: redirect */
+      char prot[16];
+      char path[URL_MAX_LENGTH];
+
+      if(2 != sscanf(data->newurl, "%15[^:]://%" URL_MAX_LENGTH_TXT
+                     "s", prot, path)) {
+       /***
+        *DANG* this is an RFC 2068 violation. The URL is supposed
+        to be absolute and this doesn't seem to be that!
+        At least the Zeus HTTP server seem to do this.
+        ***
+        Instead, we have to TRY to append this new path to the old URL
+        to the right of the host part. Oh crap, this is doomed to cause
+        problems in the future...
+        */
+       char *protsep;
+       char *pathsep;
+       char *newest;
+
+       /* protsep points to the start of the host name */
+       protsep=strstr(data->url, "//");
+       if(!protsep)
+         protsep=data->url;
+       else {
+          data->port=0; /* we got a full URL and then we should reset the
+                           port number here to re-initiate it later */
+         protsep+=2; /* pass the // */
+        }
+
+        if('/' != data->newurl[0]) {
+          /* First we need to find out if there's a ?-letter in the URL, and
+             cut it and the right-side of that off */
+          pathsep = strrchr(protsep, '?');
+          if(pathsep)
+            *pathsep=0;
+
+          /* we have a relative path to append to the last slash if
+             there's one available */
+          pathsep = strrchr(protsep, '/');
+          if(pathsep)
+            *pathsep=0;
+        }
+        else {
+          /* We got a new absolute path for this server, cut off from the
+             first slash */
+          pathsep = strchr(protsep, '/');
+          if(pathsep)
+            *pathsep=0;
+        }
+
+        newest=(char *)malloc( strlen(data->url) +
+                               1 + /* possible slash */
+                               strlen(data->newurl) + 1/* zero byte */);
+
+       if(!newest)
+         return URG_OUT_OF_MEMORY;
+        sprintf(newest, "%s%s%s", data->url, ('/' == data->newurl[0])?"":"/",
+                data->newurl);
+       free(data->newurl);
+       data->newurl = newest;
+      }
+
+      data->url = data->newurl;
+      data->newurl = NULL; /* don't show! */
+
+      infof(data, "Follows Location: to new URL: '%s'\n", data->url);
+
+      /* clean up the sockets and SSL stuff from the previous "round" */
+      urlfree(data, FALSE);
+
+      res = _urlget(data);
+    }
+    if(data->newurl)
+      free(data->newurl);
+
+  }
+  else
+    res = URG_FAILED_INIT; /* failed */
+
+  /* total cleanup */
+  urlfree(data, TRUE);
+
+  return res;
+}
+
+
+/*
+ * Read everything until a newline.
+ */
+
+static int GetLine(int sockfd, char *buf,
+                  struct UrlData *data)
+{
+  int nread;
+  int read_rc=1;
+  char *ptr;
+  ptr=buf;
+
+  /* get us a full line, terminated with a newline */
+  for(nread=0;
+      (nread<BUFSIZE) && read_rc;
+      nread++, ptr++) {
+#ifdef USE_SSLEAY
+    if (data->use_ssl) {
+      read_rc = SSL_read(data->ssl, ptr, 1);
+    }
+    else {
+#endif
+      read_rc = sread(sockfd, ptr, 1);
+#ifdef USE_SSLEAY
+    }
+#endif /* USE_SSLEAY */
+    if (*ptr == '\n')
+      break;
+  }
+  *ptr=0; /* zero terminate */
+
+  if(data->conf & CONF_VERBOSE) {
+    fputs("< ", data->err);
+    fwrite(buf, 1, nread, data->err);
+    fputs("\n", data->err);
+  }
+  return nread;
+}
+
+
+
+#ifndef WIN32
+#ifndef RETSIGTYPE
+#define RETSIGTYPE void
+#endif
+RETSIGTYPE alarmfunc(int signal)
+{
+  /* this is for "-ansi -Wall -pedantic" to stop complaining!   (rabe) */
+  (void)signal;
+  return;
+}
+#endif
+
+/* ====================================================== */
+/*
+ * urlget <url>
+ * (result put on stdout)
+ *
+ * <url> ::= <proto> "://" <host> [ ":" <port> ] "/" <path>
+ *
+ * <proto> = "HTTP" | "HTTPS" | "GOPHER" | "FTP"
+ *
+ * When FTP:
+ *
+ * <host> ::= [ <user> ":" <password> "@" ] <host>
+ */
+
+static UrgError _urlget(struct UrlData *data)
+{
+  struct hostent *hp=NULL;
+  struct sockaddr_in serv_addr;
+  char *buf;
+  char proto[64];
+  char gname[256]="default.com";
+  char *name;
+  char path[URL_MAX_LENGTH]="/";
+  char *ppath, *tmp;
+  long bytecount;
+  struct timeval now;
+
+  UrgError result;
+  char resumerange[12]="";
+
+  buf = data->buffer; /* this is our buffer */
+
+#if 0
+  signal(SIGALRM, alarmfunc);
+#endif
+
+  /* Parse <url> */
+  /* We need to parse the url, even when using the proxy, because
+   * we will need the hostname and port in case we are trying
+   * to SSL connect through the proxy -- and we don't know if we
+   * will need to use SSL until we parse the url ...
+   */
+  if((1 == sscanf(data->url, "file://%" URL_MAX_LENGTH_TXT "[^\n]",
+                  path))) {
+    /* we deal with file://<host>/<path> differently since it
+       supports no hostname other than "localhost" and "127.0.0.1",
+       which ist unique among the protocols specified in RFC 1738 */
+    if (strstr(path, "localhost/") || strstr(path, "127.0.0.1/"))
+      strcpy(path, &path[10]);         /* ... since coincidentally
+                                          both host strings are of
+                                          equal length */
+    /* otherwise, <host>/ is quietly ommitted */
+
+
+    /* that's it, no more fiddling with proxies, redirections,
+       or SSL for files, go directly to the file reading function */
+    result = file(data, path, &bytecount);
+    if(result)
+      return result;
+  
+    return URG_OK;
+  }
+  else if (2 > sscanf(data->url, "%64[^\n:]://%256[^\n/]%" URL_MAX_LENGTH_TXT "[^\n]",
+                 proto, gname, path)) {
+    
+      
+    /* badly formatted, let's try the browser-style _without_ 'http://' */
+    if((1 > sscanf(data->url, "%256[^\n/]%" URL_MAX_LENGTH_TXT "[^\n]", gname,
+                   path)) ) {
+      failf(data, "<url> malformed");
+      return URG_URL_MALFORMAT;
+    }
+    if(strnequal(gname, "FTP", 3)) {
+      strcpy(proto, "ftp");
+    }
+    else if(strnequal(gname, "GOPHER", 6))
+      strcpy(proto, "gopher");
+#ifdef USE_SSLEAY
+    else if(strnequal(gname, "HTTPS", 5))
+      strcpy(proto, "https");
+#endif /* USE_SSLEAY */
+    else if(strnequal(gname, "TELNET", 6))
+      strcpy(proto, "telnet");
+    else if (strnequal(gname, "DICT", sizeof("DICT")-1))
+      strcpy(proto, "DICT");
+    else if (strnequal(gname, "LDAP", sizeof("LDAP")-1))
+      strcpy(proto, "LDAP");
+    else
+      strcpy(proto, "http");
+
+    data->conf |= CONF_NOPROT;
+  }
+
+
+  if((data->conf & CONF_USERPWD) && ! (data->conf & CONF_NETRC)) {
+    if(':' != *data->userpwd) {
+      if((1 <= sscanf(data->userpwd, "%127[^:]:%127s",
+                      data->user, data->passwd))) {
+        /* check for password, if no ask for one */
+        if( !data->passwd[0] )
+        {
+          strncpy(data->passwd, getpass("password: "), sizeof(data->passwd));
+        }
+      }
+    }
+    if(!data->user[0]) {
+      failf(data, "USER malformat: user name can't be zero length");
+      return URG_MALFORMAT_USER;
+    }
+  }
+
+  if(data->conf & CONF_PROXYUSERPWD) {
+    if(':' != *data->proxyuserpwd) {
+      if((1 <= sscanf(data->proxyuserpwd, "%127[^:]:%127s",
+                      data->proxyuser, data->proxypasswd))) {
+        /* check for password, if no ask for one */
+        if( !data->proxypasswd[0] )
+        {
+          strncpy(data->proxypasswd, getpass("proxy password: "), sizeof(data->proxypasswd));
+        }
+      }
+    }
+    if(!data->proxyuser[0]) {
+      failf(data, " Proxy USER malformat: user name can't be zero length");
+      return URG_MALFORMAT_USER;
+    }
+  }
+
+  name = gname;
+  ppath = path;
+  data->hostname = name;
+
+
+  if(!(data->conf & CONF_PROXY)) {
+    /* If proxy was not specified, we check for default proxy environment
+       variables, to enable i.e Lynx compliance:
+
+       HTTP_PROXY http://some.server.dom:port/
+       HTTPS_PROXY http://some.server.dom:port/
+       FTP_PROXY http://some.server.dom:port/
+       GOPHER_PROXY http://some.server.dom:port/
+       NO_PROXY host.domain.dom  (a comma-separated list of hosts which should
+       not be proxied, or an asterisk to override all proxy variables)
+       ALL_PROXY seems to exist for the CERN www lib. Probably the first to
+       check for.
+       */
+    char *no_proxy=GetEnv("NO_PROXY");
+    char *proxy=NULL;
+    char proxy_env[128];
+
+    if(!no_proxy || !strequal("*", no_proxy)) {
+      /* NO_PROXY wasn't specified or it wasn't just an asterisk */
+      char *nope;
+
+      nope=no_proxy?strtok(no_proxy, ", "):NULL;
+      while(nope) {
+        if(strlen(nope) <= strlen(name)) {
+          char *checkn=
+            name + strlen(name) - strlen(nope);
+          if(strnequal(nope, checkn, strlen(nope))) {
+            /* no proxy for this host! */
+            break;
+          }
+        }
+       nope=strtok(NULL, ", ");
+      }
+      if(!nope) {
+       /* It was not listed as without proxy */
+       char *protop = proto;
+       char *envp = proxy_env;
+       char *prox;
+
+       /* Now, build <PROTOCOL>_PROXY and check for such a one to use */
+       while(*protop) {
+         *envp++ = toupper(*protop++);
+       }
+       /* append _PROXY */
+       strcpy(envp, "_PROXY");
+#if 0
+       infof(data, "DEBUG: checks the environment variable %s\n", proxy_env);
+#endif
+       /* read the protocol proxy: */
+       prox=GetEnv(proxy_env);
+
+       if(prox && *prox) { /* don't count "" strings */
+         proxy = prox; /* use this */
+        }
+        else
+          proxy = GetEnv("ALL_PROXY"); /* default proxy to use */
+
+        if(proxy && *proxy) {
+          /* we have a proxy here to set */
+          data->proxy = proxy;
+          data->conf |= CONF_PROXY;
+        }
+      } /* if (!nope) - it wasn't specfied non-proxy */
+    } /* NO_PROXY wasn't specified or '*' */
+  } /* if not using proxy */
+
+  if((data->conf & (CONF_PROXY|CONF_NOPROT)) == (CONF_PROXY|CONF_NOPROT) ) {
+    /* We're guessing prefixes here and since we're told to use a proxy, we
+       need to add the protocol prefix to the URL string before we continue!
+       */
+    char *reurl;
+
+    reurl = maprintf("%s://%s", proto, data->url);
+
+    if(!reurl)
+      return URG_OUT_OF_MEMORY;
+
+    data->url = reurl;
+    if(data->freethis)
+      free(data->freethis);
+    data->freethis = reurl;
+
+    data->conf &= ~CONF_NOPROT; /* switch that one off again */
+  }
+
+  /* RESUME on a HTTP page is a tricky business. First, let's just check that
+     'range' isn't used, then set the range parameter and leave the resume as
+     it is to inform about this situation for later use. We will then
+     "attempt" to resume, and if we're talking to a HTTP/1.1 (or later)
+     server, we will get the document resumed. If we talk to a HTTP/1.0
+     server, we just fail since we can't rewind the file writing from within
+     this function. */
+  if(data->resume_from) {
+    if(!(data->conf & CONF_RANGE)) {
+      /* if it already was in use, we just skip this */
+      sprintf(resumerange, "%d-", data->resume_from);
+      data->range=resumerange; /* tell ourselves to fetch this range */
+      data->conf |= CONF_RANGE; /* switch on range usage */
+    }
+  }
+
+
+  if(data->timeout) {
+    /* 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 */
+  }
+
+  /*
+   * Hmm, if we are using a proxy, then we can skip the GOPHER and the
+   * FTP steps, although we cannot skip the HTTPS step (since the proxy
+   * works differently, depending on whether its SSL or not).
+   */
+
+  if (strequal(proto, "HTTP")) {
+    if(!data->port)
+      data->port = PORT_HTTP;
+    data->remote_port = PORT_HTTP;
+    data->conf |= CONF_HTTP;
+  }
+  else if (strequal(proto, "HTTPS")) {
+#ifdef USE_SSLEAY
+    if(!data->port)
+      data->port = PORT_HTTPS;
+    data->remote_port = PORT_HTTPS;
+    data->conf |= CONF_HTTP;
+    data->conf |= CONF_HTTPS;
+#else /* USE_SSLEAY */
+    failf(data, "SSL is disabled, https: not supported!");
+    return URG_UNSUPPORTED_PROTOCOL;
+#endif /* !USE_SSLEAY */
+  }
+  else if (strequal(proto, "GOPHER")) {
+    if(!data->port)
+      data->port = PORT_GOPHER;
+    data->remote_port = PORT_GOPHER;
+    /* Skip /<item-type>/ in path if present */
+    if (isdigit((int)path[1])) {
+      ppath = strchr(&path[1], '/');
+      if (ppath == NULL)
+       ppath = path;
+      }
+    data->conf |= CONF_GOPHER;
+  }
+  else if(strequal(proto, "FTP")) {
+    char *type;
+    if(!data->port)
+      data->port = PORT_FTP;
+    data->remote_port = PORT_FTP;
+    data->conf |= CONF_FTP;
+
+    ppath++; /* don't include the initial slash */
+
+    /* FTP URLs support an extension like ";type=<typecode>" that
+       we'll try to get now! */
+    type=strstr(ppath, ";type=");
+    if(!type) {
+      type=strstr(gname, ";type=");
+    }
+    if(type) {
+      char command;
+      *type=0;
+      command = toupper(type[6]);
+      switch(command) {
+      case 'A': /* ASCII mode */
+       data->conf |= CONF_FTPASCII;
+       break;
+      case 'D': /* directory mode */
+       data->conf |= CONF_FTPLISTONLY;
+       break;
+      case 'I': /* binary mode */
+      default:
+       /* switch off ASCII */
+       data->conf &= ~CONF_FTPASCII; 
+       break;
+      }
+    }
+  }
+  else if(strequal(proto, "TELNET")) {
+    /* telnet testing factory */
+    data->conf |= CONF_TELNET;
+    if(!data->port)
+      data->port = PORT_TELNET;
+    data->remote_port = PORT_TELNET;
+  }
+  else if (strequal(proto, "DICT")) {
+    data->conf |= CONF_DICT;
+    if(!data->port)
+      data->port = PORT_DICT;
+    data->remote_port = PORT_DICT;
+  }
+  else if (strequal(proto, "LDAP")) {
+    data->conf |= CONF_LDAP;
+    if(!data->port)
+      data->port = PORT_LDAP;
+    data->remote_port = PORT_LDAP;
+  }
+  /* file:// is handled above */
+  /*  else if (strequal(proto, "FILE")) {
+    data->conf |= CONF_FILE;
+
+    result = file(data, path, &bytecount);
+    if(result)
+      return result;
+
+    return URG_OK;
+    }*/
+  else {
+    failf(data, "Unsupported protocol: %s", proto);
+    return URG_UNSUPPORTED_PROTOCOL;
+  }
+
+  if(data->conf & CONF_NETRC) {
+    if(ParseNetrc(data->hostname, data->user, data->passwd)) {
+      infof(data, "Couldn't find host %s in the .netrc file, using defaults",
+            data->hostname);
+    }
+    /* weather we failed or not, we don't know which fields that were filled
+       in anyway */
+    if(!data->user[0])
+      strcpy(data->user, CURL_DEFAULT_USER);
+    if(!data->passwd[0])
+      strcpy(data->passwd, CURL_DEFAULT_PASSWORD);
+    if(data->conf & CONF_HTTP) {
+      data->conf |= CONF_USERPWD;
+    }
+  }
+  else if(!(data->conf & CONF_USERPWD) &&
+         (data->conf & (CONF_FTP|CONF_HTTP)) ) {
+    /* This is a FTP or HTTP URL, and we haven't got the user+password in
+       the extra parameter, we will now try to extract the possible
+       user+password pair in a string like:
+       ftp://user:password@ftp.my.site:8021/README */
+    char *ptr=NULL; /* assign to remove possible warnings */
+    if(':' == *name) {
+      failf(data, "URL malformat: user can't be zero length");
+      return URG_URL_MALFORMAT_USER;
+    }
+    if((1 <= sscanf(name, "%127[^:]:%127[^@]",
+                   data->user, data->passwd)) && (ptr=strchr(name, '@'))) {
+      name = ++ptr;
+      data->conf |= CONF_USERPWD;
+    }
+    else {
+      strcpy(data->user, CURL_DEFAULT_USER);
+      strcpy(data->passwd, CURL_DEFAULT_PASSWORD);
+    }
+  }
+
+  if(!(data->conf & CONF_PROXY)) {
+    /* If not connecting via a proxy, extract the port from the URL, if it is
+     * there, thus overriding any defaults that might have been set above. */
+    tmp = strchr(name, ':');
+    if (tmp) {
+      *tmp++ = '\0';
+      data->port = atoi(tmp);
+    }
+    
+    /* Connect to target host right on */
+    if(!(hp = GetHost(data, name))) {
+      failf(data, "Couldn't resolv host '%s'", name);
+      return URG_COULDNT_RESOLVE_HOST;
+    }
+  }
+  else {
+    char *prox_portno;
+    char *endofprot;
+
+    /* we use proxy all right, but we wanna know the remote port for SSL
+       reasons */
+    tmp = strchr(name, ':');
+    if (tmp) {
+      *tmp++ = '\0'; /* cut off the name there */
+      data->remote_port = atoi(tmp);
+    }
+
+    /* Daniel Dec 10, 1998:
+       We do the proxy host string parsing here. We want the host name and the
+       port name. Accept a protocol:// prefix, even though it should just be
+       ignored. */
+
+    /* 1. skip the protocol part if present */
+    endofprot=strstr(data->proxy, "://");
+    if(endofprot) {
+      data->proxy = endofprot+3;
+    }
+
+    /* allow user to specify proxy.server.com:1080 if desired */
+    prox_portno = strchr (data->proxy, ':');
+    if (prox_portno) {
+      *prox_portno = 0x0; /* cut off number from host name */
+      prox_portno ++;
+      /* now set the local port number */
+      data->port = atoi(prox_portno);
+    }
+
+    /* connect to proxy */
+    if(!(hp = GetHost(data, data->proxy))) {
+      failf(data, "Couldn't resolv proxy '%s'", data->proxy);
+      return URG_COULDNT_RESOLVE_PROXY;
+    }
+  }
+
+  data->firstsocket = socket(AF_INET, SOCK_STREAM, 0);
+
+  memset((char *) &serv_addr, '\0', sizeof(serv_addr));
+  memcpy((char *)&(serv_addr.sin_addr), hp->h_addr, hp->h_length);
+  serv_addr.sin_family = hp->h_addrtype;
+
+  serv_addr.sin_port = htons(data->port);
+
+  if (connect(data->firstsocket, (struct sockaddr *) &serv_addr,
+             sizeof(serv_addr)) < 0) {
+    switch(errno) {
+#ifdef ECONNREFUSED
+      /* this should be made nicer */
+    case ECONNREFUSED:
+      failf(data, "Connection refused");
+      break;
+#endif
+#ifdef EINTR
+    case EINTR:
+      failf(data, "Connection timeouted");
+      break;
+#endif
+    default:
+      failf(data, "Can't connect to server: %d", errno);
+      break;
+    }
+    return URG_COULDNT_CONNECT;
+  }
+
+  if(data->conf & CONF_PROXYUSERPWD) {
+    char authorization[512];
+    sprintf(data->buffer, "%s:%s", data->proxyuser, data->proxypasswd);
+    base64Encode(data->buffer, authorization);
+
+    data->ptr_proxyuserpwd = maprintf("Proxy-authorization: Basic %s\015\012",
+                                     authorization);
+  }
+  if(data->conf & (CONF_HTTPS|CONF_HTTP)) {
+    if(data->useragent) {
+      data->ptr_uagent = maprintf("User-Agent: %s\015\012", data->useragent);
+    }
+  }
+
+
+  /* If we are not using a proxy and we want a secure connection,
+   * perform SSL initialization & connection now.
+   * If using a proxy with https, then we must tell the proxy to CONNECT
+   * us to the host we want to talk to.  Only after the connect
+   * has occured, can we start talking SSL
+   */
+   if (data->conf & CONF_HTTPS) {
+     if (data->conf & CONF_PROXY) {
+
+        /* OK, now send the connect statment */
+        sendf(data->firstsocket, data,
+              "CONNECT %s:%d HTTP/1.0\015\012"
+              "%s"
+             "%s"
+              "\r\n",
+              data->hostname, data->remote_port,
+              (data->conf&CONF_PROXYUSERPWD)?data->ptr_proxyuserpwd:"",
+             (data->useragent?data->ptr_uagent:"")
+              );
+
+        /* wait for the proxy to send us a HTTP/1.0 200 OK header */
+       /* Daniel rewrote this part Nov 5 1998 to make it more obvious */
+       {
+         int httperror=0;
+         int subversion=0;
+         while(GetLine(data->firstsocket, data->buffer, data)) {
+           if('\r' == data->buffer[0])
+             break; /* end of headers */
+           if(2 == sscanf(data->buffer, "HTTP/1.%d %d",
+                          &subversion,
+                          &httperror)) {
+             ;
+           }
+         }
+         if(200 != httperror) {
+           if(407 == httperror)
+             /* Added Nov 6 1998 */
+             failf(data, "Proxy requires authorization!");
+           else 
+             failf(data, "Received error code %d from proxy", httperror);
+           return URG_READ_ERROR;
+         }
+       }
+        infof (data, "Proxy has replied to CONNECT request\n");
+     }
+
+      /* now, perform the SSL initialization for this socket */
+     if(UrgSSLConnect (data)) {
+       return URG_SSL_CONNECT_ERROR;
+     }
+  }
+
+  now = tvnow(); /* time this *after* the connect is done */
+  bytecount = 0;
+  
+  /* Figure out the ip-number and the first host name it shows: */
+  {
+    struct in_addr in;
+    (void) memcpy(&in.s_addr, *hp->h_addr_list, sizeof (in.s_addr));
+    infof(data, "Connected to %s (%s)\n", hp->h_name, inet_ntoa(in));
+  }
+
+  if((data->conf&(CONF_FTP|CONF_PROXY)) == CONF_FTP) {
+    result = ftp(data, &bytecount, data->user, data->passwd, ppath);
+    if(result)
+      return result;
+  }
+  else if(data->conf & CONF_TELNET) {
+    result=telnet(data);
+    if(result)
+      return result;
+  }
+  else if (data->conf & CONF_LDAP) {
+    result = ldap(data, path, &bytecount);
+    if (result)
+      return result;
+  }
+  else if (data->conf & CONF_DICT) {
+    result = dict(data, path, &bytecount);
+    if(result)
+      return result;
+  }
+  else {
+    result = http(data, ppath, name, &bytecount);
+    if(result)
+      return result;
+  }
+  if(bytecount) {
+    double ittook = tvdiff (tvnow(), now);
+    infof(data, "%i bytes transfered in %.3lf seconds (%.0lf bytes/sec).\n",
+          bytecount, ittook, (double)bytecount/(ittook!=0.0?ittook:1));
+  }
+  return URG_OK;
+}
+
diff --git a/lib/url.h b/lib/url.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/urldata.h b/lib/urldata.h
new file mode 100644 (file)
index 0000000..f171cd0
--- /dev/null
@@ -0,0 +1,212 @@
+#ifndef __URLDATA_H
+#define __URLDATA_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+/* This file is for lib internal stuff */
+
+#include "setup.h"
+
+#ifndef MAXHOSTNAMELEN
+#define MAXHOSTNAMELEN 256
+#endif
+
+#define PORT_FTP 21
+#define PORT_TELNET 23
+#define PORT_GOPHER 70
+#define PORT_HTTP 80
+#define PORT_HTTPS 443
+#define PORT_DICT 2628
+#define PORT_LDAP 389
+
+#define DICT_MATCH "/MATCH:"
+#define DICT_MATCH2 "/M:"
+#define DICT_MATCH3 "/FIND:"
+#define DICT_DEFINE "/DEFINE:"
+#define DICT_DEFINE2 "/D:"
+#define DICT_DEFINE3 "/LOOKUP:"
+
+#define CURL_DEFAULT_USER "anonymous"
+#define CURL_DEFAULT_PASSWORD "curl_by_Daniel.Stenberg@haxx.nu"
+
+#include "cookie.h"
+    
+#ifdef USE_SSLEAY
+/* SSLeay stuff usually in /usr/local/ssl/include */
+#ifdef USE_OPENSSL
+#include "openssl/rsa.h"
+#include "openssl/crypto.h"
+#include "openssl/x509.h"
+#include "openssl/pem.h"
+#include "openssl/ssl.h"
+#include "openssl/err.h"
+#else
+#include "rsa.h"
+#include "crypto.h"
+#include "x509.h"
+#include "pem.h"
+#include "ssl.h"
+#include "err.h"
+#endif
+#endif
+
+
+/* Download buffer size, keep it fairly big for speed reasons */
+#define BUFSIZE (1024*50)
+
+/* Initial size of the buffer to store headers in, it'll be enlarged in case
+   of need. */
+#define HEADERSIZE 256
+
+struct UrlData {
+  FILE *out;    /* the fetched file goes here */
+  FILE *in;     /* the uploaded file is read from here */
+  FILE *err;    /* the stderr writes goes here */
+  FILE *writeheader; /* write the header to this is non-NULL */
+  char *url;   /* what to get */
+  char *freethis; /* if non-NULL, an allocated string for the URL */
+  char *hostname; /* hostname to contect, as parsed from url */
+  unsigned short port; /* which port to use (if non-protocol bind) set
+                          CONF_PORT to use this */
+  unsigned short remote_port; /* what remote port to connect to, not the proxy
+                                port! */
+  char *proxy; /* if proxy, set it here, set CONF_PROXY to use this */
+  long conf;   /* configure flags */
+  char *userpwd;  /* <user:password>, if used */
+  char *proxyuserpwd;  /* Proxy <user:password>, if used */
+  char *range; /* range, if used. See README for detailed specification on
+                  this syntax. */
+  char *postfields; /* if POST, set the fields' values here */
+  char *referer;
+  char *errorbuffer; /* store failure messages in here */
+  char *useragent;   /* User-Agent string */
+
+  char *ftpport; /* port to send with the PORT command */
+
+ /* function that stores the output:*/
+  size_t (*fwrite)(char *buffer,
+                   size_t size,
+                   size_t nitems,
+                   FILE *outstream);
+
+  /* function that reads the input:*/
+  size_t (*fread)(char *buffer,
+                  size_t size,
+                  size_t nitems,
+                  FILE *outstream);
+
+  long timeout; /* in seconds, 0 means no timeout */
+  long infilesize; /* size of file to upload, -1 means unknown */
+
+  long maxdownload; /* in bytes, the maximum amount of data to fetch, 0
+                       means unlimited */
+  
+  /* fields only set and used within _urlget() */
+  int firstsocket;     /* the main socket to use */
+  int secondarysocket; /* for i.e ftp transfers */
+
+  char buffer[BUFSIZE+1]; /* buffer with size BUFSIZE */
+
+  double current_speed;  /* the ProgressShow() funcion sets this */
+
+  long low_speed_limit; /* bytes/second */
+  long low_speed_time;  /* number of seconds */
+
+  int resume_from;    /* continue [ftp] transfer from here */
+
+  char *cookie;       /* HTTP cookie string to send */
+
+  short    use_ssl;   /* use ssl encrypted communications */
+
+  char *newurl; /* This can only be set if a Location: was in the
+                  document headers */
+
+#ifdef MULTIDOC
+  struct MoreDoc *moredoc;  /* linked list of more docs to get */
+#endif
+  struct HttpHeader *headers; /* linked list of extra headers */
+  struct HttpPost *httppost;  /* linked list of POST data */
+
+  char *cert; /* PEM-formatted certificate */
+  char *cert_passwd; /* plain text certificate password */
+
+  struct CookieInfo *cookies;
+
+  long ssl_version; /* what version the client wants to use */
+#ifdef USE_SSLEAY
+  SSL_CTX* ctx;
+  SSL*     ssl;
+  X509*    server_cert;
+#endif /* USE_SSLEAY */
+  long crlf;
+  struct curl_slist *quote;
+
+  TimeCond timecondition;
+  time_t timevalue;
+
+  char *customrequest; /* http/ftp request to use */
+
+  char *headerbuff; /* allocated buffer to store headers in */
+  int headersize;   /* size of the allocation */
+  int progressmode; /* what kind of progress meter to display */
+
+#define MAX_CURL_USER_LENGTH 128
+#define MAX_CURL_PASSWORD_LENGTH 128
+
+  char user[MAX_CURL_USER_LENGTH];
+  char passwd[MAX_CURL_PASSWORD_LENGTH];
+  char proxyuser[MAX_CURL_USER_LENGTH];
+  char proxypasswd[MAX_CURL_PASSWORD_LENGTH];
+
+  /**** Dynamicly allocated strings, may need to be freed on return ****/
+  char *ptr_proxyuserpwd; /* free later if not NULL! */
+  char *ptr_uagent; /* free later if not NULL! */
+  char *ptr_userpwd; /* free later if not NULL! */
+  char *ptr_rangeline; /* free later if not NULL! */
+  char *ptr_ref; /* free later if not NULL! */
+  char *ptr_cookie; /* free later if not NULL! */
+  char *ptr_host; /* free later if not NULL */
+};
+
+#define LIBCURL_NAME "libcurl"
+#define LIBCURL_ID LIBCURL_NAME " " LIBCURL_VERSION " " SSL_ID
+
+
+#endif
diff --git a/lib/version.c b/lib/version.c
new file mode 100644 (file)
index 0000000..73be0d7
--- /dev/null
@@ -0,0 +1,86 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <string.h>
+#include <stdio.h>
+
+#include "setup.h"
+#include <curl/curl.h>
+#include "urldata.h"
+
+char *curl_version(void)
+{
+  static char version[200];
+  char *ptr;
+#if defined(USE_SSLEAY)
+  static char sub[2];
+#endif
+  strcpy(version, LIBCURL_NAME " " LIBCURL_VERSION );
+  ptr=strchr(version, '\0');
+
+#ifdef USE_SSLEAY
+
+#if (SSLEAY_VERSION_NUMBER >= 0x900000)
+  sprintf(ptr, " (SSL %x.%x.%x)",
+          (SSLEAY_VERSION_NUMBER>>28)&0xff,
+          (SSLEAY_VERSION_NUMBER>>20)&0xff,
+          (SSLEAY_VERSION_NUMBER>>12)&0xf);
+#else
+  if(SSLEAY_VERSION_NUMBER&0x0f) {
+    sub[0]=(SSLEAY_VERSION_NUMBER&0x0f) + 'a' -1;
+  }
+  else
+    sub[0]=0;
+
+  sprintf(ptr, " (SSL %x.%x.%x%s)",
+          (SSLEAY_VERSION_NUMBER>>12)&0xff,
+          (SSLEAY_VERSION_NUMBER>>8)&0xf,
+          (SSLEAY_VERSION_NUMBER>>4)&0xf, sub);
+
+#endif
+  ptr=strchr(ptr, '\0');
+#endif
+
+#ifdef USE_ZLIB
+  sprintf(ptr, " (zlib %s)", zlibVersion());
+#endif
+
+  return version;
+}
diff --git a/maketgz b/maketgz
new file mode 100755 (executable)
index 0000000..6ad429b
--- /dev/null
+++ b/maketgz
@@ -0,0 +1,152 @@
+#! /bin/sh
+# Script to build release-archives with
+#
+
+echo "LIB version number?"
+read version
+
+libversion="$version"
+
+echo "CURL version number?"
+read curlversion
+
+HEADER=include/curl/curl.h
+CHEADER=src/version.h
+
+
+# Replace version number in header file:
+sed 's/#define LIBCURL_VERSION.*/#define LIBCURL_VERSION "'$libversion'"/g' $HEADER >$HEADER.new
+
+# Save old header file
+cp -p $HEADER $HEADER.old
+
+# Make new header:
+mv $HEADER.new $HEADER
+
+# Replace version number in header file:
+sed 's/#define CURL_VERSION.*/#define CURL_VERSION "'$curlversion'"/g' $CHEADER >$CHEADER.new
+
+# Save old header file
+cp -p $CHEADER $CHEADER.old
+
+# Make new header:
+mv $CHEADER.new $CHEADER
+
+findprog()
+{
+  file="$1"
+  for part in `echo $PATH| tr ':' ' '`; do
+    path="$part/$file"
+    if [ -x "$path" ]; then
+      # there it is!
+      return 1
+    fi
+  done
+
+  # no such executable
+  return 0
+}
+
+############################################################################
+#
+# If we have autoconf we can just as well update configure.in to contain our
+# brand new version number:
+#
+if { findprog autoconf >/dev/null 2>/dev/null; } then
+  echo "- No autoconf found, we leave configure as it is"
+else
+  # Replace version number in configure.in file:
+
+  CONF="configure.in"
+
+  sed 's/^AM_INIT_AUTOMAKE.*/AM_INIT_AUTOMAKE(curl,"'$version'")/g' $CONF >$CONF.new
+
+  # Save old  file
+  cp -p $CONF $CONF.old
+
+  # Make new configure.in
+  mv $CONF.new $CONF
+  # Update the configure script
+  echo "Runs autoconf"
+  autoconf
+fi
+
+############################################################################
+#
+# automake is needed to run to make a non-GNU Makefile.in if Makefile.am has
+# been modified.
+#
+
+if { findprog automake >/dev/null 2>/dev/null; } then
+  echo "- Could not find or run automake, I hope you know what you're doing!"
+else
+  echo "Runs automake --include-deps"
+  automake --include-deps
+fi
+
+############################################################################
+#
+# Now run make first to make the file dates decent and make sure that it
+# compiles just before release!
+#
+
+make
+
+# get current dir
+dir=`pwd`
+
+# Get basename
+orig=`basename $dir`
+
+# Get the left part of the dash (-)
+new=`echo $orig | cut -d- -f1`
+
+# Build new directory name
+n=$new-$version;
+
+# Tell the world what we're doing
+echo "Copying files into distribution archive";
+
+if [ -r $n ]; then
+  echo "Directory already exists!"
+  exit
+fi
+
+# Create the new dir
+mkdir $n
+
+# Copy all relevant files, with path and permissions!
+tar -cf - `cat FILES` | (cd $n; tar -xBpf -)
+
+# Create the distribution root Makefile from Makefile.dist
+cp -p Makefile.dist $n/Makefile
+
+############################################################################
+#
+# Replace @SHELL@ with /bin/sh in the Makefile.in files!
+#
+echo "Replace @SHELL@ with /bin/sh in the Makefile.in files"
+temp=/tmp/curl$$
+for file in Makefile.in lib/Makefile.in src/Makefile.in; do
+  in="$n/$file"
+  sed "s:@SHELL@:/bin/sh:g" $in >$temp
+  cp $temp $in
+done
+rm -rf $temp
+
+# Tell the world what we're doing
+echo "creates $n.tar.gz";
+
+# Make a tar archive of it all
+tar -cvf $n.tar $n
+
+# gzip the archive
+gzip $n.tar
+
+# Make it world readable
+chmod a+r $n.tar.gz ;
+
+# Delete the temp dir
+rm -rf $n
diff --git a/missing b/missing
new file mode 100755 (executable)
index 0000000..cbe2b0e
--- /dev/null
+++ b/missing
@@ -0,0 +1,188 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing - GNU libit 0.0"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`configure.in'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`configure.in'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`configure.in'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER([^):]*:\([^)]*\)).*/\1/p' configure.in`
+    if test -z "$files"; then
+      files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in`
+      test -z "$files" || files="$files.in"
+    else
+      files=`echo "$files" | sed -e 's/:/ /g'`
+    fi
+    test -z "$files" && files="config.h.in"
+    touch $files
+    ;;
+
+  automake)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print \
+      | sed 's/^\(.*\).am$/touch \1.in/' \
+      | sh
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f y.tab.h ]; then
+       echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755 (executable)
index 0000000..d0fd194
--- /dev/null
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id$
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp" 1>&2
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+         errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/perl/README b/perl/README
new file mode 100644 (file)
index 0000000..bb8757a
--- /dev/null
@@ -0,0 +1,33 @@
+This is just a small collection of perl scripts that use curl to do
+their jobs.
+
+If you need a proxy configuration in order to get HTTP or FTP
+documents, do edit your .curlrc file in your HOME dir to contain:
+-x <proxy host>:<proxy port>
+
+These scripts are all written by Daniel Stenberg.
+
+checklinks.pl
+=============
+  This script fetches an HTML page, extracts all links and references to
+  other documents and then goes through them to check that they work.
+  Reports progress in a format intended for machine-parsing.
+
+getlinks.pl
+===========
+  You ever wanted to download a bunch of programs a certain HTML page has
+  links to? This program extracts all links and references from a web page
+  and then compares them to the regex you supply. All matches will be
+  downloaded in the target directory of your choice.
+
+recursiveftpget.pl
+==================
+  This script recursively downloads all files from a directory on an ftp site
+  and all subdirectories it has. Optional depth-level.
+
+formfind.pl
+===========
+  Downloads an HTML page (or reads stdin) and reports a human readable report
+  about the FORM(s) present. What method, what URL, which input or select
+  field, what default values they have and what submit buttons there are. It
+  is useful if you intend to use curl to properly fake a form submission.
diff --git a/perl/checklinks.pl b/perl/checklinks.pl
new file mode 100644 (file)
index 0000000..347416a
--- /dev/null
@@ -0,0 +1,336 @@
+#!/usr/local/bin/perl
+#
+# checklinks.pl
+#
+# This script extracts all links from a HTML page and checks their validity.
+# Written to use 'curl' for URL checking.
+#
+# Author: Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>
+# Version: 0.7 Sept 30, 1998
+#
+# HISTORY
+#
+# 0.5 - Cuts off the #-part from links before checking.
+#
+# 0.6 - Now deals with error codes 3XX better and follows the Location:
+#       properly.
+#     - Added the -x flag that only checks http:// -links
+#
+# 0.7 - Ok, http://www.viunga.se/main.html didn't realize this had no path
+#       but a document. Now it does.
+#
+#
+
+$in="";
+
+ argv:
+if($ARGV[0] eq "-v" ) {
+    $verbose = 1;
+    shift @ARGV;
+    goto argv;
+}
+elsif($ARGV[0] eq "-i" ) {
+    $usestdin = 1;
+    shift @ARGV;
+    goto argv;
+}
+elsif($ARGV[0] eq "-l" ) {
+    $linenumber = 1;
+    shift @ARGV;
+    goto argv;
+}
+elsif($ARGV[0] eq "-h" ) {
+    $help = 1;
+    shift @ARGV;
+    goto argv;
+}
+elsif($ARGV[0] eq "-x" ) {
+    $external = 1;
+    shift @ARGV;
+    goto argv;
+}
+
+$geturl = $ARGV[0];
+
+if(($geturl eq "") || $help) {
+    print  "Usage: $0 [-hilvx] <full URL>\n",
+    " Use a traling slash for directory URLs!\n",
+    " -h  This help text\n",
+    " -i  Read the initial page from stdin\n",
+    " -l  Line number report for BAD links\n",
+    " -v  Verbose mode\n",
+    " -x  Check non-local (external?) links only\n";
+    exit;
+}
+
+if($ARGV[1] eq "-") {
+    print "We use stdin!\n";
+    $usestdin = 1;
+}
+
+# This is necessary from where I tried this:
+#$proxy =" -x 194.237.142.41:80";
+
+# linkchecker, URL will be appended to the right of this command line
+# this is the one using HEAD:
+$linkcheck = "curl -s -m 20 -I$proxy";
+
+# as a second attempt, this will be used. This is not using HEAD but will
+# get the whole frigging document!
+$linkcheckfull = "curl -s -m 20 -i$proxy";
+
+# htmlget, URL will be appended to the right of this command line
+$htmlget = "curl -s$proxy";
+
+# Parse the input URL and split it into the relevant parts:
+
+sub SplitURL {
+    my $inurl = $_[0];
+
+    if($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = $4;
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = "";
+       
+       if($getpath !~ /\//) {
+           $getpath ="";
+           $getdocument = $3;
+       }
+    
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = "";
+       $getdocument = "";
+    }
+    else {
+       print "Couldn't parse the specified URL, retry please!\n";
+       exit;
+    }
+}
+
+&SplitURL($geturl);
+
+#print "protocol = $getprotocol\n";
+#print "server = $getserver\n";
+#print "path = $getpath\n";
+#print "document = $getdocument\n";
+#exit;
+
+if(!$usestdin) {
+    open(HEADGET, "$linkcheck $geturl|") ||
+       die "Couldn't get web page for some reason";
+  headget:
+    while(<HEADGET>) {
+#      print $_;
+       if($_ =~ /HTTP\/.*3\d\d /) {
+           $pagemoved=1;
+       }
+       elsif($pagemoved &&
+              ($_ =~ /^Location: (.*)/)) {
+           $geturl = $1;
+
+           &SplitURL($geturl);
+
+           $pagemoved++;
+           last headget;
+       }
+    }
+    close(HEADGET);
+
+    if($pagemoved == 1) {
+       print "Page is moved but we don't know where. Did you forget the ",
+       "traling slash?\n";
+       exit;
+    }
+
+    open(WEBGET, "$htmlget $geturl|") ||
+       die "Couldn't get web page for some reason";
+
+    while(<WEBGET>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+#    print $line."\n";
+       $in=$in.$line;
+    }
+
+    close(WEBGET);
+}
+else {
+    while(<STDIN>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+       $in=$in.$line;
+    }
+}
+
+#print length($in)."\n";
+
+sub LinkWorks {
+    my $check = $_[0];
+
+#   URL encode:
+#    $check =~s/([^a-zA-Z0-9_:\/.-])/uc sprintf("%%%02x",ord($1))/eg;
+
+    @doc = `$linkcheck \"$check\"`;
+
+    $head = 1;
+
+#    print "COMMAND: $linkcheck \"$check\"\n";
+#    print $doc[0]."\n";
+
+  boo:
+    if( $doc[0] =~ /^HTTP[^ ]+ (\d+)/ ) {
+       $error = $1;
+
+       if($error < 400 ) {
+           return "GOOD";
+       }
+       else {
+           
+           if($head && ($error >= 500)) {
+               # This server doesn't like HEAD!
+               @doc = `$linkcheckfull \"$check\"`;
+               $head = 0;
+               goto boo;
+           }
+           return "BAD";
+       }
+    }
+    return "BAD";
+}
+
+
+sub GetLinks {
+    my $in = $_[0];
+    my @result;
+
+  getlinkloop:
+    while($in =~ /[^<]*(<[^>]+>)/g ) {
+       # we have a tag in $1
+       $tag = $1;
+       
+       if($tag =~ /^<!--/) {
+           # this is a comment tag, ignore it 
+       }
+       else {
+           if($tag =~ /(src|href|background|archive) *= *(\"[^\"]\"|[^ )>]*)/i) {
+               $url=$2;
+               if($url =~ /^\"(.*)\"$/) {
+                   # this was a "string" now $1 has removed the quotes:
+                   $url=$1;
+               }
+
+
+               $url =~ s/([^\#]*)\#.*/$1/g;
+
+               if($url eq "") {
+                   # if the link was nothing than a #-link it may now have
+                   # been emptied completely so then we skip the rest
+                   next getlinkloop;               
+               }
+
+               if($done{$url}) {
+                   # if this url already is done, do next
+                   $done{$url}++;
+                   next getlinkloop;
+               }
+
+               $done{$url} = 1; # this is "done"
+
+               push @result, $url;
+               if($tag =~ /< *([^ ]+)/) {
+#                  print "TAG: $1\n";
+                   $tagtype{$url}=$1;
+               }
+           }
+        }
+    }
+    return @result;
+}
+
+@links = &GetLinks($in);
+
+ linkloop:
+for(@links) {
+    $url = $_;
+
+    if($url =~ /^([^:]+):/) {
+       $prot = $1;
+#      if($prot !~ /(http|ftp|gopher)/i) {
+       if($prot !~ /http/i) {
+           # this is an unsupported protocol, we ignore this
+           next linkloop;
+       }
+       $link = $url;
+    }
+    else {
+       if($external) {
+           next linkloop;
+       }
+
+       # this is a link on the save server:
+       if($url =~ /^\//) {
+           # from root
+           $link = "$getprotocol://$getserver$url";
+       }
+       else {
+           # from the scanned page's dir
+           $nyurl=$url;
+
+           if(length($getpath) &&
+              ($getpath !~ /\/$/) &&
+              ($nyurl !~ /^\//)) {
+               # lacks ending slash, add one to the document part:
+               $nyurl = "/".$nyurl;
+           }
+           $link = "$getprotocol://$getserver/$getpath$nyurl";
+       }
+    }
+
+#print "test $link\n";
+#$success = "GOOD";
+
+    $success = &LinkWorks($link);
+
+    $count = $done{$url};
+
+    $allcount += $count;
+
+    print "$success $count <".$tagtype{$url}."> $link $url\n";
+
+# If bad and -l, present the line numbers of the usage
+    if("BAD" eq $success) {
+       $badlinks++;
+       if($linenumber) {
+           $line =1;
+           for(@indoc) {
+               if($_ =~ /$url/) {
+                   print " line $line\n";
+               }
+               $line++;
+           }
+       }
+    }
+
+}
+
+if($verbose) {
+    print "$allcount links were checked";
+    if($badlinks > 0) {
+       print ", $badlinks were found bad";
+    }
+    print "\n";
+}
diff --git a/perl/checklinks.pl.in b/perl/checklinks.pl.in
new file mode 100755 (executable)
index 0000000..17032b3
--- /dev/null
@@ -0,0 +1,336 @@
+#!@PERL@
+#
+# checklinks.pl
+#
+# This script extracts all links from a HTML page and checks their validity.
+# Written to use 'curl' for URL checking.
+#
+# Author: Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>
+# Version: 0.7 Sept 30, 1998
+#
+# HISTORY
+#
+# 0.5 - Cuts off the #-part from links before checking.
+#
+# 0.6 - Now deals with error codes 3XX better and follows the Location:
+#       properly.
+#     - Added the -x flag that only checks http:// -links
+#
+# 0.7 - Ok, http://www.viunga.se/main.html didn't realize this had no path
+#       but a document. Now it does.
+#
+#
+
+$in="";
+
+ argv:
+if($ARGV[0] eq "-v" ) {
+    $verbose = 1;
+    shift @ARGV;
+    goto argv;
+}
+elsif($ARGV[0] eq "-i" ) {
+    $usestdin = 1;
+    shift @ARGV;
+    goto argv;
+}
+elsif($ARGV[0] eq "-l" ) {
+    $linenumber = 1;
+    shift @ARGV;
+    goto argv;
+}
+elsif($ARGV[0] eq "-h" ) {
+    $help = 1;
+    shift @ARGV;
+    goto argv;
+}
+elsif($ARGV[0] eq "-x" ) {
+    $external = 1;
+    shift @ARGV;
+    goto argv;
+}
+
+$geturl = $ARGV[0];
+
+if(($geturl eq "") || $help) {
+    print  "Usage: $0 [-hilvx] <full URL>\n",
+    " Use a traling slash for directory URLs!\n",
+    " -h  This help text\n",
+    " -i  Read the initial page from stdin\n",
+    " -l  Line number report for BAD links\n",
+    " -v  Verbose mode\n",
+    " -x  Check non-local (external?) links only\n";
+    exit;
+}
+
+if($ARGV[1] eq "-") {
+    print "We use stdin!\n";
+    $usestdin = 1;
+}
+
+# This is necessary from where I tried this:
+#$proxy =" -x 194.237.142.41:80";
+
+# linkchecker, URL will be appended to the right of this command line
+# this is the one using HEAD:
+$linkcheck = "curl -s -m 20 -I$proxy";
+
+# as a second attempt, this will be used. This is not using HEAD but will
+# get the whole frigging document!
+$linkcheckfull = "curl -s -m 20 -i$proxy";
+
+# htmlget, URL will be appended to the right of this command line
+$htmlget = "curl -s$proxy";
+
+# Parse the input URL and split it into the relevant parts:
+
+sub SplitURL {
+    my $inurl = $_[0];
+
+    if($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = $4;
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = "";
+       
+       if($getpath !~ /\//) {
+           $getpath ="";
+           $getdocument = $3;
+       }
+    
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = "";
+       $getdocument = "";
+    }
+    else {
+       print "Couldn't parse the specified URL, retry please!\n";
+       exit;
+    }
+}
+
+&SplitURL($geturl);
+
+#print "protocol = $getprotocol\n";
+#print "server = $getserver\n";
+#print "path = $getpath\n";
+#print "document = $getdocument\n";
+#exit;
+
+if(!$usestdin) {
+    open(HEADGET, "$linkcheck $geturl|") ||
+       die "Couldn't get web page for some reason";
+  headget:
+    while(<HEADGET>) {
+#      print $_;
+       if($_ =~ /HTTP\/.*3\d\d /) {
+           $pagemoved=1;
+       }
+       elsif($pagemoved &&
+              ($_ =~ /^Location: (.*)/)) {
+           $geturl = $1;
+
+           &SplitURL($geturl);
+
+           $pagemoved++;
+           last headget;
+       }
+    }
+    close(HEADGET);
+
+    if($pagemoved == 1) {
+       print "Page is moved but we don't know where. Did you forget the ",
+       "traling slash?\n";
+       exit;
+    }
+
+    open(WEBGET, "$htmlget $geturl|") ||
+       die "Couldn't get web page for some reason";
+
+    while(<WEBGET>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+#    print $line."\n";
+       $in=$in.$line;
+    }
+
+    close(WEBGET);
+}
+else {
+    while(<STDIN>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+       $in=$in.$line;
+    }
+}
+
+#print length($in)."\n";
+
+sub LinkWorks {
+    my $check = $_[0];
+
+#   URL encode:
+#    $check =~s/([^a-zA-Z0-9_:\/.-])/uc sprintf("%%%02x",ord($1))/eg;
+
+    @doc = `$linkcheck \"$check\"`;
+
+    $head = 1;
+
+#    print "COMMAND: $linkcheck \"$check\"\n";
+#    print $doc[0]."\n";
+
+  boo:
+    if( $doc[0] =~ /^HTTP[^ ]+ (\d+)/ ) {
+       $error = $1;
+
+       if($error < 400 ) {
+           return "GOOD";
+       }
+       else {
+           
+           if($head && ($error >= 500)) {
+               # This server doesn't like HEAD!
+               @doc = `$linkcheckfull \"$check\"`;
+               $head = 0;
+               goto boo;
+           }
+           return "BAD";
+       }
+    }
+    return "BAD";
+}
+
+
+sub GetLinks {
+    my $in = $_[0];
+    my @result;
+
+  getlinkloop:
+    while($in =~ /[^<]*(<[^>]+>)/g ) {
+       # we have a tag in $1
+       $tag = $1;
+       
+       if($tag =~ /^<!--/) {
+           # this is a comment tag, ignore it 
+       }
+       else {
+           if($tag =~ /(src|href|background|archive) *= *(\"[^\"]\"|[^ )>]*)/i) {
+               $url=$2;
+               if($url =~ /^\"(.*)\"$/) {
+                   # this was a "string" now $1 has removed the quotes:
+                   $url=$1;
+               }
+
+
+               $url =~ s/([^\#]*)\#.*/$1/g;
+
+               if($url eq "") {
+                   # if the link was nothing than a #-link it may now have
+                   # been emptied completely so then we skip the rest
+                   next getlinkloop;               
+               }
+
+               if($done{$url}) {
+                   # if this url already is done, do next
+                   $done{$url}++;
+                   next getlinkloop;
+               }
+
+               $done{$url} = 1; # this is "done"
+
+               push @result, $url;
+               if($tag =~ /< *([^ ]+)/) {
+#                  print "TAG: $1\n";
+                   $tagtype{$url}=$1;
+               }
+           }
+        }
+    }
+    return @result;
+}
+
+@links = &GetLinks($in);
+
+ linkloop:
+for(@links) {
+    $url = $_;
+
+    if($url =~ /^([^:]+):/) {
+       $prot = $1;
+#      if($prot !~ /(http|ftp|gopher)/i) {
+       if($prot !~ /http/i) {
+           # this is an unsupported protocol, we ignore this
+           next linkloop;
+       }
+       $link = $url;
+    }
+    else {
+       if($external) {
+           next linkloop;
+       }
+
+       # this is a link on the save server:
+       if($url =~ /^\//) {
+           # from root
+           $link = "$getprotocol://$getserver$url";
+       }
+       else {
+           # from the scanned page's dir
+           $nyurl=$url;
+
+           if(length($getpath) &&
+              ($getpath !~ /\/$/) &&
+              ($nyurl !~ /^\//)) {
+               # lacks ending slash, add one to the document part:
+               $nyurl = "/".$nyurl;
+           }
+           $link = "$getprotocol://$getserver/$getpath$nyurl";
+       }
+    }
+
+#print "test $link\n";
+#$success = "GOOD";
+
+    $success = &LinkWorks($link);
+
+    $count = $done{$url};
+
+    $allcount += $count;
+
+    print "$success $count <".$tagtype{$url}."> $link $url\n";
+
+# If bad and -l, present the line numbers of the usage
+    if("BAD" eq $success) {
+       $badlinks++;
+       if($linenumber) {
+           $line =1;
+           for(@indoc) {
+               if($_ =~ /$url/) {
+                   print " line $line\n";
+               }
+               $line++;
+           }
+       }
+    }
+
+}
+
+if($verbose) {
+    print "$allcount links were checked";
+    if($badlinks > 0) {
+       print ", $badlinks were found bad";
+    }
+    print "\n";
+}
diff --git a/perl/formfind.pl b/perl/formfind.pl
new file mode 100644 (file)
index 0000000..cd19976
--- /dev/null
@@ -0,0 +1,273 @@
+#!/usr/local/bin/perl
+#
+# formfind.pl
+#
+# This script gets a HTML page from the specified URL and presents form
+# information you may need in order to machine-make a respond to the form.
+#
+# Written to use 'curl' for URL fetching.
+#
+# Author: Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>
+# Version: 0.1 Nov 12, 1998
+#
+# HISTORY
+#
+# 0.1 - Created now!
+#
+# TODO
+# respect file:// URLs for local file fetches!
+
+$in="";
+
+$usestdin = 0;
+if($ARGV[0] eq "" ) {
+    $usestdin = 1;
+}
+else {
+    $geturl = $ARGV[0];
+}
+
+if(($geturl eq "") && !$usestdin) {
+    print  "Usage: $0 <full source URL>\n",
+    " Use a traling slash for directory URLs!\n";
+    exit;
+}
+# If you need a proxy for web access, edit your .curlrc file to feature
+# -x <proxy:port>
+
+# linkchecker, URL will be appended to the right of this command line
+# this is the one using HEAD:
+$linkcheck = "curl -s -m 20 -I";
+
+# as a second attempt, this will be used. This is not using HEAD but will
+# get the whole frigging document!
+$linkcheckfull = "curl -s -m 20 -i";
+
+# htmlget, URL will be appended to the right of this command line
+$htmlget = "curl -s";
+
+# urlget, URL will be appended to the right of this command line
+# this stores the file with the remote file name in the current dir
+$urlget = "curl -O -s";
+
+# Parse the input URL and split it into the relevant parts:
+
+sub SplitURL {
+    my $inurl = $_[0];
+
+    if($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = $4;
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = "";
+       
+       if($getpath !~ /\//) {
+           $getpath ="";
+           $getdocument = $3;
+       }
+    
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = "";
+       $getdocument = "";
+    }
+    else {
+       print "Couldn't parse the specified URL, retry please!\n";
+       exit;
+    }
+}
+
+
+if(!$usestdin) {
+
+    &SplitURL($geturl);
+#print "protocol = $getprotocol\n";
+#print "server = $getserver\n";
+#print "path = $getpath\n";
+#print "document = $getdocument\n";
+#exit;
+
+    open(HEADGET, "$linkcheck $geturl|") ||
+       die "Couldn't get web page for some reason";
+  headget:
+    while(<HEADGET>) {
+#      print $_;
+       if($_ =~ /HTTP\/.*3\d\d /) {
+           $pagemoved=1;
+       }
+       elsif($pagemoved &&
+              ($_ =~ /^Location: (.*)/)) {
+           $geturl = $1;
+
+           &SplitURL($geturl);
+
+           $pagemoved++;
+           last headget;
+       }
+    }
+    close(HEADGET);
+
+    if($pagemoved == 1) {
+       print "Page is moved but we don't know where. Did you forget the ",
+       "traling slash?\n";
+       exit;
+    }
+
+    open(WEBGET, "$htmlget $geturl|") ||
+       die "Couldn't get web page for some reason";
+
+    while(<WEBGET>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+#    print $line."\n";
+       $in=$in.$line;
+    }
+
+    close(WEBGET);
+}
+else {
+    while(<STDIN>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+       $in=$in.$line;
+    }
+}
+
+  getlinkloop:
+    while($in =~ /[^<]*(<[^>]+>)/g ) {
+       # we have a tag in $1
+       $tag = $1;
+       
+       if($tag =~ /^<!--/) {
+           # this is a comment tag, ignore it 
+       }
+       else {
+           if(!$form &&
+              ($tag =~ /^< *form/i )) {
+               $method= $tag;
+               if($method =~ /method *=/i) {
+                   $method=~ s/.*method *= *(\"|)([^ \">]*).*/$2/gi;
+               }
+               else {
+                   $method="get"; # default method
+               }
+               $action= $tag;
+               $action=~ s/.*action *= *(\"|)([^ \">]*).*/$2/gi;
+
+               $method=uc($method);
+
+               $enctype=$tag;
+               if ($enctype =~ /enctype *=/) {
+                   $enctype=~ s/.*enctype *= *(\'|\"|)([^ \"\'>]*).*/$2/gi;
+
+                   if($enctype eq "multipart/form-data") {
+                       $enctype="multipart form upload [use -F]"
+                   }
+                   $enctype = "\n--- type: $enctype";
+               }
+               else {
+                   $enctype="";
+               }
+
+               print "--- FORM report. Uses $method to URL \"$action\"$enctype\n";
+#              print "TAG: $tag\n";
+#              print "METHOD: $method\n";
+#              print "ACTION: $action\n";
+               $form=1;
+           }
+           elsif($form &&
+                 ($tag =~ /< *\/form/i )) {
+#              print "TAG: $tag\n";
+               print "--- end of FORM\n";
+               $form=0;
+               if( 0 ) {
+                   print "*** Fill in all or any of these: (default assigns may be shown)\n";
+                   for(@vars) {
+                       $var = $_;
+                       $def = $value{$var};
+                       print "$var=$def\n";
+                   }
+                   print "*** Pick one of these:\n";
+                   for(@alts) {
+                       print "$_\n";
+                   }
+               }
+               undef @vars;
+               undef @alts;
+           }
+           elsif($form &&
+                 ($tag =~ /^< *(input|select)/i)) {
+               $mtag = $1;
+#              print "TAG: $tag\n";
+               
+               $name=$tag;
+               if($name =~ /name *=/i) {
+                   $name=~ s/.*name *= *(\"|)([^ \">]*).*/$2/gi;
+               }
+               else {
+                   # no name given
+                   $name="";
+               }
+               # get value tag
+               $value= $tag;
+               if($value =~ /value *=/i) {
+                   $value=~ s/.*value *= *(\"|)([^ \">]*).*/$2/gi;
+               }
+               else {
+                   $value="";
+               }
+               
+               if($mtag =~ /select/i) {
+                   print "Select: $name\n";
+                   push @vars, "$name";
+                   $select = 1;
+               }
+               else {
+                   $type=$tag;
+                   if($type =~ /type *=/i) {
+                       $type =~ s/.*type *= *(\"|)([^ \">]*).*/$2/gi;
+                   }
+                   else {
+                       $type="text"; # default type
+                   }
+                   $type=uc($type);
+                   if(lc($type) eq "reset") {
+                       # reset types are for UI only, ignore.
+                   }
+                   elsif($name eq "") {
+                       # let's read the value parameter
+
+                       print "Button: \"$value\" ($type)\n";
+                       push @alts, "$value";
+                   }
+                   else {
+                       $info="";
+                       if($value ne "") {
+                           $info="=$value";
+                       }
+                       print "Input: $name$info ($type)\n";
+                       push @vars, "$name";
+                       # store default value:
+                       $value{$name}=$value;
+                   }
+               }
+           }
+           elsif($select &&
+                   ($tag =~ /^< *\/ *select/i)) {
+               $select = 0;
+           }
+        }
+    }
+
diff --git a/perl/formfind.pl.in b/perl/formfind.pl.in
new file mode 100755 (executable)
index 0000000..6428e99
--- /dev/null
@@ -0,0 +1,273 @@
+#!@PERL@
+#
+# formfind.pl
+#
+# This script gets a HTML page from the specified URL and presents form
+# information you may need in order to machine-make a respond to the form.
+#
+# Written to use 'curl' for URL fetching.
+#
+# Author: Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>
+# Version: 0.1 Nov 12, 1998
+#
+# HISTORY
+#
+# 0.1 - Created now!
+#
+# TODO
+# respect file:// URLs for local file fetches!
+
+$in="";
+
+$usestdin = 0;
+if($ARGV[0] eq "" ) {
+    $usestdin = 1;
+}
+else {
+    $geturl = $ARGV[0];
+}
+
+if(($geturl eq "") && !$usestdin) {
+    print  "Usage: $0 <full source URL>\n",
+    " Use a traling slash for directory URLs!\n";
+    exit;
+}
+# If you need a proxy for web access, edit your .curlrc file to feature
+# -x <proxy:port>
+
+# linkchecker, URL will be appended to the right of this command line
+# this is the one using HEAD:
+$linkcheck = "curl -s -m 20 -I";
+
+# as a second attempt, this will be used. This is not using HEAD but will
+# get the whole frigging document!
+$linkcheckfull = "curl -s -m 20 -i";
+
+# htmlget, URL will be appended to the right of this command line
+$htmlget = "curl -s";
+
+# urlget, URL will be appended to the right of this command line
+# this stores the file with the remote file name in the current dir
+$urlget = "curl -O -s";
+
+# Parse the input URL and split it into the relevant parts:
+
+sub SplitURL {
+    my $inurl = $_[0];
+
+    if($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = $4;
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = "";
+       
+       if($getpath !~ /\//) {
+           $getpath ="";
+           $getdocument = $3;
+       }
+    
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = "";
+       $getdocument = "";
+    }
+    else {
+       print "Couldn't parse the specified URL, retry please!\n";
+       exit;
+    }
+}
+
+
+if(!$usestdin) {
+
+    &SplitURL($geturl);
+#print "protocol = $getprotocol\n";
+#print "server = $getserver\n";
+#print "path = $getpath\n";
+#print "document = $getdocument\n";
+#exit;
+
+    open(HEADGET, "$linkcheck $geturl|") ||
+       die "Couldn't get web page for some reason";
+  headget:
+    while(<HEADGET>) {
+#      print $_;
+       if($_ =~ /HTTP\/.*3\d\d /) {
+           $pagemoved=1;
+       }
+       elsif($pagemoved &&
+              ($_ =~ /^Location: (.*)/)) {
+           $geturl = $1;
+
+           &SplitURL($geturl);
+
+           $pagemoved++;
+           last headget;
+       }
+    }
+    close(HEADGET);
+
+    if($pagemoved == 1) {
+       print "Page is moved but we don't know where. Did you forget the ",
+       "traling slash?\n";
+       exit;
+    }
+
+    open(WEBGET, "$htmlget $geturl|") ||
+       die "Couldn't get web page for some reason";
+
+    while(<WEBGET>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+#    print $line."\n";
+       $in=$in.$line;
+    }
+
+    close(WEBGET);
+}
+else {
+    while(<STDIN>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+       $in=$in.$line;
+    }
+}
+
+  getlinkloop:
+    while($in =~ /[^<]*(<[^>]+>)/g ) {
+       # we have a tag in $1
+       $tag = $1;
+       
+       if($tag =~ /^<!--/) {
+           # this is a comment tag, ignore it 
+       }
+       else {
+           if(!$form &&
+              ($tag =~ /^< *form/i )) {
+               $method= $tag;
+               if($method =~ /method *=/i) {
+                   $method=~ s/.*method *= *(\"|)([^ \">]*).*/$2/gi;
+               }
+               else {
+                   $method="get"; # default method
+               }
+               $action= $tag;
+               $action=~ s/.*action *= *(\"|)([^ \">]*).*/$2/gi;
+
+               $method=uc($method);
+
+               $enctype=$tag;
+               if ($enctype =~ /enctype *=/) {
+                   $enctype=~ s/.*enctype *= *(\'|\"|)([^ \"\'>]*).*/$2/gi;
+
+                   if($enctype eq "multipart/form-data") {
+                       $enctype="multipart form upload [use -F]"
+                   }
+                   $enctype = "\n--- type: $enctype";
+               }
+               else {
+                   $enctype="";
+               }
+
+               print "--- FORM report. Uses $method to URL \"$action\"$enctype\n";
+#              print "TAG: $tag\n";
+#              print "METHOD: $method\n";
+#              print "ACTION: $action\n";
+               $form=1;
+           }
+           elsif($form &&
+                 ($tag =~ /< *\/form/i )) {
+#              print "TAG: $tag\n";
+               print "--- end of FORM\n";
+               $form=0;
+               if( 0 ) {
+                   print "*** Fill in all or any of these: (default assigns may be shown)\n";
+                   for(@vars) {
+                       $var = $_;
+                       $def = $value{$var};
+                       print "$var=$def\n";
+                   }
+                   print "*** Pick one of these:\n";
+                   for(@alts) {
+                       print "$_\n";
+                   }
+               }
+               undef @vars;
+               undef @alts;
+           }
+           elsif($form &&
+                 ($tag =~ /^< *(input|select)/i)) {
+               $mtag = $1;
+#              print "TAG: $tag\n";
+               
+               $name=$tag;
+               if($name =~ /name *=/i) {
+                   $name=~ s/.*name *= *(\"|)([^ \">]*).*/$2/gi;
+               }
+               else {
+                   # no name given
+                   $name="";
+               }
+               # get value tag
+               $value= $tag;
+               if($value =~ /value *=/i) {
+                   $value=~ s/.*value *= *(\"|)([^ \">]*).*/$2/gi;
+               }
+               else {
+                   $value="";
+               }
+               
+               if($mtag =~ /select/i) {
+                   print "Select: $name\n";
+                   push @vars, "$name";
+                   $select = 1;
+               }
+               else {
+                   $type=$tag;
+                   if($type =~ /type *=/i) {
+                       $type =~ s/.*type *= *(\"|)([^ \">]*).*/$2/gi;
+                   }
+                   else {
+                       $type="text"; # default type
+                   }
+                   $type=uc($type);
+                   if(lc($type) eq "reset") {
+                       # reset types are for UI only, ignore.
+                   }
+                   elsif($name eq "") {
+                       # let's read the value parameter
+
+                       print "Button: \"$value\" ($type)\n";
+                       push @alts, "$value";
+                   }
+                   else {
+                       $info="";
+                       if($value ne "") {
+                           $info="=$value";
+                       }
+                       print "Input: $name$info ($type)\n";
+                       push @vars, "$name";
+                       # store default value:
+                       $value{$name}=$value;
+                   }
+               }
+           }
+           elsif($select &&
+                   ($tag =~ /^< *\/ *select/i)) {
+               $select = 0;
+           }
+        }
+    }
+
diff --git a/perl/getlinks.pl b/perl/getlinks.pl
new file mode 100644 (file)
index 0000000..06da56e
--- /dev/null
@@ -0,0 +1,261 @@
+#!/usr/local/bin/perl
+#
+# getlinks.pl
+#
+# This script extracts all links from a HTML page, compares them to a pattern
+# entered on the command line and then downloads matching links into the
+# target dir (also specified on the command line).
+#
+# Written to use 'curl' for URL fetching, uses the source file names in the
+# target directory.
+#
+# Author: Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>
+# Version: 0.1 Oct 7, 1998
+#
+# HISTORY
+#
+# 0.1 - Created now!
+#
+
+$in="";
+
+ argv:
+if($ARGV[0] eq "-v" ) {
+    $verbose = 1;
+    shift @ARGV;
+    goto argv;
+}
+if($ARGV[0] eq "-d" ) {
+    $display = 1;
+    shift @ARGV;
+    goto argv;
+}
+elsif($ARGV[0] eq "-h" ) {
+    $help = 1;
+    shift @ARGV;
+    goto argv;
+}
+
+$geturl = $ARGV[0];
+$getdir = $ARGV[1];
+$getregex = $ARGV[2];
+
+if(($geturl eq "") ||
+   (($getdir eq "") && !$display) ||
+   $help) {
+    print  "Usage: $0 [-hv] <full source URL> <target dir> [regex]\n",
+    " Use a traling slash for directory URLs!\n",
+    " Use \"quotes\" around the regex!\n",
+    " -h  This help text\n",
+    " -d  Display matches only instead of downloading\n",
+    " -v  Verbose mode\n";
+    exit;
+}
+
+# change to target directory:
+chdir $getdir ||
+    die "couldn't cd into $getdir";
+
+# This is necessary from where I tried this:
+#$proxy =" -x 194.237.142.41:80";
+
+# linkchecker, URL will be appended to the right of this command line
+# this is the one using HEAD:
+$linkcheck = "curl -s -m 20 -I$proxy";
+
+# as a second attempt, this will be used. This is not using HEAD but will
+# get the whole frigging document!
+$linkcheckfull = "curl -s -m 20 -i$proxy";
+
+# htmlget, URL will be appended to the right of this command line
+$htmlget = "curl -s$proxy";
+
+# urlget, URL will be appended to the right of this command line
+# this stores the file with the remote file name in the current dir
+$urlget = "curl -O -s$proxy";
+
+# Parse the input URL and split it into the relevant parts:
+
+sub SplitURL {
+    my $inurl = $_[0];
+
+    if($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = $4;
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = "";
+       
+       if($getpath !~ /\//) {
+           $getpath ="";
+           $getdocument = $3;
+       }
+    
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = "";
+       $getdocument = "";
+    }
+    else {
+       print "Couldn't parse the specified URL, retry please!\n";
+       exit;
+    }
+}
+
+&SplitURL($geturl);
+
+#print "protocol = $getprotocol\n";
+#print "server = $getserver\n";
+#print "path = $getpath\n";
+#print "document = $getdocument\n";
+#exit;
+
+if(!$usestdin) {
+    open(HEADGET, "$linkcheck $geturl|") ||
+       die "Couldn't get web page for some reason";
+  headget:
+    while(<HEADGET>) {
+#      print $_;
+       if($_ =~ /HTTP\/.*3\d\d /) {
+           $pagemoved=1;
+       }
+       elsif($pagemoved &&
+              ($_ =~ /^Location: (.*)/)) {
+           $geturl = $1;
+
+           &SplitURL($geturl);
+
+           $pagemoved++;
+           last headget;
+       }
+    }
+    close(HEADGET);
+
+    if($pagemoved == 1) {
+       print "Page is moved but we don't know where. Did you forget the ",
+       "traling slash?\n";
+       exit;
+    }
+
+    open(WEBGET, "$htmlget $geturl|") ||
+       die "Couldn't get web page for some reason";
+
+    while(<WEBGET>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+#    print $line."\n";
+       $in=$in.$line;
+    }
+
+    close(WEBGET);
+}
+else {
+    while(<STDIN>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+       $in=$in.$line;
+    }
+}
+
+sub GetLinks {
+    my $in = $_[0];
+    my @result;
+
+  getlinkloop:
+    while($in =~ /[^<]*(<[^>]+>)/g ) {
+       # we have a tag in $1
+       $tag = $1;
+       
+       if($tag =~ /^<!--/) {
+           # this is a comment tag, ignore it 
+       }
+       else {
+           if($tag =~ /(src|href|background|archive) *= *(\"[^\"]\"|[^ )>]*)/i) {
+               $url=$2;
+               if($url =~ /^\"(.*)\"$/) {
+                   # this was a "string" now $1 has removed the quotes:
+                   $url=$1;
+               }
+
+
+               $url =~ s/([^\#]*)\#.*/$1/g;
+
+               if($url eq "") {
+                   # if the link was nothing than a #-link it may now have
+                   # been emptied completely so then we skip the rest
+                   next getlinkloop;               
+               }
+
+               if($done{$url}) {
+                   # if this url already is done, do next
+                   $done{$url}++;
+                   next getlinkloop;
+               }
+
+               $done{$url} = 1; # this is "done"
+
+               push @result, $url;
+               if($tag =~ /< *([^ ]+)/) {
+#                  print "TAG: $1\n";
+                   $tagtype{$url}=$1;
+               }
+           }
+        }
+    }
+    return @result;
+}
+
+@links = &GetLinks($in);
+
+ linkloop:
+for(@links) {
+    $url = $_;
+
+    if($url =~ /^([^:]+):/) {
+       $link = $url;
+    }
+    else {
+       # this is an absolute link on the same server:
+       if($url =~ /^\//) {
+           # from root
+           $link = "$getprotocol://$getserver$url";
+       }
+       else {
+           # from the scanned page's dir
+           $nyurl=$url;
+
+           if(length($getpath) &&
+              ($getpath !~ /\/$/) &&
+              ($nyurl !~ /^\//)) {
+               # lacks ending slash, add one to the document part:
+               $nyurl = "/".$nyurl;
+           }
+           $link = "$getprotocol://$getserver/$getpath$nyurl";
+       }
+    }
+
+    if($link =~ /$getregex/) {
+       if($display) {
+           print "$link\n";
+       }
+       else {
+           if($verbose) {
+               print "Gets $link\n";
+           }
+           print `$urlget $link`;
+       }
+    }
+
+
+}
diff --git a/perl/getlinks.pl.in b/perl/getlinks.pl.in
new file mode 100755 (executable)
index 0000000..1ef0d3e
--- /dev/null
@@ -0,0 +1,261 @@
+#!@PERL@
+#
+# getlinks.pl
+#
+# This script extracts all links from a HTML page, compares them to a pattern
+# entered on the command line and then downloads matching links into the
+# target dir (also specified on the command line).
+#
+# Written to use 'curl' for URL fetching, uses the source file names in the
+# target directory.
+#
+# Author: Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>
+# Version: 0.1 Oct 7, 1998
+#
+# HISTORY
+#
+# 0.1 - Created now!
+#
+
+$in="";
+
+ argv:
+if($ARGV[0] eq "-v" ) {
+    $verbose = 1;
+    shift @ARGV;
+    goto argv;
+}
+if($ARGV[0] eq "-d" ) {
+    $display = 1;
+    shift @ARGV;
+    goto argv;
+}
+elsif($ARGV[0] eq "-h" ) {
+    $help = 1;
+    shift @ARGV;
+    goto argv;
+}
+
+$geturl = $ARGV[0];
+$getdir = $ARGV[1];
+$getregex = $ARGV[2];
+
+if(($geturl eq "") ||
+   (($getdir eq "") && !$display) ||
+   $help) {
+    print  "Usage: $0 [-hv] <full source URL> <target dir> [regex]\n",
+    " Use a traling slash for directory URLs!\n",
+    " Use \"quotes\" around the regex!\n",
+    " -h  This help text\n",
+    " -d  Display matches only instead of downloading\n",
+    " -v  Verbose mode\n";
+    exit;
+}
+
+# change to target directory:
+chdir $getdir ||
+    die "couldn't cd into $getdir";
+
+# This is necessary from where I tried this:
+#$proxy =" -x 194.237.142.41:80";
+
+# linkchecker, URL will be appended to the right of this command line
+# this is the one using HEAD:
+$linkcheck = "curl -s -m 20 -I$proxy";
+
+# as a second attempt, this will be used. This is not using HEAD but will
+# get the whole frigging document!
+$linkcheckfull = "curl -s -m 20 -i$proxy";
+
+# htmlget, URL will be appended to the right of this command line
+$htmlget = "curl -s$proxy";
+
+# urlget, URL will be appended to the right of this command line
+# this stores the file with the remote file name in the current dir
+$urlget = "curl -O -s$proxy";
+
+# Parse the input URL and split it into the relevant parts:
+
+sub SplitURL {
+    my $inurl = $_[0];
+
+    if($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = $4;
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/([^\/]*)\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = $3;
+       $getdocument = "";
+       
+       if($getpath !~ /\//) {
+           $getpath ="";
+           $getdocument = $3;
+       }
+    
+    }
+    elsif ($inurl=~ /^([^:]+):\/\/(.*)/ ) {
+       $getprotocol = $1;
+       $getserver = $2;
+       $getpath = "";
+       $getdocument = "";
+    }
+    else {
+       print "Couldn't parse the specified URL, retry please!\n";
+       exit;
+    }
+}
+
+&SplitURL($geturl);
+
+#print "protocol = $getprotocol\n";
+#print "server = $getserver\n";
+#print "path = $getpath\n";
+#print "document = $getdocument\n";
+#exit;
+
+if(!$usestdin) {
+    open(HEADGET, "$linkcheck $geturl|") ||
+       die "Couldn't get web page for some reason";
+  headget:
+    while(<HEADGET>) {
+#      print $_;
+       if($_ =~ /HTTP\/.*3\d\d /) {
+           $pagemoved=1;
+       }
+       elsif($pagemoved &&
+              ($_ =~ /^Location: (.*)/)) {
+           $geturl = $1;
+
+           &SplitURL($geturl);
+
+           $pagemoved++;
+           last headget;
+       }
+    }
+    close(HEADGET);
+
+    if($pagemoved == 1) {
+       print "Page is moved but we don't know where. Did you forget the ",
+       "traling slash?\n";
+       exit;
+    }
+
+    open(WEBGET, "$htmlget $geturl|") ||
+       die "Couldn't get web page for some reason";
+
+    while(<WEBGET>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+#    print $line."\n";
+       $in=$in.$line;
+    }
+
+    close(WEBGET);
+}
+else {
+    while(<STDIN>) {
+       $line = $_;
+       push @indoc, $line;
+       $line=~ s/\n//g;
+       $line=~ s/\r//g;
+       $in=$in.$line;
+    }
+}
+
+sub GetLinks {
+    my $in = $_[0];
+    my @result;
+
+  getlinkloop:
+    while($in =~ /[^<]*(<[^>]+>)/g ) {
+       # we have a tag in $1
+       $tag = $1;
+       
+       if($tag =~ /^<!--/) {
+           # this is a comment tag, ignore it 
+       }
+       else {
+           if($tag =~ /(src|href|background|archive) *= *(\"[^\"]\"|[^ )>]*)/i) {
+               $url=$2;
+               if($url =~ /^\"(.*)\"$/) {
+                   # this was a "string" now $1 has removed the quotes:
+                   $url=$1;
+               }
+
+
+               $url =~ s/([^\#]*)\#.*/$1/g;
+
+               if($url eq "") {
+                   # if the link was nothing than a #-link it may now have
+                   # been emptied completely so then we skip the rest
+                   next getlinkloop;               
+               }
+
+               if($done{$url}) {
+                   # if this url already is done, do next
+                   $done{$url}++;
+                   next getlinkloop;
+               }
+
+               $done{$url} = 1; # this is "done"
+
+               push @result, $url;
+               if($tag =~ /< *([^ ]+)/) {
+#                  print "TAG: $1\n";
+                   $tagtype{$url}=$1;
+               }
+           }
+        }
+    }
+    return @result;
+}
+
+@links = &GetLinks($in);
+
+ linkloop:
+for(@links) {
+    $url = $_;
+
+    if($url =~ /^([^:]+):/) {
+       $link = $url;
+    }
+    else {
+       # this is an absolute link on the same server:
+       if($url =~ /^\//) {
+           # from root
+           $link = "$getprotocol://$getserver$url";
+       }
+       else {
+           # from the scanned page's dir
+           $nyurl=$url;
+
+           if(length($getpath) &&
+              ($getpath !~ /\/$/) &&
+              ($nyurl !~ /^\//)) {
+               # lacks ending slash, add one to the document part:
+               $nyurl = "/".$nyurl;
+           }
+           $link = "$getprotocol://$getserver/$getpath$nyurl";
+       }
+    }
+
+    if($link =~ /$getregex/) {
+       if($display) {
+           print "$link\n";
+       }
+       else {
+           if($verbose) {
+               print "Gets $link\n";
+           }
+           print `$urlget $link`;
+       }
+    }
+
+
+}
diff --git a/perl/recursiveftpget.pl b/perl/recursiveftpget.pl
new file mode 100644 (file)
index 0000000..02299b0
--- /dev/null
@@ -0,0 +1,67 @@
+#!/usr/local/bin/perl
+#
+# Author:  Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>
+# Date:    August 25 1998
+# Version: 0.1
+#
+# This is just meant as an example of why we wrote curl in the first place.
+# Quick n' easy scripting use.
+#
+
+$dir = $ARGV[0];
+
+$target = $ARGV[1];
+
+$maxdepth = $ARGV[2];
+
+if($dir eq "" || $target eq "") {
+    print "Usage: <URL> <dir> [max depth level] \n";
+    print " End the URL with a slash if a directory is specified, please\n";
+    exit;
+}
+
+if(($maxdepth ne "") && ($maxdepth == 0)) {
+    # reached maximum depth, die
+    print "Reached maximum recursive depth level ($maxdepth), exiting...\n";
+    exit;
+}
+
+# get dir
+@all = `curl -s $dir`;
+
+if($all[0] ne "") {
+    print "Got the main $dir dir\n";
+}
+
+line:
+for(@all) {
+    chop; # cut off newline
+    @linep= split(" ", $_);
+
+    $name = $linep[$#linep];
+
+    $firstletter=substr($linep[0], 0, 1);
+
+    if($firstletter eq "d") {
+        # this is a subdir, recurse
+        # if not . or .. of course
+
+        if(($name eq ".") || ($name eq "..")) {
+            next line;
+        }
+        print "Recursing for dir $dir$name in target $target/$name\n";
+
+       $nextdepth=$maxdepth-1;
+        print `$0 $dir$name/ $target/$name $nextdepth`;
+    }
+    elsif($firstletter eq "-") {
+        # this is a file, get it
+        # oh, make sure the target dir exists first
+
+        if(! -r $target ) {
+            mkdir($target,0777);
+        }
+        print "Getting file $dir$name in target $target/$name\n";
+        print `curl -s $dir$name >$target/$name`;
+    }
+}
diff --git a/perl/recursiveftpget.pl.in b/perl/recursiveftpget.pl.in
new file mode 100755 (executable)
index 0000000..7d9cf8e
--- /dev/null
@@ -0,0 +1,67 @@
+#!@PERL@
+#
+# Author:  Daniel Stenberg <Daniel.Stenberg@sth.frontec.se>
+# Date:    August 25 1998
+# Version: 0.1
+#
+# This is just meant as an example of why we wrote curl in the first place.
+# Quick n' easy scripting use.
+#
+
+$dir = $ARGV[0];
+
+$target = $ARGV[1];
+
+$maxdepth = $ARGV[2];
+
+if($dir eq "" || $target eq "") {
+    print "Usage: <URL> <dir> [max depth level] \n";
+    print " End the URL with a slash if a directory is specified, please\n";
+    exit;
+}
+
+if(($maxdepth ne "") && ($maxdepth == 0)) {
+    # reached maximum depth, die
+    print "Reached maximum recursive depth level ($maxdepth), exiting...\n";
+    exit;
+}
+
+# get dir
+@all = `curl -s $dir`;
+
+if($all[0] ne "") {
+    print "Got the main $dir dir\n";
+}
+
+line:
+for(@all) {
+    chop; # cut off newline
+    @linep= split(" ", $_);
+
+    $name = $linep[$#linep];
+
+    $firstletter=substr($linep[0], 0, 1);
+
+    if($firstletter eq "d") {
+        # this is a subdir, recurse
+        # if not . or .. of course
+
+        if(($name eq ".") || ($name eq "..")) {
+            next line;
+        }
+        print "Recursing for dir $dir$name in target $target/$name\n";
+
+       $nextdepth=$maxdepth-1;
+        print `$0 $dir$name/ $target/$name $nextdepth`;
+    }
+    elsif($firstletter eq "-") {
+        # this is a file, get it
+        # oh, make sure the target dir exists first
+
+        if(! -r $target ) {
+            mkdir($target,0777);
+        }
+        print "Getting file $dir$name in target $target/$name\n";
+        print `curl -s $dir$name >$target/$name`;
+    }
+}
diff --git a/reconf b/reconf
new file mode 100755 (executable)
index 0000000..8d29a07
--- /dev/null
+++ b/reconf
@@ -0,0 +1,16 @@
+#!/bin/sh
+#
+# $Id$
+#
+# re autoconf/automake shell script
+#
+
+die(){
+       echo "$@" ; exit
+}
+
+aclocal    || die "ahhhhh"
+autoheader || die "ahhhhh"
+automake   || die "ahhhhh"
+autoconf   || die "ahhhhh"
+
diff --git a/src/Makefile b/src/Makefile
new file mode 100644 (file)
index 0000000..a4b373e
--- /dev/null
@@ -0,0 +1,334 @@
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+#
+# $Id$
+#
+
+# Some flags needed when trying to cause warnings ;-)
+# CFLAGS = -Wall -pedantic
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+prefix = /usr/local
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/curl
+pkglibdir = $(libdir)/curl
+pkgincludedir = $(includedir)/curl
+
+top_builddir = ..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = .././install-sh -c
+INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = sparc-sun-solaris2.6
+host_triplet = sparc-sun-solaris2.6
+CC = gcc
+MAKEINFO = makeinfo
+PACKAGE = curl
+PERL = /usr/local/bin/perl
+RANLIB = ranlib
+VERSION = 6.3.1
+YACC = bison -y
+
+CPPFLAGS = -DGLOBURL -DCURL_SEPARATORS
+
+INCLUDES = -I$(top_srcdir)/include
+
+bin_PROGRAMS = curl
+
+curl_SOURCES = main.c hugehelp.c urlglob.c
+curl_LDADD = ../lib/libcurl.a
+curl_DEPENDENCIES = ../lib/libcurl.a
+BUILT_SOURCES = hugehelp.c
+CLEANFILES = hugehelp.c
+NROFF = /bin/nroff
+
+EXTRA_DIST = mkhelp.pl Makefile.vc6
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h config.h
+CONFIG_CLEAN_FILES = 
+PROGRAMS =  $(bin_PROGRAMS)
+
+
+DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I.. -I.
+LDFLAGS = 
+LIBS = -lssl -lcrypto -ldl -lsocket -lnsl  -L/home/dast/lib
+curl_OBJECTS =  main.o hugehelp.o urlglob.o
+curl_LDFLAGS = 
+CFLAGS = -g -O2
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  ./stamp-h2.in Makefile.am Makefile.in config.h.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(curl_SOURCES)
+OBJECTS = $(curl_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps src/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+config.h: stamp-h2
+       @if test ! -f $@; then \
+               rm -f stamp-h2; \
+               $(MAKE) stamp-h2; \
+       else :; fi
+stamp-h2: $(srcdir)/config.h.in $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES= CONFIG_HEADERS=src/config.h \
+            $(SHELL) ./config.status
+       @echo timestamp > stamp-h2 2> /dev/null
+$(srcdir)/config.h.in: $(srcdir)/stamp-h2.in
+       @if test ! -f $@; then \
+               rm -f $(srcdir)/stamp-h2.in; \
+               $(MAKE) $(srcdir)/stamp-h2.in; \
+       else :; fi
+$(srcdir)/stamp-h2.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOHEADER)
+       @echo timestamp > $(srcdir)/stamp-h2.in 2> /dev/null
+
+mostlyclean-hdr:
+
+clean-hdr:
+
+distclean-hdr:
+       -rm -f config.h
+
+maintainer-clean-hdr:
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo "  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+            $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+         else :; fi; \
+       done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       list='$(bin_PROGRAMS)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+       done
+
+.c.o:
+       $(COMPILE) -c $<
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+mostlyclean-compile:
+       -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+       -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+curl: $(curl_OBJECTS) $(curl_DEPENDENCIES)
+       @rm -f curl
+       $(LINK) $(curl_LDFLAGS) $(curl_OBJECTS) $(curl_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = src
+
+distdir: $(DISTFILES)
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+all-recursive-am: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) config.h
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+       -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+mostlyclean-am:  mostlyclean-hdr mostlyclean-binPROGRAMS \
+               mostlyclean-compile mostlyclean-tags \
+               mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-hdr clean-binPROGRAMS clean-compile clean-tags \
+               clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-hdr distclean-binPROGRAMS distclean-compile \
+               distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-binPROGRAMS \
+               maintainer-clean-compile maintainer-clean-tags \
+               maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck all-recursive-am install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# This generates the hugehelp.c file
+hugehelp.c: $(top_srcdir)/README.curl $(top_srcdir)/curl.1 mkhelp.pl
+       rm -f hugehelp.c
+       $(NROFF) -man $(top_srcdir)/curl.1 | $(PERL) $(top_srcdir)/src/mkhelp.pl $(top_srcdir)/README.curl > hugehelp.c
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644 (file)
index 0000000..561142e
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# $Id$
+#
+
+# Some flags needed when trying to cause warnings ;-)
+# CFLAGS = -Wall -pedantic
+CPPFLAGS = -DGLOBURL -DCURL_SEPARATORS
+
+INCLUDES = -I$(top_srcdir)/include
+
+bin_PROGRAMS = curl
+
+curl_SOURCES = main.c hugehelp.c urlglob.c
+curl_LDADD = ../lib/libcurl.a
+curl_DEPENDENCIES = ../lib/libcurl.a
+BUILT_SOURCES = hugehelp.c
+CLEANFILES = hugehelp.c
+NROFF=@NROFF@
+
+EXTRA_DIST = mkhelp.pl Makefile.vc6
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
+
+# This generates the hugehelp.c file
+hugehelp.c: $(top_srcdir)/README.curl $(top_srcdir)/curl.1 mkhelp.pl
+       rm -f hugehelp.c
+       $(NROFF) -man $(top_srcdir)/curl.1 | $(PERL) $(top_srcdir)/src/mkhelp.pl $(top_srcdir)/README.curl > hugehelp.c
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644 (file)
index 0000000..f7afbd9
--- /dev/null
@@ -0,0 +1,334 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+#
+# $Id$
+#
+
+# Some flags needed when trying to cause warnings ;-)
+# CFLAGS = -Wall -pedantic
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+PERL = @PERL@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+YACC = @YACC@
+
+CPPFLAGS = -DGLOBURL -DCURL_SEPARATORS
+
+INCLUDES = -I$(top_srcdir)/include
+
+bin_PROGRAMS = curl
+
+curl_SOURCES = main.c hugehelp.c urlglob.c
+curl_LDADD = ../lib/libcurl.a
+curl_DEPENDENCIES = ../lib/libcurl.a
+BUILT_SOURCES = hugehelp.c
+CLEANFILES = hugehelp.c
+NROFF = @NROFF@
+
+EXTRA_DIST = mkhelp.pl Makefile.vc6
+
+AUTOMAKE_OPTIONS = foreign no-dependencies
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h config.h
+CONFIG_CLEAN_FILES = 
+PROGRAMS =  $(bin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I.. -I.
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+curl_OBJECTS =  main.o hugehelp.o urlglob.o
+curl_LDFLAGS = 
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  ./stamp-h2.in Makefile.am Makefile.in config.h.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(curl_SOURCES)
+OBJECTS = $(curl_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps src/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+config.h: stamp-h2
+       @if test ! -f $@; then \
+               rm -f stamp-h2; \
+               $(MAKE) stamp-h2; \
+       else :; fi
+stamp-h2: $(srcdir)/config.h.in $(top_builddir)/config.status
+       cd $(top_builddir) \
+         && CONFIG_FILES= CONFIG_HEADERS=src/config.h \
+            $(SHELL) ./config.status
+       @echo timestamp > stamp-h2 2> /dev/null
+$(srcdir)/config.h.in: $(srcdir)/stamp-h2.in
+       @if test ! -f $@; then \
+               rm -f $(srcdir)/stamp-h2.in; \
+               $(MAKE) $(srcdir)/stamp-h2.in; \
+       else :; fi
+$(srcdir)/stamp-h2.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOHEADER)
+       @echo timestamp > $(srcdir)/stamp-h2.in 2> /dev/null
+
+mostlyclean-hdr:
+
+clean-hdr:
+
+distclean-hdr:
+       -rm -f config.h
+
+maintainer-clean-hdr:
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo "  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+            $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+         else :; fi; \
+       done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       list='$(bin_PROGRAMS)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+       done
+
+.c.o:
+       $(COMPILE) -c $<
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+mostlyclean-compile:
+       -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+       -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+curl: $(curl_OBJECTS) $(curl_DEPENDENCIES)
+       @rm -f curl
+       $(LINK) $(curl_LDFLAGS) $(curl_OBJECTS) $(curl_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       here=`pwd` && cd $(srcdir) \
+         && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)'; \
+       unique=`for i in $$list; do echo $$i; done | \
+         awk '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
+         || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+       -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = src
+
+distdir: $(DISTFILES)
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+all-recursive-am: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) config.h
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+       -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+mostlyclean-am:  mostlyclean-hdr mostlyclean-binPROGRAMS \
+               mostlyclean-compile mostlyclean-tags \
+               mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-hdr clean-binPROGRAMS clean-compile clean-tags \
+               clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-hdr distclean-binPROGRAMS distclean-compile \
+               distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-binPROGRAMS \
+               maintainer-clean-compile maintainer-clean-tags \
+               maintainer-clean-generic distclean-am
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck all-recursive-am install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# This generates the hugehelp.c file
+hugehelp.c: $(top_srcdir)/README.curl $(top_srcdir)/curl.1 mkhelp.pl
+       rm -f hugehelp.c
+       $(NROFF) -man $(top_srcdir)/curl.1 | $(PERL) $(top_srcdir)/src/mkhelp.pl $(top_srcdir)/README.curl > hugehelp.c
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Makefile.m32 b/src/Makefile.m32
new file mode 100644 (file)
index 0000000..d398083
--- /dev/null
@@ -0,0 +1,65 @@
+#############################################################
+## Makefile for building curl.exe with MingW32 (GCC-2.95) and
+## optionally OpenSSL (0.9.4)
+##
+## Use: make -f Makefile.m32 [SSL=1]
+##
+## Comments to: Troy Engel <tengel@sonic.net> or
+##              Joern Hartroth <hartroth@acm.org>
+
+CC = gcc
+STRIP = strip -s
+OPENSSL_PATH = ../../openssl-0.9.4
+
+# We may need these someday
+# PERL = perl
+# NROFF = nroff
+
+########################################################
+## Nothing more to do below this line!
+
+INCLUDES = -I. -I.. -I../include
+CFLAGS = -g -O2 -DGLOBURL -DCURL_SEPARATORS
+LDFLAGS = 
+COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
+LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@
+
+curl_PROGRAMS = curl.exe
+curl_OBJECTS =  main.o hugehelp.o urlglob.o
+curl_SOURCES = main.c hugehelp.c urlglob.c
+curl_DEPENDENCIES = ../lib/libcurl.a
+curl_LDADD = -L../lib -lcurl -lwsock32
+ifdef SSL
+  curl_LDADD += -L$(OPENSSL_PATH)/out -leay32 -lssl32 -lRSAglue
+endif
+
+PROGRAMS = $(curl_PROGRAMS)
+SOURCES = $(curl_SOURCES)
+OBJECTS = $(curl_OBJECTS)
+
+all: curl
+
+curl: $(curl_OBJECTS) $(curl_DEPENDENCIES)
+       -@erase curl.exe
+       $(LINK) $(curl_OBJECTS) $(curl_LDADD)
+       $(STRIP) $(curl_PROGRAMS)
+
+# We don't have nroff normally under win32
+# hugehelp.c: ../README.curl ../curl.1 mkhelp.pl
+#      -@erase hugehelp.c
+#      $(NROFF) -man ../curl.1 | $(PERL) mkhelp.pl ../README.curl > hugehelp.c
+
+.c.o:
+       $(COMPILE) -c $<
+
+.s.o:
+       $(COMPILE) -c $<
+
+.S.o:
+       $(COMPILE) -c $<
+
+clean:
+       -@erase $(curl_OBJECTS)
+
+distrib: clean
+       -@erase $(curl_PROGRAMS)
diff --git a/src/Makefile.vc6 b/src/Makefile.vc6
new file mode 100644 (file)
index 0000000..1502b02
--- /dev/null
@@ -0,0 +1,68 @@
+########################################################\r
+## Makefile for building curl.exe with MSVC6\r
+## Use: nmake -f makefile.vc6 [release | debug]\r
+##      (default is release)\r
+##\r
+## Comments to: Troy Engel <tengel@sonic.net>\r
+\r
+PROGRAM_NAME = curl.exe\r
+\r
+########################################################\r
+## Nothing more to do below this line!\r
+\r
+## Release\r
+CCR = cl.exe /ML /O2 /D "NDEBUG"\r
+LINKR = link.exe /incremental:no /libpath:"../lib"\r
+\r
+## Debug\r
+CCD = cl.exe /MLd /Gm /ZI /Od /D "_DEBUG" /GZ\r
+LINKD = link.exe /incremental:yes /debug\r
+\r
+CFLAGS = /nologo /W3 /GX /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:I386\r
+LINKLIBS = kernel32.lib wsock32.lib libcurl.lib\r
+\r
+RELEASE_OBJS= \\r
+       hugehelpr.obj \\r
+       mainr.obj\r
+\r
+DEBUG_OBJS= \\r
+       hugehelpd.obj \\r
+       maind.obj\r
+       \r
+LINK_OBJS= \\r
+       hugehelp.obj \\r
+       main.obj\r
+\r
+all : release\r
+\r
+release: $(RELEASE_OBJS)\r
+       $(LINKR) $(LFLAGS) $(LINKLIBS) $(LINK_OBJS)\r
+\r
+debug: $(DEBUG_OBJS)\r
+       $(LINKD) $(LFLAGS) $(LINKLIBS) $(LINK_OBJS)\r
+\r
+## Release\r
+hugehelpr.obj: hugehelp.c\r
+       $(CCR) $(CFLAGS) /Zm200 hugehelp.c\r
+mainr.obj: main.c\r
+       $(CCR) $(CFLAGS) main.c\r
+\r
+## Debug\r
+hugehelpd.obj: hugehelp.c\r
+       $(CCD) $(CFLAGS) /Zm200 hugehelp.c\r
+maind.obj: main.c\r
+       $(CCD) $(CFLAGS) main.c\r
+\r
+clean:\r
+       -@erase hugehelp.obj\r
+       -@erase main.obj\r
+       -@erase vc60.idb\r
+       -@erase vc60.pdb\r
+       -@erase vc60.pch\r
+       -@erase curl.ilk\r
+       -@erase curl.pdb\r
+\r
+distrib: clean\r
+       -@erase $(PROGRAM_NAME)\r
+\r
diff --git a/src/config-win32.h b/src/config-win32.h
new file mode 100644 (file)
index 0000000..42264ec
--- /dev/null
@@ -0,0 +1,12 @@
+/* src/config.h.  Generated automatically by configure.  */
+/* Define if you have the strcasecmp function.  */
+/*#define HAVE_STRCASECMP 1*/
+
+/* Define cpu-machine-OS */
+#define OS "win32"
+
+/* Define if you have the <unistd.h> header file.  */
+#define HAVE_UNISTD_H 1
+
+/* Define if you have the <io.h> header file.  */
+#define HAVE_IO_H 1
diff --git a/src/config.h b/src/config.h
new file mode 100644 (file)
index 0000000..e741a23
--- /dev/null
@@ -0,0 +1,13 @@
+/* src/config.h.  Generated automatically by configure.  */
+/* src/config.h.  Generated automatically by configure.  */
+/* Define if you have the strcasecmp function.  */
+#define HAVE_STRCASECMP 1
+
+/* Define cpu-machine-OS */
+#define OS "sparc-sun-solaris2.6"
+
+/* Define if you have the <unistd.h> header file.  */
+#define HAVE_UNISTD_H 1
+
+/* Define if you have the <io.h> header file.  */
+/* #undef HAVE_IO_H */
diff --git a/src/config.h.in b/src/config.h.in
new file mode 100644 (file)
index 0000000..2e210ed
--- /dev/null
@@ -0,0 +1,12 @@
+/* src/config.h.  Generated automatically by configure.  */
+/* Define if you have the strcasecmp function.  */
+#undef HAVE_STRCASECMP
+
+/* Define cpu-machine-OS */
+#undef OS
+
+/* Define if you have the <unistd.h> header file.  */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <io.h> header file.  */
+#undef HAVE_IO_H
diff --git a/src/curl b/src/curl
new file mode 100755 (executable)
index 0000000..cba40a4
Binary files /dev/null and b/src/curl differ
diff --git a/src/hugehelp.c b/src/hugehelp.c
new file mode 100644 (file)
index 0000000..3902219
--- /dev/null
@@ -0,0 +1,1049 @@
+/* NEVER EVER edit this manually, fix the mkhelp script instead! */
+#include <stdio.h>
+void hugehelp(void)
+{
+puts (
+"                                  _   _ ____  _     \n"
+"  Project                     ___| | | |  _ \\| |    \n"
+"                             / __| | | | |_) | |    \n"
+"                            | (__| |_| |  _ <| |___ \n"
+"                             \\___|\\___/|_| \\_\\_____|\n"
+"NAME\n"
+"     curl - get a URL with FTP, TELNET, LDAP, GOPHER, DICT, FILE,\n"
+"     HTTP or HTTPS syntax.\n"
+"\n"
+"SYNOPSIS\n"
+"     curl [options] url\n"
+"\n"
+"DESCRIPTION\n"
+"     curl is a client to get documents/files from servers,  using\n"
+"     any  of  the supported protocols. The command is designed to\n"
+"     work without user interaction or any kind of interactivity.\n"
+"\n"
+"     curl offers a busload of useful tricks like  proxy  support,\n"
+"     user  authentication,  ftp  upload,  HTTP post, SSL (https:)\n"
+"     connections, cookies, file transfer resume and more.\n"
+"\n"
+"URL\n"
+"     The URL syntax is protocol dependent. You'll find a detailed\n"
+"     description in RFC 2396.\n"
+"\n"
+"     You can specify multiple URLs or parts of  URLs  by  writing\n"
+"     part sets within braces as in:\n"
+"\n"
+"      http://site.{one,two,three}.com\n"
+"\n"
+"     or you can get sequences of alphanumeric series by using  []\n"
+"     as in:\n"
+"\n"
+"      ftp://ftp.numericals.com/file[1-100].txt\n"
+"      ftp://ftp.numericals.com/file[001-100].txt    (with leading\n"
+"     zeros)\n"
+"      ftp://ftp.letters.com/file[a-z].txt\n"
+"\n"
+"     It is possible to specify up to 9 sets or series for a  URL,\n"
+"     but no nesting is supported at the moment:\n"
+"\n"
+"      http://www.any.org/archive[1996-1999]/volume[1-\n"
+"     4]part{a,b,c,index}.html\n"
+"\n"
+"OPTIONS\n"
+"     -a/--append\n"
+"          (FTP) When used in a ftp upload, this will tell curl to\n"
+"          append to the target file instead of overwriting it. If\n"
+"          the file doesn't exist, it will be created.\n"
+"\n"
+"     -A/--user-agent <agent string>\n"
+"          (HTTP) Specify the User-Agent string  to  send  to  the\n"
+"          HTTP  server.  Some badly done CGIs fail if its not set\n"
+"          to \"Mozilla/4.0\".  To encode blanks in the string, sur-\n"
+"          round  the  string  with  single quote marks.  This can\n"
+"          also be set with the -H/--header flag of course.\n"
+"     -b/--cookie <name=data>\n"
+"          (HTTP) Pass the data to the HTTP server as a cookie. It\n"
+"          is  supposedly  the  data  previously received from the\n"
+"          server in a \"Set-Cookie:\" line.  The data should be  in\n"
+"          the format \"NAME1=VALUE1; NAME2=VALUE2\".\n"
+"\n"
+"          If no '=' letter is used in the line, it is treated  as\n"
+"          a  filename  to  use  to  read previously stored cookie\n"
+"          lines from, which should be used  in  this  session  if\n"
+"          they  match.  Using  this  method  also  activates  the\n"
+"          \"cookie parser\" which will make  curl  record  incoming\n"
+"          cookies too, which may be handy if you're using this in\n"
+"          combination with the  -L/--location  option.  The  file\n"
+"          format of the file to read cookies from should be plain\n"
+"          HTTP headers or the netscape cookie file format.\n"
+"\n"
+"     -B/--ftp-ascii\n"
+"          (FTP/LDAP) Use ASCII transfer when getting an FTP  file\n"
+"          or  LDAP  info.  For  FTP, this can also be enforced by\n"
+"          using an URL that ends with \";type=A\".\n"
+"\n"
+"     -c/--continue\n"
+"          Continue/Resume  a   previous   file   transfer.   This\n"
+"          instructs  curl  to continue appending data on the file\n"
+"          where it was previously left,  possibly  because  of  a\n"
+"          broken  connection to the server. There must be a named\n"
+"          physical file to append to for  this  to  work.   Note:\n"
+"          Upload  resume  is depening on a command named SIZE not\n"
+"          always present in all ftp servers! Upload resume is for\n"
+"          FTP  only.   HTTP resume is only possible with HTTP/1.1\n"
+"          or later servers.\n"
+"\n"
+"     -C/--continue-at <offset>\n"
+"          Continue/Resume a previous file transfer at  the  given\n"
+"          offset.  The  given offset is the exact number of bytes\n"
+"          that will be skipped counted from the beginning of  the\n"
+"          source file before it is transfered to the destination.\n"
+"          If used with uploads, the ftp server command SIZE  will\n"
+"          not  be  used  by  curl. Upload resume is for FTP only.\n"
+"          HTTP resume is only possible  with  HTTP/1.1  or  later\n"
+"          servers.\n"
+"\n"
+"     -d/--data <data>\n"
+"          (HTTP) Sends the specified data in a  POST  request  to\n"
+"          the  HTTP server. Note that the data is sent exactly as\n"
+"          specified  with  no  extra  processing.   The  data  is\n"
+"          expected  to  be \"url-encoded\". This will cause curl to\n"
+"          pass the data to  the  server  using  the  content-type\n"
+"          application/x-www-form-urlencoded. Compare to -F.\n"
+"\n"
+"          If you start the data  with  the  letter  @,  the  rest\n"
+"          should  be  a  file name to read the data from, or - if\n"
+"          you want curl to read the data from  stdin.   The  con-\n"
+"          tents of the file must already be url-encoded.\n"
+"\n"
+"     -D/--dump-header <file>\n"
+"          (HTTP/FTP) Write the HTTP headers to this  file.  Write\n"
+"          the FTP file info to this file if -I/--head is used.\n"
+"\n"
+"     -e/--referer <URL>\n"
+"          (HTTP) Sends the \"Referer Page\" information to the HTTP\n"
+"          server. Some badly done CGIs fail if it's not set. This\n"
+"          can also be set with the -H/--header flag of course.\n"
+"\n"
+"     -E/--cert <certificate[:password]>\n"
+"          (HTTPS) Tells curl to  use  the  specified  certificate\n"
+"          file  when  getting  a file with HTTPS. The certificate\n"
+"          must be in PEM format.  If the optional password  isn't\n"
+"          specified, it will be queried for on the terminal. Note\n"
+"          that this  certificate  is  the  private  key  and  the\n"
+"          private certificate concatenated!\n"
+"\n"
+"     -f/--fail\n"
+"          (HTTP) Fail silently  (no  output  at  all)  on  server\n"
+"          errors.  This is mostly done like this to better enable\n"
+"          scripts etc to better deal  with  failed  attempts.  In\n"
+"          normal  cases  when  a  HTTP  server fails to deliver a\n"
+"          document, it returns a HTML document stating so  (which\n"
+"          often  also  describes  why  and  more). This flag will\n"
+"          prevent curl from outputting  that  and  fail  silently\n"
+"          instead.\n"
+"\n"
+"     -F/--form <name=content>\n"
+"          (HTTP) This lets curl emulate a filled in form in which\n"
+"          a  user has pressed the submit button. This causes curl\n"
+"          to POST data using the content-type multipart/form-data\n"
+"          according  to RFC1867. This enables uploading of binary\n"
+"          files etc. To force the 'content' part to be read  from\n"
+"          a  file,  prefix the file name with an @ sign. Example,\n"
+"          to send your password file to the server, where  'pass-\n"
+"          word'   is   the   name  of  the  form-field  to  which\n"
+"          /etc/passwd will be the input:\n"
+"\n"
+"          curl -F password=@/etc/passwd www.mypasswords.com\n"
+"\n"
+"          To read the file's content from stdin insted of a file,\n"
+"          use - where the file name should've been.\n"
+"\n"
+"     -h/--help\n"
+"          Usage help.\n"
+"\n"
+"     -H/--header <header>\n"
+"          (HTTP) Extra header to use when getting a web page. You\n"
+"          may  specify  any number of extra headers. Note that if\n"
+"          you should add a custom header that has the  same  name\n"
+"          as one of the internal ones curl would use, your exter-\n"
+"          nally set header will be used instead of  the  internal\n"
+"          one.  This  allows you to make even trickier stuff than\n"
+"          curl would normally do. You should not  replace  inter-\n"
+"          nally  set  headers without knowing perfectly well what\n"
+"          you're doing.\n"
+"\n"
+"     -i/--include\n"
+"          (HTTP) Include  the  HTTP-header  in  the  output.  The\n"
+"          HTTP-header  includes  things like server-name, date of\n"
+"          the document, HTTP-version and more...\n"
+"\n"
+"     -I/--head\n"
+"          (HTTP/FTP) Fetch  the  HTTP-header  only!  HTTP-servers\n"
+"          feature the command HEAD which this uses to get nothing\n"
+"          but the header of a document. When used on a FTP  file,\n"
+"          curl displays the file size only.\n"
+"\n"
+"     -K/--config <config file>\n"
+"          Specify which config file to read curl arguments  from.\n"
+"          The  config  file  is a text file in which command line\n"
+"          arguments can be written which then will be used as  if\n"
+"          they  were  written  on the actual command line. If the\n"
+"          first column of a config line is a '#'  character,  the\n"
+"          rest of the line will be treated as a comment.\n"
+"\n"
+"          Specify the filename as '-' to make curl read the  file\n"
+"          from stdin.\n"
+"\n"
+"     -l/--list-only\n"
+"          (FTP) When listing an FTP directory, this switch forces\n"
+"          a  name-only  view.   Especially  useful if you want to\n"
+"          machine-parse the contents of an  FTP  directory  since\n"
+"          the  normal  directory view doesn't use a standard look\n"
+"          or format.\n"
+"\n"
+"     -L/--location\n"
+"          (HTTP/HTTPS) If the server reports that  the  requested\n"
+"          page  has  a  different  location  (indicated  with the\n"
+"          header line Location:) this flag will let curl  attempt\n"
+"          to reattempt the get on the new place. If used together\n"
+"          with -i or -I, headers from all requested pages will be\n"
+"          shown.\n"
+"\n"
+"     -m/--max-time <seconds>\n"
+"          Maximum time in seconds that you allow the whole opera-\n"
+"          tion to take.  This is useful for preventing your batch\n"
+"          jobs from hanging for hours due  to  slow  networks  or\n"
+"          links  going down.  This doesn't work properly in win32\n"
+"          systems.\n"
+"     -M/--manual\n"
+"          Manual. Display the huge help text.\n"
+"\n"
+"     -n/--netrc\n"
+"          Makes curl scan the .netrc  file  in  the  user's  home\n"
+"          directory  for  login  name and password. This is typi-\n"
+"          cally used for ftp on unix. If  used  with  http,  curl\n"
+"          will  enable  user  authentication.  See  netrc(4)  for\n"
+"          details on the file format. Curl will not  complain  if\n"
+"          that  file  hasn't the right permissions (it should not\n"
+"          be world nor group readable). The environment  variable\n"
+"          \"HOME\" is used to find the home directory.\n"
+"\n"
+"          A quick and very simple  example  of  how  to  setup  a\n"
+"          .netrc   to   allow   curl   to   ftp  to  the  machine\n"
+"          host.domain.com with user name\n"
+"\n"
+"          machine host.domain.com user myself password secret\n"
+"\n"
+"     -o/--output <file>\n"
+"          Write output to <file> instead of stdout.  If  you  are\n"
+"          using {} or [] to fetch multiple documents, you can use\n"
+"          #<num> in the <file> specifier. That variable  will  be\n"
+"          replaced  with  the  current  string  for the URL being\n"
+"          fetched. Like in:\n"
+"\n"
+"            curl http://{one,two}.site.com -o \"file_#1.txt\"\n"
+"\n"
+"          or use several variables like:\n"
+"\n"
+"            curl http://{site,host}.host[1-5].com -o \"#1_#2\"\n"
+"\n"
+"     -O/--remote-name\n"
+"          Write output to a local file named like the remote file\n"
+"          we get. (Only the file part of the remote file is used,\n"
+"          the path is cut off.)\n"
+"\n"
+"     -P/--ftpport <address>\n"
+"          (FTP) Reverses the initiator/listenor roles  when  con-\n"
+"          necting  with  ftp. This switch makes Curl use the PORT\n"
+"          command instead of PASV. In practice,  PORT  tells  the\n"
+"          server to connect to the client's specified address and\n"
+"          port, while PASV asks the server for an ip address  and\n"
+"          port to connect to. <address> should be one of:\n"
+"           interface - i.e \"eth0\" to specify which interface's IP\n"
+"          address you want to use  (Unix only)\n"
+"           IP address - i.e \"192.168.10.1\" to  specify  exact  IP\n"
+"          number\n"
+"           host name - i.e \"my.host.domain\" to specify machine\n"
+"           \"-\"       - (any single-letter string) to make it pick\n"
+"          the machine's default\n"
+"     -q   If used as the first parameter on the command line, the\n"
+"          $HOME/.curlrc  file will not be read and used as a con-\n"
+"          fig file.\n"
+"\n"
+"     -Q/--quote <comand>\n"
+"          (FTP) Send an  arbitrary  command  to  the  remote  FTP\n"
+"          server,  by  using the QUOTE command of the server. Not\n"
+"          all servers support this command, and the set of  QUOTE\n"
+"          commands are server specific!\n"
+"\n"
+"     -r/--range <range>\n"
+"          (HTTP/FTP) Retrieve a byte range (i.e a  partial  docu-\n"
+"          ment)  from  a  HTTP/1.1  or  FTP server. Ranges can be\n"
+"          specified in a number of ways.\n"
+"           0-499           - specifies the first 500 bytes\n"
+"           500-999         - specifies the second 500 bytes\n"
+"           -500            - specifies the last 500 bytes\n"
+"           9500-           - specifies the bytes from offset 9500\n"
+"          and forward\n"
+"           0-0,-1          - specifies the first  and  last  byte\n"
+"          only(*)(H)\n"
+"           500-700,600-799 -  specifies  300  bytes  from  offset\n"
+"          500(H)\n"
+"           100-199,500-599 - specifies  two  separate  100  bytes\n"
+"          ranges(*)(H)\n"
+"\n"
+"          (*) = NOTE that this will cause  the  server  to  reply\n"
+"          with a multipart response!\n"
+"\n"
+"          You should also be aware that many HTTP/1.1 servers  do\n"
+"          not have this feature enabled, so that when you attempt\n"
+"          to get a range, you'll instead get the whole document.\n"
+"\n"
+"          FTP range downloads  only  support  the  simple  syntax\n"
+"          'start-stop'  (optionally with one of the numbers omit-\n"
+"          ted). It depends on the non-RFC command SIZE.\n"
+"\n"
+"     -s/--silent\n"
+"          Silent mode. Don't show progress meter  or  error  mes-\n"
+"          sages.  Makes Curl mute.\n"
+"\n"
+"     -S/--show-error\n"
+"          When used with -s it makes curl show error  message  if\n"
+"          it fails.\n"
+"\n"
+"     -t/--upload\n"
+"          Transfer the stdin data to  the  specified  file.  Curl\n"
+"          will  read  everything  from  stdin until EOF and store\n"
+"          with the supplied name. If this is used  on  a  http(s)\n"
+"          server, the PUT command will be used.\n"
+"\n"
+"     -T/--upload-file <file>\n"
+"          Like -t, but this transfers the specified  local  file.\n"
+"          If  there  is  no  file part in the specified URL, Curl\n"
+"          will append the local file name. NOTE that you must use\n"
+"          a  trailing  / on the last directory to really prove to\n"
+"          Curl that there is no file name or curl will think that\n"
+"          your  last  directory  name  is the remote file name to\n"
+"          use. That will most likely cause the  upload  operation\n"
+"          to  fail.  If this is used on a http(s) server, the PUT\n"
+"          command will be used.\n"
+"\n"
+"     -u/--user <user:password>\n"
+"          Specify user and password to  use  when  fetching.  See\n"
+"          README.curl  for  detailed examples of how to use this.\n"
+"          If no password is  specified,  curl  will  ask  for  it\n"
+"          interactively.\n"
+"\n"
+"     -U/--proxy-user <user:password>\n"
+"          Specify user and password to use for Proxy  authentica-\n"
+"          tion. If no password is specified, curl will ask for it\n"
+"          interactively.\n"
+"\n"
+"     -v/--verbose\n"
+"          Makes  the  fetching  more  verbose/talkative.   Mostly\n"
+"          usable  for  debugging.  Lines  starting with '>' means\n"
+"          data sent by curl, '<' means data received by curl that\n"
+"          is  hidden  in normal cases and lines starting with '*'\n"
+"          means additional info provided by curl.\n"
+"\n"
+"     -V/--version\n"
+"          Displays the full version of curl,  libcurl  and  other\n"
+"          3rd party libraries linked with the executable.\n"
+"\n"
+"     -x/--proxy <proxyhost[:port]>\n"
+"          Use specified proxy. If the port number is  not  speci-\n"
+"          fied, it is assumed at port 1080.\n"
+"\n"
+"     -X/--request <command>\n"
+"          (HTTP) Specifies a custom request to use when  communi-\n"
+"          cating  with  the  HTTP  server.  The specified request\n"
+"          will be used instead of the standard GET. Read the HTTP\n"
+"          1.1 specification for details and explanations.\n"
+"\n"
+"          (FTP) Specifies a custom FTP command to use instead  of\n"
+"          LIST when doing file lists with ftp.\n"
+"\n"
+"     -y/--speed-time <speed>\n"
+"          Speed Limit. If a download is slower  than  this  given\n"
+"          speed,  in  bytes per second, for Speed Time seconds it\n"
+"          gets aborted. Speed Time is set with -Y and  is  30  if\n"
+"          not set.\n"
+"\n"
+"     -Y/--speed-limit <time>\n"
+"          Speed Time. If a download is slower  than  Speed  Limit\n"
+"          bytes  per second during a Speed Time period, the down-\n"
+"          load gets aborted. If Speed Time is used,  the  default\n"
+"          Speed Limit will be 1 unless set with -y.\n"
+"\n"
+"     -z/--time-cond <date expression>\n"
+"          (HTTP) Request to get a file  that  has  been  modified\n"
+"          later  than  the  given  time and date, or one that has\n"
+"          been modified before that time. The date expression can\n"
+"          be all sorts of date strings or if it doesn't match any\n"
+"          internal ones, it tries to get the time  from  a  given\n"
+"          file  name  instead!  See  the GNU date(1) man page for\n"
+"          date expression details.\n"
+"\n"
+"          Start the date expression with a dash (-)  to  make  it\n"
+"          request  for  a  document  that is older than the given\n"
+"          date/time, default is a document that is newer than the\n"
+"          specified date/time.\n"
+"\n"
+"     -3/--sslv3\n"
+"          (HTTPS) Forces curl to use SSL version 3 when negotiat-\n"
+"          ing with a remote SSL server.\n"
+"\n"
+"     -2/--sslv2\n"
+"          (HTTPS) Forces curl to use SSL version 2 when negotiat-\n"
+"          ing with a remote SSL server.\n"
+"\n"
+"     -#/--progress-bar\n"
+"          Make curl display progress information  as  a  progress\n"
+"          bar instead of the default statistics.\n"
+"\n"
+"     --crlf\n"
+"          (FTP) Convert LF to CRLF  in  upload.  Useful  for  MVS\n"
+"          (OS/390).\n"
+"\n"
+"     --stderr <file>\n"
+"          Redirect all writes to stderr  to  the  specified  file\n"
+"          instead. If the file name is a plain '-', it is instead\n"
+"          written to stdout. This option has no point when you're\n"
+"          using a shell with decent redirecting capabilities.\n"
+"\n"
+"FILES\n"
+"     ~/.curlrc\n"
+"          Default config file.\n"
+"\n"
+"ENVIRONMENT\n"
+"     HTTP_PROXY [protocol://]<host>[:port]\n"
+"          Sets proxy server to use for HTTP.\n"
+"\n"
+"     HTTPS_PROXY [protocol://]<host>[:port]\n"
+"          Sets proxy server to use for HTTPS.\n"
+"     FTP_PROXY [protocol://]<host>[:port]\n"
+"          Sets proxy server to use for FTP.\n"
+"\n"
+"     GOPHER_PROXY [protocol://]<host>[:port]\n"
+"          Sets proxy server to use for GOPHER.\n"
+"\n"
+"     ALL_PROXY [protocol://]<host>[:port]\n"
+"          Sets proxy server to use if no protocol-specific  proxy\n"
+"          is set.\n"
+"\n"
+"     NO_PROXY <comma-separated list of hosts>\n"
+"          list of host names that shouldn't go through any proxy.\n"
+"          If se\n"
+"\n"
+"LATEST VERSION\n"
+"\n"
+"  You always find news about what's going on as well as the latest versions\n"
+"  from the curl web pages, located at:\n"
+"\n"
+"        http://curl.haxx.nu\n"
+"\n"
+"SIMPLE USAGE\n"
+"\n"
+"  Get the main page from netscape's web-server:\n"
+"\n"
+"        curl http://www.netscape.com/\n"
+"\n"
+"  Get the root README file from funet's ftp-server:\n"
+"\n"
+"        curl ftp://ftp.funet.fi/README\n"
+"\n"
+"  Get a gopher document from funet's gopher server:\n"
+"\n"
+"        curl gopher://gopher.funet.fi\n"
+"\n"
+"  Get a web page from a server using port 8000:\n"
+"\n"
+"        curl http://www.weirdserver.com:8000/\n"
+"\n"
+"  Get a list of the root directory of an FTP site:\n"
+"\n"
+"        curl ftp://ftp.fts.frontec.se/\n"
+"\n"
+"  Get the definition of curl from a dictionary:\n"
+"\n"
+"        curl dict://dict.org/m:curl\n"
+"\n"
+"DOWNLOAD TO A FILE\n"
+"\n"
+"  Get a web page and store in a local file:\n"
+"\n"
+"        curl -o thatpage.html http://www.netscape.com/\n"
+"\n"
+"  Get a web page and store in a local file, make the local file get the name\n"
+"  of the remote document (if no file name part is specified in the URL, this\n"
+"  will fail):\n"
+"\n"
+"        curl -O http://www.netscape.com/index.html\n"
+"\n"
+"USING PASSWORDS\n"
+"\n"
+" FTP\n"
+"\n"
+"   To ftp files using name+passwd, include them in the URL like:\n"
+"\n"
+"        curl ftp://name:passwd@machine.domain:port/full/path/to/file\n"
+"\n"
+"   or specify them with the -u flag like\n"
+"\n"
+"        curl -u name:passwd ftp://machine.domain:port/full/path/to/file\n"
+"\n"
+" HTTP\n"
+"\n"
+"   The HTTP URL doesn't support user and password in the URL string. Curl\n"
+"   does support that anyway to provide a ftp-style interface and thus you can\n"
+"   pick a file like:\n"
+"\n"
+"        curl http://name:passwd@machine.domain/full/path/to/file\n"
+"\n"
+"   or specify user and password separately like in\n"
+"\n"
+"        curl -u name:passwd http://machine.domain/full/path/to/file\n"
+"\n"
+"   NOTE! Since HTTP URLs don't support user and password, you can't use that\n"
+"   style when using Curl via a proxy. You _must_ use the -u style fetch\n"
+"   during such circumstances.\n"
+"\n"
+" HTTPS\n"
+"\n"
+"   Probably most commonly used with private certificates, as explained below.\n"
+"\n"
+" GOPHER\n"
+"\n"
+"   Curl features no password support for gopher.\n"
+"\n"
+"PROXY\n"
+"\n"
+" Get an ftp file using a proxy named my-proxy that uses port 888:\n"
+"\n"
+"        curl -x my-proxy:888 ftp://ftp.leachsite.com/README\n"
+"\n"
+" Get a file from a HTTP server that requires user and password, using the\n"
+" same proxy as above:\n"
+"\n"
+"        curl -u user:passwd -x my-proxy:888 http://www.get.this/\n"
+"\n"
+" Some proxies require special authentication. Specify by using -U as above:\n"
+"\n"
+"        curl -U user:passwd -x my-proxy:888 http://www.get.this/\n"
+"\n"
+" See also the environment variables Curl support that offer further proxy\n"
+" control.\n"
+"\n"
+"RANGES\n"
+"\n"
+"  With HTTP 1.1 byte-ranges were introduced. Using this, a client can request\n"
+"  to get only one or more subparts of a specified document. Curl supports\n"
+"  this with the -r flag.\n"
+"\n"
+"  Get the first 100 bytes of a document:\n"
+"\n"
+"        curl -r 0-99 http://www.get.this/\n"
+"\n"
+"  Get the last 500 bytes of a document:\n"
+"\n"
+"        curl -r -500 http://www.get.this/\n"
+"\n"
+"  Curl also supports simple ranges for FTP files as well. Then you can only\n"
+"  specify start and stop position.\n"
+"\n"
+"  Get the first 100 bytes of a document using FTP:\n"
+"\n"
+"        curl -r 0-99 ftp://www.get.this/README  \n"
+"\n"
+"UPLOADING\n"
+"\n"
+" FTP\n"
+"\n"
+"   Upload all data on stdin to a specified ftp site:\n"
+"\n"
+"        curl -t ftp://ftp.upload.com/myfile\n"
+"\n"
+"   Upload data from a specified file, login with user and password:\n"
+"\n"
+"        curl -T uploadfile -u user:passwd ftp://ftp.upload.com/myfile\n"
+"\n"
+"   Upload a local file to the remote site, and use the local file name remote\n"
+"   too:\n"
+" \n"
+"        curl -T uploadfile -u user:passwd ftp://ftp.upload.com/\n"
+"\n"
+"   NOTE: Curl is not currently supporing ftp upload through a proxy! The reason\n"
+"   for this is simply that proxies are seldomly configured to allow this and\n"
+"   that no author has supplied code that makes it possible!\n"
+"\n"
+" HTTP\n"
+"\n"
+"   Upload all data on stdin to a specified http site:\n"
+"\n"
+"        curl -t http://www.upload.com/myfile\n"
+"\n"
+"   Note that the http server must've been configured to accept PUT before this\n"
+"   can be done successfully.\n"
+"\n"
+"   For other ways to do http data upload, see the POST section below.\n"
+"\n"
+"VERBOSE / DEBUG\n"
+"\n"
+"  If curl fails where it isn't supposed to, if the servers don't let you\n"
+"  in, if you can't understand the responses: use the -v flag to get VERBOSE\n"
+"  fetching. Curl will output lots of info and all data it sends and\n"
+"  receives in order to let the user see all client-server interaction.\n"
+"\n"
+"        curl -v ftp://ftp.upload.com/\n"
+"\n"
+"DETAILED INFORMATION\n"
+"\n"
+"  Different protocols provide different ways of getting detailed information\n"
+"  about specific files/documents. To get curl to show detailed information\n"
+"  about a single file, you should use -I/--head option. It displays all\n"
+"  available info on a single file for HTTP and FTP. The HTTP information is a\n"
+"  lot more extensive.\n"
+"\n"
+"  For HTTP, you can get the header information (the same as -I would show)\n"
+"  shown before the data by using -i/--include. Curl understands the\n"
+"  -D/--dump-header option when getting files from both FTP and HTTP, and it\n"
+"  will then store the headers in the specified file.\n"
+"\n"
+"  Store the HTTP headers in a separate file:\n"
+"\n"
+"        curl --dump-header headers.txt curl.haxx.nu\n"
+"\n"
+"  Note that headers stored in a separate file can be very useful at a later\n"
+"  time if you want curl to use cookies sent by the server. More about that in\n"
+"  the cookies section.\n"
+"\n"
+"POST (HTTP)\n"
+"\n"
+"  It's easy to post data using curl. This is done using the -d <data>\n"
+"  option.  The post data must be urlencoded.\n"
+"\n"
+"  Post a simple \"name\" and \"phone\" guestbook.\n"
+"\n"
+"        curl -d \"name=Rafael%20Sagula&phone=3320780\" \\\n"
+"                http://www.where.com/guest.cgi\n"
+"\n"
+"  While -d uses the application/x-www-form-urlencoded mime-type, generally\n"
+"  understood by CGI's and similar, curl also supports the more capable\n"
+"  multipart/form-data type. This latter type supports things like file upload.\n"
+"\n"
+"  -F accepts parameters like -F \"name=contents\". If you want the contents to\n"
+"  be read from a file, use <@filename> as contents. When specifying a file,\n"
+"  you can also specify which content type the file is, by appending\n"
+"  ';type=<mime type>' to the file name. You can also post contents of several\n"
+"  files in one field. So that the field name 'coolfiles' can be sent three\n"
+"  files with different content types in a manner similar to:\n"
+"\n"
+"        curl -F \"coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html\" \\\n"
+"        http://www.post.com/postit.cgi\n"
+"\n"
+"  If content-type is not specified, curl will try to guess from the extension\n"
+"  (it only knows a few), or use the previously specified type (from an earlier\n"
+"  file if several files are specified in a list) or finally using the default\n"
+"  type 'text/plain'.\n"
+"\n"
+"  Emulate a fill-in form with -F. Let's say you fill in three fields in a\n"
+"  form. One field is a file name which to post, one field is your name and one\n"
+"  field is a file description. We want to post the file we have written named\n"
+"  \"cooltext.txt\". To let curl do the posting of this data instead of your\n"
+"  favourite browser, you have to check out the HTML of the form page to get to\n"
+"  know the names of the input fields. In our example, the input field names are\n"
+"  'file', 'yourname' and 'filedescription'.\n"
+"\n"
+"        curl -F \"file=@cooltext.txt\" -F \"yourname=Daniel\" \\\n"
+"             -F \"filedescription=Cool text file with cool text inside\" \\\n"
+"             http://www.post.com/postit.cgi\n"
+"\n"
+"  So, to send two files in one post you can do it in two ways:\n"
+"\n"
+"  1. Send multiple files in a single \"field\" with a single field name:\n"
+" \n"
+"        curl -F \"pictures=@dog.gif,cat.gif\" \n"
+" \n"
+"  2. Send two fields with two field names: \n"
+"\n"
+"        curl -F \"docpicture=@dog.gif\" -F \"catpicture=@cat.gif\" \n"
+"\n"
+"REFERER\n"
+"\n"
+"  A HTTP request has the option to include information about which address\n"
+"  that referred to actual page, and curl allows the user to specify that\n"
+"  referrer to get specified on the command line. It is especially useful to\n"
+"  fool or trick stupid servers or CGI scripts that rely on that information\n"
+"  being available or contain certain data.\n"
+"\n"
+"        curl -e www.coolsite.com http://www.showme.com/\n"
+"\n"
+"USER AGENT\n"
+"\n"
+"  A HTTP request has the option to include information about the browser\n"
+"  that generated the request. Curl allows it to be specified on the command\n"
+"  line. It is especially useful to fool or trick stupid servers or CGI\n"
+"  scripts that only accept certain browsers.\n"
+"\n"
+"  Example:\n"
+"\n"
+"  curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/\n"
+"\n"
+"  Other common strings:\n"
+"    'Mozilla/3.0 (Win95; I)'     Netscape Version 3 for Windows 95\n"
+"    'Mozilla/3.04 (Win95; U)'    Netscape Version 3 for Windows 95\n"
+"    'Mozilla/2.02 (OS/2; U)'     Netscape Version 2 for OS/2\n"
+"    'Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)'           NS for AIX\n"
+"    'Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)'      NS for Linux\n"
+"\n"
+"  Note that Internet Explorer tries hard to be compatible in every way:\n"
+"    'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)'    MSIE for W95\n"
+"\n"
+"  Mozilla is not the only possible User-Agent name:\n"
+"    'Konqueror/1.0'             KDE File Manager desktop client\n"
+"    'Lynx/2.7.1 libwww-FM/2.14' Lynx command line browser\n"
+"\n"
+"COOKIES\n"
+"\n"
+"  Cookies are generally used by web servers to keep state information at the\n"
+"  client's side. The server sets cookies by sending a response line in the\n"
+"  headers that looks like 'Set-Cookie: <data>' where the data part then\n"
+"  typically contains a set of NAME=VALUE pairs (separated by semicolons ';'\n"
+"  like \"NAME1=VALUE1; NAME2=VALUE2;\"). The server can also specify for what\n"
+"  path the \"cookie\" should be used for (by specifying \"path=value\"), when the\n"
+"  cookie should expire (\"expire=DATE\"), for what domain to use it\n"
+"  (\"domain=NAME\") and if it should be used on secure connections only\n"
+"  (\"secure\").\n"
+"\n"
+"  If you've received a page from a server that contains a header like:\n"
+"        Set-Cookie: sessionid=boo123; path=\"/foo\";\n"
+"\n"
+"  it means the server wants that first pair passed on when we get anything in\n"
+"  a path beginning with \"/foo\".\n"
+"\n"
+"  Example, get a page that wants my name passed in a cookie:\n"
+"\n"
+"        curl -b \"name=Daniel\" www.sillypage.com\n"
+"\n"
+"  Curl also has the ability to use previously received cookies in following\n"
+"  sessions. If you get cookies from a server and store them in a file in a\n"
+"  manner similar to:\n"
+"\n"
+"        curl --dump-header headers www.example.com\n"
+"\n"
+"  ... you can then in a second connect to that (or another) site, use the\n"
+"  cookies from the 'headers' file like:\n"
+"\n"
+"        curl -b headers www.example.com\n"
+"\n"
+"  Note that by specifying -b you enable the \"cookie awareness\" and with -L\n"
+"  you can make curl follow a location: (which often is used in combination\n"
+"  with cookies). So that if a site sends cookies and a location, you can\n"
+"  use a non-existing file to trig the cookie awareness like:\n"
+"\n"
+"        curl -L -b empty-file www.example.com\n"
+"\n"
+"  The file to read cookies from must be formatted using plain HTTP headers OR\n"
+"  as netscape's cookie file. Curl will determine what kind it is based on the\n"
+"  file contents.\n"
+"\n"
+"PROGRESS METER\n"
+"\n"
+"  The progress meter was introduced to better show a user that something\n"
+"  actually is happening. The different fields in the output have the following\n"
+"  meaning:\n"
+"\n"
+"   %   Received   Total  Speed   Time left  Total   Curr.Speed\n"
+"  13   524140   3841536   4296   0:12:52   0:14:54    292     \n"
+"\n"
+"  From left-to-right:\n"
+"  - The first column, is the percentage of the file currently transfered.\n"
+"  - Received means the total number of bytes that has been transfered.\n"
+"  - Total is the total number of bytes expected to transfer.\n"
+"  - Speed is average speed in bytes per second for the whole transfer so far.\n"
+"  - Time left is the estimated time left for this transfer to finnish if the\n"
+"    current average speed will remain steady.\n"
+"  - Total is the estimated total transfer time.\n"
+"  - Curr.Speed is the average transfer speed the last 5 seconds (the first\n"
+"    5 seconds of a transfer is based on less time of course.)\n"
+"\n"
+"  NOTE: Much of the output is based on the fact that the size of the transfer\n"
+"  is known before it takes place. If it isn't, a much less fancy display will\n"
+"  be used.\n"
+"\n"
+"SPEED LIMIT\n"
+"\n"
+"  Curl offers the user to set conditions regarding transfer speed that must\n"
+"  be met to let the transfer keep going. By using the switch -y and -Y you\n"
+"  can make curl abort transfers if the transfer speed doesn't exceed your\n"
+"  given lowest limit for a specified time.\n"
+"\n"
+"  To let curl abandon downloading this page if its slower than 3000 bytes per\n"
+"  second for 1 minute, run:\n"
+"\n"
+"        curl -y 3000 -Y 60 www.far-away-site.com\n"
+"\n"
+"  This can very well be used in combination with the overall time limit, so\n"
+"  that the above operatioin must be completed in whole within 30 minutes:\n"
+"\n"
+"        curl -m 1800 -y 3000 -Y 60 www.far-away-site.com\n"
+"\n"
+"CONFIG FILE\n"
+"\n"
+"  Curl automatically tries to read the .curlrc file (or _curlrc file on win32\n"
+"  systems) from the user's home dir on startup. The config file should be\n"
+"  made up with normal command line switches. Comments can be used within the\n"
+"  file. If the first letter on a line is a '#'-letter the rest of the line\n"
+"  is treated as a comment.\n"
+"\n"
+"  Example, set default time out and proxy in a config file:\n"
+"\n"
+"        # We want a 30 minute timeout:\n"
+"        -m 1800\n"
+"        # ... and we use a proxy for all accesses:\n"
+"        -x proxy.our.domain.com:8080\n"
+"\n"
+"  White spaces ARE significant at the end of lines, but all white spaces\n"
+"  leading up to the first characters of each line are ignored.\n"
+"\n"
+"  Prevent curl from reading the default file by using -q as the first command\n"
+"  line parameter, like:\n"
+"\n"
+"        curl -q www.thatsite.com\n"
+"\n"
+"  Force curl to get and display a local help page in case it is invoked\n"
+"  without URL by making a config file similar to:\n"
+"\n"
+"        # default url to get\n"
+"        http://help.with.curl.com/curlhelp.html\n"
+"\n"
+"  You can specify another config file to be read by using the -K/--config\n"
+"  flag. If you set config file name to \"-\" it'll read the config from stdin,\n"
+"  which can be handy if you want to hide options from being visible in process\n"
+"  tables etc:\n"
+"\n"
+"        echo \"-u user:passwd\" | curl -K - http://that.secret.site.com\n"
+"\n"
+"EXTRA HEADERS\n"
+"\n"
+"  When using curl in your own very special programs, you may end up needing\n"
+"  to pass on your own custom headers when getting a web page. You can do\n"
+"  this by using the -H flag.\n"
+"\n"
+"  Example, send the header \"X-you-and-me: yes\" to the server when getting a\n"
+"  page:\n"
+"\n"
+"        curl -H \"X-you-and-me: yes\" www.love.com\n"
+"\n"
+"  This can also be useful in case you want curl to send a different text in\n"
+"  a header than it normally does. The -H header you specify then replaces the\n"
+"  header curl would normally send.\n"
+"\n"
+"FTP and PATH NAMES\n"
+"\n"
+"  Do note that when getting files with the ftp:// URL, the given path is\n"
+"  relative the directory you enter. To get the file 'README' from your home\n"
+"  directory at your ftp site, do:\n"
+"\n"
+"        curl ftp://user:passwd@my.site.com/README\n"
+"\n"
+"  But if you want the README file from the root directory of that very same\n"
+"  site, you need to specify the absolute file name:\n"
+"\n"
+"        curl ftp://user:passwd@my.site.com//README\n"
+"\n"
+"  (I.e with an extra slash in front of the file name.)\n"
+"\n"
+"FTP and firewalls\n"
+"\n"
+"  The FTP protocol requires one of the involved parties to open a second\n"
+"  connction as soon as data is about to get transfered. There are two ways to\n"
+"  do this.\n"
+"\n"
+"  The default way for curl is to issue the PASV command which causes the\n"
+"  server to open another port and await another connection performed by the\n"
+"  client. This is good if the client is behind a firewall that don't allow\n"
+"  incoming connections.\n"
+"\n"
+"        curl ftp.download.com\n"
+"\n"
+"  If the server for example, is behind a firewall that don't allow connections\n"
+"  on other ports than 21 (or if it just doesn't support the PASV command), the\n"
+"  other way to do it is to use the PORT command and instruct the server to\n"
+"  connect to the client on the given (as parameters to the PORT command) IP\n"
+"  number and port.\n"
+"\n"
+"  The -P flag to curl allows for different options. Your machine may have\n"
+"  several IP-addresses and/or network interfaces and curl allows you to select\n"
+"  which of them to use. Default address can also be used:\n"
+"\n"
+"        curl -P - ftp.download.com\n"
+"\n"
+"  Download with PORT but use the IP address of our 'le0' interface:\n"
+"\n"
+"        curl -P le0 ftp.download.com\n"
+"\n"
+"  Download with PORT but use 192.168.0.10 as our IP address to use:\n"
+"\n"
+"        curl -P 192.168.0.10 ftp.download.com\n"
+"\n"
+"HTTPS\n"
+"\n"
+"  Secure HTTP requires SSLeay to be installed and used when curl is built. If\n"
+"  that is done, curl is capable of retrieving and posting documents using the\n"
+"  HTTPS procotol.\n"
+"\n"
+"  Example:\n"
+"\n"
+"        curl https://www.secure-site.com\n"
+"\n"
+"  Curl is also capable of using your personal certificates to get/post files\n"
+"  from sites that require valid certificates. The only drawback is that the\n"
+"  certificate needs to be in PEM-format. PEM is a standard and open format to\n"
+"  store certificates with, but it is not used by the most commonly used\n"
+"  browsers (Netscape and MSEI both use the so called PKCS#12 format). If you\n"
+"  want curl to use the certificates you use with your (favourite) browser, you\n"
+"  may need to download/compile a converter that can convert your browser's\n"
+"  formatted certificates to PEM formatted ones. Dr Stephen N. Henson has\n"
+"  written a patch for SSLeay that adds this functionality. You can get his\n"
+"  patch (that requires an SSLeay installation) from his site at:\n"
+"  http://www.drh-consultancy.demon.co.uk/\n"
+"\n"
+"  Example on how to automatically retrieve a document using a certificate with\n"
+"  a personal password:\n"
+"\n"
+"        curl -E /path/to/cert.pem:password https://secure.site.com/\n"
+"\n"
+"  If you neglect to specify the password on the command line, you will be\n"
+"  prompted for the correct password before any data can be received.\n"
+"\n"
+"  Many older SSL-servers have problems with SSLv3 or TLS, that newer versions\n"
+"  of OpenSSL etc is using, therefore it is sometimes useful to specify what\n"
+"  SSL-version curl should use. Use -3 or -2 to specify that exact SSL version\n"
+"  to use:\n"
+"\n"
+"        curl -2 https://secure.site.com/\n"
+"\n"
+"  Otherwise, curl will first attempt to use v3 and then v2.\n"
+"\n"
+"RESUMING FILE TRANSFERS\n"
+"\n"
+" To continue a file transfer where it was previously aborted, curl supports\n"
+" resume on http(s) downloads as well as ftp uploads and downloads.\n"
+"\n"
+" Continue downloading a document:\n"
+"\n"
+"        curl -c -o file ftp://ftp.server.com/path/file\n"
+"\n"
+" Continue uploading a document(*1):\n"
+"\n"
+"        curl -c -T file ftp://ftp.server.com/path/file\n"
+"\n"
+" Continue downloading a document from a web server(*2):\n"
+"\n"
+"        curl -c -o file http://www.server.com/\n"
+"\n"
+" (*1) = This requires that the ftp server supports the non-standard command\n"
+"        SIZE. If it doesn't, curl will say so.\n"
+"\n"
+" (*2) = This requires that the wb server supports at least HTTP/1.1. If it\n"
+"        doesn't, curl will say so.\n"
+"\n"
+"TIME CONDITIONS\n"
+"\n"
+" HTTP allows a client to specify a time condition for the document it\n"
+" requests. It is If-Modified-Since or If-Unmodified-Since. Curl allow you to\n"
+" specify them with the -z/--time-cond flag.\n"
+"\n"
+" For example, you can easily make a download that only gets performed if the\n"
+" remote file is newer than a local copy. It would be made like:\n"
+"\n"
+"        curl -z local.html http://remote.server.com/remote.html\n"
+"\n"
+" Or you can download a file only if the local file is newer than the remote\n"
+" one. Do this by prepending the date string with a '-', as in:\n"
+"\n"
+"        curl -z -local.html http://remote.server.com/remote.html\n"
+"\n"
+" You can specify a \"free text\" date as condition. Tell curl to only download\n"
+" the file if it was updated since yesterday:\n"
+"\n"
+"        curl -z yesterday http://remote.server.com/remote.html\n"
+"\n"
+" Curl will then accept a wide range of date formats. You always make the date\n"
+" check the other way around by prepending it with a dash '-'.\n"
+"\n"
+"DICT\n"
+"\n"
+"  For fun try\n"
+"\n"
+"        curl dict://dict.org/m:curl\n"
+"        curl dict://dict.org/d:heisenbug:jargon\n"
+"        curl dict://dict.org/d:daniel:web1913\n"
+"\n"
+"  Aliases for 'm' are 'match' and 'find', and aliases for 'd' are 'define'\n"
+"  and 'lookup'. For example,\n"
+"\n"
+"        curl dict://dict.org/find:curl\n"
+"\n"
+"  Commands that break the URL description of the RFC (but not the DICT\n"
+"  protocol) are\n"
+"\n"
+"        curl dict://dict.org/show:db\n"
+"        curl dict://dict.org/show:strat\n"
+"\n"
+"  Authentication is still missing (but this is not required by the RFC)\n"
+"\n"
+"LDAP\n"
+"\n"
+"  If you have installed the OpenLDAP library, curl can take advantage of it\n"
+"  and offer ldap:// support.\n"
+"\n"
+"  LDAP is a complex thing and writing an LDAP query is not an easy task. I do\n"
+"  advice you to dig up the syntax description for that elsewhere, RFC 1959 if\n"
+"  no other place is better.\n"
+"\n"
+"  To show you an example, this is now I can get all people from my local LDAP\n"
+"  server that has a certain sub-domain in their email address:\n"
+"\n"
+"        curl -B \"ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se\"\n"
+"\n"
+"  If I want the same info in HTML format, I can get it by not using the -B\n"
+"  (enforce ASCII) flag.\n"
+"\n"
+"ENVIRONMENT VARIABLES\n"
+"\n"
+"  Curl reads and understands the following environment variables:\n"
+"\n"
+"        HTTP_PROXY, HTTPS_PROXY, FTP_PROXY, GOPHER_PROXY\n"
+"\n"
+"  They should be set for protocol-specific proxies. General proxy should be\n"
+"  set with\n"
+"        \n"
+"        ALL_PROXY\n"
+"\n"
+"  A comma-separated list of host names that shouldn't go through any proxy is\n"
+"  set in (only an asterisk, '*' matches all hosts)\n"
+"\n"
+"        NO_PROXY\n"
+"\n"
+"  If a tail substring of the domain-path for a host matches one of these\n"
+"  strings, transactions with that node will not be proxied.\n"
+"\n"
+"\n"
+"  The usage of the -x/--proxy flag overrides the environment variables.\n"
+"\n"
+"MAILING LIST\n"
+"\n"
+"  We have an open mailing list to discuss curl, its development and things\n"
+"  relevant to this.\n"
+"\n"
+"  To subscribe, mail curl-request@contactor.se with \"subscribe <your email\n"
+"  address>\" in the body.\n"
+"\n"
+"  To post to the list, mail curl@contactor.se.\n"
+"\n"
+"  To unsubcribe, mail curl-request@contactor.se with \"unsubscribe <your\n"
+"  subscribed email address>\" in the body.\n"
+"\n"
+ ) ;
+}
diff --git a/src/main.c b/src/main.c
new file mode 100644 (file)
index 0000000..5666c77
--- /dev/null
@@ -0,0 +1,1154 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <sys/stat.h>
+#include <ctype.h>
+
+#include <curl/curl.h>
+#include <curl/mprintf.h>
+#include "../lib/getdate.h"
+#ifdef GLOBURL
+#include "urlglob.h"
+#define CURLseparator  "--_curl_--"
+#define MIMEseparator  "_curl_"
+#endif
+
+/* This is now designed to have its own local setup.h */
+#include "setup.h"
+
+#include "version.h"
+
+#ifdef HAVE_IO_H /* typical win32 habit */
+#include <io.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+extern void hugehelp(void);
+
+static void helpf(char *fmt, ...)
+{
+  va_list ap;
+  if(fmt) {
+    va_start(ap, fmt);
+    fputs("curl: ", stderr); /* prefix it */
+    vfprintf(stderr, fmt, ap);
+    va_end(ap);
+  }
+  fprintf(stderr, "curl: try 'curl --help' for more information\n");
+}
+
+static void help(void)
+{
+  printf(CURL_ID "%s\n"
+       "Usage: curl [options...] <url>\n"
+       "Options: (H) means HTTP/HTTPS only, (F) means FTP only\n"
+       " -a/--append        Append to target file when uploading (F)\n"
+       " -A/--user-agent <string> User-Agent to send to server (H)\n"
+       " -b/--cookie <name=string/file> Cookie string or file to read cookies from (H)\n"
+       " -B/--ftp-ascii     Use ASCII transfer (F)\n"
+       " -c/--continue      Resume a previous transfer where we left it\n"
+       " -C/--continue-at <offset> Specify absolute resume offset\n"
+       " -d/--data          POST data (H)\n"
+       " -D/--dump-header <file> Write the headers to this file\n"
+       " -e/--referer       Referer page (H)\n"
+       " -E/--cert <cert:passwd> Specifies your certificate file and password (HTTPS)\n"
+       " -f/--fail          Fail silently (no output at all) on errors (H)\n"
+       " -F/--form <name=content> Specify HTTP POST data (H)\n"
+
+       " -h/--help          This help text\n"
+       " -H/--header <line> Custom header to pass to server. (H)\n"
+       " -i/--include       Include the HTTP-header in the output (H)\n"
+       " -I/--head          Fetch document info only (HTTP HEAD/FTP SIZE)\n"
+       " -K/--config        Specify which config file to read\n"
+       " -l/--list-only     List only names of an FTP directory (F)\n"
+       " -L/--location      Follow Location: hints (H)\n"
+       " -m/--max-time <seconds> Maximum time allowed for the transfer\n"
+       " -M/--manual        Display huge help text\n"
+       " -n/--netrc         Read .netrc for user name and password\n"
+       " -o/--output <file> Write output to <file> instead of stdout\n"
+       " -O/--remote-name   Write output to a file named as the remote file\n"
+#if 0
+       " -p/--port <port>   Use port other than default for current protocol.\n"
+#endif
+       " -P/--ftpport <address> Use PORT with address instead of PASV when ftping (F)\n"
+       " -q                 When used as the first parameter disables .curlrc\n"
+       " -Q/--quote <cmd>   Send QUOTE command to FTP before file transfer (F)\n"
+       " -r/--range <range> Retrieve a byte range from a HTTP/1.1 or FTP server\n"
+       " -s/--silent        Silent mode. Don't output anything\n"
+       " -S/--show-error    Show error. With -s, make curl show errors when they occur\n"
+       " -t/--upload        Transfer/upload stdin to remote site\n"
+       " -T/--upload-file <file> Transfer/upload <file> to remote site\n"
+       " -u/--user <user:password> Specify user and password to use\n"
+       " -U/--proxy-user <user:password> Specify Proxy authentication\n"
+       " -v/--verbose       Makes the operation more talkative\n"
+       " -V/--version       Outputs version number then quits\n"
+       " -x/--proxy <host>  Use proxy. (Default port is 1080)\n"
+       " -X/--request <command> Specific request command to use\n"
+       " -y/--speed-limit   Stop transfer if below speed-limit for 'speed-time' secs\n"
+       " -Y/--speed-time    Time needed to trig speed-limit abort. Defaults to 30\n"
+       " -z/--time-cond <time> Includes a time condition to the server (H)\n"
+       " -2/--sslv2         Force usage of SSLv2 (H)\n"
+       " -3/--sslv3         Force usage of SSLv3 (H)\n"
+       " -#/--progress-bar  Display transfer progress as a progress bar\n"
+       "    --crlf          Convert LF to CRLF in upload. Useful for MVS (OS/390)\n"
+       "    --stderr <file> Where to redirect stderr. - means stdout.\n",
+         curl_version()
+         );
+}
+
+struct LongShort {
+  char *letter;
+  char *lname;
+  bool extraparam;
+};
+
+struct Configurable {
+  char *useragent;
+  char *cookie;
+  bool use_resume;
+  int resume_from;
+  char *postfields;
+  char *referer;
+  long timeout;
+  char *outfile;
+  char *headerfile;
+  char remotefile;
+  char *ftpport;
+  unsigned short porttouse;
+  char *range;
+  int low_speed_limit;
+  int low_speed_time;
+  bool showerror;
+  char *infile;
+  char *userpwd;
+  char *proxyuserpwd;
+  char *proxy;
+  bool configread;
+  long conf;
+  char *url;
+  char *cert;
+  char *cert_passwd;
+  bool crlf;
+  char *cookiefile;
+  char *customrequest;
+  bool progressmode;
+
+  FILE *errors; /* if stderr redirect is requested */
+
+  struct curl_slist *quote;
+
+  long ssl_version;
+  TimeCond timecond;
+  time_t condtime;
+
+  struct HttpHeader *headers;
+  struct HttpHeader *last_header;
+
+  struct HttpPost *httppost;
+  struct HttpPost *last_post;
+};
+
+static int parseconfig(char *filename,
+                      struct Configurable *config);
+
+static void GetStr(char **string,
+                  char *value)
+{
+  if(*string)
+    free(*string);
+  *string = strdup(value);
+}
+
+static char *file2string(FILE *file)
+{
+  char buffer[256];
+  char *ptr;
+  char *string=NULL;
+  int len=0;
+  int stringlen;
+
+  if(file) {
+    while(fgets(buffer, sizeof(buffer), file)) {
+      ptr= strchr(buffer, '\r');
+      if(ptr)
+        *ptr=0;
+      ptr= strchr(buffer, '\n');
+      if(ptr)
+        *ptr=0;
+      stringlen=strlen(buffer);
+      if(string)
+        string = realloc(string, len+stringlen+1);
+      else
+        string = malloc(stringlen+1);
+
+      strcpy(string+len, buffer);
+
+      len+=stringlen;
+    }
+    return string;
+  }
+  else
+    return NULL; /* no string */
+}
+
+static int getparameter(char *flag, /* f or -long-flag */
+                       char *nextarg, /* NULL if unset */
+                       bool *usedarg, /* set to TRUE if the arg has been
+                                         used */
+                       struct Configurable *config)
+{
+  char letter;
+  char *parse=NULL;
+  int res;
+  struct HttpHeader *head;
+  int j;
+  time_t now;
+  int hit=-1;
+
+  /* single-letter,
+     long-name,
+     boolean whether it takes an additional argument
+     */
+  struct LongShort aliases[]= {
+    {"9", "crlf",        FALSE},
+    {"8", "stderr",      TRUE},
+
+    {"2", "sslv2",       FALSE},
+    {"3", "sslv3",       FALSE},
+    {"a", "append",      FALSE},
+    {"A", "user-agent",  TRUE},
+    {"b", "cookie",      TRUE},
+    {"B", "ftp-ascii",   FALSE},
+    {"c", "continue",    FALSE},
+    {"C", "continue-at", TRUE},
+    {"d", "data",        TRUE},
+    {"D", "dump-header", TRUE},
+    {"e", "referer",     TRUE},
+    {"E", "cert",        TRUE},
+    {"f", "fail",        FALSE},
+    {"F", "form",        TRUE},
+
+    {"h", "help",        FALSE},
+    {"H", "header",      TRUE},
+    {"i", "include",     FALSE},
+    {"I", "head",        FALSE},
+    {"K", "config",      TRUE},
+    {"l", "list-only",   FALSE},
+    {"L", "location",    FALSE},
+    {"m", "max-time",    TRUE},
+    {"M", "manual",      FALSE},
+    {"n", "netrc",       FALSE},
+    {"o", "output",      TRUE},
+    {"O", "remote-name", FALSE},
+#if 0
+    {"p", "port",        TRUE},
+#endif
+    {"P", "ftpport",     TRUE},
+    {"q", "disable",     FALSE},
+    {"Q", "quote",       TRUE},
+    {"r", "range",       TRUE},
+    {"s", "silent",      FALSE},
+    {"S", "show-error",  FALSE},
+    {"t", "upload",      FALSE},
+    {"T", "upload-file", TRUE},
+    {"u", "user",        TRUE},
+    {"U", "proxy-user",  TRUE},
+    {"v", "verbose",     FALSE},
+    {"V", "version",     FALSE},
+    {"x", "proxy",       TRUE},
+    {"X", "request",     TRUE},
+    {"X", "http-request", TRUE}, /* OBSOLETE VERSION */
+    {"y", "speed-time",  TRUE},
+    {"Y", "speed-limit", TRUE},
+    {"z", "time-cond",   TRUE},
+    {"#", "progress-bar",FALSE},
+  };
+
+  if('-' == flag[0]) {
+    /* try a long name */
+    int fnam=strlen(&flag[1]);
+    for(j=0; j< sizeof(aliases)/sizeof(aliases[0]); j++) {
+      if(strnequal(aliases[j].lname, &flag[1], fnam)) {
+        if(strequal(aliases[j].lname, &flag[1])) {
+          parse = aliases[j].letter;
+          hit = j;
+          break;
+        }
+       if(parse) {
+         /* this is the second match, we can't continue! */
+         helpf("option --%s is ambiguous\n", &flag[1]);
+         return URG_FAILED_INIT;
+       }
+       parse = aliases[j].letter;
+       hit = j;
+      }
+    }
+    if(hit < 0) {
+      helpf("unknown option -%s.\n", flag);
+      return URG_FAILED_INIT;
+    }    
+  }
+  else {
+    hit=-1;
+    parse = flag;
+  }
+
+  do {
+    /* we can loop here if we have multiple single-letters */
+
+    letter = parse?*parse:'\0';
+    *usedarg = FALSE; /* default is that we don't use the arg */
+
+#if 0
+    fprintf(stderr, "OPTION: %c %s\n", letter, nextarg?nextarg:"<null>");
+#endif
+    if(hit < 0) {
+      for(j=0; j< sizeof(aliases)/sizeof(aliases[0]); j++) {
+       if(letter == *aliases[j].letter) {
+         hit = j;
+         break;
+       }
+      }
+      if(hit < 0) {
+       helpf("unknown option -%c.\n", letter);
+       return URG_FAILED_INIT;      
+      }
+    }
+    if(hit < 0) {
+      helpf("unknown option -%c.\n", letter);
+      return URG_FAILED_INIT;
+    }    
+    if(!nextarg && aliases[hit].extraparam) {
+      helpf("option -%s/--%s requires an extra argument!\n",
+           aliases[hit].letter,
+           aliases[hit].lname);
+      return URG_FAILED_INIT;
+    }
+    else if(nextarg && aliases[hit].extraparam)
+      *usedarg = TRUE; /* mark it as used */
+
+    switch(letter) {
+    case 'z': /* time condition coming up */
+      switch(*nextarg) {
+      case '+':
+        nextarg++;
+      default:
+        /* If-Modified-Since: (section 14.28 in RFC2068) */
+        config->timecond = TIMECOND_IFMODSINCE;
+        break;
+      case '-':
+        /* If-Unmodified-Since:  (section 14.24 in RFC2068) */
+        config->timecond = TIMECOND_IFUNMODSINCE;
+        nextarg++;
+        break;
+      case '=':
+        /* Last-Modified:  (section 14.29 in RFC2068) */
+        config->timecond = TIMECOND_LASTMOD;
+        nextarg++;
+        break;
+      }
+      now=time(NULL);
+      config->condtime=get_date(nextarg, &now);
+      if(-1 == config->condtime) {
+        /* now let's see if it is a file name to get the time from instead! */
+        struct stat statbuf;
+        if(-1 == stat(nextarg, &statbuf)) {
+          /* failed, remove time condition */
+          config->timecond = TIMECOND_NONE;
+        }
+        else {
+          /* pull the time out from the file */
+          config->condtime = statbuf.st_mtime;
+        }
+      }
+      break;
+    case '9': /* there is no short letter for this */
+      /* LF -> CRLF conversinon? */
+      config->crlf = TRUE;
+      break;
+    case '8': /* there is no short letter for this */
+      if(strcmp(nextarg, "-"))
+        config->errors = fopen(nextarg, "wt");
+      else
+        config->errors = stdout;
+      break;
+    case '#': /* added 19990617 larsa */
+      config->progressmode ^= CURL_PROGRESS_BAR;
+      break;
+    case '2': 
+      /* SSL version 2 */
+      config->ssl_version = 2;
+      break;
+    case '3': 
+      /* SSL version 2 */
+      config->ssl_version = 3;
+      break;
+    case 'a':
+      /* This makes the FTP sessions use APPE instead of STOR */
+      config->conf ^= CONF_FTPAPPEND;
+      break;
+    case 'A':
+      /* This specifies the User-Agent name */
+      GetStr(&config->useragent, nextarg);
+      break;
+    case 'b': /* cookie string coming up: */
+      if(strchr(nextarg, '=')) {
+        /* A cookie string must have a =-letter */
+        GetStr(&config->cookie, nextarg);
+      }
+      else {
+        /* We have a cookie file to read from! */
+        GetStr(&config->cookiefile, nextarg);
+      }
+      break;
+    case 'B':
+      /* use type ASCII when transfering ftp files */
+      config->conf ^= CONF_FTPASCII;
+      break;
+    case 'c':
+      /* This makes us continue an ftp transfer */
+      config->use_resume^=TRUE;
+      break;
+    case 'C':
+      /* This makes us continue an ftp transfer at given position */
+      config->resume_from= atoi(nextarg);
+      config->use_resume=TRUE;
+      break;
+    case 'd':
+      /* postfield data */
+      if('@' == *nextarg) {
+        /* the data begins with a '@' letter, it means that a file name
+           or - (stdin) follows */
+        FILE *file;
+        nextarg++; /* pass the @ */
+        if(strequal("-", nextarg))
+          file = stdin;
+        else 
+          file = fopen(nextarg, "r");
+        config->postfields = file2string(file);
+        if(file && (file != stdin))
+          fclose(stdin);
+      }
+      else {
+        GetStr(&config->postfields, nextarg);
+      }
+      if(config->postfields)
+        config->conf |= CONF_POST;
+      break;
+    case 'D':
+      /* dump-header to given file name */
+      GetStr(&config->headerfile, nextarg);
+      break;
+    case 'e':
+      GetStr(&config->referer, nextarg);
+      config->conf |= CONF_REFERER;
+      break;
+    case 'E':
+      {
+       char *ptr = strchr(nextarg, ':');
+       if(ptr) {
+         /* we have a password too */
+         *ptr=0;
+         ptr++;
+         GetStr(&config->cert_passwd, ptr);
+       }
+       GetStr(&config->cert, nextarg);
+      }
+      break;
+    case 'f':
+      /* fail hard on errors  */
+      config->conf ^= CONF_FAILONERROR;
+      break;
+    case 'F':
+      /* "form data" simulation, this is a little advanced so lets do our best
+        to sort this out slowly and carefully */
+      if(curl_FormParse(nextarg,
+                        &config->httppost,
+                        &config->last_post))
+       return URG_FAILED_INIT;    
+      config->conf |= CONF_HTTPPOST; /* no toggle, OR! */
+      break;
+
+    case 'h': /* h for help */
+      help();
+      return URG_FAILED_INIT;
+    case 'H':
+      head = (struct HttpHeader *)malloc(sizeof(struct HttpHeader));
+      if(head) {
+       head->next = NULL;
+       head->header = NULL; /* first zero this */
+       GetStr(&head->header, nextarg); /* now get the header line */
+
+       /* point on our new one */
+       if(config->last_header)
+         config->last_header->next = head;
+       else {
+         config->headers = head;
+       }
+
+       config->last_header = head;
+      }
+      break;
+    case 'i':
+      config->conf ^= CONF_HEADER; /* include the HTTP header as well */
+      break;
+    case 'I':
+      config->conf ^= CONF_HEADER; /* include the HTTP header in the output */
+      config->conf ^= CONF_NOBODY; /* don't fetch the body at all */
+      break;
+    case 'K':
+      res = parseconfig(nextarg, config);
+      config->configread = TRUE;
+      if(res)
+       return res;
+      break;
+    case 'l':
+      config->conf ^= CONF_FTPLISTONLY; /* only list the names of the FTP dir */
+      break;
+    case 'L':
+      config->conf ^= CONF_FOLLOWLOCATION; /* Follow Location: HTTP headers */
+      break;
+    case 'm':
+      /* specified max time */
+      config->timeout = atoi(nextarg);
+      break;
+    case 'M': /* M for manual, huge help */
+      hugehelp();
+      return URG_FAILED_INIT;
+    case 'n':
+      /* pick info from .netrc, if this is used for http, curl will
+        automatically enfore user+password with the request */
+      config->conf ^= CONF_NETRC;
+      break;
+    case 'o':
+      /* output file */
+      GetStr(&config->outfile, nextarg); /* write to this file */
+      break;
+    case 'O':
+      /* output file */
+      config->remotefile ^= TRUE;
+      break;
+    case 'P':
+      /* This makes the FTP sessions use PORT instead of PASV */
+      /* use <eth0> or <192.168.10.10> style addresses. Anything except
+        this will make us try to get the "default" address.
+        NOTE: this is a changed behaviour since the released 4.1!
+        */
+      config->conf |= CONF_FTPPORT;
+      GetStr(&config->ftpport, nextarg);
+      break;
+#if 0
+    case 'p':
+      /* specified port */
+      fputs("You've used the -p option, it will be removed in a future version\n",
+           stderr);
+      config->porttouse = atoi(nextarg);
+      config->conf |= CONF_PORT; /* changed port */
+      break;
+#endif
+    case 'q': /* if used first, already taken care of, we do it like
+                this so we don't cause an error! */
+      break;
+    case 'Q':
+      /* QUOTE command to send to FTP server */
+      config->quote = curl_slist_append(config->quote, nextarg);
+      break;
+    case 'r':
+      /* byte range requested */
+      GetStr(&config->range, nextarg);
+      config->conf |= CONF_RANGE;
+      break;
+    case 's':
+      /* don't show progress meter, don't show errors : */
+      config->conf |= (CONF_MUTE|CONF_NOPROGRESS);
+      config->showerror ^= TRUE; /* toggle off */
+      break;
+    case 'S':
+      /* show errors */
+      config->showerror ^= TRUE; /* toggle on if used with -s */
+      break;
+    case 't':
+      /* we are uploading */
+      config->conf ^= CONF_UPLOAD;
+      break;
+    case 'T':
+      /* we are uploading */
+      config->conf |= CONF_UPLOAD;
+      GetStr(&config->infile, nextarg);
+      break;
+    case 'u':
+      /* user:password  */
+      GetStr(&config->userpwd, nextarg);
+      config->conf |= CONF_USERPWD;
+      break;
+    case 'U':
+      /* Proxy user:password  */
+      GetStr(&config->proxyuserpwd, nextarg);
+      config->conf |= CONF_PROXYUSERPWD;
+      break;
+    case 'v':
+      config->conf ^= CONF_VERBOSE; /* talk a lot */
+      break;
+    case 'V':
+      printf(CURL_ID "%s\n", curl_version());
+      return URG_FAILED_INIT;
+    case 'x':
+      /* proxy */
+      if(!*nextarg) {
+       /* disable proxy when no proxy is given */
+       config->conf &= ~CONF_PROXY;
+      }
+      else { 
+       config->conf |= CONF_PROXY;
+       GetStr(&config->proxy, nextarg);
+      }
+      break;
+    case 'X':
+      /* HTTP request */
+      GetStr(&config->customrequest, nextarg);
+      break;
+    case 'Y':
+      /* low speed time */
+      config->low_speed_time = atoi(nextarg);
+      if(!config->low_speed_limit)
+       config->low_speed_limit = 1;
+      break;
+    case 'y':
+      /* low speed limit */
+      config->low_speed_limit = atoi(nextarg);
+      if(!config->low_speed_time)
+       config->low_speed_time=30;
+      break;
+
+    default: /* unknown flag */
+      if(letter)       
+       helpf("Unknown option '%c'\n", letter);
+      else
+       helpf("Unknown option\n"); /* short help blurb */
+      return URG_FAILED_INIT;
+    }
+    hit = -1;
+
+  } while(*++parse && !*usedarg);
+
+  return URG_OK;
+}
+
+
+static int parseconfig(char *filename,
+                      struct Configurable *config)
+{
+  int res;
+  FILE *file;
+  char configbuffer[4096];
+  char filebuffer[256];
+  bool usedarg;
+  
+  if(!filename || !*filename) {
+    /* NULL or no file name attempts to load .curlrc from the homedir! */
+
+#define CURLRC DOT_CHAR "curlrc"
+
+    char *home = curl_GetEnv("HOME"); /* portable environment reader */
+
+    if(!home || (strlen(home)>(sizeof(filebuffer)-strlen(CURLRC))))
+      return URG_OK;
+
+    sprintf(filebuffer, "%s%s%s", home, DIR_CHAR, CURLRC);
+
+    filename = filebuffer;
+  }
+
+  if(strcmp(filename,"-"))
+    file = fopen(filename, "r");
+  else
+    file = stdin;
+  
+  if(file) {
+    char *tok;
+    char *tok2;
+    while(fgets(configbuffer, sizeof(configbuffer), file)) {
+      /* lines with # in the fist column is a comment! */
+
+#if 0
+      fprintf(stderr, "%s", configbuffer);
+#endif
+      if('#' == configbuffer[0])
+       continue;
+      tok = configbuffer;
+
+      while(*tok && isspace((int)*tok))
+       tok++;
+/*      tok=strtok(configbuffer, " \t\n"); */
+#if 0
+      fprintf(stderr, "TOK: %s\n", tok);
+#endif
+      if('-' != tok[0]) {
+       char *nl;
+       if(config->url)
+         free(config->url);
+       config->url = strdup(tok);
+       nl = strchr(config->url, '\n');
+       if(nl)
+         *nl=0;
+      }
+      while(('-' == tok[0])) {
+       /* this is a flag */
+       char *firsttok = strdup(tok);
+       char *nl;
+
+       /* remove newline from firsttok */
+       nl = strchr(firsttok, '\n');
+       if(nl)
+         *nl=0;
+
+       /* pass the -flag */
+       tok2=tok;
+       while(*tok2 && !isspace((int)*tok2))
+         tok2++;
+
+       /* pass the following white space */
+       while(*tok2 && isspace((int)*tok2))
+         tok2++;
+       
+       while(!*tok2 &&
+             fgets(configbuffer, sizeof(configbuffer), file)) {
+         /* lines with # in the fist column is a comment! */
+#if 0
+         fprintf(stderr, "%s", configbuffer);
+#endif
+         if('#' == configbuffer[0])
+           continue;
+         tok2 = configbuffer;
+         /*        tok2=strtok(configbuffer, " \t\n"); */
+         /* pass white space */
+         while(*tok2 && isspace((int)*tok2))
+           tok2++;
+       }
+       /* remove newline from tok2 */
+       nl = strchr(tok2, '\n');
+       if(nl)
+         *nl=0;
+
+       res = getparameter(firsttok+1,
+                          *tok2?tok2:NULL,
+                          &usedarg,
+                          config);
+       free(firsttok);
+#if 0
+       fprintf(stderr, "TOK %s TOK2: %s RES: %d\n",
+               firsttok, tok2?tok2:"NULL", res);
+#endif
+       if(res)
+         return res;
+       if(!usedarg) {
+         /* tok2 is unused,  */
+         tok = tok2;
+       }
+       else 
+         break; /* we've used both our words */
+      }
+    }
+    if(file != stdin)
+      fclose(file);
+  }
+  return URG_OK;
+}
+
+struct OutStruct {
+  char *filename;
+  FILE *stream;
+};
+
+int my_fwrite(void *buffer, size_t size, size_t nmemb, FILE *stream)
+{
+  struct OutStruct *out=(struct OutStruct *)stream;
+  if(out && !out->stream) {
+    /* open file for writing */
+    out->stream=fopen(out->filename, "wb");
+    if(!out->stream)
+      return -1; /* failure */
+  }
+  return fwrite(buffer, size, nmemb, out->stream);
+}
+
+
+int main(int argc, char *argv[])
+{
+  char errorbuffer[URLGET_ERROR_SIZE];
+
+  struct OutStruct outs;
+
+  char *url = NULL;
+#ifdef GLOBURL
+  URLGlob *urls;
+  int urlnum;
+  char *outfiles = NULL;
+  int separator = 0;
+#endif
+  
+  FILE *infd = stdin;
+  FILE *headerfilep = NULL;
+  char *urlbuffer=NULL;
+  int infilesize=-1; /* -1 means unknown */
+  bool stillflags=TRUE;
+
+  int res=URG_OK;
+  int i;
+  struct Configurable config;
+
+  outs.stream = stdout;
+
+  memset(&config, 0, sizeof(struct Configurable));
+  
+  /* set non-zero default values: */
+  config.useragent= maprintf(CURL_NAME "/" CURL_VERSION " (" OS ") "
+                             "%s", curl_version());
+  config.showerror=TRUE;
+  config.conf=CONF_DEFAULT;
+  config.crlf=FALSE;
+  config.quote=NULL;
+
+  if(argc>1 &&
+     (!strnequal("--", argv[1], 2) && (argv[1][0] == '-')) &&
+     strchr(argv[1], 'q')) {
+    /*
+     * The first flag, that is not a verbose name, but a shortname
+     * and it includes the 'q' flag!
+     */
+#if 0
+    fprintf(stderr, "I TURNED OFF THE CRAP\n");
+#endif
+    ;
+  }
+  else {
+    res = parseconfig(NULL, &config);
+    if(res)
+      return res;
+  }
+
+  if ((argc < 2)  && !config.url) {
+    helpf(NULL);
+    return URG_FAILED_INIT;
+  }
+
+  /* Parse options */
+  for (i = 1; i < argc; i++) {
+    if(stillflags &&
+       ('-' == argv[i][0])) {
+      char *nextarg;
+      bool passarg;
+      
+      char *flag = &argv[i][1];
+
+      if(strequal("--", argv[i]))
+       /* this indicates the end of the flags and thus enables the
+          following (URL) argument to start with -. */
+       stillflags=FALSE;
+      else {
+       nextarg= (i < argc - 1)? argv[i+1]: NULL;
+
+       res = getparameter ( flag,
+                            nextarg,
+                            &passarg,
+                          &config );
+       if(res)
+         return res;
+
+       if(passarg) /* we're supposed to skip this */
+         i++;
+      }
+    }
+    else {
+      if(url) {
+       helpf("only one URL is supported!\n");
+       return URG_FAILED_INIT;
+      }
+      url = argv[i];
+    }
+  }
+
+  /* if no URL was specified and there was one in the config file, get that
+     one */
+  if(!url && config.url)
+    url = config.url;
+  
+  if(!url) {
+    helpf("no URL specified!\n");
+    return URG_FAILED_INIT;
+  }
+#if 0
+    fprintf(stderr, "URL: %s PROXY: %s\n", url, config.proxy?config.proxy:"none");
+#endif
+
+#ifdef GLOBURL
+  urlnum = glob_url(&urls, url);       /* expand '{...}' and '[...]' expressions and return
+                                          total number of URLs in pattern set */
+  outfiles = config.outfile;           /* save outfile pattern befor expansion */
+  if (!outfiles && !config.remotefile && urlnum > 1) {
+#ifdef CURL_SEPARATORS
+    /* multiple files extracted to stdout, insert separators! */
+    separator = 1;
+#endif
+#ifdef MIME_SEPARATORS
+    /* multiple files extracted to stdout, insert MIME separators! */
+    separator = 1;
+    printf("MIME-Version: 1.0\n");
+    printf("Content-Type: multipart/mixed; boundary=%s\n\n", MIMEseparator);
+#endif
+  }
+  for (i = 0; (url = next_url(urls)); ++i) {
+    if (outfiles)
+      config.outfile = strdup(outfiles);
+#endif
+
+  if(config.outfile && config.infile) {
+    helpf("you can't both upload and download!\n");
+    return URG_FAILED_INIT;
+  }
+  if (config.outfile || config.remotefile) {
+    /* 
+     * We have specified a file name to store the result in, or we have
+     * decided we want to use the remote file name.
+     */
+
+    if(config.remotefile) {
+      /* Find and get the remote file name */
+      config.outfile=strstr(url, "://");
+      if(config.outfile)
+        config.outfile+=3;
+      else
+        config.outfile=url;
+      config.outfile = strrchr(config.outfile, '/');
+      if(!config.outfile || !strlen(++config.outfile)) {
+        helpf("Remote file name has no length!\n");
+        return URG_WRITE_ERROR;
+      }
+    }
+#ifdef GLOBURL
+    else       /* fill '#1' ... '#9' terms from URL pattern */
+      config.outfile = match_url(config.outfile, *urls);
+#endif
+
+    if((0 == config.resume_from) && config.use_resume) {
+      /* we're told to continue where we are now, then we get the size of the
+        file as it is now and open it for append instead */
+      struct stat fileinfo;
+
+      if(0 == stat(config.outfile, &fileinfo)) {
+       /* set offset to current file size: */
+       config.resume_from = fileinfo.st_size;
+      }
+      /* else let offset remain 0 */
+    }
+
+    if(config.resume_from) {
+      /* open file for output: */
+      outs.stream=(FILE *) fopen(config.outfile, config.resume_from?"ab":"wb");
+      if (!outs.stream) {
+        helpf("Can't open '%s'!\n", config.outfile);
+        return URG_WRITE_ERROR;
+      }
+    }
+    else {
+      outs.filename = config.outfile;
+      outs.stream = NULL; /* open when needed */
+    }
+  }
+  if (config.infile) {
+    /*
+     * We have specified a file to upload
+     */
+    struct stat fileinfo;
+
+    /* If no file name part is given in the URL, we add this file name */
+    char *ptr=strstr(url, "://");
+    if(ptr)
+      ptr+=3;
+    else
+      ptr=url;
+    ptr = strrchr(ptr, '/');
+    if(!ptr || !strlen(++ptr)) {
+      /* The URL has no file name part, add the local file name. In order
+         to be able to do so, we have to create a new URL in another buffer.*/
+      urlbuffer=(char *)malloc(strlen(url) + strlen(config.infile) + 3);
+      if(!urlbuffer) {
+        helpf("out of memory\n");
+        return URG_OUT_OF_MEMORY;
+      }
+      if(ptr)
+        /* there is a trailing slash on the URL */
+        sprintf(urlbuffer, "%s%s", url, config.infile);
+      else
+        /* thers is no trailing slash on the URL */
+        sprintf(urlbuffer, "%s/%s", url, config.infile);
+
+      url = urlbuffer; /* use our new URL instead! */
+    }
+
+    infd=(FILE *) fopen(config.infile, "rb");
+    if (!infd || stat(config.infile, &fileinfo)) {
+      helpf("Can't open '%s'!\n", config.infile);
+      return URG_READ_ERROR;
+    }
+    infilesize=fileinfo.st_size;
+
+  }
+  if((config.conf&CONF_UPLOAD) &&
+     config.use_resume &&
+     (0==config.resume_from)) {
+    config.resume_from = -1; /* -1 will then force get-it-yourself */
+  }
+  if(config.headerfile) {
+    /* open file for output: */
+    if(strcmp(config.headerfile,"-"))
+    {
+      headerfilep=(FILE *) fopen(config.headerfile, "wb");
+      if (!headerfilep) {
+       helpf("Can't open '%s'!\n", config.headerfile);
+       return URG_WRITE_ERROR;
+      }
+    }
+    else
+      headerfilep=stdout;
+  }
+
+  /* This was previously done in urlget, but that was wrong place to do it */
+  if(outs.stream && isatty(fileno(outs.stream)))
+    /* we send the output to a tty, and therefor we switch off the progress
+       meter right away */
+    config.conf |= CONF_NOPROGRESS;
+
+#ifdef GLOBURL
+  if (urlnum > 1) {
+    fprintf(stderr, "\n[%d/%d]: %s --> %s\n", i+1, urlnum, url, config.outfile ? config.outfile : "<stdout>");
+    if (separator) {
+#ifdef CURL_SEPARATORS
+      printf("%s%s\n", CURLseparator, url);
+#endif
+#ifdef MIME_SEPARATORS
+      printf("--%s\n", MIMEseparator);
+      printf("Content-ID: %s\n\n", url); 
+#endif
+    }
+  }
+#endif
+
+  if(!config.errors)
+    config.errors = stderr;
+
+  res = curl_urlget(URGTAG_FILE, (FILE *)&outs,  /* where to store */
+                    URGTAG_WRITEFUNCTION, my_fwrite, /* what call to write */
+                    URGTAG_INFILE, infd, /* for uploads */
+                    URGTAG_INFILESIZE, infilesize, /* size of uploaded file */
+                    URGTAG_URL, url,     /* what to fetch */
+                    URGTAG_PROXY, config.proxy, /* proxy to use */
+                    URGTAG_FLAGS, config.conf, /* flags */
+                    URGTAG_USERPWD, config.userpwd, /* user + passwd */
+                    URGTAG_PROXYUSERPWD, config.proxyuserpwd, /* Proxy user + passwd */
+                    URGTAG_RANGE, config.range, /* range of document */
+                    URGTAG_ERRORBUFFER, errorbuffer,
+                    URGTAG_TIMEOUT, config.timeout,
+                    URGTAG_POSTFIELDS, config.postfields,
+                    URGTAG_REFERER, config.referer,
+                    URGTAG_USERAGENT, config.useragent,
+                    URGTAG_FTPPORT, config.ftpport,
+                    URGTAG_LOW_SPEED_LIMIT, config.low_speed_limit,
+                    URGTAG_LOW_SPEED_TIME, config.low_speed_time,
+                    URGTAG_RESUME_FROM, config.use_resume?config.resume_from:0,
+                    URGTAG_COOKIE, config.cookie,
+                    URGTAG_HTTPHEADER, config.headers,
+                    URGTAG_HTTPPOST, config.httppost,
+                    URGTAG_SSLCERT, config.cert,
+                    URGTAG_SSLCERTPASSWD, config.cert_passwd,
+                    URGTAG_CRLF, config.crlf,
+                    URGTAG_QUOTE, config.quote,
+                    URGTAG_WRITEHEADER, headerfilep,
+                    URGTAG_COOKIEFILE, config.cookiefile,
+                    URGTAG_SSLVERSION, config.ssl_version,
+                    URGTAG_TIMECONDITION, config.timecond,
+                    URGTAG_TIMEVALUE, config.condtime,
+                    URGTAG_CUSTOMREQUEST, config.customrequest,
+                    URGTAG_STDERR, config.errors,
+                    URGTAG_DONE); /* always terminate the list of tags */
+  if((res!=URG_OK) && config.showerror)
+    fprintf(config.errors, "curl: (%d) %s\n", res, errorbuffer);
+
+  if((config.errors != stderr) &&
+     (config.errors != stdout))
+    /* it wasn't directed to stdout or stderr so close the file! */
+    fclose(config.errors);
+
+  if(urlbuffer)
+    free(urlbuffer);
+  if (config.outfile && outs.stream)
+    fclose(outs.stream);
+  if (config.infile)
+    fclose(infd);
+  if(headerfilep)
+    fclose(headerfilep);
+
+  if(config.url)
+    free(config.url);
+
+#ifdef GLOBURL
+  if(url)
+    free(url);
+  if(config.outfile && !config.remotefile)
+    free(config.outfile);
+  }
+#ifdef MIME_SEPARATORS
+  if (separator)
+    printf("--%s--\n", MIMEseparator);
+#endif
+#endif
+
+  curl_slist_free_all(config.quote); /* the checks for config.quote == NULL */
+
+  return(res);
+}
diff --git a/src/mkhelp.pl b/src/mkhelp.pl
new file mode 100644 (file)
index 0000000..842a42f
--- /dev/null
@@ -0,0 +1,85 @@
+#!/usr/local/bin/perl
+
+# Yeah, I know, probably 1000 other persons already wrote a script like
+# this, but I'll tell ya:
+
+# THEY DON'T FIT ME :-)
+
+# Get readme file as parameter:
+$README = $ARGV[0];
+
+if($README eq "") {
+    print "usage: mkreadme.pl <README>\n";
+    exit;
+}
+
+
+push @out, "                                  _   _ ____  _     \n";
+push @out, "  Project                     ___| | | |  _ \\| |    \n";
+push @out, "                             / __| | | | |_) | |    \n";
+push @out, "                            | (__| |_| |  _ <| |___ \n";
+push @out, "                             \\___|\\___/|_| \\_\\_____|\n";
+
+$head=0;
+loop:
+while (<STDIN>) {
+    $line = $_;
+
+    # this kind should be removed first:
+    $line =~ s/_\b//g;
+
+    # then this:
+    $line =~ s/\b.//g;
+
+    if($line =~ /^curl/i) {
+       # cut off the page headers
+        $head=1;
+       next loop;
+    } 
+
+    if($line =~ /^[ \t]*\n/) {
+       $wline++;
+       # we only make one empty line max
+       next loop;
+    }
+    if($wline) {
+       $wline = 0;
+        if(!$head) {
+            push @out, "\n";
+        }
+        $head =0;
+    }
+    push @out, $line;
+}
+push @out, "\n"; # just an extra newline
+
+open(READ, "<$README") ||
+    die "couldn't read the README infile";
+
+while(<READ>) {
+    push @out, $_;
+}
+close(READ);
+
+
+print "/* NEVER EVER edit this manually, fix the mkhelp script instead! */\n"
+;
+print "#include <stdio.h>\n";
+print "void hugehelp(void)\n";
+print "{\n";
+print "puts (\n";
+
+for(@out) {
+    chop;
+
+    $new = $_;
+
+    $new =~ s/\\/\\\\/g;
+    $new =~ s/\"/\\\"/g;
+
+    printf("\"%s\\n\"\n", $new);
+
+}
+
+print " ) ;\n}\n"
+    
diff --git a/src/setup.h b/src/setup.h
new file mode 100644 (file)
index 0000000..78103f9
--- /dev/null
@@ -0,0 +1,91 @@
+#ifndef __SETUP_H
+#define __SETUP_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <stdio.h>
+
+#if !defined(WIN32) && defined(_WIN32)
+/* This _might_ be a good Borland fix. Please report whether this works or
+   not! */
+#define WIN32
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h" /* the configure script results */
+#else
+#ifdef WIN32
+/* include the hand-modified win32 adjusted config.h! */
+#include "config-win32.h"
+#endif
+#endif
+
+#ifndef OS
+#define OS "unknown"
+#endif
+
+#ifdef HAVE_STRCASECMP
+#define strnequal(x,y,z) !(strncasecmp)(x,y,z)
+#define strequal(x,y) !(strcasecmp)(x,y)
+
+/* this is for "-ansi -Wall -pedantic" to stop complaining! */
+extern int (strcasecmp)(const char *s1, const char *s2);
+extern int (strncasecmp)(const char *s1, const char *s2, size_t n);
+#ifndef fileno /* sunos 4 have this as a macro! */
+int fileno( FILE *stream);
+#endif
+
+#else
+#define strnequal(x,y,z) !strnicmp(x,y,z)
+#define strequal(x,y) !stricmp(x,y)
+#endif
+
+#ifdef WIN32
+#define PATH_CHAR     ";"
+#define DIR_CHAR      "\\"
+#define DOT_CHAR      "_"
+#else
+#define PATH_CHAR     ":"
+#define DIR_CHAR      "/"
+#define DOT_CHAR      "."
+
+#endif
+
+#endif /* __SETUP_H */
diff --git a/src/stamp-h2 b/src/stamp-h2
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
@@ -0,0 +1 @@
+timestamp
diff --git a/src/stamp-h2.in b/src/stamp-h2.in
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
@@ -0,0 +1 @@
+timestamp
diff --git a/src/urlglob.c b/src/urlglob.c
new file mode 100644 (file)
index 0000000..846f86c
--- /dev/null
@@ -0,0 +1,332 @@
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <curl/curl.h>
+#include "urlglob.h"
+
+char glob_buffer[URL_MAX_LENGTH];
+URLGlob *glob_expand;
+
+int glob_word(char*, int);
+
+int glob_set(char *pattern, int pos) {
+  /* processes a set expression with the point behind the opening '{'
+     ','-separated elements are collected until the next closing '}'
+  */
+  char* buf = glob_buffer;
+  URLPattern *pat;
+
+  pat = (URLPattern*)&glob_expand->pattern[glob_expand->size / 2];
+  /* patterns 0,1,2,... correspond to size=1,3,5,... */
+  pat->type = UPTSet;
+  pat->content.Set.size = 0;
+  pat->content.Set.ptr_s = 0;
+  pat->content.Set.elements = (char**)malloc(0);
+  ++glob_expand->size;
+
+  while (1) {
+    switch (*pattern) {
+    case '\0':                         /* URL ended while set was still open */
+      printf("error: unmatched brace at pos %d\n", pos);
+      exit (URG_URL_MALFORMAT);
+    case '{':
+    case '[':                          /* no nested expressions at this time */
+      printf("error: nested braces not supported %d\n", pos);
+      exit (URG_URL_MALFORMAT);
+    case ',':
+    case '}':                          /* set element completed */
+      *buf = '\0';
+      pat->content.Set.elements = realloc(pat->content.Set.elements, (pat->content.Set.size + 1) * sizeof(char*));
+      if (!pat->content.Set.elements) {
+       printf("out of memory in set pattern\n");
+       exit(URG_OUT_OF_MEMORY);
+      }
+      pat->content.Set.elements[pat->content.Set.size] = strdup(glob_buffer);
+      ++pat->content.Set.size;
+
+      if (*pattern == '}')             /* entire set pattern completed */
+       /* always check for a literal (may be "") between patterns */
+       return pat->content.Set.size * glob_word(++pattern, ++pos);
+
+      buf = glob_buffer;
+      ++pattern;
+      ++pos;
+      break;
+    case ']':                          /* illegal closing bracket */
+      printf("error: illegal pattern at pos %d\n", pos);
+      exit (URG_URL_MALFORMAT);
+    case '\\':                         /* escaped character, skip '\' */
+      if (*(buf+1) == '\0') {          /* but no escaping of '\0'! */
+       printf("error: illegal pattern at pos %d\n", pos);
+       exit (URG_URL_MALFORMAT);
+      }
+      ++pattern;
+      ++pos;                           /* intentional fallthrough */
+    default:
+      *buf++ = *pattern++;             /* copy character to set element */
+      ++pos;
+    }
+  }
+  exit (URG_FAILED_INIT);
+}
+
+int glob_range(char *pattern, int pos) {
+  /* processes a range expression with the point behind the opening '['
+     - char range: e.g. "a-z]", "B-Q]"
+     - num range: e.g. "0-9]", "17-2000]"
+     - num range with leading zeros: e.g. "001-999]"
+     expression is checked for well-formedness and collected until the next ']'
+  */
+  URLPattern *pat;
+  char *c;
+  
+  pat = (URLPattern*)&glob_expand->pattern[glob_expand->size / 2];
+  /* patterns 0,1,2,... correspond to size=1,3,5,... */
+  ++glob_expand->size;
+
+  if (isalpha((int)*pattern)) {                /* character range detected */
+    pat->type = UPTCharRange;
+    if (sscanf(pattern, "%c-%c]", &pat->content.CharRange.min_c, &pat->content.CharRange.max_c) != 2 ||
+       pat->content.CharRange.min_c >= pat->content.CharRange.max_c ||
+       pat->content.CharRange.max_c - pat->content.CharRange.min_c > 'z' - 'a') {
+      /* the pattern is not well-formed */ 
+      printf("error: illegal pattern or range specification after pos %d\n", pos);
+      exit (URG_URL_MALFORMAT);
+    }
+    pat->content.CharRange.ptr_c = pat->content.CharRange.min_c;
+    /* always check for a literal (may be "") between patterns */
+    return (pat->content.CharRange.max_c - pat->content.CharRange.min_c + 1) *
+      glob_word(pattern + 4, pos + 4);
+  }
+  if (isdigit((int)*pattern)) {                /* numeric range detected */
+    pat->type = UPTNumRange;
+    pat->content.NumRange.padlength = 0;
+    if (sscanf(pattern, "%d-%d]", &pat->content.NumRange.min_n, &pat->content.NumRange.max_n) != 2 ||
+       pat->content.NumRange.min_n >= pat->content.NumRange.max_n) {
+      /* the pattern is not well-formed */ 
+      printf("error: illegal pattern or range specification after pos %d\n", pos);
+      exit (URG_URL_MALFORMAT);
+    }
+    if (*pattern == '0') {             /* leading zero specified */
+      c = pattern;  
+      while (isdigit((int)*c++))
+       ++pat->content.NumRange.padlength;      /* padding length is set for all instances
+                                                  of this pattern */
+    }
+    pat->content.NumRange.ptr_n = pat->content.NumRange.min_n;
+    c = (char*)(strchr(pattern, ']') + 1);     /* continue after next ']' */
+    /* always check for a literal (may be "") between patterns */
+    return (pat->content.NumRange.max_n - pat->content.NumRange.min_n + 1) *
+      glob_word(c, pos + (c - pattern));
+  }
+  printf("error: illegal character in range specification at pos %d\n", pos);
+  exit (URG_URL_MALFORMAT);
+}
+
+int glob_word(char *pattern, int pos) {
+  /* processes a literal string component of a URL
+     special characters '{' and '[' branch to set/range processing functions
+   */ 
+  char* buf = glob_buffer;
+  int litindex;
+
+  while (*pattern != '\0' && *pattern != '{' && *pattern != '[') {
+    if (*pattern == '}' || *pattern == ']') {
+      printf("illegal character at position %d\n", pos);
+      exit (URG_URL_MALFORMAT);
+    }
+    if (*pattern == '\\') {            /* escape character, skip '\' */
+      ++pattern;
+      ++pos;
+      if (*pattern == '\0') {          /* but no escaping of '\0'! */
+       printf("illegal character at position %d\n", pos);
+       exit (URG_URL_MALFORMAT);
+      }
+    }
+    *buf++ = *pattern++;               /* copy character to literal */
+    ++pos;
+  }
+  *buf = '\0';
+  litindex = glob_expand->size / 2;
+  /* literals 0,1,2,... correspond to size=0,2,4,... */
+  glob_expand->literal[litindex] = strdup(glob_buffer);
+  ++glob_expand->size;
+  if (*pattern == '\0')
+    return 1;                          /* singular URL processed  */
+  if (*pattern == '{') {
+    return glob_set(++pattern, ++pos); /* process set pattern */
+  }
+  if (*pattern == '[') {
+    return glob_range(++pattern, ++pos);/* process range pattern */
+  }
+  printf("internal error\n");
+  exit (URG_FAILED_INIT);
+}
+
+int glob_url(URLGlob** glob, char* url) {
+  int urlnum;          /* counts instances of a globbed pattern */
+
+  glob_expand = (URLGlob*)malloc(sizeof(URLGlob));
+  glob_expand->size = 0;
+  urlnum = glob_word(url, 1);
+  *glob = glob_expand;
+  return urlnum;
+}
+
+char *next_url(URLGlob *glob) {
+  static int beenhere = 0;
+  char *buf = glob_buffer;
+  URLPattern *pat;
+  char *lit;
+  signed int i;
+  int carry;
+
+  if (!beenhere)
+    beenhere = 1;
+  else {
+    carry = 1;
+
+    /* implement a counter over the index ranges of all patterns,
+       starting with the rightmost pattern */
+    for (i = glob->size / 2 - 1; carry && i >= 0; --i) {
+      carry = 0;
+      pat = &glob->pattern[i];
+      switch (pat->type) {
+      case UPTSet:
+       if (++pat->content.Set.ptr_s == pat->content.Set.size) {
+         pat->content.Set.ptr_s = 0;
+         carry = 1;
+       }
+       break;
+      case UPTCharRange:
+       if (++pat->content.CharRange.ptr_c > pat->content.CharRange.max_c) {
+         pat->content.CharRange.ptr_c = pat->content.CharRange.min_c;
+         carry = 1;
+       }
+       break;
+      case UPTNumRange:
+       if (++pat->content.NumRange.ptr_n > pat->content.NumRange.max_n) {
+         pat->content.NumRange.ptr_n = pat->content.NumRange.min_n;
+         carry = 1;
+       }
+       break;
+      default:
+       printf("internal error: invalid pattern type (%d)\n", pat->type);
+       exit (URG_FAILED_INIT);
+      }
+    }
+    if (carry)         /* first pattern ptr has run into overflow, done! */
+      return NULL;
+  }
+
+  for (i = 0; i < glob->size; ++i) {
+    if (!(i % 2)) {                    /* every other term (i even) is a literal */
+      lit = glob->literal[i/2];
+      strcpy(buf, lit);
+      buf += strlen(lit);
+    }
+    else {                             /* the rest (i odd) are patterns */
+      pat = &glob->pattern[i/2];
+      switch(pat->type) {
+      case UPTSet:
+       strcpy(buf, pat->content.Set.elements[pat->content.Set.ptr_s]);
+       buf += strlen(pat->content.Set.elements[pat->content.Set.ptr_s]);
+       break;
+      case UPTCharRange:
+       *buf++ = pat->content.CharRange.ptr_c;
+       break;
+      case UPTNumRange:
+       buf += sprintf(buf, "%0*d", pat->content.NumRange.padlength, pat->content.NumRange.ptr_n); 
+       break;
+      default:
+       printf("internal error: invalid pattern type (%d)\n", pat->type);
+       exit (URG_FAILED_INIT);
+      }
+    }
+  }
+  *buf = '\0';
+  return strdup(glob_buffer);
+}
+
+char *match_url(char *filename, URLGlob glob) {
+  char *buf = glob_buffer;
+  URLPattern pat;
+  int i;
+
+  while (*filename != '\0') {
+    if (*filename == '#') {
+      if (!isdigit((int)*++filename) ||
+         *filename == '0') {           /* only '#1' ... '#9' allowed */
+       printf("illegal matching expression\n");
+       exit(URG_URL_MALFORMAT);
+      }
+      i = *filename - '1';
+      if (i + 1 > glob.size / 2) {
+       printf("match against nonexisting pattern\n");
+       exit(URG_URL_MALFORMAT);
+      }
+      pat = glob.pattern[i];
+      switch (pat.type) {
+      case UPTSet:
+       strcpy(buf, pat.content.Set.elements[pat.content.Set.ptr_s]);
+       buf += strlen(pat.content.Set.elements[pat.content.Set.ptr_s]);
+       break;
+      case UPTCharRange:
+       *buf++ = pat.content.CharRange.ptr_c;
+       break;
+      case UPTNumRange:
+       buf += sprintf(buf, "%0*d", pat.content.NumRange.padlength, pat.content.NumRange.ptr_n);
+       break;
+      default:
+       printf("internal error: invalid pattern type (%d)\n", pat.type);
+       exit (URG_FAILED_INIT);
+      }
+      ++filename;
+    }
+    else
+      *buf++ = *filename++;
+  }
+  *buf = '\0';
+  return strdup(glob_buffer);
+}
diff --git a/src/urlglob.h b/src/urlglob.h
new file mode 100644 (file)
index 0000000..dc52371
--- /dev/null
@@ -0,0 +1,74 @@
+#ifndef __URLGLOB_H
+#define __URLGLOB_H
+/*****************************************************************************
+ *                                  _   _ ____  _     
+ *  Project                     ___| | | |  _ \| |    
+ *                             / __| | | | |_) | |    
+ *                            | (__| |_| |  _ <| |___ 
+ *                             \___|\___/|_| \_\_____|
+ *
+ *  The contents of this file are subject to the Mozilla Public License
+ *  Version 1.0 (the "License"); you may not use this file except in
+ *  compliance with the License. You may obtain a copy of the License at
+ *  http://www.mozilla.org/MPL/
+ *
+ *  Software distributed under the License is distributed on an "AS IS"
+ *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ *  License for the specific language governing rights and limitations
+ *  under the License.
+ *
+ *  The Original Code is Curl.
+ *
+ *  The Initial Developer of the Original Code is Daniel Stenberg.
+ *
+ *  Portions created by the Initial Developer are Copyright (C) 1998.
+ *  All Rights Reserved.
+ *
+ * ------------------------------------------------------------
+ * Main author:
+ * - Daniel Stenberg <Daniel.Stenberg@haxx.nu>
+ *
+ *     http://curl.haxx.nu
+ *
+ * $Source$
+ * $Revision$
+ * $Date$
+ * $Author$
+ * $State$
+ * $Locker$
+ *
+ * ------------------------------------------------------------
+ ****************************************************************************/
+typedef enum {UPTSet=1,UPTCharRange,UPTNumRange} URLPatternType;
+
+typedef struct {
+  URLPatternType type;
+  union {
+    struct {
+      char **elements;
+      short size;
+      short ptr_s;
+    } Set;
+    struct {
+      char min_c, max_c;
+      char ptr_c;
+    } CharRange;
+    struct {
+      int min_n, max_n;
+      short padlength;
+      int ptr_n;
+    } NumRange ;
+  } content;
+} URLPattern;
+
+typedef struct {
+  char* literal[10];
+  URLPattern pattern[9];
+  int size;
+} URLGlob;
+
+int glob_url(URLGlob**, char*);
+char* next_url(URLGlob*);
+char* match_url(char*, URLGlob); 
+
+#endif
diff --git a/src/version.h b/src/version.h
new file mode 100644 (file)
index 0000000..65ec2d1
--- /dev/null
@@ -0,0 +1,3 @@
+#define CURL_NAME "curl"
+#define CURL_VERSION "6.3.1"
+#define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") "
diff --git a/stamp-h b/stamp-h
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
+++ b/stamp-h
@@ -0,0 +1 @@
+timestamp
diff --git a/stamp-h.in b/stamp-h.in
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
@@ -0,0 +1 @@
+timestamp
diff --git a/stamp-h1 b/stamp-h1
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
+++ b/stamp-h1
@@ -0,0 +1 @@
+timestamp
diff --git a/stamp-h1.in b/stamp-h1.in
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
@@ -0,0 +1 @@
+timestamp