#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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, "</Serveur>", 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, "</Serveur>", 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
}