diff options
author | Daniel Stenberg <daniel@haxx.se> | 1999-12-29 14:20:26 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 1999-12-29 14:20:26 +0000 |
commit | ae1912cb0d494b48d514d937826c9fe83ec96c4d (patch) | |
tree | 3b027d577182fc74bade646227f729eac461d0d2 | |
download | curl-ae1912cb0d494b48d514d937826c9fe83ec96c4d.tar.gz |
Initial revision
-rw-r--r-- | CHANGES | 1656 | ||||
-rw-r--r-- | CONTRIBUTE | 68 | ||||
-rw-r--r-- | FAQ | 31 | ||||
-rw-r--r-- | FEATURES | 72 | ||||
-rw-r--r-- | FILES | 47 | ||||
-rw-r--r-- | INSTALL | 195 | ||||
-rw-r--r-- | LEGAL | 21 | ||||
-rw-r--r-- | MPL-1.0.txt | 360 | ||||
-rw-r--r-- | Makefile | 426 | ||||
-rw-r--r-- | Makefile.am | 13 | ||||
-rw-r--r-- | Makefile.dist | 78 | ||||
-rw-r--r-- | Makefile.in | 426 | ||||
-rw-r--r-- | README | 28 | ||||
-rw-r--r-- | README.curl | 611 | ||||
-rw-r--r-- | README.libcurl | 108 | ||||
-rw-r--r-- | RESOURCES | 62 | ||||
-rw-r--r-- | TODO | 87 | ||||
-rw-r--r-- | acconfig.h | 12 | ||||
-rw-r--r-- | aclocal.m4 | 127 | ||||
-rw-r--r-- | config-win32.h | 168 | ||||
-rw-r--r-- | config.cache | 86 | ||||
-rwxr-xr-x | config.guess | 997 | ||||
-rwxr-xr-x | config.guess-991124 | 900 | ||||
-rw-r--r-- | config.h | 220 | ||||
-rw-r--r-- | config.h.in | 219 | ||||
-rw-r--r-- | config.log | 90 | ||||
-rwxr-xr-x | config.status | 492 | ||||
-rwxr-xr-x | config.sub | 979 | ||||
-rwxr-xr-x | config.sub-991124 | 952 | ||||
-rwxr-xr-x | configure | 3091 | ||||
-rw-r--r-- | configure.in | 210 | ||||
-rw-r--r-- | curl-6.3.1.tar.gz | bin | 0 -> 242680 bytes | |||
-rw-r--r-- | curl-ssl.spec | 52 | ||||
-rw-r--r-- | curl.1 | 402 | ||||
-rw-r--r-- | curl.beos-patch | 695 | ||||
-rw-r--r-- | curl.spec | 52 | ||||
-rw-r--r-- | curl_631_general.patch | 1265 | ||||
-rw-r--r-- | curl_63_form.patch | 92 | ||||
-rw-r--r-- | curl_63_partialdl.patch | 106 | ||||
-rw-r--r-- | head | 7 | ||||
-rw-r--r-- | include/README | 15 | ||||
-rw-r--r-- | include/curl/curl.beos-patch | 46 | ||||
-rw-r--r-- | include/curl/curl.h | 434 | ||||
-rw-r--r-- | include/curl/getdate.h | 0 | ||||
-rw-r--r-- | include/curl/mprintf.h | 93 | ||||
-rw-r--r-- | include/curl/stdcheaders.h | 53 | ||||
-rwxr-xr-x | install-sh | 250 | ||||
-rw-r--r-- | lib/Makefile | 282 | ||||
-rw-r--r-- | lib/Makefile.am | 31 | ||||
-rw-r--r-- | lib/Makefile.in | 282 | ||||
-rw-r--r-- | lib/Makefile.m32 | 67 | ||||
-rw-r--r-- | lib/Makefile.vc6 | 315 | ||||
-rw-r--r-- | lib/arpa_telnet.h | 319 | ||||
-rw-r--r-- | lib/base64.c | 94 | ||||
-rw-r--r-- | lib/base64.h | 44 | ||||
-rw-r--r-- | lib/cookie.c | 457 | ||||
-rw-r--r-- | lib/cookie.h | 45 | ||||
-rw-r--r-- | lib/dict.c | 245 | ||||
-rw-r--r-- | lib/dict.h | 45 | ||||
-rw-r--r-- | lib/download.c | 484 | ||||
-rw-r--r-- | lib/download.h | 50 | ||||
-rw-r--r-- | lib/escape.c | 111 | ||||
-rw-r--r-- | lib/escape.h | 49 | ||||
-rw-r--r-- | lib/file.c | 175 | ||||
-rw-r--r-- | lib/file.h | 45 | ||||
-rwxr-xr-x | lib/formdata | bin | 0 -> 23808 bytes | |||
-rw-r--r-- | lib/formdata.c | 617 | ||||
-rw-r--r-- | lib/formdata.h | 103 | ||||
-rw-r--r-- | lib/ftp.c | 1046 | ||||
-rw-r--r-- | lib/ftp.h | 52 | ||||
-rw-r--r-- | lib/getdate.c | 2101 | ||||
-rw-r--r-- | lib/getdate.h | 46 | ||||
-rw-r--r-- | lib/getdate.y | 1051 | ||||
-rw-r--r-- | lib/getenv.c | 95 | ||||
-rw-r--r-- | lib/getenv.h | 71 | ||||
-rw-r--r-- | lib/getpass.c | 185 | ||||
-rw-r--r-- | lib/getpass.h | 1 | ||||
-rw-r--r-- | lib/hostip.c | 111 | ||||
-rw-r--r-- | lib/hostip.h | 46 | ||||
-rw-r--r-- | lib/http.c | 381 | ||||
-rw-r--r-- | lib/http.h | 45 | ||||
-rw-r--r-- | lib/if2ip.c | 110 | ||||
-rw-r--r-- | lib/if2ip.h | 50 | ||||
-rw-r--r-- | lib/ldap.c | 226 | ||||
-rw-r--r-- | lib/ldap.h | 45 | ||||
-rw-r--r-- | lib/mprintf.c | 1253 | ||||
-rw-r--r-- | lib/netrc.c | 182 | ||||
-rw-r--r-- | lib/netrc.h | 70 | ||||
-rw-r--r-- | lib/progress.c | 221 | ||||
-rw-r--r-- | lib/progress.h | 54 | ||||
-rw-r--r-- | lib/sendf.c | 115 | ||||
-rw-r--r-- | lib/sendf.h | 47 | ||||
-rw-r--r-- | lib/setup.h | 169 | ||||
-rw-r--r-- | lib/speedcheck.c | 81 | ||||
-rw-r--r-- | lib/speedcheck.h | 50 | ||||
-rw-r--r-- | lib/ssluse.c | 265 | ||||
-rw-r--r-- | lib/ssluse.h | 46 | ||||
-rw-r--r-- | lib/sta01005 | bin | 0 -> 1024 bytes | |||
-rw-r--r-- | lib/sta18057 | bin | 0 -> 461824 bytes | |||
-rw-r--r-- | lib/telnet.c | 937 | ||||
-rw-r--r-- | lib/telnet.h | 45 | ||||
-rw-r--r-- | lib/timeval.c | 93 | ||||
-rw-r--r-- | lib/timeval.h | 64 | ||||
-rw-r--r-- | lib/upload.c | 178 | ||||
-rw-r--r-- | lib/upload.h | 46 | ||||
-rw-r--r-- | lib/url.c | 1181 | ||||
-rw-r--r-- | lib/url.h | 0 | ||||
-rw-r--r-- | lib/urldata.h | 212 | ||||
-rw-r--r-- | lib/version.c | 86 | ||||
-rwxr-xr-x | maketgz | 152 | ||||
-rwxr-xr-x | missing | 188 | ||||
-rwxr-xr-x | mkinstalldirs | 40 | ||||
-rw-r--r-- | perl/README | 33 | ||||
-rw-r--r-- | perl/checklinks.pl | 336 | ||||
-rwxr-xr-x | perl/checklinks.pl.in | 336 | ||||
-rw-r--r-- | perl/formfind.pl | 273 | ||||
-rwxr-xr-x | perl/formfind.pl.in | 273 | ||||
-rw-r--r-- | perl/getlinks.pl | 261 | ||||
-rwxr-xr-x | perl/getlinks.pl.in | 261 | ||||
-rw-r--r-- | perl/recursiveftpget.pl | 67 | ||||
-rwxr-xr-x | perl/recursiveftpget.pl.in | 67 | ||||
-rwxr-xr-x | reconf | 16 | ||||
-rw-r--r-- | src/Makefile | 334 | ||||
-rw-r--r-- | src/Makefile.am | 27 | ||||
-rw-r--r-- | src/Makefile.in | 334 | ||||
-rw-r--r-- | src/Makefile.m32 | 65 | ||||
-rw-r--r-- | src/Makefile.vc6 | 68 | ||||
-rw-r--r-- | src/config-win32.h | 12 | ||||
-rw-r--r-- | src/config.h | 13 | ||||
-rw-r--r-- | src/config.h.in | 12 | ||||
-rwxr-xr-x | src/curl | bin | 0 -> 1830293 bytes | |||
-rw-r--r-- | src/hugehelp.c | 1049 | ||||
-rw-r--r-- | src/main.c | 1154 | ||||
-rw-r--r-- | src/mkhelp.pl | 85 | ||||
-rw-r--r-- | src/setup.h | 91 | ||||
-rw-r--r-- | src/stamp-h2 | 1 | ||||
-rw-r--r-- | src/stamp-h2.in | 1 | ||||
-rw-r--r-- | src/urlglob.c | 332 | ||||
-rw-r--r-- | src/urlglob.h | 74 | ||||
-rw-r--r-- | src/version.h | 3 | ||||
-rw-r--r-- | stamp-h | 1 | ||||
-rw-r--r-- | stamp-h.in | 1 | ||||
-rw-r--r-- | stamp-h1 | 1 | ||||
-rw-r--r-- | stamp-h1.in | 1 |
144 files changed, 37273 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES new file mode 100644 index 000000000..34cc7bf83 --- /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 index 000000000..e268d4e21 --- /dev/null +++ b/CONTRIBUTE @@ -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. @@ -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 index 000000000..18d3d3d44 --- /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 @@ -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 index 000000000..a2e389433 --- /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. @@ -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 index 000000000..f7f2ff185 --- /dev/null +++ b/MPL-1.0.txt @@ -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 index 000000000..0eaf99620 --- /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 index 000000000..b5b81a564 --- /dev/null +++ b/Makefile.am @@ -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 index 000000000..843091df0 --- /dev/null +++ b/Makefile.dist @@ -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 index 000000000..18fa70152 --- /dev/null +++ b/Makefile.in @@ -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: @@ -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 index 000000000..00f685e41 --- /dev/null +++ b/README.curl @@ -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 index 000000000..ccec76150 --- /dev/null +++ b/README.libcurl @@ -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 index 000000000..92b25ce45 --- /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 - ? + @@ -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 index 000000000..616cc069a --- /dev/null +++ b/acconfig.h @@ -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 index 000000000..bd4779c71 --- /dev/null +++ b/aclocal.m4 @@ -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 index 000000000..8fe85e8aa --- /dev/null +++ b/config-win32.h @@ -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 index 000000000..ba8353a0d --- /dev/null +++ b/config.cache @@ -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 index 000000000..1d27287d5 --- /dev/null +++ b/config.guess @@ -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 index 000000000..58670decb --- /dev/null +++ b/config.guess-991124 @@ -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 index 000000000..195afa8ba --- /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 index 000000000..9c5e11013 --- /dev/null +++ b/config.h.in @@ -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 index 000000000..ac13614e4 --- /dev/null +++ b/config.log @@ -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 index 000000000..8c3de4b68 --- /dev/null +++ b/config.status @@ -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 index 000000000..ecf770cea --- /dev/null +++ b/config.sub @@ -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 index 000000000..e24b85041 --- /dev/null +++ b/config.sub-991124 @@ -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 index 000000000..51b1b3dad --- /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 index 000000000..17418fd64 --- /dev/null +++ b/configure.in @@ -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 Binary files differnew file mode 100644 index 000000000..38bba51aa --- /dev/null +++ b/curl-6.3.1.tar.gz diff --git a/curl-ssl.spec b/curl-ssl.spec new file mode 100644 index 000000000..1d69342d3 --- /dev/null +++ b/curl-ssl.spec @@ -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/ + @@ -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 index 000000000..25a1b3b60 --- /dev/null +++ b/curl.beos-patch @@ -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 + ++/* 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 + +-#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" + + 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 index 000000000..adf907e91 --- /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 index 000000000..242e308f9 --- /dev/null +++ b/curl_631_general.patch @@ -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 index 000000000..03738dbc0 --- /dev/null +++ b/curl_63_form.patch @@ -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 index 000000000..9df65e232 --- /dev/null +++ b/curl_63_partialdl.patch @@ -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!"); @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK
+Server: Microsoft-IIS/4.0
+Date: Thu, 02 Dec 1999 23:15:03 GMT
+Content-Type: text/html
+Set-Cookie: ASPSESSIONIDGQQQGGPD=HEDEOJCAIDADIKKLCFIFEJAJ; path=/
+Cache-control: private
+
diff --git a/include/README b/include/README new file mode 100644 index 000000000..fc9ea9137 --- /dev/null +++ b/include/README @@ -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 index 000000000..67bab368e --- /dev/null +++ b/include/curl/curl.beos-patch @@ -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 index 000000000..a74625dbd --- /dev/null +++ b/include/curl/curl.h @@ -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 index 000000000..e69de29bb --- /dev/null +++ b/include/curl/getdate.h diff --git a/include/curl/mprintf.h b/include/curl/mprintf.h new file mode 100644 index 000000000..65c64f439 --- /dev/null +++ b/include/curl/mprintf.h @@ -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 index 000000000..3027b86e9 --- /dev/null +++ b/include/curl/stdcheaders.h @@ -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 index 000000000..e8436696c --- /dev/null +++ b/install-sh @@ -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 index 000000000..303df5359 --- /dev/null +++ b/lib/Makefile @@ -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 index 000000000..ca83f8627 --- /dev/null +++ b/lib/Makefile.am @@ -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 index 000000000..eb39e2a2b --- /dev/null +++ b/lib/Makefile.in @@ -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 index 000000000..00aa77650 --- /dev/null +++ b/lib/Makefile.m32 @@ -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 index 000000000..e7db08e56 --- /dev/null +++ b/lib/Makefile.vc6 @@ -0,0 +1,315 @@ +#############################################################
+## Makefile for building libcurl.lib with MSVC6
+## Use: nmake -f makefile.vc6 [release | release-ssl | debug]
+## (default is release)
+##
+## Comments to: Troy Engel <tengel@sonic.net>
+
+PROGRAM_NAME = libcurl.lib
+OPENSSL_PATH = ../../openssl-0.9.3a
+
+########################################################
+## Nothing more to do below this line!
+
+## Release
+CCR = cl.exe /ML /O2 /D "NDEBUG"
+LINKR = link.exe -lib
+
+## Debug
+CCD = cl.exe /MLd /Gm /ZI /Od /D "_DEBUG" /GZ
+LINKD = link.exe -lib
+
+## SSL Release
+CCRS = cl.exe /ML /O2 /D "NDEBUG" /D "USE_SSLEAY" /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
+LINKRS = link.exe -lib /LIBPATH:$(OPENSSL_PATH)/out32dll
+
+CFLAGS = /nologo /W3 /GX /D "WIN32" /D "_MBCS" /D "_LIB" /YX /FD /c
+LFLAGS = /nologo /out:$(PROGRAM_NAME)
+LINKLIBS = kernel32.lib wsock32.lib
+LINKSLIBS = libeay32.lib ssleay32.lib RSAglue.lib
+
+RELEASE_OBJS= \
+ base64r.obj \
+ cookier.obj \
+ downloadr.obj \
+ escaper.obj \
+ formdatar.obj \
+ ftpr.obj \
+ httpr.obj \
+ dictr.obj \
+ telnetr.obj \
+ getdater.obj \
+ getenvr.obj \
+ getpassr.obj \
+ hostipr.obj \
+ if2ipr.obj \
+ mprintfr.obj \
+ netrcr.obj \
+ progressr.obj \
+ sendfr.obj \
+ speedcheckr.obj \
+ ssluser.obj \
+ timevalr.obj \
+ uploadr.obj \
+ urlr.obj \
+ filer.obj \
+ versionr.obj
+
+DEBUG_OBJS= \
+ base64d.obj \
+ cookied.obj \
+ downloadd.obj \
+ escaped.obj \
+ formdatad.obj \
+ ftpd.obj \
+ httpd.obj \
+ dictd.obj \
+ telnetd.obj \
+ getdated.obj \
+ getenvd.obj \
+ getpassd.obj \
+ hostipd.obj \
+ if2ipd.obj \
+ mprintfd.obj \
+ netrcd.obj \
+ progressd.obj \
+ sendfd.obj \
+ speedcheckd.obj \
+ sslused.obj \
+ timevald.obj \
+ uploadd.obj \
+ urld.obj \
+ filed.obj \
+ versiond.obj
+
+RELEASE_SSL_OBJS= \
+ base64rs.obj \
+ cookiers.obj \
+ downloadrs.obj \
+ escapers.obj \
+ formdatars.obj \
+ ftprs.obj \
+ httprs.obj \
+ dictrs.obj \
+ telnetrs.obj \
+ getdaters.obj \
+ getenvrs.obj \
+ getpassrs.obj \
+ hostiprs.obj \
+ if2iprs.obj \
+ mprintfrs.obj \
+ netrcrs.obj \
+ progressrs.obj \
+ sendfrs.obj \
+ speedcheckrs.obj \
+ sslusers.obj \
+ timevalrs.obj \
+ uploadrs.obj \
+ urlrs.obj \
+ filers.obj \
+ versionrs.obj
+
+LINK_OBJS= \
+ base64.obj \
+ cookie.obj \
+ download.obj \
+ escape.obj \
+ formdata.obj \
+ ftp.obj \
+ http.obj \
+ dict.obj \
+ telnet.obj \
+ getdate.obj \
+ getenv.obj \
+ getpass.obj \
+ hostip.obj \
+ if2ip.obj \
+ mprintf.obj \
+ netrc.obj \
+ progress.obj \
+ sendf.obj \
+ speedcheck.obj \
+ ssluse.obj \
+ timeval.obj \
+ upload.obj \
+ url.obj \
+ file.obj \
+ version.obj
+
+all : release
+
+release: $(RELEASE_OBJS)
+ $(LINKR) $(LFLAGS) $(LINKLIBS) $(LINK_OBJS)
+
+debug: $(DEBUG_OBJS)
+ $(LINKD) $(LFLAGS) $(LINKLIBS) $(LINK_OBJS)
+
+release-ssl: $(RELEASE_SSL_OBJS)
+ $(LINKRS) $(LFLAGS) $(LINKLIBS) $(LINKSLIBS) $(LINK_OBJS)
+
+
+## Release
+base64r.obj: base64.c
+ $(CCR) $(CFLAGS) base64.c
+cookier.obj: cookie.c
+ $(CCR) $(CFLAGS) cookie.c
+downloadr.obj: download.c
+ $(CCR) $(CFLAGS) download.c
+escaper.obj: escape.c
+ $(CCR) $(CFLAGS) escape.c
+formdatar.obj: formdata.c
+ $(CCR) $(CFLAGS) formdata.c
+ftpr.obj: ftp.c
+ $(CCR) $(CFLAGS) ftp.c
+httpr.obj: http.c
+ $(CCR) $(CFLAGS) http.c
+dictr.obj: dict.c
+ $(CCR) $(CFLAGS) dict.c
+telnetr.obj: telnet.c
+ $(CCR) $(CFLAGS) telnet.c
+getdater.obj: getdate.c
+ $(CCR) $(CFLAGS) getdate.c
+getenvr.obj: getenv.c
+ $(CCR) $(CFLAGS) getenv.c
+getpassr.obj: getpass.c
+ $(CCR) $(CFLAGS) getpass.c
+hostipr.obj: hostip.c
+ $(CCR) $(CFLAGS) hostip.c
+if2ipr.obj: if2ip.c
+ $(CCR) $(CFLAGS) if2ip.c
+mprintfr.obj: mprintf.c
+ $(CCR) $(CFLAGS) mprintf.c
+netrcr.obj: netrc.c
+ $(CCR) $(CFLAGS) netrc.c
+progressr.obj: progress.c
+ $(CCR) $(CFLAGS) progress.c
+sendfr.obj: sendf.c
+ $(CCR) $(CFLAGS) sendf.c
+speedcheckr.obj: speedcheck.c
+ $(CCR) $(CFLAGS) speedcheck.c
+ssluser.obj: ssluse.c
+ $(CCR) $(CFLAGS) ssluse.c
+timevalr.obj: timeval.c
+ $(CCR) $(CFLAGS) timeval.c
+uploadr.obj: upload.c
+ $(CCR) $(CFLAGS) upload.c
+urlr.obj: url.c
+ $(CCR) $(CFLAGS) url.c
+filer.obj: file.c
+ $(CCR) $(CFLAGS) file.c
+versionr.obj: version.c
+ $(CCR) $(CFLAGS) version.c
+
+## Debug
+base64d.obj: base64.c
+ $(CCD) $(CFLAGS) base64.c
+cookied.obj: cookie.c
+ $(CCD) $(CFLAGS) cookie.c
+downloadd.obj: download.c
+ $(CCD) $(CFLAGS) download.c
+escaped.obj: escape.c
+ $(CCD) $(CFLAGS) escape.c
+formdatad.obj: formdata.c
+ $(CCD) $(CFLAGS) formdata.c
+ftpd.obj: ftp.c
+ $(CCD) $(CFLAGS) ftp.c
+httpd.obj: http.c
+ $(CCD) $(CFLAGS) http.c
+dictd.obj: dict.c
+ $(CCD) $(CFLAGS) dict.c
+telnetd.obj: telnet.c
+ $(CCD) $(CFLAGS) telnet.c
+getdated.obj: getdate.c
+ $(CCD) $(CFLAGS) getdate.c
+getenvd.obj: getenv.c
+ $(CCD) $(CFLAGS) getenv.c
+getpassd.obj: getpass.c
+ $(CCD) $(CFLAGS) getpass.c
+hostipd.obj: hostip.c
+ $(CCD) $(CFLAGS) hostip.c
+if2ipd.obj: if2ip.c
+ $(CCD) $(CFLAGS) if2ip.c
+mprintfd.obj: mprintf.c
+ $(CCD) $(CFLAGS) mprintf.c
+netrcd.obj: netrc.c
+ $(CCD) $(CFLAGS) netrc.c
+progressd.obj: progress.c
+ $(CCD) $(CFLAGS) progress.c
+sendfd.obj: sendf.c
+ $(CCD) $(CFLAGS) sendf.c
+speedcheckd.obj: speedcheck.c
+ $(CCD) $(CFLAGS) speedcheck.c
+sslused.obj: ssluse.c
+ $(CCD) $(CFLAGS) ssluse.c
+timevald.obj: timeval.c
+ $(CCD) $(CFLAGS) timeval.c
+uploadd.obj: upload.c
+ $(CCD) $(CFLAGS) upload.c
+urld.obj: url.c
+ $(CCD) $(CFLAGS) url.c
+filed.obj: file.c
+ $(CCD) $(CFLAGS) file.c
+versiond.obj: version.c
+ $(CCD) $(CFLAGS) version.c
+
+
+## Release SSL
+base64rs.obj: base64.c
+ $(CCRS) $(CFLAGS) base64.c
+cookiers.obj: cookie.c
+ $(CCRS) $(CFLAGS) cookie.c
+downloadrs.obj: download.c
+ $(CCRS) $(CFLAGS) download.c
+escapers.obj: escape.c
+ $(CCRS) $(CFLAGS) escape.c
+formdatars.obj: formdata.c
+ $(CCRS) $(CFLAGS) formdata.c
+ftprs.obj: ftp.c
+ $(CCRS) $(CFLAGS) ftp.c
+httprs.obj: http.c
+ $(CCRS) $(CFLAGS) http.c
+dictrs.obj: dict.c
+ $(CCRS) $(CFLAGS) dict.c
+telnetrs.obj: telnet.c
+ $(CCRS) $(CFLAGS) telnet.c
+getdaters.obj: getdate.c
+ $(CCRS) $(CFLAGS) getdate.c
+getenvrs.obj: getenv.c
+ $(CCRS) $(CFLAGS) getenv.c
+getpassrs.obj: getpass.c
+ $(CCRS) $(CFLAGS) getpass.c
+hostiprs.obj: hostip.c
+ $(CCRS) $(CFLAGS) hostip.c
+if2iprs.obj: if2ip.c
+ $(CCRS) $(CFLAGS) if2ip.c
+mprintfrs.obj: mprintf.c
+ $(CCRS) $(CFLAGS) mprintf.c
+netrcrs.obj: netrc.c
+ $(CCRS) $(CFLAGS) netrc.c
+progressrs.obj: progress.c
+ $(CCRS) $(CFLAGS) progress.c
+sendfrs.obj: sendf.c
+ $(CCRS) $(CFLAGS) sendf.c
+speedcheckrs.obj: speedcheck.c
+ $(CCRS) $(CFLAGS) speedcheck.c
+sslusers.obj: ssluse.c
+ $(CCRS) $(CFLAGS) ssluse.c
+timevalrs.obj: timeval.c
+ $(CCRS) $(CFLAGS) timeval.c
+uploadrs.obj: upload.c
+ $(CCRS) $(CFLAGS) upload.c
+urlrs.obj: url.c
+ $(CCRS) $(CFLAGS) url.c
+filers.obj: file.c
+ $(CCRS) $(CFLAGS) file.c
+versionrs.obj: version.c
+ $(CCRS) $(CFLAGS) version.c
+
+clean:
+ -@erase *.obj
+ -@erase vc60.idb
+ -@erase vc60.pch
+
+distrib: clean
+ -@erase $(PROGRAM_NAME)
+
diff --git a/lib/arpa_telnet.h b/lib/arpa_telnet.h new file mode 100644 index 000000000..25085b89a --- /dev/null +++ b/lib/arpa_telnet.h @@ -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 index 000000000..8758af1ef --- /dev/null +++ b/lib/base64.c @@ -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 index 000000000..460974331 --- /dev/null +++ b/lib/base64.h @@ -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 index 000000000..dde335042 --- /dev/null +++ b/lib/cookie.c @@ -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 index 000000000..466844a5d --- /dev/null +++ b/lib/cookie.h @@ -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 index 000000000..e26437022 --- /dev/null +++ b/lib/dict.c @@ -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 index 000000000..edff0c434 --- /dev/null +++ b/lib/dict.h @@ -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 index 000000000..fb0cb60ea --- /dev/null +++ b/lib/download.c @@ -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 index 000000000..e8ca82add --- /dev/null +++ b/lib/download.h @@ -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 index 000000000..68000cd71 --- /dev/null +++ b/lib/escape.c @@ -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 index 000000000..bca4d8bd9 --- /dev/null +++ b/lib/escape.h @@ -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 index 000000000..b5d198e57 --- /dev/null +++ b/lib/file.c @@ -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 index 000000000..eeaeef4f4 --- /dev/null +++ b/lib/file.h @@ -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 Binary files differnew file mode 100755 index 000000000..dc8e9e803 --- /dev/null +++ b/lib/formdata diff --git a/lib/formdata.c b/lib/formdata.c new file mode 100644 index 000000000..eff0212e4 --- /dev/null +++ b/lib/formdata.c @@ -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 index 000000000..6b08a05b4 --- /dev/null +++ b/lib/formdata.h @@ -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 index 000000000..d62891298 --- /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 index 000000000..b7d265927 --- /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 index 000000000..e3342ff3a --- /dev/null +++ b/lib/getdate.c @@ -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 + +/* 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 + +#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" + + 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 } +}; + + + + +/* 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 index 000000000..674c474f1 --- /dev/null +++ b/lib/getdate.h @@ -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 index 000000000..d60be3cf0 --- /dev/null +++ b/lib/getdate.y @@ -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 } +}; + + + + +/* 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 index 000000000..404f1c970 --- /dev/null +++ b/lib/getenv.c @@ -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 index 000000000..83b9495e1 --- /dev/null +++ b/lib/getenv.h @@ -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 index 000000000..c0c7bf97b --- /dev/null +++ b/lib/getpass.c @@ -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 index 000000000..33dfed668 --- /dev/null +++ b/lib/getpass.h @@ -0,0 +1 @@ +char *getpass(const char *prompt); diff --git a/lib/hostip.c b/lib/hostip.c new file mode 100644 index 000000000..453d8a387 --- /dev/null +++ b/lib/hostip.c @@ -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 *)# + 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 index 000000000..8753e3975 --- /dev/null +++ b/lib/hostip.h @@ -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 index 000000000..2dd380214 --- /dev/null +++ b/lib/http.c @@ -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 index 000000000..be35842cf --- /dev/null +++ b/lib/http.h @@ -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 index 000000000..f8a37bb12 --- /dev/null +++ b/lib/if2ip.c @@ -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 index 000000000..0b658f9d2 --- /dev/null +++ b/lib/if2ip.h @@ -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 index 000000000..7f0e0251f --- /dev/null +++ b/lib/ldap.c @@ -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 index 000000000..d88880ede --- /dev/null +++ b/lib/ldap.h @@ -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 index 000000000..237a21a9d --- /dev/null +++ b/lib/mprintf.c @@ -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 index 000000000..f0e1382fe --- /dev/null +++ b/lib/netrc.c @@ -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 index 000000000..2875cbc53 --- /dev/null +++ b/lib/netrc.h @@ -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 index 000000000..6a083370b --- /dev/null +++ b/lib/progress.c @@ -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 index 000000000..6babd89ca --- /dev/null +++ b/lib/progress.h @@ -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 index 000000000..387984d9d --- /dev/null +++ b/lib/sendf.c @@ -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 index 000000000..de6571930 --- /dev/null +++ b/lib/sendf.h @@ -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 index 000000000..6770ec6c4 --- /dev/null +++ b/lib/setup.h @@ -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 index 000000000..5647b50e2 --- /dev/null +++ b/lib/speedcheck.c @@ -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 index 000000000..27e7ba2f6 --- /dev/null +++ b/lib/speedcheck.h @@ -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 index 000000000..bb78df009 --- /dev/null +++ b/lib/ssluse.c @@ -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 index 000000000..c1996b28e --- /dev/null +++ b/lib/ssluse.h @@ -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 Binary files differnew file mode 100644 index 000000000..31cd282d1 --- /dev/null +++ b/lib/sta01005 diff --git a/lib/sta18057 b/lib/sta18057 Binary files differnew file mode 100644 index 000000000..36d824b46 --- /dev/null +++ b/lib/sta18057 diff --git a/lib/telnet.c b/lib/telnet.c new file mode 100644 index 000000000..8ca12450d --- /dev/null +++ b/lib/telnet.c @@ -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 index 000000000..25b7f2d29 --- /dev/null +++ b/lib/telnet.h @@ -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 index 000000000..8ad25325f --- /dev/null +++ b/lib/timeval.c @@ -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 index 000000000..fe99e2896 --- /dev/null +++ b/lib/timeval.h @@ -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 index 000000000..0673382e9 --- /dev/null +++ b/lib/upload.c @@ -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 index 000000000..dbb6600c8 --- /dev/null +++ b/lib/upload.h @@ -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 index 000000000..b520898dc --- /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 index 000000000..e69de29bb --- /dev/null +++ b/lib/url.h diff --git a/lib/urldata.h b/lib/urldata.h new file mode 100644 index 000000000..f171cd096 --- /dev/null +++ b/lib/urldata.h @@ -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 index 000000000..73be0d7f9 --- /dev/null +++ b/lib/version.c @@ -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 index 000000000..6ad429b5d --- /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 index 000000000..cbe2b0ef0 --- /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 index 000000000..d0fd194fd --- /dev/null +++ b/mkinstalldirs @@ -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 index 000000000..bb8757aea --- /dev/null +++ b/perl/README @@ -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 index 000000000..347416ac9 --- /dev/null +++ b/perl/checklinks.pl @@ -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 index 000000000..17032b36a --- /dev/null +++ b/perl/checklinks.pl.in @@ -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 index 000000000..cd1997642 --- /dev/null +++ b/perl/formfind.pl @@ -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 index 000000000..6428e991e --- /dev/null +++ b/perl/formfind.pl.in @@ -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 index 000000000..06da56e30 --- /dev/null +++ b/perl/getlinks.pl @@ -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 index 000000000..1ef0d3e27 --- /dev/null +++ b/perl/getlinks.pl.in @@ -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 index 000000000..02299b00d --- /dev/null +++ b/perl/recursiveftpget.pl @@ -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 index 000000000..7d9cf8eb8 --- /dev/null +++ b/perl/recursiveftpget.pl.in @@ -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`; + } +} @@ -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 index 000000000..a4b373e22 --- /dev/null +++ b/src/Makefile @@ -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 index 000000000..561142ed3 --- /dev/null +++ b/src/Makefile.am @@ -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 index 000000000..f7afbd977 --- /dev/null +++ b/src/Makefile.in @@ -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 index 000000000..d398083fb --- /dev/null +++ b/src/Makefile.m32 @@ -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 index 000000000..1502b0218 --- /dev/null +++ b/src/Makefile.vc6 @@ -0,0 +1,68 @@ +########################################################
+## Makefile for building curl.exe with MSVC6
+## Use: nmake -f makefile.vc6 [release | debug]
+## (default is release)
+##
+## Comments to: Troy Engel <tengel@sonic.net>
+
+PROGRAM_NAME = curl.exe
+
+########################################################
+## Nothing more to do below this line!
+
+## Release
+CCR = cl.exe /ML /O2 /D "NDEBUG"
+LINKR = link.exe /incremental:no /libpath:"../lib"
+
+## Debug
+CCD = cl.exe /MLd /Gm /ZI /Od /D "_DEBUG" /GZ
+LINKD = link.exe /incremental:yes /debug
+
+CFLAGS = /nologo /W3 /GX /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:I386
+LINKLIBS = kernel32.lib wsock32.lib libcurl.lib
+
+RELEASE_OBJS= \
+ hugehelpr.obj \
+ mainr.obj
+
+DEBUG_OBJS= \
+ hugehelpd.obj \
+ maind.obj
+
+LINK_OBJS= \
+ hugehelp.obj \
+ main.obj
+
+all : release
+
+release: $(RELEASE_OBJS)
+ $(LINKR) $(LFLAGS) $(LINKLIBS) $(LINK_OBJS)
+
+debug: $(DEBUG_OBJS)
+ $(LINKD) $(LFLAGS) $(LINKLIBS) $(LINK_OBJS)
+
+## Release
+hugehelpr.obj: hugehelp.c
+ $(CCR) $(CFLAGS) /Zm200 hugehelp.c
+mainr.obj: main.c
+ $(CCR) $(CFLAGS) main.c
+
+## Debug
+hugehelpd.obj: hugehelp.c
+ $(CCD) $(CFLAGS) /Zm200 hugehelp.c
+maind.obj: main.c
+ $(CCD) $(CFLAGS) main.c
+
+clean:
+ -@erase hugehelp.obj
+ -@erase main.obj
+ -@erase vc60.idb
+ -@erase vc60.pdb
+ -@erase vc60.pch
+ -@erase curl.ilk
+ -@erase curl.pdb
+
+distrib: clean
+ -@erase $(PROGRAM_NAME)
+
diff --git a/src/config-win32.h b/src/config-win32.h new file mode 100644 index 000000000..42264ecff --- /dev/null +++ b/src/config-win32.h @@ -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 index 000000000..e741a236c --- /dev/null +++ b/src/config.h @@ -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 index 000000000..2e210ede8 --- /dev/null +++ b/src/config.h.in @@ -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 Binary files differnew file mode 100755 index 000000000..cba40a4c0 --- /dev/null +++ b/src/curl diff --git a/src/hugehelp.c b/src/hugehelp.c new file mode 100644 index 000000000..390221935 --- /dev/null +++ b/src/hugehelp.c @@ -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 index 000000000..5666c777e --- /dev/null +++ b/src/main.c @@ -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 index 000000000..842a42f59 --- /dev/null +++ b/src/mkhelp.pl @@ -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/_//g; + + # then this: + $line =~ s/.//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 index 000000000..78103f9ce --- /dev/null +++ b/src/setup.h @@ -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 index 000000000..9788f7023 --- /dev/null +++ b/src/stamp-h2 @@ -0,0 +1 @@ +timestamp diff --git a/src/stamp-h2.in b/src/stamp-h2.in new file mode 100644 index 000000000..9788f7023 --- /dev/null +++ b/src/stamp-h2.in @@ -0,0 +1 @@ +timestamp diff --git a/src/urlglob.c b/src/urlglob.c new file mode 100644 index 000000000..846f86c2f --- /dev/null +++ b/src/urlglob.c @@ -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 index 000000000..dc52371ee --- /dev/null +++ b/src/urlglob.h @@ -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 index 000000000..65ec2d1ef --- /dev/null +++ b/src/version.h @@ -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 index 000000000..9788f7023 --- /dev/null +++ b/stamp-h @@ -0,0 +1 @@ +timestamp diff --git a/stamp-h.in b/stamp-h.in new file mode 100644 index 000000000..9788f7023 --- /dev/null +++ b/stamp-h.in @@ -0,0 +1 @@ +timestamp diff --git a/stamp-h1 b/stamp-h1 new file mode 100644 index 000000000..9788f7023 --- /dev/null +++ b/stamp-h1 @@ -0,0 +1 @@ +timestamp diff --git a/stamp-h1.in b/stamp-h1.in new file mode 100644 index 000000000..9788f7023 --- /dev/null +++ b/stamp-h1.in @@ -0,0 +1 @@ +timestamp |