Including CURL with Solaris
Stefan Teleman <Stefan.Teleman at Sun.COM>
15 March 2007
1. Summary and motivation
The Internet has created the necessity for a standardized
syntax format for accessing remote object references. In 1994,
IETF published the URI [Uniform Resource Identifier] Specification
[RFC 1630] [76], followed by the URN [Uniform Resource Name]
Specification [RFC 1737] [77] and the URL [Uniform Resource Locator]
Specification [RFC 1738] [16]. Since then, the terms URI, URL and
URN have been used interchangeably. While subtle distinctions
between URI, URL and URN do exist, these differences have become,
in practice, largely academic.
This evolution has created the need for programmatic and userland
facilities supporting remote object referencing and data transfers,
compliant to the specifications outlined above.
CURL [http://curl.haxx.se/] [1] provides such a collection of
facilities in a portable and platform independent implementation.
CURL is known to run on most UNIX platforms, as well as Windows.
This FastTrack proposes the integration of CURL in Solaris.
CURL is Open Source Software, and is developed and maintained
outside of SMI. As such, the SFW Consolidation is the natural choice
for Solaris integration.
This case proposes the most recent stable release of CURL, 7.16.1.
CURL stands for 'C-URL' [where 'C' refers to the C Programming
Language]. For the purposes of this document, the terms CURL and
LibCURL are semantically equivalent. The 'curl' executable is a
wrapper around the LibCURL library [libcurl.so.3.0.0], and implements
a command-line interface to the facilities provided by LibCURL.
This case seeks Micro/Patch Release Binding.
2. Technical issues
2.1. Key objects
/usr/bin/curl
/usr/bin/curl-config
/usr/lib/libcurl.so.3.0.0
/usr/lib/libcurl.so.3 -> /usr/lib/libcurl.so.3.0.0
/usr/lib/libcurl.so -> /usr/lib/libcurl.so.3.0.0
/usr/include/curl/curl.h
/usr/include/curl/curlver.h
/usr/include/curl/easy.h
/usr/include/curl/mprintf.h
/usr/include/curl/multi.h
/usr/include/curl/stdcheaders.h
/usr/include/curl/types.h
/usr/share/man/man1/curl.1
/usr/share/man/man1/curl-config.1
/usr/share/man/man3/libcurl.3
/usr/share/man/man3/curl_easy_cleanup.3
/usr/share/man/man3/curl_easy_duphandle.3
/usr/share/man/man3/curl_easy_escape.3
/usr/share/man/man3/curl_easy_getinfo.3
/usr/share/man/man3/curl_easy_init.3
/usr/share/man/man3/curl_easy_perform.3
/usr/share/man/man3/curl_easy_reset.3
/usr/share/man/man3/curl_easy_setopt.3
/usr/share/man/man3/curl_easy_strerror.3
/usr/share/man/man3/curl_easy_unescape.3
/usr/share/man/man3/curl_escape.3
/usr/share/man/man3/curl_formadd.3
/usr/share/man/man3/curl_formfree.3
/usr/share/man/man3/curl_formget.3
/usr/share/man/man3/curl_free.3
/usr/share/man/man3/curl_getdate.3
/usr/share/man/man3/curl_getenv.3
/usr/share/man/man3/curl_global_cleanup.3
/usr/share/man/man3/curl_global_init.3
/usr/share/man/man3/curl_global_init_mem.3
/usr/share/man/man3/curl_mprintf.3
/usr/share/man/man3/curl_multi_add_handle.3
/usr/share/man/man3/curl_multi_assign.3
/usr/share/man/man3/curl_multi_cleanup.3
/usr/share/man/man3/curl_multi_fdset.3
/usr/share/man/man3/curl_multi_info_read.3
/usr/share/man/man3/curl_multi_init.3
/usr/share/man/man3/curl_multi_perform.3
/usr/share/man/man3/curl_multi_remove_handle.3
/usr/share/man/man3/curl_multi_setopt.3
/usr/share/man/man3/curl_multi_socket.3
/usr/share/man/man3/curl_multi_strerror.3
/usr/share/man/man3/curl_multi_timeout.3
/usr/share/man/man3/curl_share_cleanup.3
/usr/share/man/man3/curl_share_init.3
/usr/share/man/man3/curl_share_setopt.3
/usr/share/man/man3/curl_share_strerror.3
/usr/share/man/man3/curl_slist_append.3
/usr/share/man/man3/curl_slist_free_all.3
/usr/share/man/man3/curl_strequal.3
/usr/share/man/man3/curl_unescape.3
/usr/share/man/man3/curl_version.3
/usr/share/man/man3/curl_version_info.3
/usr/share/man/man3/libcurl-easy.3
/usr/share/man/man3/libcurl-errors.3
/usr/share/man/man3/libcurl-multi.3
/usr/share/man/man3/libcurl-share.3
/usr/share/man/man3/libcurl-tutorial.3
/usr/share/doc/curl/index.html
/usr/share/doc/curl/curl.html
/usr/share/doc/curl/curl-config.html
LibCURL's functionality is provided by one executable [curl], and
one shared library [libcurl.so.3.0.0]. LibCURL implements a very
large number of Internet-related protocols, authentication mechanisms,
and data transfer facilities. Key aspects of the specifications
implemented, and facilities provided, by, LibCURL are listed below.
CURL is largefile aware and is 64-bit clean. CURL is not thread-safe,
and its functions are not reentrant. Calls to public functions within
the LibCURL library, from different threads, must be serialized. The
private LibCURL interfaces use static data structures [for internal
consumption only].
2.2. Specifications
LibCURL implements the following Specifications:
NAME DESCRIPTION NOTES
RFC 0822 Standard for ARPA Internet Text Messages [8]
RFC 0850 Standard for Interchange of USENET Messages [9]
RFC 0959 File Transfer Protocol [FTP] [10]
RFC 1036 Standard for Interchange of USENET Messages [11]
RFC 1123 Requirements for Internet Hosts -- Application and
Support [12]
RFC 1350 Trivial File Transfer Protocol [TFTP] [13]
RFC 1635 Anonymous FTP [14]
RFC 1639 FTP Operation Over Big Address Records [FOOBAR] [15]
RFC 1738 Uniform Resource Locators [URL] [16]
RFC 1777 Lightweight Directory Access Protocol [LDAP] [17]
RFC 1808 Relative Uniform Resource Locators [18]
RFC 1867 Form-based File Upload in HTML [19]
RFC 1884 IPv6 [20]
RFC 1928 SOCKS Protocol [21]
RFC 1945 HTTP/1.0 [22]
RFC 1950 Z-LIB [23]
RFC 1951 DEFLATE [24]
RFC 1952 GZip [25]
RFC 1959 LDAP URL
RFC 2045 MIME Part 1: Format of Internet Message Bodies [26]
RFC 2046 MIME Part 2: Media Types [27]
RFC 2047 MIME Part 3: Message Header Extensions for Non-ASCII
Text [28]
RFC 2048 MIME Part 4: Registration Procedures [29]
RFC 2049 MIME Part 5: Conformance Criteria and Examples [30]
RFC 2068 HTTP/1.1 [31]
RFC 2109 HTTP Session and State Management [32]
RFC 2133 IPv6 Sockets [33]
RFC 2183 Content-Disposition Header [34]
RFC 2184 MIME Parameter Value and Encoded Word Extensions
[35]
RFC 2228 FTP Security Extensions [36]
RFC 2229 Dictionary Server Protocol [37]
RFC 2231 MIME Parameter Value and Encoded Word Extensions
[38]
RFC 2246 TLS Protocol 1.0 [39]
RFC 2255 New LDAP URL [40]
RFC 2326 Real Time Streaming Protocol [RTSP] [41]
RFC 2373 IP Version 6 Addressing Architecture [42]
RFC 2388 Returning Values from Forms: multipart/form-data
[43]
RFC 2389 Feature negotiation mechanism for the File Transfer
Protocol [44]
RFC 2396 Uniform Resource Identifiers [URI]: Generic Syntax
[45]
RFC 2428 FTP Extensions for IPv6 and NATs [46]
RFC 2459 Internet X.509 Public Key Infrastructure: Certificate
and CRL Profile [47]
RFC 2518 HTTP Extensions for Distributed Authoring: WebDAV
[48]
RFC 2553 Basic Socket Interface Extensions for IPv6 [49]
RFC 2577 FTP Security Considerations [50]
RFC 2616 HTTP/1.1 [Obsoletes RFC 2068] [51]
RFC 2617 HTTP Authentication: Basic and Digest Access
Authentication [52]
RFC 2640 Internationalization of the File Transfer Protocol
[53]
RFC 2718 Guidelines for new URL Schemes [54]
RFC 2732 Format for Literal IPv6 Addresses in URL's [55]
RFC 2817 Upgrading to TLS Within HTTP/1.1 [56]
RFC 2818 HTTP Over TLS [57]
RFC 2854 The 'text/html' Media Type [58]
RFC 2936 HTTP MIME Type Handler Detection [59]
RFC 2964 Use of HTTP State Management [60]
RFC 2965 HTTP State Management Mechanism [61]
RFC 3280 Internet X.509 Public Key Infrastructure [62]
RFC 3493 Basic Socket Interface Extensions for IPv6 [63]
RFC 3513 Internet Protocol Version 6 [IPv6] Addressing
Architecture [64]
RFC 3617 Uniform Resource Identifier [URI] Scheme and
Applicability Statement
for TFTP [65]
RFC 3986 Uniform Resource Identifier [URI]: Generic Syntax
[66]
RFC 4217 Securing FTP with TLS [67]
RFC 4248 The telnet URI Scheme [68]
RFC 4346 The Transport Layer Security [TLS] Protocol Version 1.1
[69]
RFC 4366 Transport Layer Security [TLS] Extensions [70]
Cookie Spec Persistent Client State - HTTP Cookies [71]
Draft SPNEGO HTTP Authentication: SPNEGO Access Authentication As
implemented
in Microsoft Windows 2000 [72]
Draft SecSH/SCP/SFTP/SSH/URI-04 Uniform Resource Identifier [URI]
Scheme for
Secure File Transfer Protocol [SFTP] and Secure Shell [SSH] [73]
Draft Web Proxy TCP Tunneling Tunneling TCP based protocols through
Web proxy
servers [74]
NTLM The NTLM Authentication Protocol [75]
2.3. Language bindings
CURL is written in C. No other language bindings are provided by
the canonical distribution.
2.4. Documentation
CURL provides an extensive and complete documentation set in UNIX
manual format, as well as HTML. We propose that the full documentation
set be included with the Solaris integration.
3. Interfaces
3.1. Interface Stability
CURL is an Open Source project, and its design, development and
release schedule are external to SMI. CURL makes no implicit or
explicit promises or guarantees of API or ABI compatibility
between releases.
3.2. Imported interfaces
In addition to the Standard C Library and Network Services Library
Interfaces, CURL depends on, and imports interfaces, from:
NAME NOTES
OpenSSL PSARC/2003/500 [2]
Z-Lib PSARC/2006/537 [3]
LDAP [OpenLDAP] PSARC/1997/276 et seq. [4]
Kerberos [MIT] PSARC/1999/617 et seq. [5]
LibIDN PSARC/2007/000 [6]
GNU TLS PSARC/2002/621 [7]
The LDAP, Kerberos and GNU TLS bindings are optional. The OpenSSL,
Z-Lib and LibIDN bindings are mandatory.
3.3. Exported interfaces
NAME STABILITY NOTES
SUNWcurl Uncommitted Package name
/usr/bin/curl Uncommitted Executable location
/usr/bin/curl-config Uncommitted Shell script location
/usr/lib/libcurl.so.3.0.0 Uncommitted Library location
/usr/lib/libcurl.so.3 Uncommitted Symbolic link
/usr/lib/libcurl.so Uncommitted Symbolic link
/usr/include/curl/ Uncommitted Include files
4. References
[1] http://curl.haxx.se/
[2] http://www.openssl.org/
[3] http://www.gzip.org/zlib/
[4] http://www.openldap.org/
[5] http://web.mit.edu/kerberos/dist/index.html
[6] http://www.gnu.org/software/libidn/
[7] http://www.gnu.org/software/gnutls/
[8] http://www.ietf.org/rfc/rfc0822.txt
[9] http://www.ietf.org/rfc/rfc0850.txt
[10] http://www.ietf.org/rfc/rfc0959.txt
[11] http://www.ietf.org/rfc/rfc1036.txt
[12] http://www.ietf.org/rfc/rfc1123.txt
[13] http://www.ietf.org/rfc/rfc1350.txt
[14] http://www.ietf.org/rfc/rfc1635.txt
[15] http://www.ietf.org/rfc/rfc1639.txt
[16] http://www.ietf.org/rfc/rfc1738.txt
[17] http://www.ietf.org/rfc/rfc1777.txt
[18] http://www.ietf.org/rfc/rfc1808.txt
[19] http://www.ietf.org/rfc/rfc1867.txt
[20] http://www.ietf.org/rfc/rfc1884.txt
[21] http://www.ietf.org/rfc/rfc1928.txt
[22] http://www.ietf.org/rfc/rfc1945.txt
[23] http://www.ietf.org/rfc/rfc1945.txt
[24] http://www.ietf.org/rfc/rfc1951.txt
[25] http://www.ietf.org/rfc/rfc1952.txt
[26] http://www.ietf.org/rfc/rfc1959.txt
[27] http://www.ietf.org/rfc/rfc2045.txt
[28] http://www.ietf.org/rfc/rfc2046.txt
[29] http://www.ietf.org/rfc/rfc2047.txt
[30] http://www.ietf.org/rfc/rfc2048.txt
[31] http://www.ietf.org/rfc/rfc2049.txt
[32] http://www.ietf.org/rfc/rfc2068.txt
[33] http://www.ietf.org/rfc/rfc2109.txt
[34] http://www.ietf.org/rfc/rfc2133.txt
[35] http://www.ietf.org/rfc/rfc2183.txt
[36] http://www.ietf.org/rfc/rfc2184.txt
[37] http://www.ietf.org/rfc/rfc2228.txt
[38] http://www.ietf.org/rfc/rfc2229.txt
[39] http://www.ietf.org/rfc/rfc2231.txt
[40] http://www.ietf.org/rfc/rfc2246.txt
[41] http://www.ietf.org/rfc/rfc2255.txt
[41] http://www.ietf.org/rfc/rfc2326.txt
[42] http://www.ietf.org/rfc/rfc2373.txt
[43] http://www.ietf.org/rfc/rfc2388.txt
[44] http://www.ietf.org/rfc/rfc2389.txt
[45] http://www.ietf.org/rfc/rfc2396.txt
[46] http://www.ietf.org/rfc/rfc2428.txt
[47] http://www.ietf.org/rfc/rfc2459.txt
[48] http://www.ietf.org/rfc/rfc2518.txt
[49] http://www.ietf.org/rfc/rfc2553.txt
[50] http://www.ietf.org/rfc/rfc2577.txt
[51] http://www.ietf.org/rfc/rfc2616.txt
[52] http://www.ietf.org/rfc/rfc2617.txt
[53] http://www.ietf.org/rfc/rfc2640.txt
[54] http://www.ietf.org/rfc/rfc2718.txt
[55] http://www.ietf.org/rfc/rfc2732.txt
[56] http://www.ietf.org/rfc/rfc2817.txt
[57] http://www.ietf.org/rfc/rfc2818.txt
[58] http://www.ietf.org/rfc/rfc2854.txt
[59] http://www.ietf.org/rfc/rfc2936.txt
[60] http://www.ietf.org/rfc/rfc2964.txt
[61] http://www.ietf.org/rfc/rfc2965.txt
[62] http://www.ietf.org/rfc/rfc3280.txt
[63] http://www.ietf.org/rfc/rfc3493.txt
[64] http://www.ietf.org/rfc/rfc3513.txt
[65] http://www.ietf.org/rfc/rfc3617.txt
[66] http://www.ietf.org/rfc/rfc3986.txt
[67] http://www.ietf.org/rfc/rfc4217.txt
[68] http://www.ietf.org/rfc/rfc4248.txt
[69] http://www.ietf.org/rfc/rfc4346.txt
[70] http://www.ietf.org/rfc/rfc4366.txt
[71] http://curl.haxx.se/rfc/cookie_spec.html
[72] http://curl.haxx.se/rfc/draft-brezak-spnego-http-04.txt
[73] http://curl.haxx.se/rfc/draft-ietf-secsh-scp-sftp-ssh-uri-04.txt
[74]
http://curl.haxx.se/rfc/draft-luotonen-web-proxy-tunneling-01.txt
[75] http://curl.haxx.se/rfc/ntlm.html
[76] http://tools.ietf.org/html/rfc1630
[77] http://www.ietf.org/rfc/rfc1737.txt
--
Stefan Teleman
Sun Microsystems, Inc.
Stefan.Teleman at Sun.COM