salut à tous,

Je souhaite utiliser (sous linux) l'appel execl définit comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
int execv(const char *application, const char * argv[]);
Comme je dois faire cet appel un nombre important de fois, je le place dans une procédure "iptables_call" à laquelle je transmet les paramètres :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
int iptables_call(const char *);
 
int main()
{
...
if (iptables_call("-t filter -F")) return(1);
...
}
Donc le problème c'est que j'ai en entrée une chaîne de caractères séparées par des espaces alors qu'il faut que je transmette une série de chaîne de caractères sans espace. Donc voilà mon idée :
1) comme la chaîne en entrée est constante, je la copie dans une zone mémoire allouée dynamiquement (variable copied_chain)
2) Je boucle maintenant sur la longueur de copied_chain et à chaque fois que je trouve un espace :
a) je remplace l'espace par 0 pour simuler la fin de la chaîne
b) j'utilise un char ** list_parameters pour le passage de la liste à execl (le 2ème paramètre) et donc quand je tombe sur un espace dans copied_chain, je realloc le char** pour lui dire qu'il y a un pointeur en plus et faire pointer vers le caractère suivant l'espace
3) je finis par un pointeur NULL pour clotûrer la liste comme préciser dans mes références pour execl
4) je fais en gros mon appel execl.

Maintenant voilà le code :
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
int iptables_call(const char *iptables_parameters)
{
  pid_t pid_son;
  char *copied_chain;
  int long_param, nb_param,i;
  char **list_pointers, **new_list_pointers;
  char *iptables_chain="/sbin/iptables";
  
 // copie de la chaine
  long_param=strlen(iptables_parameters);
  copied_chain=(char *)(malloc(long_param*sizeof(char)));
  if (copied_chain==NULL) {
    fprintf(stderr,"Error : Not enough memory !\n");
    return(1);
  }
  strcpy(copied_chain,iptables_parameters);
 // il faut initialiser la chaine avec "/sbin/iptables" d'abord en sus, et le début de copied_chain
  nb_param=2;
  list_pointers=(char **)(malloc(nb_param*sizeof(char *)));
  if (list_pointers==NULL) {
    fprintf(stderr,"Error : Not enough memory !\n");
    return(1);
  }
  list_pointers[0]=iptables_chain;
  list_pointers[1]=copied_chain;
  i=0;
 //boucle sur la longueur
  while (i<long_param) {
 // test si c'est un espace
    if (copied_chain[i]==' ') {
      copied_chain[i]=0;
      nb_param++;
 // affichage de debogage
      fprintf(stdout,"%s\n",iptables_chain);
 // realloc
      new_list_pointers=(char **)(realloc(list_pointers,nb_param*sizeof(char *)));
 // affichage de debogage
      fprintf(stdout,"%s\n",list_pointers[1]);
      if (new_list_pointers==NULL) {
    fprintf(stderr,"Error : Not enough memory !\n");
    return(1);
      }
      list_pointers=new_list_pointers;
 // initialiser le nouveau pointeur
      list_pointers[nb_param-1]=copied_chain+i+1;
    }
    i++;
  }
 // sortie temporaire en attendant que la chaîne soit bien initialisée
  fprintf(stdout,"ici\n");
  return(1);
   // add NULL at the end
  nb_param++;
  new_list_pointers=(char **)(realloc(list_pointers,nb_param*sizeof(char *)));
  if (new_list_pointers==NULL) {
    fprintf(stderr,"Error : Not enough memory !\n");
    return(1);
  }
  list_pointers=new_list_pointers;
  list_pointers[nb_param-1]=NULL;
 // mise en place de l'appel execl
  pid_son=fork();
  if (pid_son==-1) {
    fprintf(stderr,"Error : New process cannot be created !\n");
    return(1);
  }
  if (!pid_son) {
     /* prototype : int execv(const char *application, const char * argv[]); */
    execv("/sbin/iptables",list_pointers);
  }
  else wait(NULL);
  free(list_pointers);
  free(copied_chain);
  return(0);
}
Mon compilateur ne me donne aucune erreur ni warning mais quand je lance le programme, j'ai ça comme affichage :
/sbin/iptables
-t
/sbin/iptables
*** glibc detected *** free(): invalid next size (normal): 0x0804d030 ***
Abandon
Donc sur le premier espace, ça fontionne vu qu'il affiche "-t" mais il bloque sur le deuxième realloc.
Là j'avoue que je sèche complètement, est-ce que quelqu'un a une idée ? Une simple explication de mon erreur me suffirait.
Merci d'avance