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

Reply via email to