<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-legacy-support.
</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/ce4b23acd7001278d7335092d7c3f7de7e6b825e">https://github.com/macports/macports-legacy-support/commit/ce4b23acd7001278d7335092d7c3f7de7e6b825e</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit ce4b23acd7001278d7335092d7c3f7de7e6b825e
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Thu Sep 26 17:51:42 2024 -0700
<span style='display:block; white-space:pre;color:#404040;'> Rewrite dprintf() test.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> This performs a much more thorough test of dprintf(), including
</span><span style='display:block; white-space:pre;color:#404040;'> verifying that it does not close the underlying fd.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'> Fails when the old close bug is present, passes otherwise.
</span>---
test/test_dprintf.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 91 insertions(+), 3 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_dprintf.c b/test/test_dprintf.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 3a15670..00490a4 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_dprintf.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_dprintf.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,95 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2024 Frederick H. G. Wright II <fw@fwright.net>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This provides functional tests for dprintf, including *not* closing the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * provided fd.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <assert.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stddef.h>
</span> #include <stdio.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BUF_SIZE 256
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define TEST_ARGS "%s output is %d\n", name, 42
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+typedef int test_func_t(int fd, const char * __restrict format, ...);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test_xdprintf(const char *name, test_func_t func, int pipes[], int verbose)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int ret, explen, done = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssize_t actlen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char expbuf[BUF_SIZE], actbuf[BUF_SIZE];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verbose) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("Testing %s...\n", name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fflush(stdout);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Create expected result */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ explen = snprintf(expbuf, sizeof(expbuf), TEST_ARGS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(explen > 0 && "snprintf failed creating expected");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Test func writing to wrong (read) end of pipe */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ret = func(pipes[0], TEST_ARGS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(ret < 0 && "Bad return value with invalid fd");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(errno == EBADF && "Bad errno with invalid fd");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Do test twice to detect unexpected close() */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Test func writing to correct (write) end of pipe */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ret = func(pipes[1], TEST_ARGS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(ret == explen && "Bad return value with valid fd");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(errno == 0 && "Bad errno with valid fd");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Read and check the pipe data */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ actlen = read(pipes[0], actbuf, sizeof(actbuf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(actlen == explen && "Incorrect length read from pipe");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert(!strncmp(actbuf, expbuf, explen) && "Piped result doesn't match");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } while (!done++);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+main(int argc, const char *argv[]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int verbose = 0, pipes[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (argc >= 2 && !strcmp(argv[1], "-v")) verbose = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (pipe(pipes)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ perror("Unable to create pipe");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ test_xdprintf("dprintf", dprintf, pipes, verbose);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (close(pipes[1])) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ perror("Unable to close write pipe");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (close(pipes[0])) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ perror("Unable to close read pipe");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-int main() {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- dprintf(fileno(stdout), "Hello, %s! My favorite number is %d\n", "Joe", 42);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("dprintf test succeeded\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span> }
</pre><pre style='margin:0'>
</pre>