1.\"- 2.\" Copyright (c) 1998-2004 Dag-Erling Co�dan Sm�rgrav 3.\" All rights reserved. 4.\" 5.\" Redistribution and use in source and binary forms, with or without 6.\" modification, are permitted provided that the following conditions 7.\" are met: 8.\" 1. Redistributions of source code must retain the above copyright 9.\" notice, this list of conditions and the following disclaimer. 10.\" 2. Redistributions in binary form must reproduce the above copyright 11.\" notice, this list of conditions and the following disclaimer in the 12.\" documentation and/or other materials provided with the distribution. 13.\" 14.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24.\" SUCH DAMAGE. 25.\" 26.\" $FreeBSD$ 27.\" 28.Dd December 14, 2008 29.Dt FETCH 3 30.Os 31.Sh NAME 32.Nm fetchMakeURL , 33.Nm fetchParseURL , 34.Nm fetchFreeURL , 35.Nm fetchXGetURL , 36.Nm fetchGetURL , 37.Nm fetchPutURL , 38.Nm fetchStatURL , 39.Nm fetchListURL , 40.Nm fetchXGet , 41.Nm fetchGet , 42.Nm fetchPut , 43.Nm fetchStat , 44.Nm fetchList , 45.Nm fetchXGetFile , 46.Nm fetchGetFile , 47.Nm fetchPutFile , 48.Nm fetchStatFile , 49.Nm fetchListFile , 50.Nm fetchXGetHTTP , 51.Nm fetchGetHTTP , 52.Nm fetchPutHTTP , 53.Nm fetchStatHTTP , 54.Nm fetchListHTTP , 55.Nm fetchXGetFTP , 56.Nm fetchGetFTP , 57.Nm fetchPutFTP , 58.Nm fetchStatFTP , 59.Nm fetchListFTP 60.Nd file transfer functions 61.Sh LIBRARY 62.Lb libfetch 63.Sh SYNOPSIS 64.In sys/param.h 65.In stdio.h 66.In fetch.h 67.Ft struct url * 68.Fn fetchMakeURL "const char *scheme" "const char *host" "int port" "const char *doc" "const char *user" "const char *pwd" 69.Ft struct url * 70.Fn fetchParseURL "const char *URL" 71.Ft void 72.Fn fetchFreeURL "struct url *u" 73.Ft FILE * 74.Fn fetchXGetURL "const char *URL" "struct url_stat *us" "const char *flags" 75.Ft FILE * 76.Fn fetchGetURL "const char *URL" "const char *flags" 77.Ft FILE * 78.Fn fetchPutURL "const char *URL" "const char *flags" 79.Ft int 80.Fn fetchStatURL "const char *URL" "struct url_stat *us" "const char *flags" 81.Ft struct url_ent * 82.Fn fetchListURL "const char *URL" "const char *flags" 83.Ft FILE * 84.Fn fetchXGet "struct url *u" "struct url_stat *us" "const char *flags" 85.Ft FILE * 86.Fn fetchGet "struct url *u" "const char *flags" 87.Ft FILE * 88.Fn fetchPut "struct url *u" "const char *flags" 89.Ft int 90.Fn fetchStat "struct url *u" "struct url_stat *us" "const char *flags" 91.Ft struct url_ent * 92.Fn fetchList "struct url *u" "const char *flags" 93.Ft FILE * 94.Fn fetchXGetFile "struct url *u" "struct url_stat *us" "const char *flags" 95.Ft FILE * 96.Fn fetchGetFile "struct url *u" "const char *flags" 97.Ft FILE * 98.Fn fetchPutFile "struct url *u" "const char *flags" 99.Ft int 100.Fn fetchStatFile "struct url *u" "struct url_stat *us" "const char *flags" 101.Ft struct url_ent * 102.Fn fetchListFile "struct url *u" "const char *flags" 103.Ft FILE * 104.Fn fetchXGetHTTP "struct url *u" "struct url_stat *us" "const char *flags" 105.Ft FILE * 106.Fn fetchGetHTTP "struct url *u" "const char *flags" 107.Ft FILE * 108.Fn fetchPutHTTP "struct url *u" "const char *flags" 109.Ft int 110.Fn fetchStatHTTP "struct url *u" "struct url_stat *us" "const char *flags" 111.Ft struct url_ent * 112.Fn fetchListHTTP "struct url *u" "const char *flags" 113.Ft FILE * 114.Fn fetchXGetFTP "struct url *u" "struct url_stat *us" "const char *flags" 115.Ft FILE * 116.Fn fetchGetFTP "struct url *u" "const char *flags" 117.Ft FILE * 118.Fn fetchPutFTP "struct url *u" "const char *flags" 119.Ft int 120.Fn fetchStatFTP "struct url *u" "struct url_stat *us" "const char *flags" 121.Ft struct url_ent * 122.Fn fetchListFTP "struct url *u" "const char *flags" 123.Sh DESCRIPTION 124These functions implement a high-level library for retrieving and 125uploading files using Uniform Resource Locators (URLs). 126.Pp 127.Fn fetchParseURL 128takes a URL in the form of a null-terminated string and splits it into 129its components function according to the Common Internet Scheme Syntax 130detailed in RFC1738. 131A regular expression which produces this syntax is: 132.Bd -literal 133 <scheme>:(//(<user>(:<pwd>)?@)?<host>(:<port>)?)?/(<document>)? 134.Ed 135.Pp 136If the URL does not seem to begin with a scheme name, the following 137syntax is assumed: 138.Bd -literal 139 ((<user>(:<pwd>)?@)?<host>(:<port>)?)?/(<document>)? 140.Ed 141.Pp 142Note that some components of the URL are not necessarily relevant to 143all URL schemes. 144For instance, the file scheme only needs the <scheme> and <document> 145components. 146.Pp 147.Fn fetchMakeURL 148and 149.Fn fetchParseURL 150return a pointer to a 151.Vt url 152structure, which is defined as follows in 153.In fetch.h : 154.Bd -literal 155#define URL_SCHEMELEN 16 156#define URL_USERLEN 256 157#define URL_PWDLEN 256 158 159struct url { 160 char scheme[URL_SCHEMELEN+1]; 161 char user[URL_USERLEN+1]; 162 char pwd[URL_PWDLEN+1]; 163 char host[MAXHOSTNAMELEN+1]; 164 int port; 165 char *doc; 166 off_t offset; 167 size_t length; 168 time_t ims_time; 169}; 170.Ed 171.Pp 172The 173.Va ims_time 174field stores the time value for 175.Li If-Modified-Since 176HTTP requests. 177.Pp 178The pointer returned by 179.Fn fetchMakeURL 180or 181.Fn fetchParseURL 182should be freed using 183.Fn fetchFreeURL . 184.Pp 185.Fn fetchXGetURL , 186.Fn fetchGetURL , 187and 188.Fn fetchPutURL 189constitute the recommended interface to the 190.Nm fetch 191library. 192They examine the URL passed to them to determine the transfer 193method, and call the appropriate lower-level functions to perform the 194actual transfer. 195.Fn fetchXGetURL 196also returns the remote document's metadata in the 197.Vt url_stat 198structure pointed to by the 199.Fa us 200argument. 201.Pp 202The 203.Fa flags 204argument is a string of characters which specify transfer options. 205The 206meaning of the individual flags is scheme-dependent, and is detailed 207in the appropriate section below. 208.Pp 209.Fn fetchStatURL 210attempts to obtain the requested document's metadata and fill in the 211structure pointed to by its second argument. 212The 213.Vt url_stat 214structure is defined as follows in 215.In fetch.h : 216.Bd -literal 217struct url_stat { 218 off_t size; 219 time_t atime; 220 time_t mtime; 221}; 222.Ed 223.Pp 224If the size could not be obtained from the server, the 225.Fa size 226field is set to -1. 227If the modification time could not be obtained from the server, the 228.Fa mtime 229field is set to the epoch. 230If the access time could not be obtained from the server, the 231.Fa atime 232field is set to the modification time. 233.Pp 234.Fn fetchListURL 235attempts to list the contents of the directory pointed to by the URL 236provided. 237If successful, it returns a malloced array of 238.Vt url_ent 239structures. 240The 241.Vt url_ent 242structure is defined as follows in 243.In fetch.h : 244.Bd -literal 245struct url_ent { 246 char name[PATH_MAX]; 247 struct url_stat stat; 248}; 249.Ed 250.Pp 251The list is terminated by an entry with an empty name. 252.Pp 253The pointer returned by 254.Fn fetchListURL 255should be freed using 256.Fn free . 257.Pp 258.Fn fetchXGet , 259.Fn fetchGet , 260.Fn fetchPut 261and 262.Fn fetchStat 263are similar to 264.Fn fetchXGetURL , 265.Fn fetchGetURL , 266.Fn fetchPutURL 267and 268.Fn fetchStatURL , 269except that they expect a pre-parsed URL in the form of a pointer to 270a 271.Vt struct url 272rather than a string. 273.Pp 274All of the 275.Fn fetchXGetXXX , 276.Fn fetchGetXXX 277and 278.Fn fetchPutXXX 279functions return a pointer to a stream which can be used to read or 280write data from or to the requested document, respectively. 281Note that 282although the implementation details of the individual access methods 283vary, it can generally be assumed that a stream returned by one of the 284.Fn fetchXGetXXX 285or 286.Fn fetchGetXXX 287functions is read-only, and that a stream returned by one of the 288.Fn fetchPutXXX 289functions is write-only. 290.Sh FILE SCHEME 291.Fn fetchXGetFile , 292.Fn fetchGetFile 293and 294.Fn fetchPutFile 295provide access to documents which are files in a locally mounted file 296system. 297Only the <document> component of the URL is used. 298.Pp 299.Fn fetchXGetFile 300and 301.Fn fetchGetFile 302do not accept any flags. 303.Pp 304.Fn fetchPutFile 305accepts the 306.Ql a 307(append to file) flag. 308If that flag is specified, the data written to 309the stream returned by 310.Fn fetchPutFile 311will be appended to the previous contents of the file, instead of 312replacing them. 313.Sh FTP SCHEME 314.Fn fetchXGetFTP , 315.Fn fetchGetFTP 316and 317.Fn fetchPutFTP 318implement the FTP protocol as described in RFC959. 319.Pp 320If the 321.Ql p 322(passive) flag is specified, a passive (rather than active) connection 323will be attempted. 324.Pp 325If the 326.Ql l 327(low) flag is specified, data sockets will be allocated in the low (or 328default) port range instead of the high port range (see 329.Xr ip 4 ) . 330.Pp 331If the 332.Ql d 333(direct) flag is specified, 334.Fn fetchXGetFTP , 335.Fn fetchGetFTP 336and 337.Fn fetchPutFTP 338will use a direct connection even if a proxy server is defined. 339.Pp 340If no user name or password is given, the 341.Nm fetch 342library will attempt an anonymous login, with user name "anonymous" 343and password "anonymous@<hostname>". 344.Sh HTTP SCHEME 345The 346.Fn fetchXGetHTTP , 347.Fn fetchGetHTTP 348and 349.Fn fetchPutHTTP 350functions implement the HTTP/1.1 protocol. 351With a little luck, there is 352even a chance that they comply with RFC2616 and RFC2617. 353.Pp 354If the 355.Ql d 356(direct) flag is specified, 357.Fn fetchXGetHTTP , 358.Fn fetchGetHTTP 359and 360.Fn fetchPutHTTP 361will use a direct connection even if a proxy server is defined. 362.Pp 363If the 364.Ql i 365(if-modified-since) flag is specified, and 366the 367.Va ims_time 368field is set in 369.Vt "struct url" , 370then 371.Fn fetchXGetHTTP 372and 373.Fn fetchGetHTTP 374will send a conditional 375.Li If-Modified-Since 376HTTP header to only fetch the content if it is newer than 377.Va ims_time . 378.Pp 379Since there seems to be no good way of implementing the HTTP PUT 380method in a manner consistent with the rest of the 381.Nm fetch 382library, 383.Fn fetchPutHTTP 384is currently unimplemented. 385.Sh AUTHENTICATION 386Apart from setting the appropriate environment variables and 387specifying the user name and password in the URL or the 388.Vt struct url , 389the calling program has the option of defining an authentication 390function with the following prototype: 391.Pp 392.Ft int 393.Fn myAuthMethod "struct url *u" 394.Pp 395The callback function should fill in the 396.Fa user 397and 398.Fa pwd 399fields in the provided 400.Vt struct url 401and return 0 on success, or any other value to indicate failure. 402.Pp 403To register the authentication callback, simply set 404.Va fetchAuthMethod 405to point at it. 406The callback will be used whenever a site requires authentication and 407the appropriate environment variables are not set. 408.Pp 409This interface is experimental and may be subject to change. 410.Sh RETURN VALUES 411.Fn fetchParseURL 412returns a pointer to a 413.Vt struct url 414containing the individual components of the URL. 415If it is 416unable to allocate memory, or the URL is syntactically incorrect, 417.Fn fetchParseURL 418returns a NULL pointer. 419.Pp 420The 421.Fn fetchStat 422functions return 0 on success and -1 on failure. 423.Pp 424All other functions return a stream pointer which may be used to 425access the requested document, or NULL if an error occurred. 426.Pp 427The following error codes are defined in 428.In fetch.h : 429.Bl -tag -width 18n 430.It Bq Er FETCH_ABORT 431Operation aborted 432.It Bq Er FETCH_AUTH 433Authentication failed 434.It Bq Er FETCH_DOWN 435Service unavailable 436.It Bq Er FETCH_EXISTS 437File exists 438.It Bq Er FETCH_FULL 439File system full 440.It Bq Er FETCH_INFO 441Informational response 442.It Bq Er FETCH_MEMORY 443Insufficient memory 444.It Bq Er FETCH_MOVED 445File has moved 446.It Bq Er FETCH_NETWORK 447Network error 448.It Bq Er FETCH_OK 449No error 450.It Bq Er FETCH_PROTO 451Protocol error 452.It Bq Er FETCH_RESOLV 453Resolver error 454.It Bq Er FETCH_SERVER 455Server error 456.It Bq Er FETCH_TEMP 457Temporary error 458.It Bq Er FETCH_TIMEOUT 459Operation timed out 460.It Bq Er FETCH_UNAVAIL 461File is not available 462.It Bq Er FETCH_UNKNOWN 463Unknown error 464.It Bq Er FETCH_URL 465Invalid URL 466.El 467.Pp 468The accompanying error message includes a protocol-specific error code 469and message, e.g.\& "File is not available (404 Not Found)" 470.Sh ENVIRONMENT 471.Bl -tag -width ".Ev FETCH_BIND_ADDRESS" 472.It Ev FETCH_BIND_ADDRESS 473Specifies a hostname or IP address to which sockets used for outgoing 474connections will be bound. 475.It Ev FTP_LOGIN 476Default FTP login if none was provided in the URL. 477.It Ev FTP_PASSIVE_MODE 478If set to anything but 479.Ql no , 480forces the FTP code to use passive mode. 481.It Ev FTP_PASSWORD 482Default FTP password if the remote server requests one and none was 483provided in the URL. 484.It Ev FTP_PROXY 485URL of the proxy to use for FTP requests. 486The document part is ignored. 487FTP and HTTP proxies are supported; if no scheme is specified, FTP is 488assumed. 489If the proxy is an FTP proxy, 490.Nm libfetch 491will send 492.Ql user@host 493as user name to the proxy, where 494.Ql user 495is the real user name, and 496.Ql host 497is the name of the FTP server. 498.Pp 499If this variable is set to an empty string, no proxy will be used for 500FTP requests, even if the 501.Ev HTTP_PROXY 502variable is set. 503.It Ev ftp_proxy 504Same as 505.Ev FTP_PROXY , 506for compatibility. 507.It Ev HTTP_AUTH 508Specifies HTTP authorization parameters as a colon-separated list of 509items. 510The first and second item are the authorization scheme and realm 511respectively; further items are scheme-dependent. 512Currently, only basic authorization is supported. 513.Pp 514Basic authorization requires two parameters: the user name and 515password, in that order. 516.Pp 517This variable is only used if the server requires authorization and 518no user name or password was specified in the URL. 519.It Ev HTTP_PROXY 520URL of the proxy to use for HTTP requests. 521The document part is ignored. 522Only HTTP proxies are supported for HTTP requests. 523If no port number is specified, the default is 3128. 524.Pp 525Note that this proxy will also be used for FTP documents, unless the 526.Ev FTP_PROXY 527variable is set. 528.It Ev http_proxy 529Same as 530.Ev HTTP_PROXY , 531for compatibility. 532.It Ev HTTP_PROXY_AUTH 533Specifies authorization parameters for the HTTP proxy in the same 534format as the 535.Ev HTTP_AUTH 536variable. 537.Pp 538This variable is used if and only if connected to an HTTP proxy, and 539is ignored if a user and/or a password were specified in the proxy 540URL. 541.It Ev HTTP_REFERER 542Specifies the referrer URL to use for HTTP requests. 543If set to 544.Dq auto , 545the document URL will be used as referrer URL. 546.It Ev HTTP_USER_AGENT 547Specifies the User-Agent string to use for HTTP requests. 548This can be useful when working with HTTP origin or proxy servers that 549differentiate between user agents. 550.It Ev NETRC 551Specifies a file to use instead of 552.Pa ~/.netrc 553to look up login names and passwords for FTP sites. 554See 555.Xr ftp 1 556for a description of the file format. 557This feature is experimental. 558.It Ev NO_PROXY 559Either a single asterisk, which disables the use of proxies 560altogether, or a comma- or whitespace-separated list of hosts for 561which proxies should not be used. 562.It Ev no_proxy 563Same as 564.Ev NO_PROXY , 565for compatibility. 566.El 567.Sh EXAMPLES 568To access a proxy server on 569.Pa proxy.example.com 570port 8080, set the 571.Ev HTTP_PROXY 572environment variable in a manner similar to this: 573.Pp 574.Dl HTTP_PROXY=http://proxy.example.com:8080 575.Pp 576If the proxy server requires authentication, there are 577two options available for passing the authentication data. 578The first method is by using the proxy URL: 579.Pp 580.Dl HTTP_PROXY=http://<user>:<pwd>@proxy.example.com:8080 581.Pp 582The second method is by using the 583.Ev HTTP_PROXY_AUTH 584environment variable: 585.Bd -literal -offset indent 586HTTP_PROXY=http://proxy.example.com:8080 587HTTP_PROXY_AUTH=basic:*:<user>:<pwd> 588.Ed 589.Pp 590To disable the use of a proxy for an HTTP server running on the local 591host, define 592.Ev NO_PROXY 593as follows: 594.Bd -literal -offset indent 595NO_PROXY=localhost,127.0.0.1 596.Ed 597.Sh SEE ALSO 598.Xr fetch 1 , 599.Xr ftpio 3 , 600.Xr ip 4 601.Rs 602.%A J. Postel 603.%A J. K. Reynolds 604.%D October 1985 605.%B File Transfer Protocol 606.%O RFC959 607.Re 608.Rs 609.%A P. Deutsch 610.%A A. Emtage 611.%A A. Marine. 612.%D May 1994 613.%T How to Use Anonymous FTP 614.%O RFC1635 615.Re 616.Rs 617.%A T. Berners-Lee 618.%A L. Masinter 619.%A M. McCahill 620.%D December 1994 621.%T Uniform Resource Locators (URL) 622.%O RFC1738 623.Re 624.Rs 625.%A R. Fielding 626.%A J. Gettys 627.%A J. Mogul 628.%A H. Frystyk 629.%A L. Masinter 630.%A P. Leach 631.%A T. Berners-Lee 632.%D January 1999 633.%B Hypertext Transfer Protocol -- HTTP/1.1 634.%O RFC2616 635.Re 636.Rs 637.%A J. Franks 638.%A P. Hallam-Baker 639.%A J. Hostetler 640.%A S. Lawrence 641.%A P. Leach 642.%A A. Luotonen 643.%A L. Stewart 644.%D June 1999 645.%B HTTP Authentication: Basic and Digest Access Authentication 646.%O RFC2617 647.Re 648.Sh HISTORY 649The 650.Nm fetch 651library first appeared in 652.Fx 3.0 . 653.Sh AUTHORS 654.An -nosplit 655The 656.Nm fetch 657library was mostly written by 658.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org 659with numerous suggestions from 660.An Jordan K. Hubbard Aq jkh@FreeBSD.org , 661.An Eugene Skepner Aq eu@qub.com 662and other 663.Fx 664developers. 665It replaces the older 666.Nm ftpio 667library written by 668.An Poul-Henning Kamp Aq phk@FreeBSD.org 669and 670.An Jordan K. Hubbard Aq jkh@FreeBSD.org . 671.Pp 672This manual page was written by 673.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org . 674.Sh BUGS 675Some parts of the library are not yet implemented. 676The most notable 677examples of this are 678.Fn fetchPutHTTP , 679.Fn fetchListHTTP , 680.Fn fetchListFTP 681and FTP proxy support. 682.Pp 683There is no way to select a proxy at run-time other than setting the 684.Ev HTTP_PROXY 685or 686.Ev FTP_PROXY 687environment variables as appropriate. 688.Pp 689.Nm libfetch 690does not understand or obey 305 (Use Proxy) replies. 691.Pp 692Error numbers are unique only within a certain context; the error 693codes used for FTP and HTTP overlap, as do those used for resolver and 694system errors. 695For instance, error code 202 means "Command not 696implemented, superfluous at this site" in an FTP context and 697"Accepted" in an HTTP context. 698.Pp 699.Fn fetchStatFTP 700does not check that the result of an MDTM command is a valid date. 701.Pp 702The man page is incomplete, poorly written and produces badly 703formatted text. 704.Pp 705The error reporting mechanism is unsatisfactory. 706.Pp 707Some parts of the code are not fully reentrant. 708