fix: run stdin

This commit is contained in:
lohhiiccc 2026-05-05 00:01:00 +02:00
parent 4d4fa262b8
commit 17488fdee0

View file

@ -1,15 +1,70 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <cli.h>
#include <libft_ssl.h>
#include "compiler.h"
#include "ft_ssl.h"
#include "ft_ssl_flags.h"
#include "internal/ssl/ssl.h"
/* Forward declarations */
static int run_stdin_p(const struct ssl_config *config);
static ssize_t read_and_hash(const struct ssl_config *config, union digest_ctx
*ctx, char *label, size_t cap);
/* ------------------- */
int
run_stdin(const struct ssl_config *config)
{
if (HAS_FLAG(config->flags, FLAG_P) && !HAS_FLAG(config->flags, FLAG_Q))
return run_stdin_p(config);
return digest_stream(config, STDIN_FILENO, "stdin", 0,
HAS_FLAG(config->flags, FLAG_P));
}
static ssize_t
read_and_hash(const struct ssl_config *config, union digest_ctx *ctx,
char *label, size_t cap)
{
uint8_t buf[READ_BUFSIZE];
size_t len;
ssize_t n;
size_t take;
config->algo->init(ctx);
len = 0;
while (0 < (n = read(STDIN_FILENO, buf, READ_BUFSIZE)))
{
config->algo->update(ctx, buf, (size_t)n);
take = (size_t)n < cap - len ? (size_t)n : cap - len;
memcpy(label + len, buf, take);
len += take;
}
return (n < 0 ? -1 : (ssize_t)len);
}
static int
run_stdin_p(const struct ssl_config *config)
{
union digest_ctx ctx;
uint8_t digest[MAX_DIGEST_SIZE];
char label[4097];
char hex[MAX_DIGEST_SIZE * 2 + 1];
ssize_t len;
size_t i;
len = read_and_hash(config, &ctx, label, sizeof(label) - 1);
if (len < 0)
return CLI_ERROR;
if (len && '\n' == label[len - 1])
--len;
label[len] = '\0';
config->algo->final(&ctx, digest);
for (i = 0; i < config->algo->digest_size; i++)
snprintf(hex + i * 2, 3, "%02x", (unsigned int)digest[i]);
printf("(\"%s\")= %s\n", label, hex);
return CLI_SUCCESS;
}