From 99babbf6d25ce89a7f5ab96a4481c393f257957f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kha=C3=AFs=20COLIN?= Date: Mon, 10 Mar 2025 18:22:22 +0100 Subject: [PATCH] here_doc: generate random filenames --- src/executing/here_doc/here_doc.c | 46 ++++++++++++++++++++++++++++++- src/executing/here_doc/here_doc.h | 4 +-- tests/test_here_doc.c | 23 +++++++++++++++- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/src/executing/here_doc/here_doc.c b/src/executing/here_doc/here_doc.c index 459c222..c1c8d25 100644 --- a/src/executing/here_doc/here_doc.c +++ b/src/executing/here_doc/here_doc.c @@ -6,8 +6,52 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/07 11:42:29 by khais #+# #+# */ -/* Updated: 2025/03/07 11:42:36 by khais ### ########.fr */ +/* Updated: 2025/03/11 11:22:54 by khais ### ########.fr */ /* */ /* ************************************************************************** */ #include "here_doc.h" +#include +#include +#include +#include "../../ft_errno.h" +#include "../../buffer/buffer.h" +#include "libft/libft.h" + +/* +** Genereate a random filename for use by here_doc +** +** The filename will be of the form +** /tmp/minishell_here_doc_XXXXXXXXXXX +** where each X is a random alphanumerical char +** +** Random bytes are generated by reading from /dev/urandom +** +** Return NULL and sets ft_errno on error +*/ +char *here_doc_random_filename(void) +{ + int randomfd; + char buf[1]; + t_buffer *filename; + + randomfd = open("/dev/urandom", O_RDONLY); + if (randomfd < 0) + return (ft_errno(FT_EERRNO), NULL); + filename = ft_buffer_new(); + if (filename == NULL) + return (close(randomfd), ft_errno(FT_EERRNO), NULL); + filename = ft_buffer_push_buf(filename, "/tmp/minishell_here_doc_", 24); + while (filename->length < 35) + { + if (read(randomfd, buf, 1) != 1) + { + ft_buffer_free(filename); + return (close(randomfd), ft_errno(FT_EERRNO), NULL); + } + if (ft_isalnum(buf[0])) + filename = ft_buffer_pushchar(filename, buf[0]); + } + close(randomfd); + return (ft_buffer_to_charptr(filename)); +} diff --git a/src/executing/here_doc/here_doc.h b/src/executing/here_doc/here_doc.h index d4f30c8..9b8ba1c 100644 --- a/src/executing/here_doc/here_doc.h +++ b/src/executing/here_doc/here_doc.h @@ -6,13 +6,13 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/07 11:41:27 by khais #+# #+# */ -/* Updated: 2025/03/07 11:42:19 by khais ### ########.fr */ +/* Updated: 2025/03/11 10:58:19 by khais ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef HERE_DOC_H # define HERE_DOC_H -# include "../../parser/worddesc/worddesc.h" +char *here_doc_random_filename(void); #endif // HERE_DOC_H diff --git a/tests/test_here_doc.c b/tests/test_here_doc.c index ca41eeb..40d4255 100644 --- a/tests/test_here_doc.c +++ b/tests/test_here_doc.c @@ -6,7 +6,7 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/07 11:43:32 by khais #+# #+# */ -/* Updated: 2025/03/10 18:21:43 by khais ### ########.fr */ +/* Updated: 2025/03/10 18:23:36 by khais ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,27 @@ #include "testutil.h" #include "libft.h" #include +#include "../src/executing/here_doc/here_doc.h" + +static void test_here_doc_filename_generation(void) +{ + char *filename1; + char *filename2; + + ft_dprintf(STDERR_FILENO, "==> %s <==\n", __FUNCTION__); + filename1 = here_doc_random_filename(); + filename2 = here_doc_random_filename(); + assert(filename1 != NULL); + assert(filename2 != NULL); + ft_dprintf(STDERR_FILENO, "Got filename: [%s]\n", filename1); + ft_dprintf(STDERR_FILENO, "Got filename: [%s]\n", filename2); + assert(ft_strcmp(filename1, filename2) != 0); + free(filename1); + free(filename2); + do_leak_check(); +} + int main(void) { + test_here_doc_filename_generation(); return (0); }