/* Gestion d'un index telephonique (pour etre server RPC avec rpcgen) fichier donnee: lignes ascii de la forme "nom telephone(entier)" */ #include #include #include "index.h" #define FILENAME "index.data" #define NOM_FICHIER "index.data" /* Recherche de la ligne contenant le nom correspondant... */ static ligne entree; static char buf[256]; static chained_list list; struct svc_req request; ligne * recherche_1_svc ( char ** nom, struct svc_req *request ) { FILE *f; int t; entree.nom = (char *)buf; entree.tel = 0; if ((f = fopen (NOM_FICHIER, "r")) == NULL) {perror ("svc: fopen ");} else { while ( fscanf(f,"%s%d", buf, &t ) != EOF ) { if ( !strcmp( *nom, buf) ) { entree.tel = t; fclose ( f ); return ( &entree ); } } fclose ( f ); } /* entry not found: return empty string */ entree.nom[0] = '\0'; return ( &entree ); } /* Ajout d'une ligne si pas deja presente... */ static int status_ajout; int * ajout_1_svc ( ligne * a_ajouter, struct svc_req *request ) { FILE *f; ligne *test; status_ajout = 0; test = recherche_1_svc ( &(a_ajouter->nom), request ); if ( ! (test->tel) ) { f = fopen ( NOM_FICHIER, "a" ); fprintf (f, "%s %d\n", a_ajouter->nom, a_ajouter->tel); fclose(f); status_ajout = 1; } return ( &status_ajout ); } /* Affiche une chaine de caractere... */ void * affiche_1_svc ( char ** s, struct svc_req *request ) { printf ( "%s\n", *s ); fflush (stdout); return ((void *)1); } void free_chained_list(chained_list *liste) { if(liste !=NULL){ chained_list *iterator; while(liste->next != NULL) { iterator = liste; liste = liste->next; free(iterator); } } } chained_list *listage_1_svc (void *rien2, struct svc_req *request) { chained_list *iterator; free_chained_list(&list); FILE *f; int tel; if ((f = fopen (FILENAME, "r")) == NULL) {perror ("Server : problem while opening file "); exit(0);} else { if( fscanf(f, "%s%d", buf, &tel) !=EOF) { list.line.nom = malloc(sizeof(char)*strlen(buf)); memcpy(list.line.nom, buf, strlen(buf)); list.line.tel = tel; iterator = &list; printf("%s\n" , iterator->line.nom); while( fscanf(f, "%s%d", buf, &tel) != EOF ) { iterator->next = malloc(sizeof(chained_list)); iterator = iterator->next; iterator->line.nom = malloc(strlen(buf)); memcpy(iterator->line.nom, buf, strlen(buf)); iterator->line.tel = tel; printf("%s\n" , iterator->line.nom); } } fclose(f); } return &list; } void * stop_1_svc(char **mdp, struct svc_req *request) { printf("Shutting down %s !\n", mdp[0]); if ( !strcmp(mdp[0] , "now" ) ) { exit(0); } else return (void *)0; }