This is an automated email from the git hooks/post-receive script. guillem pushed a commit to branch master in repository dpkg.
View the commit online: https://git.dpkg.org/cgit/dpkg/dpkg.git/commit/?id=ac47acc3f816672852bd5ad036e663aa150abe3f commit ac47acc3f816672852bd5ad036e663aa150abe3f Author: Guillem Jover <guil...@debian.org> AuthorDate: Wed Aug 22 01:18:34 2018 +0200 libdpkg: Change dpkg_error to track errno values This will make it possible for the caller to check what errno caused an error to be emitted, if any. --- debian/changelog | 1 + lib/dpkg/error.c | 14 +++++++++----- lib/dpkg/error.h | 3 ++- lib/dpkg/t/t-error.c | 10 ++++++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/debian/changelog b/debian/changelog index 5dfc4ae03..b61741174 100644 --- a/debian/changelog +++ b/debian/changelog @@ -193,6 +193,7 @@ dpkg (1.19.1) UNRELEASED; urgency=medium - libdpkg: Reset nfiles in files_db_reset(). - libdpkg: Split push_cleanup() into push_cleanup_fallback(). - Switch from strchr() + strlen() to strchrnul(). + - libdpkg: Change dpkg_error to track errno values. * Build system: - Set distribution tarball format to ustar, instead of default v7 format. - Mark PO4A and POD2MAN as precious variables. diff --git a/lib/dpkg/error.c b/lib/dpkg/error.c index b2b0e3f9c..ecbf35fba 100644 --- a/lib/dpkg/error.c +++ b/lib/dpkg/error.c @@ -29,8 +29,9 @@ #include <dpkg/varbuf.h> #include <dpkg/error.h> -static void DPKG_ATTR_VPRINTF(3) -dpkg_error_set(struct dpkg_error *err, int type, const char *fmt, va_list args) +static void DPKG_ATTR_VPRINTF(4) +dpkg_error_set(struct dpkg_error *err, enum dpkg_msg_type type, int syserrno, + const char *fmt, va_list args) { struct varbuf str = VARBUF_INIT; @@ -38,6 +39,7 @@ dpkg_error_set(struct dpkg_error *err, int type, const char *fmt, va_list args) return; err->type = type; + err->syserrno = syserrno; varbuf_vprintf(&str, fmt, args); err->str = str.buf; @@ -49,7 +51,7 @@ dpkg_put_warn(struct dpkg_error *err, const char *fmt, ...) va_list args; va_start(args, fmt); - dpkg_error_set(err, DPKG_MSG_WARN, fmt, args); + dpkg_error_set(err, DPKG_MSG_WARN, 0, fmt, args); va_end(args); return -1; @@ -61,7 +63,7 @@ dpkg_put_error(struct dpkg_error *err, const char *fmt, ...) va_list args; va_start(args, fmt); - dpkg_error_set(err, DPKG_MSG_ERROR, fmt, args); + dpkg_error_set(err, DPKG_MSG_ERROR, 0, fmt, args); va_end(args); return -1; @@ -72,11 +74,12 @@ dpkg_put_errno(struct dpkg_error *err, const char *fmt, ...) { va_list args; char *new_fmt; + int syserrno = errno; new_fmt = str_fmt("%s (%s)", fmt, strerror(errno)); va_start(args, fmt); - dpkg_error_set(err, DPKG_MSG_ERROR, new_fmt, args); + dpkg_error_set(err, DPKG_MSG_ERROR, syserrno, new_fmt, args); va_end(args); free(new_fmt); @@ -106,6 +109,7 @@ void dpkg_error_destroy(struct dpkg_error *err) { err->type = DPKG_MSG_NONE; + err->syserrno = 0; free(err->str); err->str = NULL; } diff --git a/lib/dpkg/error.h b/lib/dpkg/error.h index 4d8b048df..da06e028d 100644 --- a/lib/dpkg/error.h +++ b/lib/dpkg/error.h @@ -40,10 +40,11 @@ enum dpkg_msg_type { struct dpkg_error { enum dpkg_msg_type type; + int syserrno; char *str; }; -#define DPKG_ERROR_INIT { DPKG_MSG_NONE, NULL } +#define DPKG_ERROR_INIT { DPKG_MSG_NONE, 0, NULL } int dpkg_put_warn(struct dpkg_error *err, const char *fmt, ...) DPKG_ATTR_PRINTF(2); diff --git a/lib/dpkg/t/t-error.c b/lib/dpkg/t/t-error.c index 5e2f55fcd..e93459e7e 100644 --- a/lib/dpkg/t/t-error.c +++ b/lib/dpkg/t/t-error.c @@ -42,10 +42,12 @@ test_dpkg_error_put(void) test_pass(dpkg_put_errno(NULL, "void error") < 0); test_pass(dpkg_put_warn(&err, "test warning %d", 10) < 0); + test_pass(err.syserrno == 0); test_str(err.str, ==, "test warning 10"); test_warn(err); test_pass(dpkg_put_error(&err, "test error %d", 20) < 0); + test_pass(err.syserrno == 0); test_str(err.str, ==, "test error 20"); test_error(err); @@ -54,6 +56,7 @@ test_dpkg_error_put(void) test_bail("cannot allocate string"); test_pass(dpkg_put_errno(&err, "test errno %d", 30) < 0); test_str(err.str, ==, errstr_ref); + test_pass(err.syserrno == ENOENT); test_error(err); free(errstr_ref); errno = 0; @@ -64,17 +67,20 @@ test_dpkg_error_destroy(void) { struct dpkg_error err = DPKG_ERROR_INIT; - test_pass(dpkg_put_error(&err, "test destroy") < 0); + errno = ENOENT; + test_pass(dpkg_put_errno(&err, "test destroy") < 0); + test_pass(err.syserrno == ENOENT); test_pass(err.type == DPKG_MSG_ERROR); test_pass(err.str != NULL); dpkg_error_destroy(&err); test_pass(err.type == DPKG_MSG_NONE); + test_pass(err.syserrno == 0); test_pass(err.str == NULL); } TEST_ENTRY(test) { - test_plan(19); + test_plan(24); test_dpkg_error_put(); test_dpkg_error_destroy(); -- Dpkg.Org's dpkg