All pastes #450228 Raw Edit

ben

public text v1 · immutable
·published 2007-04-20 18:04 UTC
rendered paste body
#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
}