From 93ce759c73e21f7ac6642b79a8e6146522b452aa Mon Sep 17 00:00:00 2001 From: des Date: Fri, 6 Nov 1998 22:14:08 +0000 Subject: Second of a series of cleanups to libfetch. This commit introduces the following features: a) the fetchStat*() functions, which return meta-information for a document, such as size, modification time, etc. b) the use of the com_err(3) facilities to report errors. It also fixes a bunch of style bugs and a few logic bugs and somewhat improves the man page. Changed files, in alphabetical order: Makefile: Don't generate macros in {ftp,http}err.c. Generate category fields for the error message lists. Compile the error table. Install fetch_err.h along with fetch.h. common.c: Remove the _netdb_errstring() macro, and add FETCH_ERR_NETDB to the error code in the _netdb_seterr() macro. Add categories to the _netdb_errlist table. Report errors through the Common Error library. common.h: Add the DEBUG macros. Add prototype for fetchConnect(). Remove the prototype for _fetch_errstring(), which is local to common.c Add a categroy field to struct fetcherr, and define constants for error categories. Define macros for _{url,netdb,ftp,http}_seterr(). errors.et: (new file) List error categories. fetch.3: Document the fetchStat*() functions. Move the "unimplemented functionality" comments from NOTES to BUGS. Document that applications which use libfetch must also use libcom_err, and list existing error codes. Undocument fetchLastErr{Code,String}. Remove the (empty) DIAGNOSTICS section. Mention Eugene Skepner in the AUTHORS section. fetch.c: Move the DEBUG macros to common.c Add fetchStat() and fetchStatURL(). Generate error messages for URL parser errors, and fix a minor bug in the parser. Use 'struct url' instead of 'url_t'. Remove fetchLastErr{Code,String}. fetch.h: Use 'struct url' instead of 'url_t', and remove the typedef. Define struct url_stat (used by fetchStat()). Add prototypes for fetchStat*(). Remove the declarations for fetchLastErr{Code,String}. Include fetch_err.h. fetch_err.et: (new file) Error table for libfetch. file.c: Add fetchStatFile(). Use 'struct url' instead of 'url_t'. ftp.c: Add fetchStatFTP(). Use 'struct url' instead of 'url_t'. Don't use fetchLastErrCode. ftp.errors: Add categories to all error messages. http.c: Add fetchStatHTTP(). Use 'struct url' instead of 'url_t'. Don't use fetchLastErr{Code,Text}. http.errors: Add categories to all error messages. Prompted by: jkh and Eugene Skepner Numerous sugestions from: Garett Wollman and Eugene Skepner --- lib/libfetch/common.c | 107 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 89 insertions(+), 18 deletions(-) (limited to 'lib/libfetch/common.c') diff --git a/lib/libfetch/common.c b/lib/libfetch/common.c index be0da67..c42f2db 100644 --- a/lib/libfetch/common.c +++ b/lib/libfetch/common.c @@ -25,13 +25,14 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id$ + * $Id: common.c,v 1.1 1998/11/05 19:48:16 des Exp $ */ #include #include #include +#include #include #include #include @@ -40,34 +41,45 @@ #include "fetch.h" #include "common.h" + /*** Local data **************************************************************/ /* * Error messages for resolver errors */ static struct fetcherr _netdb_errlist[] = { - { HOST_NOT_FOUND, "Host not found" }, - { TRY_AGAIN, "Transient resolver failure" }, - { NO_RECOVERY, "Non-recoverable resolver failure" }, - { NO_DATA, "No address record" }, - { -1, "Unknown resolver error" } + { HOST_NOT_FOUND, FETCH_RESOLV, "Host not found" }, + { TRY_AGAIN, FETCH_RESOLV, "Transient resolver failure" }, + { NO_RECOVERY, FETCH_RESOLV, "Non-recoverable resolver failure" }, + { NO_DATA, FETCH_RESOLV, "No address record" }, + { -1, FETCH_UNKNOWN, "Unknown resolver error" } }; -#define _netdb_errstring(n) _fetch_errstring(_netdb_errlist, n) -#define _netdb_seterr(n) _fetch_seterr(_netdb_errlist, n) +static int com_err_initialized; /*** Error-reporting functions ***********************************************/ /* + * Initialize the common error library + */ +static void +_fetch_init_com_err(void) +{ + initialize_ftch_error_table(); + com_err_initialized = 1; +} + +/* * Map error code to string */ -const char * -_fetch_errstring(struct fetcherr *p, int e) +static int +_fetch_finderr(struct fetcherr *p, int e) { - while ((p->num != -1) && (p->num != e)) - p++; - - return p->string; + int i; + for (i = 0; p[i].num != -1; i++) + if (p[i].num == e) + break; + return i; } /* @@ -76,8 +88,13 @@ _fetch_errstring(struct fetcherr *p, int e) void _fetch_seterr(struct fetcherr *p, int e) { - fetchLastErrCode = e; - fetchLastErrText = _fetch_errstring(p, e); + int n; + + if (!com_err_initialized) + _fetch_init_com_err(); + + n = _fetch_finderr(p, e); + com_err("libfetch", p[n].cat, "(%d %s)", e, p[n].string); } /* @@ -86,8 +103,62 @@ _fetch_seterr(struct fetcherr *p, int e) void _fetch_syserr(void) { - fetchLastErrCode = errno; - fetchLastErrText = strerror(errno); + int cat; + + if (!com_err_initialized) + _fetch_init_com_err(); + + switch (errno) { + case 0: + cat = FETCH_OK; + break; + case EPERM: + case EACCES: + case EROFS: + case EAUTH: + case ENEEDAUTH: + cat = FETCH_AUTH; + break; + case ENOENT: + case EISDIR: /* XXX */ + cat = FETCH_UNAVAIL; + break; + case ENOMEM: + cat = FETCH_MEMORY; + break; + case EBUSY: + case EAGAIN: + cat = FETCH_TEMP; + break; + case EEXIST: + cat = FETCH_EXISTS; + break; + case ENOSPC: + cat = FETCH_FULL; + break; + case EADDRINUSE: + case EADDRNOTAVAIL: + case ENETDOWN: + case ENETUNREACH: + case ENETRESET: + case EHOSTUNREACH: + cat = FETCH_NETWORK; + break; + case ECONNABORTED: + case ECONNRESET: + cat = FETCH_ABORT; + break; + case ETIMEDOUT: + cat = FETCH_TIMEOUT; + break; + case ECONNREFUSED: + case EHOSTDOWN: + cat = FETCH_DOWN; + break; + default: + cat = FETCH_UNKNOWN; + } + com_err("libfetch", cat, "(%02d %s)", errno, strerror(errno)); } -- cgit v1.1