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);
} |
Partager