<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/61fec98cb5078c9a36749bd1675ebe427aca11bb">https://github.com/macports/macports-legacy-support/commit/61fec98cb5078c9a36749bd1675ebe427aca11bb</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 61fec98cb5078c9a36749bd1675ebe427aca11bb
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Fri Sep 27 20:06:37 2024 -0700
<span style='display:block; white-space:pre;color:#404040;'> Rewrite dprintf() implementation.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> This is primarily to fix a bug in dprintf() which erroneously closed
</span><span style='display:block; white-space:pre;color:#404040;'> the fd after its use, but is also mildly more efficient.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Based on some work by raf <raf@raf.org>
</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;'> Passes the updated test, which failed before this fix.
</span>---
src/dprintf.c | 51 +++++++++++++++++++++++++++++++++++----------------
1 file changed, 35 insertions(+), 16 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/dprintf.c b/src/dprintf.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 51b844b..1ef7bd7 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/dprintf.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/dprintf.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,5 +1,5 @@
</span> /*
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * Copyright (c) 2021, Evan Miller <emmiller@gmail.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2024 Frederick H. G. Wright II <fw@fwright.net>
</span> *
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -14,26 +14,45 @@
</span> * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
<span style='display:block; white-space:pre;background:#ffe0e0;'>-// MP support header
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MP support header */
</span> #include "MacportsLegacySupport.h"
#if __MPLS_LIB_SUPPORT_DPRINTF__
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <errno.h>
</span> #include <stdarg.h>
#include <stdio.h>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <sys/errno.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-int dprintf(int fildes, const char * __restrict format, ...) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- FILE *stream = fdopen(fildes, "w");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (stream == NULL) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- errno = EBADF;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return -1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- va_list ap;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- va_start(ap, format);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int result = vfprintf(stream, format, ap);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- va_end(ap);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- fclose(stream);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return result;
</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;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+dprintf(int fildes, const char * __restrict format, ...) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ va_list ap;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ FILE *stream;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char buf[BUFSIZ];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Create a stream for a copy of the target fd, with our local buffer. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stream = fdopen(dup(fildes), "w");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (stream == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ errno = EBADF; /* Set the expected errno if it fails */
</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;'>+ setbuffer(stream, buf, sizeof(buf));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Do the output. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ va_start(ap, format);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ret = vfprintf(stream, format, ap);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ va_end(ap);
</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;'>+ * Close the FILE and the duplicate fd.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * NOTE: This releases any locks held by the original fd. There doesn't
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * seem to be an easy way to avoid this, given that free(stream) doesn't
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * work.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (fclose(stream)) ret = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return ret;
</span> }
#endif /* __MPLS_LIB_SUPPORT_DPRINTF__ */
</pre><pre style='margin:0'>
</pre>