(execve et EFAULT) Shell perso ;)

Shell perso ;) (execve et EFAULT) - C - Programmation

Marsh Posté le 22-05-2009 à 15:33:32    

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


Message édité par Elmoricq le 22-05-2009 à 18:27:34

---------------
Worldcraze 10loop
Reply

Marsh Posté le 22-05-2009 à 15:33:32   

Reply

Marsh Posté le 22-05-2009 à 18:28:45    

EFAULT est assez parlant : problème de gestion mémoire.
 
Poste ton code (en tout cas la partie intéressante), que l'on y jette un oeil.

Reply

Marsh Posté le 22-05-2009 à 18:40:55    

Il vau mieu que je poste le coterr parseur ou plutot execution ??

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


Merci beaucoup ;)

 

Édité par Elmoricq : ajout des balises [code]


Message édité par Elmoricq le 22-05-2009 à 18:42:45

---------------
Worldcraze 10loop
Reply

Marsh Posté le 22-05-2009 à 20:52:26    

Bah, c'est ça le problème avec les accès mémoire illégaux (surtout en écriture) : ça peut foirer n'importe où.
 
Mais avant même d'analyser ton code, connaitrais-tu l'existance de la fonction fnmatch(3) ? Ça t'éviteras quelques réinventage de roue inutile.
 

Reply

Marsh Posté le 22-05-2009 à 21:04:31    

a quoi pourrait bien me servir fnmatch ?
enfin je comprend son utilite mais pas dans mon code ^^ ;)


---------------
Worldcraze 10loop
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed