IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

(execve et EFAULT) Shell perso ;)


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Points : 8
    Points
    8
    Par défaut (execve et EFAULT) Shell perso ;)
    Bonjour,
    je suis actuellement entrain de coder un shell mais je rencontre un problème assez délicat.

    mon shell exécute toutes les binaires (ls,...)
    j'ai coder un parseur pour gérer le cas ou dans ma chaine de caractère comporte une etoile.

    ex:
    >> ls *.c
    mon parseur recupere le "mot" *.c et le remplace par tout les .c du fichier courant (jusque la pas de probleme , je print la ligne est elle est correct.)
    cependant execve m'envoi l'erreur ERRNO 14 soit EFAULT.

    cet erreur correspond a
    EFAULT
    L'argument fichier pointe en dehors de l'espace d'adressage accessible.

    apres plusieur teste je me rend compte que mon shell n'execute :
    ni "ls *.c"
    ni ls ma*.*
    mais qui gere bien "ma*.c"

    Quelqu'un aurait-il une idee ?

    Cordialement
    Leoz

  2. #2
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    salut !
    pour pouvoir t'aider il faudrait qu'on voit ton code. on peut pas deviner tes erreurs ^^
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    et voila voili voilou les bouts de code concerner ^^

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    char    *parse_star(char *str)
    {
      char  **tabl;
      char  **retab;
      char  *str2;
      int   i;
      int   e;
     
      e = 0;
      i = 0;
      str = space(str);
      tabl = str_to_wordtab(str, " ");
      retab = xmalloc(sizeof(*retab) * strlen(str));
      while (tabl[i] != NULL)
        {
          retab[e] = star(tabl[i]);
          e++;
          i++;
        }
      retab[e] = NULL;
      str2 = tab_to_str(' ', retab);
      return (str2);
    }
     
     
    -------------------------------------------------------------
     
    static void     exec_wait(t_info *info)
    {
      int           statut;
      int           i;
     
      i = 0;
      if (info->nb_wait > 0)
        while (i++ < info->nb_wait)
          wait(&statut);
      info->nb_wait = 0;
    }
     
    int             execute(t_mysh *mysh)
    {
      t_pipe        *lpipe;
      t_cmd         *lcmd;
      t_cmp         cmp;
     
      cmp.i = 0;
      lcmd = mysh->icmd->begin;
      while (cmp.i <  mysh->icmd->len_list)
        {
          cmp.j = 0;
          mysh->info->flag = FALSE;
          lpipe = lcmd->begin_pipe;
          mysh->info->std = lcmd->len_list_pipe;
          while ((cmp.j < lcmd->len_list_pipe) || (mysh->info->std > 0))
            {
              check_cmd(epur_str(lpipe->table_pipe), mysh);
              mysh->info->flag = TRUE;
              lpipe = lpipe->next;
              mysh->info->std--;
              cmp.j++;
            }
          exec_wait(mysh->info);
          lcmd = lcmd->next;
          cmp.i++;
        }
      return (TRUE);
    }
    -------------------------------------------------------------------
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <errno.h>
     
    # define        MSG_ERROR_EXECVE        "2: execve c'est mal terminer!\n"
     
    int                     xexecve(char *bin_path, char **bin_cmd)
    {
      extern        char    **environ;
      int                   fd;
     
      fd = 0;
      fd = execve(bin_path, bin_cmd, environ);
      if (fd == (-1))
        {
          printf("errno => %i\n", errno);
          write(2, MSG_ERROR_EXECVE, strlen(MSG_ERROR_EXECVE));
          exit(0);
        }
      return (fd);
    }

  4. #4
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    pourrais tu indenter ton code ? et me dire ou est passée la fonction main ! ^^
    je suppose que c'est dans le main que tu appel xexecve ?
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    en fait c'est un shell complet recoder par nos soins (etudiant d'une ecole d'info), je pensse qu'il serait plus judicieux de te fournir un .rar plutot que fichier par fichier ^^

    allez un petit main juste pour te montrer ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    int             main()
    {
      t_mysh        *mysh;
      char          area[BUF_SIZE + 1];
      char          *term;
     
      mysh = xmalloc(sizeof(*mysh));
      malloc_all(mysh);
      if ((term = check_error()) != NULL)
        init_cap(mysh->cap, area);
      signal(SIGWINCH, show_win_size);
      path_search(mysh->env);
      add_old_story(mysh->story, ARG_STORY);
      wait_cmd(mysh, mysh->info);
      xtputs(mysh->cap->maudible_bell, 1, my_outc);
      free_all(mysh);
      return (EXIT_SUCCESS);
    }
    Ps: je peut pas indenter dans les balises quote...

  6. #6
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Citation Envoyé par leoz2007 Voir le message
    Ps: je peut pas indenter dans les balises quote...
    alors utilse la balise CODE ^^ c'est le #
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  7. #7
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    ca ne me dis toujours pas où se fais l'appel à execve...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  8. #8
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    le top serait que tu mette un breakpoint sur execve et que tu me donne le backtrace.
    ce que je veux savoir en fait, ce sont les arguments que tu passe à execve
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    tu veu mon rar ?

    je l'apelle dans wait_cmd
    mais comme je te dis mon rar fait 12mo.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "mysh.h"
    #include "cmd.h"
     
     
    int     wait_cmd(t_mysh *mysh, t_info *info)
    {
      while (info->continu == TRUE)
        {
          mputstr(info->prompt);
          init_index_struct_cmd(mysh->icmd);
          mysh->story->index = 0;
          init_index_struct_list(mysh->story);
          mysh->cmd = get_line(mysh);
          mysh->cmd = parse_star(mysh->cmd);
          printf("mysh->cmd (star) => %s\n", mysh->cmd);
          mysh->cmd = parse_exclamation(mysh->cmd, mysh);
          add_list_story(mysh->story, mysh->data->cmd);
          printf("mysh->cmd :%s\n", mysh->cmd);
          if (analyse(mysh, mysh->cmd) == TRUE)
            execute(mysh);
          free_list_cmd(mysh->icmd);
        }
      mputstr("Good Bye!\n");
      return (EXIT_SUCCESS);
    }

  10. #10
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Citation Envoyé par leoz2007 Voir le message
    tu veu mon rar ?
    si le code compile, oui.
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  11. #11
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    et vire les binaires de ton archive...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  12. #12
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    mon acces ftp est impossible depuis l'ecole une idee pour t'envoyer sa, en piece jointes par email si tu veu bien me communiquer ton mail en pv

    sinon je regarde du coter de google code search mais toutes ;a promo check les files uploader

  13. #13
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    essaye ca:
    http://dl.free.fr/
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  14. #14
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    http://dl.free.fr/iBo1echoe

    regarde tes mp
    Merci

  15. #15
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    il semblerai qu'une fois que * ai été interpreté ton programme plante dans tab_to_str:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    str = xmalloc(sizeof(char) * (tablen(tabb) + 1));
    memset(str, '\0', strlen(str));
    str viens d'etre alloué, tu ne peut pas recuperer sa taille avec strlen
    replace
    par:
    ca devrait regler le probleme...s'il n'y en a pas d'autres...j'ai pas testé, mais en tout cas, c'est ce qui le faisait planter
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  16. #16
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    Malheureusement non, il doit y avoir plusieurs problème :/

    il suffit de passer les argument ls -l -a -G -d (par exemple)
    et non pas ls -laGd

    ls -l -a -G -d me pete une erreur errno 14...

    Merci pour ton message deja

  17. #17
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    il semblerai que ca vienne de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    check_cmd(epur_str(lpipe->table_pipe), mysh);
    dans execute.c

    il est tard je regarderai ce weekend.
    bon courage !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  18. #18
    Futur Membre du Club
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Points : 8
    Points
    8
    Par défaut
    merci c'est gentil
    moi je pars pour 72h de code intensse

    Bonne nuit

  19. #19
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    il semblerai aussi qu'il y ai un problème de saisie:
    si tu tape:
    et que tu essaie d'effacer, tu n'y arrivera pas !
    sinon je regarde pour le second bug...
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

Discussions similaires

  1. Lancer un processus depuis un shell perso
    Par kanadianDri3 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 03/08/2011, 09h49
  2. Creation d'un shell probleme avec execve
    Par Mouch2 dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2011, 17h37
  3. Réponses: 4
    Dernier message: 07/12/2002, 15h24
  4. D6 Perso et Gen d'état
    Par diam's dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 02/12/2002, 17h58
  5. [Kylix] probleme pour lancer le shell
    Par miky dans le forum EDI
    Réponses: 5
    Dernier message: 13/08/2002, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo