#include #include #include #define confile "checkserv.conf" //Fichier de conf #define SIZEBUF 512 typedef struct _conf conf; struct _conf { char host[SIZEBUF]; char port[5]; conf *prec; conf *suiv; }; //prototypage des fo nction pour que gcc sachent ce qu'elles prennent en parametre, et ce qu'elles retournent conf *checkconf(FILE*); //On va ici rcuperer les informations du serveur dans la conf //Ajoute un lment void ajout_val(conf **data, FILE *fd) { //On passe l'adresse du pointeur du maillon courant conf *newdata = checkconf(fd); //tu retournes un element deja mallocee, pas besoin de re alluer une structure if (newdata == NULL) { printf("error, maybe malloc failled ?"); exit(EXIT_FAILURE); } if (*data == NULL) // premier element de la liste !@# { } else { (*data)->prec = newdata; } newdata->suiv = *data; newdata->prec = NULL; *data = newdata; // data->prec = newdata; // newdata->suiv = data; // newdata->prec = NULL; // return(newdata); } //Affiche les donnes void affich_data(conf *data) { while (data != NULL) { printf("%s\n", data->host); printf("%s\n", data->port); data = data->suiv; } } //Nombre de serveur dans la config int nb_serv() { int nb = 0; FILE *fd; char *fileconf = confile; char *verif; char buf[SIZEBUF]; //Ouverture du fichier de conf fd = fopen(fileconf, "r"); if (fd == NULL) { perror("fopen failed "); exit(1); } while ((verif = fgets(buf, SIZEBUF,fd)) != NULL) { if ((strncmp(buf, "", 10) == 0)) { nb++; } } fclose(fd); return(nb); } //Rcupere les info pour chaque serveur conf * checkconf(FILE *fd) { char *verif; conf *data = (conf *) malloc(sizeof(conf)); char *buf = (char *) malloc(SIZEBUF * sizeof(char)); while (((verif = fgets(buf, SIZEBUF,fd)) != NULL) && (strncmp(buf, "", 10) != 0)) { //On recherche le host if (strncmp(buf, "host", 4) == 0) { //Une fois trouv, on avance de 5case buf = buf+5; //On supprime tous les blancs qu'il pourrait y avoir au debut while (strncmp(buf, " ", 1) == 0) { buf++; } //On ecrit dans la structure strncpy(data->host, buf, SIZEBUF); } //On recherche le port if (strncmp(buf, "port", 4) == 0) { //Une fois trouv, on avance de 5case buf = buf+5; //On supprime tous les blancs qu'il pourrait y avoir au debut while (strncmp(buf, " ", 1) == 0) { buf++; } //On ecrit dans la structure strncpy(data->port, buf, 5); } } return(data); } int main() { char *fileconf = confile; FILE *fd; conf *data; int nb; int i; //notre poiteur courrant sur la liste chainee data = NULL;// On le set a NULL, //pour qu'on puisse parcourir la liste chainee jusqu'a NULL //On attribue la mmoire a data qui contiendra le dbut de la liste chaine //data = (conf *) malloc(sizeof(conf)); //data->suiv = NULL; dans notre cas, le 1er pointeur est a NULL, // faire NULL->NULL == Segfault // // // if (data == NULL) // { // perror("malloc failed "); // exit(1); // } //On cherche pas a allouer le 1er pointeur de liste chainee // nb = nb_serv(); //Ca, ca t'a fait une ouverture de fichier qui sert a rien, //l'alocation est dynamique avec les listes chainneees //Ouverture du fichier de conf //perso je prefere // if ((fd = fopen(fileconf, "r")) == NULL) // { // perror("fopen"); // exit(EXIT_FAILURE); definis dans stdlib ou la bibliotheque ou se trouve exit(3) // } fd = fopen(fileconf, "r"); if (fd == NULL) { perror("fopen failed "); exit(1); } // tmp = checkconf(fd); for (i = 0; i < nb; i++) //evite de faire des tours de boucles - 1, ca fait faire un calcul en plus a chaque boucle { ajout_val(&data, fd); //on file l'adresse de data (pointeur de debut) et le fd qui nous sert a recuperer une // structure } affich_data(data); return(0); // quand un programme a bien fini il est sens toujours retourner 0 }