diff options
author | des <des@FreeBSD.org> | 1998-11-06 22:14:08 +0000 |
---|---|---|
committer | des <des@FreeBSD.org> | 1998-11-06 22:14:08 +0000 |
commit | 93ce759c73e21f7ac6642b79a8e6146522b452aa (patch) | |
tree | f7eca0835b20fb3b31b3e447f024ef540f77afe0 /lib/libfetch/common.c | |
parent | f2ceee99496bf97c1d2ffff9c8e7fd6a79474f2e (diff) | |
download | FreeBSD-src-93ce759c73e21f7ac6642b79a8e6146522b452aa.zip FreeBSD-src-93ce759c73e21f7ac6642b79a8e6146522b452aa.tar.gz |
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
Diffstat (limited to 'lib/libfetch/common.c')
-rw-r--r-- | lib/libfetch/common.c | 107 |
1 files changed, 89 insertions, 18 deletions
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 <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> +#include <com_err.h> #include <errno.h> #include <netdb.h> #include <string.h> @@ -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)); } |