summaryrefslogtreecommitdiffstats
path: root/lib/libfetch/common.c
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>1998-11-06 22:14:08 +0000
committerdes <des@FreeBSD.org>1998-11-06 22:14:08 +0000
commit93ce759c73e21f7ac6642b79a8e6146522b452aa (patch)
treef7eca0835b20fb3b31b3e447f024ef540f77afe0 /lib/libfetch/common.c
parentf2ceee99496bf97c1d2ffff9c8e7fd6a79474f2e (diff)
downloadFreeBSD-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.c107
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));
}
OpenPOWER on IntegriCloud