mirror of
https://codeberg.org/la-chouette/minishell.git
synced 2025-12-06 07:28:09 +01:00
57 lines
2 KiB
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));
|
|
}
|