rpm/rpmio/rpmurl.h

197 lines
5.5 KiB
C

#ifndef H_RPMURL
#define H_RPMURL
/** \ingroup rpmio
* \file rpmio/rpmurl.h
*/
#include <assert.h>
/**
* Supported URL types.
*/
typedef enum urltype_e {
URL_IS_UNKNOWN = 0, /*!< unknown (aka a file) */
URL_IS_DASH = 1, /*!< stdin/stdout */
URL_IS_PATH = 2, /*!< file://... */
URL_IS_FTP = 3, /*!< ftp://... */
URL_IS_HTTP = 4, /*!< http://... */
URL_IS_HTTPS = 5, /*!< https://... */
URL_IS_HKP = 6 /*!< hkp://... */
} urltype;
#define URLMAGIC 0xd00b1ed0
#define URLSANE(u) assert(u && u->magic == URLMAGIC)
typedef /*@abstract@*/ /*@refcounted@*/ struct urlinfo_s * urlinfo;
/**
* URL control structure.
*/
struct urlinfo_s {
/*@refs@*/ int nrefs; /*!< no. of references */
/*@owned@*/ /*@relnull@*/
const char * url; /*!< copy of original url */
/*@owned@*/ /*@relnull@*/
const char * scheme; /*!< URI scheme. */
/*@owned@*/ /*@null@*/
const char * user; /*!< URI user. */
/*@owned@*/ /*@null@*/
const char * password; /*!< URI password. */
/*@owned@*/ /*@relnull@*/
const char * host; /*!< URI host. */
/*@owned@*/ /*@null@*/
const char * portstr; /*!< URI port string. */
/*@owned@*/ /*@null@*/
const char * proxyu; /*!< FTP: proxy user */
/*@owned@*/ /*@null@*/
const char * proxyh; /*!< FTP/HTTP: proxy host */
int proxyp; /*!< FTP/HTTP: proxy port */
int port; /*!< URI port. */
int urltype; /*!< URI type. */
FD_t ctrl; /*!< control channel */
FD_t data; /*!< per-xfer data channel */
/*@relnull@*/
void * capabilities; /*!< neon ne_server_capabilities ptr */
/*@relnull@*/
void * lockstore; /*!< neon ne_lock_store ptr */
/*@relnull@*/
void * sess; /*!< neon ne_session ptr */
off_t current; /*!< neon current body offset. */
off_t total; /*!< neon total body length. */
int connstatus; /*!< neon connection status. */
#ifdef REFERENCE
typedef enum {
ne_conn_namelookup, /* lookup up hostname (info = hostname) */
ne_conn_connecting, /* connecting to host (info = hostname) */
ne_conn_connected, /* connected to host (info = hostname) */
ne_conn_secure /* connection now secure (info = crypto level) */
} ne_conn_status;
#endif
int bufAlloced; /*!< sizeof I/O buffer */
/*@owned@*/
char * buf; /*!< I/O buffer */
int openError; /*!< Type of open failure */
int httpVersion;
int httpHasRange;
int magic;
};
#ifdef __cplusplus
extern "C" {
#endif
/*@unchecked@*/
extern int _url_count; /*!< No. of cached URL's. */
/*@unchecked@*/
/*@only@*/ /*@null@*/
extern urlinfo * _url_cache; /*!< URL cache. */
/*@unchecked@*/
extern int _url_iobuf_size; /*!< Initial size of URL I/O buffer. */
#define RPMURL_IOBUF_SIZE 4096
/*@unchecked@*/
extern int _url_debug; /*!< URL debugging? */
#define RPMURL_DEBUG_IO 0x40000000
#define RPMURL_DEBUG_REFS 0x20000000
/**
* Create a URL control structure instance.
* @param msg debugging identifier (unused)
* @return new instance
*/
/*@unused@*/ urlinfo urlNew(const char * msg) /*@*/;
/** @todo Remove debugging entry from the ABI. */
urlinfo XurlNew(const char * msg, const char * file, unsigned line) /*@*/;
#define urlNew(_msg) XurlNew(_msg, __FILE__, __LINE__)
/**
* Reference a URL control structure instance.
* @param u URL control structure
* @param msg debugging identifier (unused)
* @return referenced instance
*/
/*@unused@*/ urlinfo urlLink(urlinfo u, const char * msg)
/*@modifies u @*/;
/** @todo Remove debugging entry from the ABI. */
urlinfo XurlLink(urlinfo u, const char * msg, const char * file, unsigned line)
/*@modifies u @*/;
#define urlLink(_u, _msg) XurlLink(_u, _msg, __FILE__, __LINE__)
/**
* Dereference a URL control structure instance.
* @param u URL control structure
* @param msg debugging identifier (unused)
* @return dereferenced instance (NULL if freed)
*/
/*@unused@*/ urlinfo urlFree( /*@killref@*/ urlinfo u, const char * msg)
/*@globals fileSystem, internalState @*/
/*@modifies u, fileSystem, internalState @*/;
/** @todo Remove debugging entry from the ABI. */
urlinfo XurlFree( /*@killref@*/ urlinfo u, const char * msg,
const char * file, unsigned line)
/*@globals fileSystem, internalState @*/
/*@modifies u, fileSystem, internalState @*/;
#define urlFree(_u, _msg) XurlFree(_u, _msg, __FILE__, __LINE__)
/**
* Free cached URL control structures.
*/
void urlFreeCache(void)
/*@globals _url_cache, _url_count, fileSystem, internalState @*/
/*@modifies _url_cache, _url_count, fileSystem, internalState @*/;
/**
* Return type of URL.
* @param url url string
* @return type of url
*/
urltype urlIsURL(const char * url)
/*@*/;
/**
* Return path component of URL.
* @param url url string
* @retval pathp pointer to path component of url
* @return type of url
*/
/*@-incondefs@*/
urltype urlPath(const char * url, /*@out@*/ const char ** pathp)
/*@ensures maxSet(*pathp) == 0 /\ maxRead(*pathp) == 0 @*/
/*@modifies *pathp @*/;
/*@=incondefs@*/
/**
* Parse URL string into a control structure.
* @param url url string
* @retval uret address of new control instance pointer
* @return 0 on success, -1 on error
*/
int urlSplit(const char * url, /*@out@*/ urlinfo * uret)
/*@globals h_errno, internalState @*/
/*@modifies *uret, internalState @*/;
/**
* Copy data from URL to local file.
* @param url url string of source
* @param dest file name of destination
* @return 0 on success, otherwise FTPERR_* code
*/
int urlGetFile(const char * url, /*@null@*/ const char * dest)
/*@globals h_errno, fileSystem, internalState @*/
/*@modifies fileSystem, internalState @*/;
#ifdef __cplusplus
}
#endif
#endif /* H_RPMURL */