commit e87900056a659f93fc1b7e938dde0a4f842d537b
parent cf4085a0cd788bf3718350421c19c50e45d7ff00
Auteur: Selve <selve@asteride.xyz>
Date: Sun, 3 Dec 2023 19:32:58 -0500
transfère des arguments
iusc transfère maintenant les arguments à partir d'argv[2] au shell.
Diffstat:
M | iusc.c | | | 25 | ++++++++++++++----------- |
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/iusc.c b/iusc.c
@@ -24,23 +24,24 @@ int
main(int argc, char **argv)
{
char *sh;
- char *args[2];
char *var;
- if (argc != 2) {
+ if (argc < 2) {
utilisation();
return 1;
}
- /* arguments de sh */
- args[0] = argv[1];
- args[1] = NULL;
+ /* 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 (*args[0] != '/') {
+ if (*argv[1] != '/') {
static char abs[PATH_MAX];
size_t lngr;
@@ -52,9 +53,8 @@ main(int argc, char **argv)
errno = ENAMETOOLONG;
goto erreur;
}
- printf("test: %lu\n", strlen(abs));
abs[lngr++] = '/';
- strncpy(abs + lngr, args[0], PATH_MAX - 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 */
@@ -63,9 +63,10 @@ main(int argc, char **argv)
goto erreur;
}
- args[0] = abs;
+ argv[1] = abs;
}
+
if ((var = getenv("IUSC_SHELL")) != NULL ||
(var = getenv("SHELL")) != NULL)
sh = var;
@@ -78,7 +79,9 @@ main(int argc, char **argv)
unsetenv("IUSC_ENV");
setenv("ENV", argv[1], 1);
- execve(sh, args, environ);
+ argv[1] = "-s";
+
+ execve(sh, argv, environ);
erreur:
perror("iusc");
@@ -88,5 +91,5 @@ erreur:
static void
utilisation(void)
{
- fprintf(stderr, "UTILISATION: iusc [programme]\n");
+ fprintf(stderr, "UTILISATION: iusc [programme] [arg ...]\n");
}