bibic

bibliothèques pour l'interpréteur de commande
git clone git://git.asteride.xyz/~ldp/bibic.git
Journaux | Fichiers | Références | LICENCE

commit 69b2446d217797a6bdd1f19ae956802db62d3a48
parent f1600032749242f26853a3fb72a1b0253bb784f6
Auteur: Selve <selve@asteride.xyz>
Date:   Mon, 11 Dec 2023 18:05:32 -0500

autre changement de nom

Pour bibic, cette fois-ci.

Diffstat:
MMakefile | 14+++++++-------
Abibic.c | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Denvic.c | 116-------------------------------------------------------------------------------
3 files changed, 123 insertions(+), 123 deletions(-)

diff --git a/Makefile b/Makefile @@ -2,16 +2,16 @@ COPT = -Wall -Werror -Wextra -Wpedantic --std=c89 -O2 CC = cc PREFIX = "/usr/local/bin" -all: envic +all: bibic -envic: envic.c - ${CC} ${COPT} -o "$@" envic.c +bibic: bibic.c + ${CC} ${COPT} -o "$@" bibic.c -install: envic - install -m 755 envic ${PREFIX}/envic +install: bibic + install -m 755 bibic ${PREFIX}/bibic uninstall: - rm -f ${PREFIX}/envic + rm -f ${PREFIX}/bibic clean: - rm -f envic *.core + rm -f bibic *.core diff --git a/bibic.c b/bibic.c @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2023 Selve <selve@asteride.xyz> + * + * Ce fichier fait partie de bibic, publié sous la licence GPLv3 (seulement). + * Consultez le fichier LICENCE ou le site <https://www.gnu.org/licenses/> + * pour plus de détails. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <errno.h> +#include <limits.h> + +#define IC_DEF "/bin/sh" /* interpréteur de commandes par défaut */ + +extern char **environ; + +static void utilisation(void); + +int +main(int argc, char **argv) +{ + char *sh; /* interpéreteur de commande */ + char *var; /* pointeur vers variable d'environnement */ + char **args; /* arguments à passer à l'interpréteur */ + + if (argc < 2) { + utilisation(); + return 1; + } + + /* création des arguments à fournir à l'interpréteur + * 0: nom du script + * 1: option pour forcer l'interprétation en entrée standard, + * sert avant tout à indiquer à l'interpréteur de transférer les + * arguments au script + * 2: option pour indiquer à l'interpréteur de traiter les arguments qui + * suivent comme des arguments et non comme des options. Nécessaire + * pour qu'il soit possible de fournir des options aux scripts. + * …: arguments à fournir au script */ + if ((args = malloc(argc + 2)) == NULL) + goto erreur; + args[0] = argv[1]; + args[1] = "-si"; + args[2] = "--"; + args[argc + 1] = NULL; + + /* copier les arguments */ + while (argc > 2) { + args[argc] = argv[argc-1]; + argc--; + } + + /* POSIX stipule que le chemin contenu dans la variable ENV doit être + * absolu. Il faut assembler ce chemin. Ce chemin est formé par la + * concaténation du dossier courant, d'une barre oblique (/) et du + * fichier dans lequel se trouve le script. + * Bien sûr, nul besoin de tout cela si le chemin fourni est déjà un + * besoin absolu. */ + if (**argv != '/') { + static char abs[PATH_MAX]; /* chemin absolu */ + size_t lngr; /* longueur du chemin */ + + if (getcwd(abs, PATH_MAX) == NULL) + goto erreur; + lngr = strlen(abs); + /* il faut encore ajouter au moins deux caractères au chemin. */ + if (lngr + 2 >= PATH_MAX) { + errno = ENAMETOOLONG; + goto erreur; + } + abs[lngr++] = '/'; + strncpy(abs + lngr, argv[1], PATH_MAX - lngr); + /* strncpy remplit le reste du tampon avec des caractères NUL. + * si donc le dernier caractère n'est pas NUL, c'est que le + * chemin est trop long. */ + if (abs[PATH_MAX - 1] != '\0') { + errno = ENAMETOOLONG; + goto erreur; + } + + argv[1] = abs; + } + + /* ENVIC_SHELL a priorité sur SHELL. Si ni l'une ni l'autre n'existe, + * l'interpréteur spécifié par le macro IC_DEF est assigné à sh */ + if ((var = getenv("ENVIC_SHELL")) != NULL || + (var = getenv("SHELL")) != NULL) + sh = var; + else + sh = IC_DEF; + + /* Si la variable ENV existe déjà, on déplace son contenu vers + * ENVIC_ENV, sinon, il faut supprimer ENVIC_ENV pour ne pas que les + * programmes sourcent un fichier sans raison. */ + if ((var = getenv("ENV")) != NULL) + setenv("ENVIC_ENV", var, 1); + else + unsetenv("ENVIC_ENV"); + setenv("ENV", argv[1], 1); + + execve(sh, args, environ); + +erreur: + perror("bibic"); + return 1; +} + +static void +utilisation(void) +{ + fprintf(stderr, "UTILISATION: bibic [programme] [arg ...]\n"); +} diff --git a/envic.c b/envic.c @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2023 Selve <selve@asteride.xyz> - * - * Ce fichier fait partie de envic, publié sous la licence GPLv3 (seulement). - * Consultez le fichier LICENCE ou le site <https://www.gnu.org/licenses/> - * pour plus de détails. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <errno.h> -#include <limits.h> - -#define IC_DEF "/bin/sh" /* interpréteur de commandes par défaut */ - -extern char **environ; - -static void utilisation(void); - -int -main(int argc, char **argv) -{ - char *sh; /* interpéreteur de commande */ - char *var; /* pointeur vers variable d'environnement */ - char **args; /* arguments à passer à l'interpréteur */ - - if (argc < 2) { - utilisation(); - return 1; - } - - /* création des arguments à fournir à l'interpréteur - * 0: nom du script - * 1: option pour forcer l'interprétation en entrée standard, - * sert avant tout à indiquer à l'interpréteur de transférer les - * arguments au script - * 2: option pour indiquer à l'interpréteur de traiter les arguments qui - * suivent comme des arguments et non comme des options. Nécessaire - * pour qu'il soit possible de fournir des options aux scripts. - * …: arguments à fournir au script */ - if ((args = malloc(argc + 2)) == NULL) - goto erreur; - args[0] = argv[1]; - args[1] = "-si"; - args[2] = "--"; - args[argc + 1] = NULL; - - /* copier les arguments */ - while (argc > 2) { - args[argc] = argv[argc-1]; - argc--; - } - - /* POSIX stipule que le chemin contenu dans la variable ENV doit être - * absolu. Il faut assembler ce chemin. Ce chemin est formé par la - * concaténation du dossier courant, d'une barre oblique (/) et du - * fichier dans lequel se trouve le script. - * Bien sûr, nul besoin de tout cela si le chemin fourni est déjà un - * besoin absolu. */ - if (**argv != '/') { - static char abs[PATH_MAX]; /* chemin absolu */ - size_t lngr; /* longueur du chemin */ - - if (getcwd(abs, PATH_MAX) == NULL) - goto erreur; - lngr = strlen(abs); - /* il faut encore ajouter au moins deux caractères au chemin. */ - if (lngr + 2 >= PATH_MAX) { - errno = ENAMETOOLONG; - goto erreur; - } - abs[lngr++] = '/'; - strncpy(abs + lngr, argv[1], PATH_MAX - lngr); - /* strncpy remplit le reste du tampon avec des caractères NUL. - * si donc le dernier caractère n'est pas NUL, c'est que le - * chemin est trop long. */ - if (abs[PATH_MAX - 1] != '\0') { - errno = ENAMETOOLONG; - goto erreur; - } - - argv[1] = abs; - } - - /* ENVIC_SHELL a priorité sur SHELL. Si ni l'une ni l'autre n'existe, - * l'interpréteur spécifié par le macro IC_DEF est assigné à sh */ - if ((var = getenv("ENVIC_SHELL")) != NULL || - (var = getenv("SHELL")) != NULL) - sh = var; - else - sh = IC_DEF; - - /* Si la variable ENV existe déjà, on déplace son contenu vers - * ENVIC_ENV, sinon, il faut supprimer ENVIC_ENV pour ne pas que les - * programmes sourcent un fichier sans raison. */ - if ((var = getenv("ENV")) != NULL) - setenv("ENVIC_ENV", var, 1); - else - unsetenv("ENVIC_ENV"); - setenv("ENV", argv[1], 1); - - execve(sh, args, environ); - -erreur: - perror("envic"); - return 1; -} - -static void -utilisation(void) -{ - fprintf(stderr, "UTILISATION: envic [programme] [arg ...]\n"); -}