commit 7c6dcd6061ea8ecfea2fc8067c0e72ae3c87c9b7
parent 00031f5d74f7784cd18f86aae2a898bd11ec2c8b
Auteur: Selve <selve@asteride.xyz>
Date: Sun, 3 Dec 2023 18:32:34 -0500
support pour les chemins relatifs
Le chemin contenu dans la variable ENV, qui pointe vers le ficher que source les
shell interactives, doit être absolu. iusc se charge maintenant de construire ce
chemin.
Diffstat:
M | iusc.c | | | 36 | ++++++++++++++++++++++++++++++++++++ |
1 file changed, 36 insertions(+), 0 deletions(-)
diff --git a/iusc.c b/iusc.c
@@ -8,8 +8,12 @@
#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;
@@ -28,9 +32,40 @@ main(int argc, char **argv)
return 1;
}
+ /* arguments de sh */
args[0] = argv[1];
args[1] = NULL;
+ /* 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] != '/') {
+ 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;
+ }
+ printf("test: %lu\n", strlen(abs));
+ abs[lngr++] = '/';
+ strncpy(abs + lngr, args[0], 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;
+ }
+
+ args[0] = abs;
+ }
+
if ((var = getenv("IUSC_SHELL")) != NULL ||
(var = getenv("SHELL")) != NULL)
sh = var;
@@ -45,6 +80,7 @@ main(int argc, char **argv)
execve(sh, args, environ);
+erreur:
perror("iusc");
return 1;
}