diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2023-09-19 06:32:48 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2023-09-19 06:32:48 (GMT) |
commit | ef58d4479922ad026367c6daa73469f8ac42f001 (patch) | |
tree | 8866ad5018b6d9561482f0d55bf7e8019e750f8c | |
parent | 5c31b8362235b7423dced633866a2d4507c63251 (diff) |
Allow ROST rules loading from standard input.
-rw-r--r-- | src/rost.c | 98 |
1 files changed, 92 insertions, 6 deletions
@@ -25,7 +25,9 @@ #include <getopt.h> #include <libgen.h> #include <locale.h> +#include <malloc.h> #include <stdlib.h> +#include <string.h> #include <i18n.h> @@ -51,6 +53,9 @@ static void show_rost_help(const char *); /* Affiche des indications sur la version courante du programme. */ static void show_rost_version(void); +/* Récupère un contenu à traiter depuis l'entrée standard. */ +static void *get_input_data_from_stdin(void); + /****************************************************************************** @@ -140,6 +145,60 @@ static void show_rost_version(void) /****************************************************************************** * * +* Paramètres : - * +* * +* Description : Récupère un contenu à traiter depuis l'entrée standard. * +* * +* Retour : Adresse valide ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void *get_input_data_from_stdin(void) +{ + char *result; /* Espace mémoire à retourner */ + size_t length; /* Taille de ce contenu */ + ssize_t got; /* Quantité d'octets lus */ + + result = NULL; + + length = 0; + +#define ALLOC_SIZE 2048 + + while (true) + { + result = realloc(result, (length + ALLOC_SIZE) * sizeof(char)); + + got = read(STDIN_FILENO, result + length, ALLOC_SIZE); + + if (got == -1) + { + LOG_ERROR_N("read"); + goto exit_with_error; + } + + length += got; + + if (got < ALLOC_SIZE) + break; + + } + + return result; + + exit_with_error: + + free(result); + + return NULL; + +} + + +/****************************************************************************** +* * * Paramètres : argc = nombre d'arguments dans la ligne de commande. * * argv = arguments de la ligne de commande. * * * @@ -160,9 +219,10 @@ int main(int argc, char **argv) GScanOptions *options; /* Options d'analyses */ int index; /* Indice d'argument */ int ret; /* Bilan d'un appel */ + char *edir; /* Répertoire de base effectif */ char *rules; /* Définition de règles */ char *target; /* Cible communiquée */ - char *edir; /* Répertoire de base effectif */ + void *rule_content; /* Contenu à traduire */ GContentScanner *scanner; /* Encadrement d'une recherche */ GBinContent *content; /* Contenu à analyser */ GScanContext *context; /* Contexte des trouvailles */ @@ -237,16 +297,13 @@ int main(int argc, char **argv) } - if ((optind + 2) != argc) + if ((optind + 1) != argc && (optind + 2) != argc) { show_rost_help(argv[0]); result = EXIT_FAILURE; goto done; } - rules = argv[optind]; - target = argv[optind + 1]; - /* Actions de base */ if (show_help) @@ -293,7 +350,36 @@ int main(int argc, char **argv) /* Traitement des recherches */ - scanner = g_content_scanner_new_from_file(rules); + if ((optind + 1) == argc) + { + rules = NULL; + target = argv[optind]; + } + else + { + rules = argv[optind]; + target = argv[optind + 1]; + + if (strcmp(rules, "-") == 0 || strcmp(rules, "/dev/stdin") == 0) + rules = NULL; + + } + + if (rules == NULL) + { + rule_content = get_input_data_from_stdin(); + + if (rule_content != NULL) + { + scanner = g_content_scanner_new_from_text(rule_content); + free(rule_content); + } + else + scanner = NULL; + + } + else + scanner = g_content_scanner_new_from_file(rules); if (scanner != NULL) { |