star-mesh

Define and load a binary data format for meshes
git clone git://git.meso-star.fr/star-mesh.git
Log | Files | Refs | README | LICENSE

commit c97ecdc7810043f0721979fe1e788e29d402c7bd
parent 9f25c7a279bb5a56c6c8b95edab2d68d48d88ad3
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon, 16 Oct 2023 15:49:46 +0200

Detect whether memory mapping is enabled when loading from stdin

In this case, print a specific error message at the start of the loading
procedure before any loading problems occur. To test this, we can now
provide the "-" option as an input argument to the test_smsh_load
program, which means "read data from stdin".

Diffstat:
Msrc/smsh.c | 38+++++++++++++++++++++++---------------
Msrc/test_smsh_load.c | 26++++++++++++++++++++------
2 files changed, 43 insertions(+), 21 deletions(-)

diff --git a/src/smsh.c b/src/smsh.c @@ -32,6 +32,18 @@ /******************************************************************************* * Helper functions ******************************************************************************/ +static INLINE int +is_stdin(FILE* stream) +{ + struct stat stream_buf; + struct stat stdin_buf; + ASSERT(stream); + + CHK(fstat(fileno(stream), &stream_buf) == 0); + CHK(fstat(STDIN_FILENO, &stdin_buf) == 0); + return stream_buf.st_dev == stdin_buf.st_dev; +} + static INLINE res_T check_smsh_create_args(const struct smsh_create_args* args) { @@ -47,9 +59,17 @@ check_smsh_load_args(const struct smsh_load_args* args) } static INLINE res_T -check_smsh_load_stream_args(const struct smsh_load_stream_args* args) +check_smsh_load_stream_args + (struct smsh* smsh, + const struct smsh_load_stream_args* args) { if(!args || !args->stream || !args->name) return RES_BAD_ARG; + if(args->memory_mapping && is_stdin(args->stream)) { + log_err(smsh, + "%s: unable to use memory mapping on data loaded from stdin\n", + args->name); + return RES_BAD_ARG; + } return RES_OK; } @@ -80,18 +100,6 @@ reset_smsh(struct smsh* smsh) smsh->map_len_cells = 0; } -static INLINE int -is_stdin(FILE* stream) -{ - struct stat stream_buf; - struct stat stdin_buf; - ASSERT(stream); - - CHK(fstat(fileno(stream), &stream_buf) == 0); - CHK(fstat(STDIN_FILENO, &stdin_buf) == 0); - return stream_buf.st_dev == stdin_buf.st_dev; -} - static res_T map_data (struct smsh* smsh, @@ -246,7 +254,7 @@ static res_T load_stream(struct smsh* smsh, const struct smsh_load_stream_args* args) { res_T res = RES_OK; - ASSERT(smsh && check_smsh_load_stream_args(args) == RES_OK); + ASSERT(smsh && check_smsh_load_stream_args(smsh, args) == RES_OK); reset_smsh(smsh); @@ -412,7 +420,7 @@ smsh_load_stream(struct smsh* smsh, const struct smsh_load_stream_args* args) { res_T res = RES_OK; if(!smsh) return RES_BAD_ARG; - res = check_smsh_load_stream_args(args); + res = check_smsh_load_stream_args(smsh, args); if(res != RES_OK) return res; return load_stream(smsh, args); } diff --git a/src/test_smsh_load.c b/src/test_smsh_load.c @@ -21,6 +21,7 @@ #include <rsys/rsys.h> #include <stdio.h> +#include <string.h> #include <unistd.h> /******************************************************************************* @@ -237,7 +238,6 @@ test_load_fail(struct smsh* smsh) static void test_load_files(struct smsh* smsh, int argc, char** argv) { - struct smsh_load_args args = SMSH_LOAD_ARGS_NULL; hash256_T hash; int i; CHK(smsh); @@ -247,11 +247,25 @@ test_load_files(struct smsh* smsh, int argc, char** argv) size_t inode; size_t icell; - printf("Load %s\n", argv[i]); - - args.path = argv[i]; - args.memory_mapping = 1; - CHK(smsh_load(smsh, &args) == RES_OK); + /* Load from file */ + if(strcmp(argv[i], "-") != 0) { + struct smsh_load_args args = SMSH_LOAD_ARGS_NULL; + printf("Load %s\n", argv[i]); + args.path = argv[i]; + args.memory_mapping = 1; + CHK(smsh_load(smsh, &args) == RES_OK); + + /* Load from stdin */ + } else { + struct smsh_load_stream_args args = SMSH_LOAD_STREAM_ARGS_NULL; + printf("Load from stdin\n"); + args.stream = stdin; + args.name = "stdin"; + args.memory_mapping = 1; + CHK(smsh_load_stream(smsh, &args) == RES_BAD_ARG); + args.memory_mapping = 0; + CHK(smsh_load_stream(smsh, &args) == RES_OK); + } CHK(smsh_get_desc(smsh, &desc) == RES_OK); CHK(smsh_desc_compute_hash(&desc, hash) == RES_OK);