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 3293c154dabbe69f008fdcae348742eb71780fd2
parent e87900056a659f93fc1b7e938dde0a4f842d537b
Auteur: Selve <selve@asteride.xyz>
Date:   Thu,  7 Dec 2023 21:49:17 -0500

changement de nom pour envic

Diffstat:
MMakefile | 14+++++++-------
Aenvic.c | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Diusc.c | 95-------------------------------------------------------------------------------
3 files changed, 102 insertions(+), 102 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: iusc +all: envic -iusc: iusc.c - ${CC} ${COPT} -o "$@" iusc.c +envic: envic.c + ${CC} ${COPT} -o "$@" envic.c -install: iusc - install -m 755 iusc ${PREFIX}/iusc +install: envic + install -m 755 envic ${PREFIX}/envic uninstall: - rm -f ${PREFIX}/iusc + rm -f ${PREFIX}/envic clean: - rm -f iusc *.core + rm -f envic *.core diff --git a/envic.c b/envic.c @@ -0,0 +1,95 @@ +/* + * 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; + char *var; + + if (argc < 2) { + utilisation(); + return 1; + } + + /* argv[0] contient le nom du programme que sh exécutera, et argv[1] + * contient temporairement le chemin absolu vers ce programme. Une fois + * que ce chemini aura été assigné à la variable d'environnement ENV, il + * servira à contenir l'argument -s. */ + argv[0] = argv[1]; + + /* POSIX stipule que le chemin contenu dans la variable ENV doit être + * absolu. Ce chemin est formé par la concaténation du dossier courant + * et du fichier donné en premier argument, séparés par une barre + * oblique (/). */ + if (*argv[1] != '/') { + static char abs[PATH_MAX]; + size_t lngr; + + 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 rempli le reste du tampon avec des caractères NUL + * si 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; + } + + + if ((var = getenv("ENVIC_SHELL")) != NULL || + (var = getenv("SHELL")) != NULL) + sh = var; + else + sh = IC_DEF; + + if ((var = getenv("ENV")) != NULL) + setenv("ENVIC_ENV", var, 1); + else + unsetenv("ENVIC_ENV"); + setenv("ENV", argv[1], 1); + + argv[1] = "-s"; + + execve(sh, argv, environ); + +erreur: + perror("envic"); + return 1; +} + +static void +utilisation(void) +{ + fprintf(stderr, "UTILISATION: envic [programme] [arg ...]\n"); +} diff --git a/iusc.c b/iusc.c @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2023 Selve <selve@asteride.xyz> - * - * Ce fichier fait partie de iusc, 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 SHELL_DEF "/bin/sh" - -extern char **environ; - -static void utilisation(void); - -int -main(int argc, char **argv) -{ - char *sh; - char *var; - - if (argc < 2) { - utilisation(); - return 1; - } - - /* argv[0] contient le nom du programme que sh exécutera, et argv[1] - * contient temporairement le chemin absolu vers ce programme. Une fois - * que ce chemini aura été assigné à la variable d'environnement ENV, il - * servira à contenir l'argument -s. */ - argv[0] = argv[1]; - - /* POSIX stipule que le chemin contenu dans la variable ENV doit être - * absolu. Ce chemin est formé par la concaténation du dossier courant - * et du fichier donné en premier argument, séparés par une barre - * oblique (/). */ - if (*argv[1] != '/') { - static char abs[PATH_MAX]; - size_t lngr; - - 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 rempli le reste du tampon avec des caractères NUL - * si 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; - } - - - if ((var = getenv("IUSC_SHELL")) != NULL || - (var = getenv("SHELL")) != NULL) - sh = var; - else - sh = SHELL_DEF; - - if ((var = getenv("ENV")) != NULL) - setenv("IUSC_ENV", var, 1); - else - unsetenv("IUSC_ENV"); - setenv("ENV", argv[1], 1); - - argv[1] = "-s"; - - execve(sh, argv, environ); - -erreur: - perror("iusc"); - return 1; -} - -static void -utilisation(void) -{ - fprintf(stderr, "UTILISATION: iusc [programme] [arg ...]\n"); -}