1.\" Copyright (c) 1998 Dag-Erling Co�dan Sm�rgrav 2.\" All rights reserved. 3.\" 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, are permitted provided that the following conditions 6.\" are met: 7.\" 1. Redistributions of source code must retain the above copyright 8.\" notice, this list of conditions and the following disclaimer. 9.\" 2. Redistributions in binary form must reproduce the above copyright 10.\" notice, this list of conditions and the following disclaimer in the 11.\" documentation and/or other materials provided with the distribution. 12.\" 13.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23.\" SUCH DAMAGE. 24.\" 25.\" $FreeBSD$ 26.\" 27.Dd July 1, 1998 28.Dt FETCH 3 29.Os 30.Sh NAME 31.Nm fetchMakeURL , 32.Nm fetchParseURL , 33.Nm fetchFreeURL , 34.Nm fetchXGetURL , 35.Nm fetchGetURL , 36.Nm fetchPutURL , 37.Nm fetchStatURL , 38.Nm fetchListURL , 39.Nm fetchXGet , 40.Nm fetchGet , 41.Nm fetchPut , 42.Nm fetchStat , 43.Nm fetchList , 44.Nm fetchXGetFile , 45.Nm fetchGetFile , 46.Nm fetchPutFile , 47.Nm fetchStatFile , 48.Nm fetchListFile , 49.Nm fetchXGetHTTP , 50.Nm fetchGetHTTP , 51.Nm fetchPutHTTP , 52.Nm fetchStatHTTP , 53.Nm fetchListHTTP , 54.Nm fetchXGetFTP , 55.Nm fetchGetFTP , 56.Nm fetchPutFTP , 57.Nm fetchStatFTP , 58.Nm fetchListFTP 59.Nd file transfer functions 60.Sh LIBRARY 61.Lb libfetch 62.Sh SYNOPSIS 63.Fd #include <sys/param.h> 64.Fd #include <stdio.h> 65.Fd #include <fetch.h> 66.Ft struct url * 67.Fn fetchMakeURL "char *scheme" "char *host" "int port" "char *doc" "char *user" "char *pwd" 68.Ft struct url * 69.Fn fetchParseURL "char *URL" 70.Ft void 71.Fn fetchFreeURL "struct url *URL" 72.Ft FILE * 73.Fn fetchXGetURL "char *URL" "struct url_stat *us" "char *flags" 74.Ft FILE * 75.Fn fetchGetURL "char *URL" "char *flags" 76.Ft FILE * 77.Fn fetchPutURL "char *URL" "char *flags" 78.Ft int 79.Fn fetchStatURL "char *URL" "struct url_stat *us" "char *flags" 80.Ft struct url_ent * 81.Fn fetchListURL "char *URL" "char *flags" 82.Ft FILE * 83.Fn fetchXGet "struct url *URL" "struct url_stat *us" "char *flags" 84.Ft FILE * 85.Fn fetchGet "struct url *URL" "char *flags" 86.Ft FILE * 87.Fn fetchPut "struct url *URL" "char *flags" 88.Ft int 89.Fn fetchStat "struct url *URL" "struct url_stat *us" "char *flags" 90.Ft struct url_ent * 91.Fn fetchList "struct url *" "char *flags" 92.Ft FILE * 93.Fn fetchXGetFile "struct url *u" "struct url_stat *us" "char *flags" 94.Ft FILE * 95.Fn fetchGetFile "struct url *u" "char *flags" 96.Ft FILE * 97.Fn fetchPutFile "struct url *u" "char *flags" 98.Ft int 99.Fn fetchStatFile "struct url *URL" "struct url_stat *us" "char *flags" 100.Ft struct url_ent * 101.Fn fetchListFile "struct url *" "char *flags" 102.Ft FILE * 103.Fn fetchXGetHTTP "struct url *u" "struct url_stat *us" "char *flags" 104.Ft FILE * 105.Fn fetchGetHTTP "struct url *u" "char *flags" 106.Ft FILE * 107.Fn fetchPutHTTP "struct url *u" "char *flags" 108.Ft int 109.Fn fetchStatHTTP "struct url *URL" "struct url_stat *us" "char *flags" 110.Ft struct url_ent * 111.Fn fetchListHTTP "struct url *" "char *flags" 112.Ft FILE * 113.Fn fetchXGetFTP "struct url *u" "struct url_stat *us" "char *flags" 114.Ft FILE * 115.Fn fetchGetFTP "struct url *u" "char *flags" 116.Ft FILE * 117.Fn fetchPutFTP "struct url *u" "char *flags" 118.Ft int 119.Fn fetchStatFTP "struct url *URL" "struct url_stat *us" "char *flags" 120.Ft struct url_ent * 121.Fn fetchListFTP "struct url *" "char *flags" 122.Sh DESCRIPTION 123.Pp 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 136Note that some components of the URL are not necessarily relevant to 137all URL schemes. 138For instance, the file scheme only needs the <scheme> 139and <document> components. 140.Pp 141.Fn fetchMakeURL 142and 143.Fn fetchParseURL 144return a pointer to a 145.Fa url 146structure, which is defined as follows in 147.Aq Pa fetch.h : 148.Bd -literal 149#define URL_SCHEMELEN 16 150#define URL_USERLEN 256 151#define URL_PWDLEN 256 152 153struct url { 154 char scheme[URL_SCHEMELEN+1]; 155 char user[URL_USERLEN+1]; 156 char pwd[URL_PWDLEN+1]; 157 char host[MAXHOSTNAMELEN+1]; 158 int port; 159 char *doc; 160 off_t offset; 161 size_t length; 162}; 163.Ed 164.Pp 165The pointer returned by 166.Fn fetchMakeURL 167or 168.Fn fetchParseURL 169should be freed using 170.Fn fetchFreeURL . 171.Pp 172.Fn fetchXGetURL , 173.Fn fetchGetURL , 174and 175.Fn fetchPutURL 176constitute the recommended interface to the 177.Nm fetch 178library. 179They examine the URL passed to them to determine the transfer 180method, and call the appropriate lower-level functions to perform the 181actual transfer. 182.Fn fetchXGetURL 183also returns the remote document's metadata in the 184.Fa url_stat 185structure pointed to by the 186.Fa us 187argument. 188.Pp 189The 190.Fa flags 191argument is a string of characters which specify transfer options. 192The 193meaning of the individual flags is scheme-dependent, and is detailed 194in the appropriate section below. 195.Pp 196.Fn fetchStatURL 197attempts to obtain the requested document's metadata and fill in the 198structure pointed to by it's second argument. 199The 200.Fa url_stat 201structure is defined as follows in 202.Aq Pa fetch.h : 203.Bd -literal 204struct url_stat { 205 off_t size; 206 time_t atime; 207 time_t mtime; 208}; 209.Ed 210.Pp 211If the size could not be obtained from the server, the 212.Fa size 213field is set to -1. 214If the modification time could not be obtained from the server, the 215.Fa mtime 216field is set to the epoch. 217If the access time could not be obtained from the server, the 218.Fa atime 219field is set to the modification time. 220.Pp 221.Fn fetchListURL 222attempts to list the contents of the directory pointed to by the URL 223provided. 224If successful, it returns a malloced array of 225.Fa url_ent 226structures. 227The 228.Fa url_ent 229structure is defined as follows in 230.Aq Pa fetch.h : 231.Bd -literal 232struct url_ent { 233 char name[MAXPATHLEN]; 234 struct url_stat stat; 235}; 236.Ed 237.Pp 238The list is terminated by an entry with an empty name. 239.Pp 240The pointer returned by 241.Fn fetchListURL 242should be freed using 243.Fn free . 244.Pp 245.Fn fetchXGet , 246.Fn fetchGet , 247.Fn fetchPut 248and 249.Fn fetchStat 250are similar to 251.Fn fetchXGetURL , 252.Fn fetchGetURL , 253.Fn fetchPutURL 254and 255.Fn fetchStatURL , 256except that they expect a pre-parsed URL in the form of a pointer to 257a 258.Fa struct url 259rather than a string. 260.Pp 261All of the 262.Fn fetchXGetXXX , 263.Fn fetchGetXXX 264and 265.Fn fetchPutXXX 266functions return a pointer to a stream which can be used to read or 267write data from or to the requested document, respectively. 268Note that 269although the implementation details of the individual access methods 270vary, it can generally be assumed that a stream returned by one of the 271.Fn fetchXGetXXX 272or 273.Fn fetchGetXXX 274functions is read-only, and that a stream returned by one of the 275.Fn fetchPutXXX 276functions is write-only. 277.Sh FILE SCHEME 278.Fn fetchXGetFile , 279.Fn fetchGetFile 280and 281.Fn fetchPutFile 282provide access to documents which are files in a locally mounted file 283system. 284Only the <document> component of the URL is used. 285.Pp 286.Fn fetchXGetFile 287and 288.Fn fetchGetFile 289do not accept any flags. 290.Pp 291.Fn fetchPutFile 292accepts the 293.Fa a 294(append to file) flag. 295If that flag is specified, the data written to 296the stream returned by 297.Fn fetchPutFile 298will be appended to the previous contents of the file, instead of 299replacing them. 300.Sh FTP SCHEME 301.Fn fetchXGetFTP , 302.Fn fetchGetFTP 303and 304.Fn fetchPutFTP 305implement the FTP protocol as described in RFC959. 306.Pp 307If the 308.Fa p 309(passive) flag is specified, a passive (rather than active) connection 310will be attempted. 311.Pp 312If the 313.Fa h 314(high) flag is specified, data sockets will be allocated in the high 315port range (see 316.Xr ip 4 ). 317.Pp 318If the 319.Fa d 320(direct) flag is specified, 321.Fn fetchXGetFTP , 322.Fn fetchGetFTP 323and 324.Fn fetchPutFTP 325will use a direct connection even if a proxy server is defined. 326.Pp 327If no user name or password is given, the 328.Nm fetch 329library will attempt an anonymous login, with user name "ftp" and 330password "ftp". 331.Sh HTTP SCHEME 332The 333.Fn fetchXGetHTTP , 334.Fn fetchGetHTTP 335and 336.Fn fetchPutHTTP 337functions implement the HTTP/1.1 protocol. 338With a little luck, there's 339even a chance that they comply with RFC2068. 340.Pp 341If the 342.Fa d 343(direct) flag is specified, 344.Fn fetchXGetHTTP , 345.Fn fetchGetHTTP 346and 347.Fn fetchPutHTTP 348will use a direct connection even if a proxy server is defined. 349.Pp 350Since there seems to be no good way of implementing the HTTP PUT 351method in a manner consistent with the rest of the 352.Nm fetch 353library, 354.Fn fetchPutHTTP 355is currently unimplemented. 356.Sh RETURN VALUES 357.Fn fetchParseURL 358returns a pointer to a 359.Fa struct url 360containing the individual components of the URL. 361If it is 362unable to allocate memory, or the URL is syntactically incorrect, 363.Fn fetchParseURL 364returns a NULL pointer. 365.Pp 366The 367.Fn fetchStat 368functions return 0 on success and -1 on failure. 369.Pp 370All other functions return a stream pointer which may be used to 371access the requested document, or NULL if an error occurred. 372.Pp 373The following error codes are defined in 374.Aq Pa fetch.h : 375.Bl -tag -width 18n 376.It Bq Er FETCH_ABORT 377Operation aborted 378.It Bq Er FETCH_AUTH 379Authentication failed 380.It Bq Er FETCH_DOWN 381Service unavailable 382.It Bq Er FETCH_EXISTS 383File exists 384.It Bq Er FETCH_FULL 385File system full 386.It Bq Er FETCH_INFO 387Informational response 388.It Bq Er FETCH_MEMORY 389Insufficient memory 390.It Bq Er FETCH_MOVED 391File has moved 392.It Bq Er FETCH_NETWORK 393Network error 394.It Bq Er FETCH_OK 395No error 396.It Bq Er FETCH_PROTO 397Protocol error 398.It Bq Er FETCH_RESOLV 399Resolver error 400.It Bq Er FETCH_SERVER 401Server error 402.It Bq Er FETCH_TEMP 403Temporary error 404.It Bq Er FETCH_TIMEOUT 405Operation timed out 406.It Bq Er FETCH_UNAVAIL 407File is not available 408.It Bq Er FETCH_UNKNOWN 409Unknown error 410.It Bq Er FETCH_URL 411Invalid URL 412.El 413.Pp 414The accompanying error message includes a protocol-specific error code 415and message, e.g. "File is not available (404 Not Found)" 416.Sh ENVIRONMENT 417.Bl -tag -width HTTP_PROXY_AUTH 418.It Ev FTP_PROXY 419host name of the FTP proxy to use, optionally followed by a port 420number separated from the host name by a colon. 421.Nm libfetch 422will send 423.Ql user@host 424as user name to the proxy, where 425.Ql user 426is the real user name, and 427.Ql host 428is the name of the FTP server. 429.It Ev HTTP_AUTH 430Specifies HTTP authorization parameters, used only if the server 431requires authorization and no user name or password was specified in 432the URL. 433The first and second item are the authorization scheme and realm 434respectively; further items are scheme-dependent. 435Currently, only basic authorization is supported. 436Basic authorization requires two parameters: the user name and 437password, in that order. 438.It Ev HTTP_PROXY 439host name of the HTTP proxy to use, optionally followed by a port 440number separated from the host name by a colon. 441If no port number is specified, the default is 3128. 442Note that the HTTP proxy will also be used for FTP documents, unless 443the 444.Ev FTP_PROXY 445variable is set. 446.It Ev HTTP_PROXY_AUTH 447Specifies authorization parameters for the HTTP proxy in the same 448format as the 449.Ev HTTP_AUTH 450variable. 451The value of this variable is used if and only if connected to an HTTP 452proxy. 453.El 454.Sh SEE ALSO 455.Xr fetch 1 , 456.Xr ftpio 3 , 457.Xr ip 4 . 458.Rs 459.%A T. Berners-Lee 460.%A L. Masinter 461.%A M. McCahill 462.%D December 1994 463.%T Uniform Resource Locators (URL) 464.%O RFC1738 465.Re 466.Rs 467.%A R. Fielding 468.%A J. Gettys 469.%A J. Mogul 470.%A H. Frystyk 471.%A T. Berners-Lee 472.%D Januray 1997 473.%B Hypertext Transfer Protocol -- HTTP/1.1 474.%O RFC2068 475.Re 476.Rs 477.%A J. Postel 478.%A J. K. Reynolds 479.%D October 1985 480.%B File Transfer Protocol 481.%O RFC959 482.Re 483.Sh HISTORY 484The 485.Nm fetch 486library first appeared in 487.Fx 3.0 . 488.Sh AUTHORS 489The 490.Nm fetch 491library was mostly written by 492.An Dag-Erling Co�dan Sm�rgrav Aq des@FreeBSD.org 493with numerous suggestions from 494.An Jordan K. Hubbard Aq jkh@FreeBSD.org , 495.An Eugene Skepner Aq eu@qub.com 496and other FreeBSD developers. 497It replaces the older 498.Nm ftpio 499library written by 500.An Poul-Henning Kamp Aq pkh@FreeBSD.org 501and 502.An Jordan K. Hubbard Aq jkh@FreeBSD.org . 503.Pp 504This manual page was written by 505.An Dag-Erling Co�dan Sm�rgrav Aq des@FreeBSD.org 506.Sh BUGS 507Some parts of the library are not yet implemented. 508The most notable 509examples of this are 510.Fn fetchPutHTTP , 511.Fn fetchListHTTP , 512.Fn fetchListFTP 513and FTP proxy support. 514.Pp 515There's no way to select a proxy at run-time other than setting the 516.Ev HTTP_PROXY 517or 518.Ev FTP_PROXY 519environment variables as appropriate. 520.Pp 521.Nm libfetch 522does not attempt to interpret and respond to authentication requests 523from the HTTP server or proxy (code 401 and 407 respectively). 524.Pp 525.Nm libfetch 526does not understand or obey 305 (Use Proxy) replies. 527.Pp 528No attempt is made to encode spaces etc. within URLs. 529Spaces in the 530document part of an URLshould be replaced with "%20" in HTTP URLs and 531"\\ " in FTP URLs. 532.Pp 533Error numbers are unique only within a certain context; the error 534codes used for FTP and HTTP overlap, as do those used for resolver and 535system errors. 536For instance, error code 202 means "Command not 537implemented, superfluous at this site" in an FTP context and 538"Accepted" in an HTTP context. 539.Pp 540.Fn fetchStatFTP 541does not check that the result of an MDTM command is a valid date. 542.Pp 543The HTTP code needs a complete rewrite, or at least a serious cleanup. 544.Pp 545The man page is incomplete, poorly written and produces badly 546formatted text. 547.Pp 548The error reporting mechanism is unsatisfactory. 549.Pp 550Some parts of the code are not fully reentrant. 551.Pp 552Tons of other stuff. 553