exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

commit 97cec69dfeda6d94e29897a1f329120fa0b2498c
parent 320ab53cf14adf87456c56f3a15fd17b4ff9d6e6
Author: Christian Grothoff <christian@grothoff.org>
Date:   Mon, 15 Dec 2025 21:33:11 +0100

fix attachment dumping logic

Diffstat:
Msrc/mhd/mhd_typst.c | 55+++++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 47 insertions(+), 8 deletions(-)

diff --git a/src/mhd/mhd_typst.c b/src/mhd/mhd_typst.c @@ -184,6 +184,7 @@ inline_pdf_stage (struct TypstStage *stage, char *fn; size_t n; void *b; + int fd; if (NULL == str) { @@ -200,7 +201,7 @@ inline_pdf_stage (struct TypstStage *stage, return false; } GNUNET_asprintf (&fn, - "%s/external-XXXXXX", + "%s/external-", tmpdir); stage->filename = GNUNET_DISK_mktemp (fn); if (NULL == stage->filename) @@ -211,18 +212,43 @@ inline_pdf_stage (struct TypstStage *stage, return false; } GNUNET_free (fn); - - if (n != - GNUNET_DISK_fn_write (stage->filename, - b, - n, - GNUNET_DISK_PERM_USER_READ - | GNUNET_DISK_PERM_USER_WRITE)) + fd = open (stage->filename, + O_WRONLY | O_TRUNC, + S_IRUSR | S_IWUSR); + if (-1 == fd) { + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, + "open", + stage->filename); GNUNET_free (b); GNUNET_free (stage->filename); return false; } + + { + size_t off = 0; + + while (off < n) + { + ssize_t r; + + r = write (fd, + b + off, + n - off); + if (-1 == r) + { + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, + "write", + stage->filename); + GNUNET_break (0 == close (fd)); + GNUNET_free (b); + GNUNET_free (stage->filename); + return false; + } + off += r; + } + } + GNUNET_break (0 == close (fd)); return true; } @@ -464,11 +490,19 @@ setup_stage (struct TypstStage *stage, if (NULL == doc->form_name) { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Stage %u: Dumping inlined PDF attachment\n", + i); return inline_pdf_stage (stage, tmpdir, doc->data); } + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Stage %u: Handling form %s\n", + i, + doc->form_name); + /* Setup inputs */ { char *dirname; @@ -641,6 +675,8 @@ TALER_MHD_typst ( once = GNUNET_OK; break; case GNUNET_SYSERR: + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "PDF generation initialization failed before, not even trying again\n"); return NULL; } tc = GNUNET_new (struct TALER_MHD_TypstContext); @@ -691,6 +727,9 @@ TALER_MHD_typst ( { char err[128]; + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Typst setup failed on stage %u\n", + i); GNUNET_snprintf (err, sizeof (err), "Typst setup failed on stage %u",