Including CURL with Solaris Stefan Teleman 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/bin/64/curl /usr/bin/64/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/lib/64/libcurl.so.3.0.0 /usr/lib/64/libcurl.so.3 -> /usr/lib/libcurl.so.3.0.0 /usr/lib/64/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 STABILITY NOTES OpenSSL External/Volatile PSARC/2003/500 [2] Z-Lib Committed PSARC/2006/537 [3] LDAP [OpenLDAP] Evolving PSARC/1997/276 [4] Kerberos [MIT] External PSARC/1999/617 et seq. [5] LibIDN Uncommitted PSARC/2007/167 [6] GNU TLS Volatile LSARC/2006/202 [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/bin/64/curl Uncommitted Executable location /usr/bin/64/curl-config Uncommitted Shell script location /usr/lib/libcurl.so.3.0.0 Volatile Library location /usr/lib/libcurl.so.3 Uncommitted Symbolic link /usr/lib/libcurl.so Volatile Symbolic link /usr/lib/64/libcurl.so.3.0.0 Volatile Library location /usr/lib/64/libcurl.so.3 Uncommitted Symbolic link /usr/lib/64/libcurl.so Volatile 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