minishell/src/executing/here_doc/here_doc.c

57 lines
2 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* here_doc.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/03/07 11:42:29 by khais #+# #+# */
/* Updated: 2025/03/11 11:22:54 by khais ### ########.fr */
/* */
/* ************************************************************************** */
#include "here_doc.h"
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#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));
}