1*914f0ba5Schristos /* $NetBSD: common.h,v 1.3 2024/02/02 22:19:05 christos Exp $ */ 2fe618babSjoerg /*- 3fe618babSjoerg * Copyright (c) 1998-2004 Dag-Erling Co�dan Sm�rgrav 4fe618babSjoerg * All rights reserved. 5fe618babSjoerg * 6fe618babSjoerg * Redistribution and use in source and binary forms, with or without 7fe618babSjoerg * modification, are permitted provided that the following conditions 8fe618babSjoerg * are met: 9fe618babSjoerg * 1. Redistributions of source code must retain the above copyright 10fe618babSjoerg * notice, this list of conditions and the following disclaimer 11fe618babSjoerg * in this position and unchanged. 12fe618babSjoerg * 2. Redistributions in binary form must reproduce the above copyright 13fe618babSjoerg * notice, this list of conditions and the following disclaimer in the 14fe618babSjoerg * documentation and/or other materials provided with the distribution. 15fe618babSjoerg * 3. The name of the author may not be used to endorse or promote products 16fe618babSjoerg * derived from this software without specific prior written permission 17fe618babSjoerg * 18fe618babSjoerg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19fe618babSjoerg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20fe618babSjoerg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21fe618babSjoerg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22fe618babSjoerg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23fe618babSjoerg * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24fe618babSjoerg * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25fe618babSjoerg * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26fe618babSjoerg * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27fe618babSjoerg * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28fe618babSjoerg * 29fe618babSjoerg * $FreeBSD: common.h,v 1.30 2007/12/18 11:03:07 des Exp $ 30fe618babSjoerg */ 31fe618babSjoerg 32fe618babSjoerg #ifndef _COMMON_H_INCLUDED 33fe618babSjoerg #define _COMMON_H_INCLUDED 34fe618babSjoerg 35fe618babSjoerg #define FTP_DEFAULT_PORT 21 36fe618babSjoerg #define HTTP_DEFAULT_PORT 80 37fe618babSjoerg #define FTP_DEFAULT_PROXY_PORT 21 38fe618babSjoerg #define HTTP_DEFAULT_PROXY_PORT 3128 39fe618babSjoerg 40fe618babSjoerg #ifdef WITH_SSL 41fe618babSjoerg #include <openssl/crypto.h> 42fe618babSjoerg #include <openssl/x509.h> 43fe618babSjoerg #include <openssl/pem.h> 44fe618babSjoerg #include <openssl/ssl.h> 45fe618babSjoerg #include <openssl/err.h> 46fe618babSjoerg #endif 47fe618babSjoerg 48*914f0ba5Schristos #if defined(__GNUC__) && __GNUC__ >= 3 49*914f0ba5Schristos #define LIBFETCH_PRINTFLIKE(fmtarg, firstvararg) \ 50*914f0ba5Schristos __attribute__((__format__ (__printf__, fmtarg, firstvararg))) 51*914f0ba5Schristos #else 52*914f0ba5Schristos #define LIBFETCH_PRINTFLIKE(fmtarg, firstvararg) 53*914f0ba5Schristos #endif 54*914f0ba5Schristos 55fe618babSjoerg #if !defined(__sun) && !defined(__hpux) && !defined(__INTERIX) && \ 567bacb5afSjoerg !defined(__digital__) && !defined(__linux) && !defined(__MINT__) && \ 57*914f0ba5Schristos !defined(__sgi) && !defined(__minix) && !defined(__CYGWIN__) 58fe618babSjoerg #define HAVE_SA_LEN 59fe618babSjoerg #endif 60fe618babSjoerg 61fe618babSjoerg /* Connection */ 62fe618babSjoerg typedef struct fetchconn conn_t; 6370160d70Sjoerg 64fe618babSjoerg struct fetchconn { 65fe618babSjoerg int sd; /* socket descriptor */ 66fe618babSjoerg char *buf; /* buffer */ 67fe618babSjoerg size_t bufsize; /* buffer size */ 68fe618babSjoerg size_t buflen; /* length of buffer contents */ 69*914f0ba5Schristos int buf_events; /* poll flags for the next cycle */ 70f298aa92Sjoerg char *next_buf; /* pending buffer, e.g. after getln */ 71f298aa92Sjoerg size_t next_len; /* size of pending buffer */ 72fe618babSjoerg int err; /* last protocol reply code */ 73fe618babSjoerg #ifdef WITH_SSL 74fe618babSjoerg SSL *ssl; /* SSL handle */ 75fe618babSjoerg SSL_CTX *ssl_ctx; /* SSL context */ 76fe618babSjoerg X509 *ssl_cert; /* server certificate */ 77fe618babSjoerg # if OPENSSL_VERSION_NUMBER < 0x00909000L 78fe618babSjoerg SSL_METHOD *ssl_meth; /* SSL method */ 79fe618babSjoerg # else 80fe618babSjoerg const SSL_METHOD *ssl_meth; /* SSL method */ 81fe618babSjoerg # endif 82fe618babSjoerg #endif 8370160d70Sjoerg 840ab1cb6dSjoerg char *ftp_home; 850ab1cb6dSjoerg 8670160d70Sjoerg struct url *cache_url; 8770160d70Sjoerg int cache_af; 8870160d70Sjoerg int (*cache_close)(conn_t *); 8970160d70Sjoerg conn_t *next_cached; 90fe618babSjoerg }; 91fe618babSjoerg 92fe618babSjoerg /* Structure used for error message lists */ 93fe618babSjoerg struct fetcherr { 94fe618babSjoerg const int num; 95fe618babSjoerg const int cat; 96fe618babSjoerg const char *string; 97fe618babSjoerg }; 98fe618babSjoerg 99fe618babSjoerg void fetch_seterr(struct fetcherr *, int); 100fe618babSjoerg void fetch_syserr(void); 101*914f0ba5Schristos void fetch_info(const char *, ...) LIBFETCH_PRINTFLIKE(1, 2); 102fe618babSjoerg int fetch_default_port(const char *); 103fe618babSjoerg int fetch_default_proxy_port(const char *); 104fe618babSjoerg int fetch_bind(int, int, const char *); 10570160d70Sjoerg conn_t *fetch_cache_get(const struct url *, int); 10670160d70Sjoerg void fetch_cache_put(conn_t *, int (*)(conn_t *)); 10770160d70Sjoerg conn_t *fetch_connect(struct url *, int, int); 108fe618babSjoerg conn_t *fetch_reopen(int); 109*914f0ba5Schristos int fetch_ssl(conn_t *, const struct url *, int); 110fe618babSjoerg ssize_t fetch_read(conn_t *, char *, size_t); 111fe618babSjoerg int fetch_getln(conn_t *); 11270160d70Sjoerg ssize_t fetch_write(conn_t *, const void *, size_t); 113fe618babSjoerg int fetch_close(conn_t *); 114fe618babSjoerg int fetch_add_entry(struct url_list *, struct url *, const char *, int); 115fe618babSjoerg int fetch_netrc_auth(struct url *url); 116fe618babSjoerg int fetch_no_proxy_match(const char *); 117fe618babSjoerg int fetch_urlpath_safe(char); 118fe618babSjoerg 119fe618babSjoerg #define ftp_seterr(n) fetch_seterr(ftp_errlist, n) 120fe618babSjoerg #define http_seterr(n) fetch_seterr(http_errlist, n) 121fe618babSjoerg #define netdb_seterr(n) fetch_seterr(netdb_errlist, n) 122fe618babSjoerg #define url_seterr(n) fetch_seterr(url_errlist, n) 123fe618babSjoerg 124fe618babSjoerg fetchIO *fetchIO_unopen(void *, ssize_t (*)(void *, void *, size_t), 125fe618babSjoerg ssize_t (*)(void *, const void *, size_t), void (*)(void *)); 126fe618babSjoerg 127fe618babSjoerg /* 128fe618babSjoerg * I don't really like exporting http_request() and ftp_request(), 129fe618babSjoerg * but the HTTP and FTP code occasionally needs to cross-call 130fe618babSjoerg * eachother, and this saves me from adding a lot of special-case code 131fe618babSjoerg * to handle those cases. 132fe618babSjoerg * 133fe618babSjoerg * Note that _*_request() free purl, which is way ugly but saves us a 134fe618babSjoerg * whole lot of trouble. 135fe618babSjoerg */ 136fe618babSjoerg fetchIO *http_request(struct url *, const char *, 137fe618babSjoerg struct url_stat *, struct url *, const char *); 138fe618babSjoerg fetchIO *ftp_request(struct url *, const char *, const char *, 139fe618babSjoerg struct url_stat *, struct url *, const char *); 140fe618babSjoerg 141fe618babSjoerg 142fe618babSjoerg /* 143fe618babSjoerg * Check whether a particular flag is set 144fe618babSjoerg */ 145fe618babSjoerg #define CHECK_FLAG(x) (flags && strchr(flags, (x))) 146fe618babSjoerg 147fe618babSjoerg #endif 148