Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Fix printing file:line debug output in errors.
Will Andrews committed 14 years ago
commit 13f532a02dddb0e8cf2eb1bc7c227d195abe3f9a
parent 8241122
5 files changed +50 -43
modified libpkg/pkg.h
@@ -655,7 +655,7 @@ typedef enum {
 * Event callback mechanism.  Events will be reported using this callback,
 * providing an event identifier and up to two event-specific pointers.
 */
-
typedef int(*pkg_event_cb)(pkg_event_t, void **);
+
typedef int(*pkg_event_cb)(pkg_event_t, const char *, int, void **);

struct pkg_handle {
	pkg_event_cb event_cb;
@@ -665,9 +665,9 @@ struct pkg_handle *pkg_get_handle(void);
pkg_event_cb pkg_handle_get_event_callback(struct pkg_handle *);
void pkg_handle_set_event_callback(struct pkg_handle *, pkg_event_cb);

-
void __pkg_emit_event(struct pkg_handle *, pkg_event_t, int, ...);
+
void __pkg_emit_event(struct pkg_handle *, const char *, int, pkg_event_t, int, ...);

#define	pkg_emit_event(ev, argc, argv...) \
-
	__pkg_emit_event(pkg_get_handle(), ev, argc, argv)
+
	__pkg_emit_event(pkg_get_handle(), __FILE__, __LINE__, ev, argc, argv)

#endif
modified libpkg/pkg_error.h
@@ -1,12 +1,7 @@
#ifndef _PKG_ERROR_H
#define _PKG_ERROR_H

-
#ifdef DEBUG
-
#	define pkg_error_set(code, fmt, ...) \
-
		_pkg_error_set(code, fmt " [at %s:%d]", ##__VA_ARGS__, __FILE__, __LINE__)
-
#else
-
#	define pkg_error_set _pkg_error_set
-
#endif
+
#define	pkg_error_set _pkg_error_set

#define ERROR_BAD_ARG(name) \
	pkg_error_set(EPKG_FATAL, "Bad argument `%s` in %s", name, __FUNCTION__)
modified libpkg/pkg_event.c
@@ -2,6 +2,7 @@
#include <archive.h>
#include "pkg.h"
#include "pkg_error.h"
+
#include <sys/sbuf.h>

/* Guard-rail against incorrect number of arguments */
static void
@@ -45,84 +46,94 @@ pkg_event_argument_check(pkg_event_t ev, int argc)
 * This function's purpose is to perform global event handling.
 */
static void
-
libpkg_handle_event(pkg_event_t ev, void **argv)
+
libpkg_handle_event(pkg_event_t ev, const char *filename, int line, void **argv)
{
+
	pkg_error_t ret = EPKG_FATAL; /* most of these are this code */
+
	struct sbuf *sb;
+

+
	sb = sbuf_new_auto();
	switch(ev) {
	case PKG_EVENT_ALREADY_INSTALLED:
-
		pkg_error_set(EPKG_INSTALLED, "package '%s' already installed",
-
		    pkg_get(argv[0], PKG_NAME));
+
		sbuf_printf(sb, "package '%s' already installed", pkg_get(argv[0], PKG_NAME));
+
		ret = EPKG_INSTALLED;
		break;
	case PKG_EVENT_ARCHIVE_COMP_UNSUP:
+
		ret = EPKG_OK; /* XXX needs an error message? */
		break;
	case PKG_EVENT_ARCHIVE_ERROR:
-
		pkg_error_set(EPKG_FATAL, "archive error at %s: %s",
-
		    argv[0], archive_error_string(argv[1]));
+
		sbuf_printf(sb, "archive error at %s: %s", (const char *)argv[0], archive_error_string(argv[1]));
		break;
	case PKG_EVENT_CKSUM_ERROR:
-
		pkg_error_set(EPKG_FATAL, "package '%s' failed checksum",
-
		    pkg_get(argv[0], PKG_NAME));
+
		sbuf_printf(sb, "package '%s' failed checksum", pkg_get(argv[0], PKG_NAME));
		break;
	case PKG_EVENT_CONFIG_KEY_NOTFOUND:
-
		pkg_error_set(EPKG_FATAL, "unknown configuration key `%s'", argv[0]);
+
		sbuf_printf(sb, "unknown configuration key `%s'", (const char *)argv[0]);
		break;
	case PKG_EVENT_CREATE_DB_ERROR:
		if (argv[2] == NULL)
-
			pkg_error_set(EPKG_FATAL, "%s: %s", argv[0], argv[1]);
+
			sbuf_printf(sb, "%s: %s", (char *)argv[0], (char *)argv[1]);
		else
-
			pkg_error_set(EPKG_FATAL, "%s(%s): %s", argv[0], argv[1], argv[2]);
+
			sbuf_printf(sb, "%s(%s): %s", (char *)argv[0], (char *)argv[1], (char *)argv[2]);
		break;
	case PKG_EVENT_DELETE_DEP_EXISTS:
-
		pkg_error_set(EPKG_REQUIRED, "%s", argv[0]);
+
		sbuf_printf(sb, "%s", (char *)argv[0]);
+
		ret = EPKG_REQUIRED;
		break;
	case PKG_EVENT_ERROR_INSTALLING_DEP:
-
		pkg_error_set(EPKG_FATAL, "error while installing dependency %s: %s",
-
		    argv[0], argv[1]);
+
		sbuf_printf(sb, "error while installing dependency %s: %s", (char *)argv[0], (char *)argv[1]);
		break;
	case PKG_EVENT_FETCH_ERROR:
-
		pkg_error_set(EPKG_FATAL, "%s", argv[0]);
+
		sbuf_printf(sb, "%s", (char *)argv[0]);
		break;
	case PKG_EVENT_INVALID_DB_STATE:
-
		pkg_error_set(EPKG_FATAL, "%s", argv[0]);
+
		sbuf_printf(sb, "%s", (char *)argv[0]);
		break;
	case PKG_EVENT_IO_ERROR:
-
		pkg_error_set(EPKG_FATAL, "I/O error: %s(%s): %s",
-
		    /*call*/argv[0], /*arg*/argv[1], /*strerror*/argv[2]);
+
		sbuf_printf(sb, "I/O error: %s(%s): %s", /*call*/(char *)argv[0],
+
		    /*arg*/(char *)argv[1], /*strerror*/(char *)argv[2]);
		break;
	case PKG_EVENT_MALLOC_ERROR:
-
		pkg_error_set(EPKG_FATAL, "allocation error: %s", argv[0]);
+
		sbuf_printf(sb, "allocation error: %s", (char *)argv[0]);
		break;
	case PKG_EVENT_MISSING_DEP:
-
		pkg_error_set(EPKG_DEPENDENCY, "missing %s-%s dependency",
-
		    argv[0], argv[1]);
+
		sbuf_printf(sb, "missing %s-%s dependency", (char *)argv[0], (char *)argv[1]);
+
		ret = EPKG_DEPENDENCY;
		break;
	case PKG_EVENT_OPEN_DB_ERROR:
-
		pkg_error_set(EPKG_FATAL, "db open(%s) failed: %s", argv[0], argv[1]);
+
		sbuf_printf(sb, "db open(%s) failed: %s", (char *)argv[0], (char *)argv[1]);
		break;
	case PKG_EVENT_PARSE_ERROR:
-
		pkg_error_set(EPKG_FATAL, "parse error(%s): %s", argv[0], argv[1]);
+
		sbuf_printf(sb, "parse error(%s): %s", (char *)argv[0], (char *)argv[1]);
		break;
	case PKG_EVENT_REPO_KEY_UNAVAIL:
-
		pkg_error_set(EPKG_FATAL, "RSA key %s invalid: %s", argv[0], argv[1]);
+
		sbuf_printf(sb, "RSA key %s invalid: %s", (char *)argv[0], (char *)argv[1]);
		break;
	case PKG_EVENT_REPO_KEY_UNUSABLE:
-
		pkg_error_set(EPKG_FATAL, "RSA key %s unusable: %s", argv[0], argv[1]);
+
		sbuf_printf(sb, "RSA key %s unusable: %s", (char *)argv[0], (char *)argv[1]);
		break;
	case PKG_EVENT_SQLITE_CONSTRAINT:
-
		pkg_error_set(EPKG_FATAL, "constraint violation on %s: %s", argv[0], argv[1]);
+
		sbuf_printf(sb, "constraint violation on %s: %s", (char *)argv[0], (char *)argv[1]);
		break;
	case PKG_EVENT_SQLITE_ERROR:
-
		pkg_error_set(EPKG_FATAL, "sqlite: %s", argv[0]);
+
		sbuf_printf(sb, "sqlite error: %s", (char *)argv[0]);
		break;
	case PKG_EVENT_UNKNOWN_SCRIPT:
-
		pkg_error_set(EPKG_FATAL, "unknown script '%s'", argv[0]);
+
		sbuf_printf(sb, "unknown script '%s'", (char *)argv[0]);
		break;
	default:
+
		ret = EPKG_OK; /* unhandled error */
		break;
	}
+
	if (filename != NULL && line >= 0)
+
		sbuf_printf(sb, " [at %s:%d]", filename, line);
+
	sbuf_done(sb);
+
	if (ret != 0)
+
		pkg_error_set(ret, sbuf_data(sb));
+
	sbuf_delete(sb);
}

void
-
__pkg_emit_event(struct pkg_handle *hdl, pkg_event_t ev, int argc, ...)
+
__pkg_emit_event(struct pkg_handle *hdl, const char *filename, int line, pkg_event_t ev, int argc, ...)
{
	va_list ap;
	void **argv;
@@ -140,9 +151,9 @@ __pkg_emit_event(struct pkg_handle *hdl, pkg_event_t ev, int argc, ...)
		argv[i] = va_arg(ap, void *);
	va_end(ap);

-
	libpkg_handle_event(ev, argv);
+
	libpkg_handle_event(ev, filename, line, argv);

	if (hdl->event_cb != NULL)
-
		hdl->event_cb(ev, argv);
+
		hdl->event_cb(ev, filename, line, argv);
	free(argv);
}
modified pkg/event.c
@@ -5,7 +5,7 @@
#include "event.h"

int
-
event_callback(pkg_event_t ev, void **argv)
+
event_callback(pkg_event_t ev, const char *filename, int line, void **argv)
{

	switch(ev) {
@@ -13,8 +13,9 @@ event_callback(pkg_event_t ev, void **argv)
		printf("Installing %s\n", pkg_get((struct pkg *)argv[0], PKG_NAME));
		break;
	case PKG_EVENT_ARCHIVE_ERROR:
-
		fprintf(stderr, "archive error on %s: %s\n",
-
		    (const char *)argv[0], archive_error_string(argv[1]));
+
		fprintf(stderr, "archive error on %s: %s [at %s:%d]\n",
+
		    (const char *)argv[0], archive_error_string(argv[1]),
+
		    filename, line);
		break;
	case PKG_EVENT_ARCHIVE_COMP_UNSUP:
		warnx("%s is not supported, trying %s",
modified pkg/event.h
@@ -1,6 +1,6 @@
#ifndef __PKG_EVENT_H__
#define	__PKG_EVENT_H__

-
int event_callback(pkg_event_t ev, void **argv);
+
int event_callback(pkg_event_t ev, const char *, int, void **argv);

#endif