On Wed, Nov 13, 2024 at 08:00:34PM +0000, Gavin Smith wrote:
> On Tue, Nov 12, 2024 at 09:35:24PM +0000, Gavin Smith wrote:
> > I can't see how it can be that complicated to call fopen/fread/fwrite
> > ourselves to copy the file. These are all completely standard library
> > functions. I can have a go at implementing this in the next couple of
> > days.
>
> My work on this is at the bottom of this message.
from_file_name and to_file_name should probably be different from from
and to, as they should be decoded to UTF-8 to appear in error messages
and maybe could be passed too to the function.
> Should this be the following?
>
> xasprintf (&from_file_name, "%s/%s", jssrcdir, js_files[i]);
> xasprintf (&to_file_name, "%s/%s", jsdir, js_files[i]);
>
> With this, 'from_file_name' is the same as 'from'.
I think that you are right. It would be better if the jssrcdir file
was decoded (to UTF-8) as in convert/html_prepare_converter.c
parse_htmlxref_files using COMMAND_LINE_ENCODING before being output
in the error message.
> For MS-Windows I checked if O_BINARY or _O_BINARY was set, as is done in
> the top-level system.h include (although I didn't include system.h).
>
> I reused most of the error messages from the existing code, although
> didn't find a use for some of them (for GL_COPY_ERR_AFTER_READ and the
> ACL errors).
>
>
> diff --git a/tp/Texinfo/XS/convert/convert_html.c
> b/tp/Texinfo/XS/convert/convert_html.c
> index 2aec97aa3b..d4ef4e3424 100644
> --- a/tp/Texinfo/XS/convert/convert_html.c
> +++ b/tp/Texinfo/XS/convert/convert_html.c
> @@ -20,8 +20,6 @@
> #include <stdio.h>
> #include <errno.h>
>
> -#include "copy-file.h"
> -
> #include "html_conversion_data.h"
> #include "text.h"
> #include "element_types.h"
> @@ -2392,6 +2390,95 @@ do_jslicenses_file (CONVERTER *self)
> free (formatted_jlicenses);
> }
>
> +/* Set FOPEN_RBIN and ROPEN_WBIN. */
> +#ifndef O_BINARY
> +# ifdef _O_BINARY
> +# define O_BINARY _O_BINARY
> +# else
> + # define O_BINARY 0
> + # endif
> +#endif /* O_BINARY */
> +
> +#if O_BINARY /* MS-Windows */
> +# define FOPEN_RBIN "rb"
> +# define FOPEN_WBIN "wb"
> +#else
> +# define FOPEN_RBIN "r"
> +# define FOPEN_WBIN "w"
> +#endif
> +
> +static void
> +copy_file_to (CONVERTER *self, const char *from, const char *to)
> +{
> + FILE *src = 0, *dest = 0;
> +
> + const char *from_file_name = from, *to_file_name = to;
> +
> + src = fopen (from, FOPEN_RBIN);
> + if (!src)
> + {
> + message_list_document_error (&self->error_messages,
> + self->conf, 0,
> + "error while opening %s for reading: %s",
> + from_file_name, strerror (errno));
> + return;
> + }
> +
> + dest = fopen (to, FOPEN_WBIN);
> + if (!dest)
> + {
> + message_list_document_error (&self->error_messages,
> + self->conf, 0,
> + "cannot open %s for writing: %s",
> + to_file_name, strerror (errno));
> + fclose (src);
> + return;
> + }
> +
> +#define bufsize 512
> + char buf[bufsize];
> + size_t nread, nwritten;
> + do
> + {
> + nread = fread (buf, sizeof(char), sizeof(buf), src);
> +
> + nwritten = fwrite (buf, sizeof(char), nread, dest);
> + if (nwritten != nread)
> + {
> + message_list_document_error (&self->error_messages,
> + self->conf, 0,
> + "error writing %s: %s",
> + to_file_name, strerror (errno));
> + fclose (src);
> + fclose (dest);
> + return;
> + }
> + }
> + while (nread == bufsize);
> +#undef bufsize
> +
> + if (ferror (src))
> + {
> + message_list_document_error (&self->error_messages,
> + self->conf, 0,
> + "error reading %s: %s",
> + from_file_name, strerror (errno));
> + fclose (src);
> + fclose (dest);
> + return;
> + }
> +
> + fclose (src);
> + if (fclose (dest) != 0)
> + {
> + message_list_document_error (&self->error_messages,
> + self->conf, 0,
> + "error closing %s: %s",
> + to_file_name, strerror (errno));
> + return;
> + }
> +}
> +
> static const char *js_files[4] = {"info.js", "modernizr.js", "info.css", 0};
>
> void
> @@ -2448,81 +2535,12 @@ html_do_js_files (CONVERTER *self)
> {
> char *from;
> char *to;
> - int status;
>
> xasprintf (&from, "%s/%s", jssrcdir, js_files[i]);
> xasprintf (&to, "%s/%s", encoded_jsdir, js_files[i]);
> - status = copy_file_to (from, to);
> -
> - if (status != 0)
> - {
> - char *to_file_name;
> - char *from_file_name;
>
> - xasprintf (&to_file_name, "%s/%s", jsdir, js_files[i]);
> - xasprintf (&from_file_name, "%s/%s", jsdir,
> js_files[i]);
> + copy_file_to (self, from, to);
>
> - switch (status)
> - {
> - case GL_COPY_ERR_OPEN_READ:
> - message_list_document_error
> (&self->error_messages,
> - self->conf, 0,
> - "error while opening %s for reading: %s",
> - from_file_name, strerror (errno));
> - break;
> -
> - case GL_COPY_ERR_OPEN_BACKUP_WRITE:
> - message_list_document_error
> (&self->error_messages,
> - self->conf, 0,
> - "cannot open %s for writing: %s",
> - to_file_name, strerror (errno));
> - break;
> -
> - case GL_COPY_ERR_READ:
> - message_list_document_error
> (&self->error_messages,
> - self->conf, 0,
> - "error reading %s: %s",
> - from_file_name, strerror (errno));
> - break;
> -
> - case GL_COPY_ERR_WRITE:
> - message_list_document_error
> (&self->error_messages,
> - self->conf, 0,
> - "error writing %s: %s",
> - to_file_name, strerror (errno));
> - break;
> -
> - case GL_COPY_ERR_AFTER_READ:
> - message_list_document_error
> (&self->error_messages,
> - self->conf, 0,
> - "error after reading %s: %s",
> - from_file_name, strerror (errno));
> - break;
> -
> - case GL_COPY_ERR_GET_ACL:
> - message_list_document_warn
> (&self->error_messages,
> - self->conf, 0,
> - "%s: %s",
> - from_file_name, strerror (errno));
> - break;
> -
> - case GL_COPY_ERR_SET_ACL:
> - message_list_document_warn
> (&self->error_messages,
> - self->conf, 0,
> - "preserving permissions for %s: %s",
> - to_file_name, strerror (errno));
> - break;
> -
> - default:
> - message_list_document_warn
> (&self->error_messages,
> - self->conf, 0,
> - "unexpected error on copying %s into %s",
> - from_file_name, to_file_name);
> - break;
> - }
> - free (to_file_name);
> - free (from_file_name);
> - }
> free (to);
> free (from);
> }
>