From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <35547YQYKDiQCCROSSGOOGLE.COMELFUTILS-DEVELSOURCEWARE.ORG@flex--ccross.bounces.google.com> Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by sourceware.org (Postfix) with ESMTPS id 525DF3858405 for ; Fri, 10 Sep 2021 18:07:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 525DF3858405 Received: by mail-yb1-xb49.google.com with SMTP id q17-20020a25b591000000b005a07d27bbdaso3506973ybj.3 for ; Fri, 10 Sep 2021 11:07:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=IvfkTHMEg8CWt5YeLnfQbtsI0+TEX+K9qvWEV7+3QPI=; b=GazjTEtnvxOF6OZ6KyV+eTIJFC021bf/5icQf96+X/5gQ1w+eN7za+ZRhtYaVCbcrR 8pgxyMrtx60zjMHOHI3+/e5EQOrOcKcPlLDipZLMAFfHrNxqEKuAorYUCF91n1zLgrsR PEM/pZG3I4PD7w+lq8m+X5Pvkjgi1eRcD1DYPdVSe6KGh7terM+sxVpicAqjl3ze8m96 CBHMg0QwBLEwOtZ3KZk95M0pIwjIrbdF4ujvoz3tAENOylALI3JX9DbfeCSZ1Ra7BdEi 6/LNk8nHgNwo5S+qZ6Ejp815IwKdTqXNkVvEK9LsZMO+ix6O387U5jzjCK0vkMXGNGQ8 Mxjw== X-Gm-Message-State: AOAM5336QvjFb8LvcTOQ44mQXTb4sMiWj9yRYPETrx6D+1wjMmcvCXDr +Gg4KP6H0q+Iv2JeQeIMxNe4NytlxE+b9uceMSoPgiip2Q4ZVdycG0Xkl/exRg+8S5udB1gnhsD +dMtD/Y1yUKbet0MKYoN4JD4KPyoZSqoeRkrsPix7NICuhnsNeUOvBFHurWyHgeqIlsw6FE0= X-Google-Smtp-Source: ABdhPJz3qXpUDPS9Y0w1Y1XnkChd3AkWJFgHge7HsPQnRS5eBOa7kYID2Oor+WSF6kGFmYalth33T9A5r+0= X-Received: from walnut.mtv.corp.google.com ([2620:15c:211:2:8e97:1fa:2d9a:33f]) (user=ccross job=sendgmr) by 2002:a25:3046:: with SMTP id w67mr12842350ybw.134.1631297255887; Fri, 10 Sep 2021 11:07:35 -0700 (PDT) Date: Fri, 10 Sep 2021 11:07:16 -0700 In-Reply-To: <6098de6222cc54410231586581d08cf442e00f56.camel@klomp.org> Message-Id: <20210910180716.1464674-1-ccross@google.com> Mime-Version: 1.0 References: <6098de6222cc54410231586581d08cf442e00f56.camel@klomp.org> X-Mailer: git-send-email 2.33.0.309.g3052b89438-goog Subject: [PATCH] lib: Make error.c more like error(3) From: Colin Cross To: elfutils-devel@sourceware.org Cc: Colin Cross Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-21.8 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Sep 2021 18:07:37 -0000 Fix some issues with the error reimplementation to make it match the specification for error(3). Flush stdout before printing to stderr. Also flush stderr afterwards, which is not specified in the man page for error(3), but is what bionic does. error(3) prints strerror(errnum) if and only if errnum is nonzero, but verr prints strerror(errno) unconditionaly. When errnum is nonzero copy it to errno and use verr, and when it is not set use verrx that doesn't print errno. error(3) only exits if status is nonzero, but verr exits uncondtionally. Use vwarn/vwarnx when status is zero, which don't exit. Signed-off-by: Colin Cross --- lib/error.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/error.c b/lib/error.c index 75e964fd..dba046ef 100644 --- a/lib/error.c +++ b/lib/error.c @@ -29,7 +29,9 @@ #include #if !defined(HAVE_ERROR_H) && defined(HAVE_ERR_H) +#include #include +#include #include #include @@ -37,13 +39,32 @@ unsigned int error_message_count = 0; void error(int status, int errnum, const char *format, ...) { va_list argp; + int saved_errno = errno; + + fflush(stdout); va_start(argp, format); - verr(status, format, argp); + if (status) { + if (errnum) { + errno = errnum; + verr(status, format, argp); + } else { + verrx(status, format, argp); + } + } else { + if (errnum) { + errno = errnum; + vwarn(format, argp); + } else { + vwarnx(format, argp); + } + } va_end(argp); - if (status) - exit(status); + fflush(stderr); + ++error_message_count; + + errno = saved_errno; } #endif -- 2.33.0.309.g3052b89438-goog