Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1538 connectés 

  FORUM HardWare.fr
  Programmation
  C

  (execve et EFAULT) Shell perso ;)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

(execve et EFAULT) Shell perso ;)

n°1887039
leoz2004
Posté le 22-05-2009 à 15:33:32  profilanswer
 

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
mood
Publicité
Posté le 22-05-2009 à 15:33:32  profilanswer
 

n°1887071
Elmoricq
Modérateur
Posté le 22-05-2009 à 18:28:45  profilanswer
 

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.

n°1887075
leoz2004
Posté le 22-05-2009 à 18:40:55  profilanswer
 

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
n°1887107
tpierron
Posté le 22-05-2009 à 20:52:26  profilanswer
 

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.
 

n°1887110
leoz2004
Posté le 22-05-2009 à 21:04:31  profilanswer
 

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


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  (execve et EFAULT) Shell perso ;)

 

Sujets relatifs
Aménager un shell pour gérer les redirections > et 2>Exécuter un script SHELL grace au CGI
Installer une application sur un serveur grace à un Shell sous SolarisRécupérer une variable du shell [fpc lazarus debian]
Comment créer un espace perso pour les visiteurs sur mon site ?Question pour transmettre des varibles à un scritp shell
[Creation d'un Shell] Simuler un environ avec env -i[Shell/ksh] Log telnet
[SHELL] envoie de mail 
Plus de sujets relatifs à : (execve et EFAULT) Shell perso ;)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR