ce que tu fais sur le main thread me fait pense a ca :
TU AIMES ?
- include "commande.h"
- include <stdio.h>
- include <stdlib.h>
- include <string.h>
- include <errno.h>
- include <fcntl.h>
- include <unistd.h>
- include <memory.h>
- include "commandes-internes.h"
- include "psh.h"
/* REDIRECTION_MAX_FD doit etre egal au max de STD*_FILENO */
- define REDIRECTION_MAX_FD ( 2)
struct commande
{
struct tache *tache;
int argc;
char **argv;
char **envp;
int redir[REDIRECTION_MAX_FD + 1];
int fd_a_fermer;
};
struct commande *
commande_creer ( void)
{
struct commande *com = memory_alloc ( sizeof *com);
int i;
com->argc = 0;
com->argv = NULL;
com->envp = NULL;
for ( i = 0; i <= REDIRECTION_MAX_FD; i++)
{
com->redir[i] = i;
}
com->fd_a_fermer = -1;
return com;
}
void
commande_detruire ( struct commande *com)
{
memory_free ( com->argv);
memory_free ( com);
}
void
commande_affecter_a_tache ( struct commande *com, struct tache *t)
{
com->tache = t;
}
void
commande_mettre_parametres ( struct commande *com, int argc, char **argv)
{
int i;
com->argc = argc;
com->argv = memory_alloc ( (argc + 1) * sizeof *com->argv);
for ( i = 0; i < argc; i++)
com->argv[i] = argv[i];
com->argv[i] = NULL;
}
int
commande_lexeme_est_redirection ( const char *lexeme)
{
return ! strcmp ( lexeme, "<") || ! strcmp ( lexeme, ">") ||
! strcmp ( lexeme, "2>") || ! strcmp ( lexeme, ">>");
}
void
commande_mettre_redirection ( struct commande *com, const char *redir,
const char *fichier)
{
}
void
commande_mettre_tube_en_entree ( struct commande *com, int fd[2])
{
}
void
commande_mettre_tube_en_sortie ( struct commande *com, int fd[2])
{
}
int
commande_est_redirigee ( struct commande *com)
{
int i;
for ( i = 0; i <= REDIRECTION_MAX_FD; i++)
if ( com->redir[i] ! = i)
return 1;
return 0;
}
int
commande_est_interne ( struct commande *com)
{
return com->argc > 0 && cmd_interne_reconnaitre ( com->argv[0]) ! = NULL;
}
void
commande_fermer_fichiers_parent ( struct commande *com)
{
}
void
commande_lance_interne ( struct commande *com)
{
cmd_interne cmd_interne = cmd_interne_reconnaitre ( com->argv[0]);
psh_valeur_derniere_commande = cmd_interne ( com->argc, com->argv);
if ( psh_valeur_derniere_commande ! = EXIT_SUCCESS)
perror ( com->argv[0]);
return;
}
void
commande_exec ( struct commande *com)
{
if ( com->argc == 0)
return;
if ( commande_est_interne ( com))
{
commande_lance_interne ( com);
exit ( psh_valeur_derniere_commande);
}
/* perror ( com->argv[0]);
* exit ( EXIT_FAILURE);
*/
}