Institut des Sciences et Techniques des Yvelines (ISTY) |
English version of this page |
void SndLog(int PRIORITE, char *txt, ...) { FILE *LogF; va_list ap; int masque; time_t temps = time(NULL); char *chaine = asctime(gmtime(&temps)); chaine[strlen(chaine)-1] = ' '; /* On enleve le \n" */ va_start(ap,txt); if ((LogF = fopen("/dev/tty","w"))== NULL) return; /*fprintf(LogF,"%s: [Es] ",Prio[PRIORITE], chaine); */ vfprintf(LogF,txt,ap); va_end(ap); fclose(LogF); }Comme on peut le voir, nous avons même pensé à passer en paramètre un ordre de priorité pour l'information arrivante (NOTICE, WARNING, ERROR).
if ((pidfils=fork()) < 0) SndLog(ERROR,"serveur.c: Pas pu lancer fils\n"); else if (pidfils > 0) exit(0);
signal(SIGTERM,SIG_IGN); signal(SIGINT,(void (*)(int))Quitte); signal(SIGHUP,(void (*)(int))Quitte); signal(SIGQUIT,(void (*)(int))Quitte); signal(SIGSEGV,(void (*)(int))Quitte); signal(SIGBUS,(void (*)(int))Quitte); signal(SIGALRM,(void (*)(int))TraiteExpire);
int Quitte(int numsig) { char strtmp[256]; sprintf(strtmp,"%s/%s",REPNEWS,LOCKSERV); SndLog(WARNING,"Arret du Serveur. Interception SIGNAL %d\n",numsig); msgctl(idtmsg,IPC_RMID,0); unlink(strtmp); exit(1); }
for (i=0; i<=maxNum;i++){ switch(numeros[i]){ case 0: switch(Etat){ case 0: break; case 1: fprintf(fd," "); Etat = 0; break; case 2: fprintf(fd,"%d ",i-1); Etat = 0; break; } break; case -1: switch(Etat){ case 0: fprintf(fd,"%d",i); Etat = 1; break; case 1: fprintf(fd,"-"); Etat = 2; break; case 2: break; } break; } } if (Etat == 2) fprintf(fd,"%d",i);
Commandes Disponibles: ====================== (h)elp Affiche cette aide (l)ist Affiche les articles disponibles (non lus) (d) [nombre] Efface l'article/article courant (D)elete Efface tous les articles (q)uitte Quitte le programme en sauvant ou non les articles lus
/users/public/News> lecteur Lecteur -- 0.999 ============================================================= 0 Luc Stepniewski Message de bienvenue 1 root J verifie ! 2 Bob Bob Testeur Je pense que j'ai raison LECTEUR> q Aucuns fichiers modifies, pas besoin d'updater le fichier .forum /users/public/News>
char *Editeur, subject[256], reponse[1],nomfichier[80], entete[6*80], *buffer; struct passwd *infos;
CC = @CC@
/* DEFINES AUTO MODIFIE PAR LE PROGRAMME CONFIGURE */ #undef HAVE_UNISTD_H #undef HAVE_DIRENT_H #undef HAVE_SYS_NDIR_H #undef HAVE_SYS_DIR_H #undef HAVE_SETSID #undef HAVE_GETOPT Ces variables, après passage de configure donnent (sur Linux): /* DEFINES AUTO MODIFIE PAR LE PROGRAMME CONFIGURE */ #define HAVE_UNISTD_H 1 #define HAVE_DIRENT_H 1 /* #undef HAVE_SYS_NDIR_H */ #define HAVE_SYS_DIR_H 1 #define HAVE_SETSID 1 #define HAVE_GETOPT 1 Il n'y donc plus qu'à tester ces constantes dans le programme et l'adapter. Par exemple, si la focntion 'setsid()' n'existe pas sur le systeme (HAVE_SETSID), nous avons défini une alternative dans le fichier serveur.c #if HAVE_SETSID if (setsid() == -1){ #else if(setpgrp(getpid(),0) == -1) { #endif SndLog(ERROR,"Probleme execution du SETSID\n"); exit(1); }
/* Le POSTEUR */ #include#include "../config.h" #include #include #include #ifdef HAVE_UNISTD_H #include #include #endif #include #include #include #define VERSION "0.888" #define NOMPRG "POSTEUR" struct messbuf { long mtype; char texte[TAILLE]; }; /*************************************************************************/ int main(int argc,char *argv[]) { char *Editeur, subject[256], reponse[1],nomfichier[80], entete[6*80], *buffer; struct passwd *infos; time_t t; char *tzstr = "TZ=PST8PDT", *ptr; FILE *fsortie, *fentree; char repfichtemp[512], strtmp[256]; Bool Continuer, Recommence; int pID, nbLu; key_t msgcle; int drapeau,idtmsg,boucle; struct messbuf tampon; printf("\n========= %s %s =======\n\n\n",NOMPRG,VERSION); SndLog("Lancement Client %s %s\n",NOMPRG,VERSION); sprintf(strtmp,"%s/%s",REPNEWS,LOCKSERV); if (access(strtmp,F_OK)){ printf("Le serveur ne semble pas etre lance. Impossible de travailler!\n"); exit(1); } if ((Editeur=(char *)getenv("EDITOR")) == NULL){ printf("Pas d'editeur defini avec la commande EDITOR !\n"); exit(1); } /* Il faudrait retirer toutes les autres variables d'environnement pour la securite...... */ printf("Sujet: "); fgets(subject,256,stdin); /* PAS DE GETS ! SECURITE OBLIGE */ /* On choisi un nom de fichier maintenant */ sprintf(nomfichier,"/tmp/tmp%d",getpid()); umask(000); Continuer = False; do { if ((pID=fork())==0) { setuid(getuid()); setgid(getgid()); execl(Editeur,Editeur,nomfichier,NULL); printf("Erreur execution de %s\n",Editeur); SndLog(ERROR,"client: Erreur exec EDITOR: %s par %d\n",Editeur,getuid()); } wait(NULL); if (access(nomfichier,F_OK)) { printf("Fichier vide ! Rien a faire\n"); exit(0); } do { printf("e) Editer message s) Envoyer le message f) Oublier le message\n"); fflush(stdin); reponse[0] = getchar(); switch(reponse[0]) { case 's': Continuer = True; Recommence = False; break; case 'e': Continuer = False; Recommence = False; break; case 'f': unlink(nomfichier); printf("Message efface\n"); exit(1); default: printf("Mauvais choix !\n"); Recommence = True; break; } } while (Recommence); } while (!Continuer); /* On ouvre AVANT le fichier que l'on a tape, au cas ou il n'y */ /* serait plus, ou s'il est vide....On teste cela evite d'avoir a effacer */ /* le pre-message qui a deja ete ecrit dans le rep du serveur... */ sprintf(repfichtemp,"%s/final.%d",REPNEWS,getpid()); chmod(repfichtemp,00400|00200); if ((fsortie=fopen(repfichtemp,"w"))==NULL) { perror("ERREUR FICHIER #1"); fclose(fsortie); exit(1); } infos=getpwuid(getuid()); t = time(NULL); fprintf(fsortie,"From: %s (%s)\nDate: %sSubject: %s\n",infos->pw_name,infos->pw_gecos,asctime(gmtime(&t)),subject); buffer = (char *)malloc(sizeof(char)*4096); if ((fentree=fopen(nomfichier,"r"))==NULL) { perror("ERREUR FICHIER #2"); fclose(fentree); fclose(fsortie); exit(1); } nbLu = fread(buffer,sizeof(char),4096,fentree); while(!feof(fentree)) { fwrite(buffer,sizeof(char),nbLu,fsortie); nbLu = fread(buffer,sizeof(char),4096,fentree); } fwrite(buffer,sizeof(char),nbLu,fsortie); free(buffer); fclose(fsortie); fclose(fentree); unlink(nomfichier); /* On envoie le nom du fichier au serveur, avec TYPE=MSGSEND */ /* On installe une alarme, au cas ou le serveur ne repondrait pas */ /* recherche de la clef d'acces */ if ((msgcle = ftok("/etc",'Z')) == -1){ perror("ftok: pas de clef trouvee"); /* proposer de sauver mail dans un fichier */ exit(1); } /* Recherche de l'identifiant message */ if ((idtmsg = msgget(msgcle,0600)) == -1) { perror("msgget: identif."); /* proposer de sauver mail dans un fichier */ exit(1); } if (strlen(repfichtemp) >= 511){ printf("Longueur repertoire trop grande !\n"); exit(1); } strcpy(tampon.texte,repfichtemp); tampon.mtype = MSGSEND; if (msgsnd(idtmsg,&tampon,TAILLE,0) == -1){ printf("Erreur envoi du nom du fichier au serveur !\n"); exit(1); } printf("Message envoye\n"); boucle = True; bzero(tampon.texte,511); while (boucle) { /* On attend la confirmation par ACK maintenant */ if (msgrcv(idtmsg,&tampon,TAILLE,0,0) == -1) { perror("msgrcv"); exit(1); } if (!strncmp(tampon.texte,"ACK",3)) { boucle = False; printf("Accuse de reception bien recu !\n"); } else { printf("Erreur dans la file: %s\n",tampon.texte); } } printf("Bye\n"); }
/* Le SERVEUR */ #include#include "../config.h" #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #include #endif #include #include /* Configuration compatibilite structure DIR* */ #if HAVE_DIRENT_H # include # define NAMELEN(dirent) srtlen((dirent->d_name) #else # define dirent direct # define NAMELEN(dirent) (dirent->d_namlen) # if HAVE_SYS_NDIR_H # include # endif # if HAVE_NDIR_H # include # endif #endif #define VERSION "0.999 beta" #define NOMPRG "SERVEUR" struct messbuf { long mtype; char texte[TAILLE]; }; int idtmsg, nbjours; /*************************************************************************/ void usage() { printf("Syntaxe: %s -e X [-f]\n",NOMPRG); printf("\t- X est la duree en jours d'un message avant expiration\n"); printf("\t- -f (option) permet de recuperer directement de stdin le msg\n"); exit(1); } /*************************************************************************/ int Quitte(int numsig) { char strtmp[256]; sprintf(strtmp,"%s/%s",REPNEWS,LOCKSERV); SndLog(WARNING,"Arret du Serveur. Interception SIGNAL %d\n",numsig); msgctl(idtmsg,IPC_RMID,0); unlink(strtmp); exit(1); } /*************************************************************************/ /* Traitement des expirations */ /*************************************************************************/ void TraiteExpire(int i) { DIR *dirp; struct dirent *dp; struct stat *buf; int nb=0; SndLog(NOTICE,"Lancement Traitement Expiration"); dirp = opendir(REPNEWS); while ((dp = readdir(dirp)) != NULL) { if (strcmp("..",dp->d_name) && strcmp(".",dp->d_name)) { stat(dp->d_name,buf); if ((buf->st_mtime + (nbjours*3600*24)) > time(NULL)){ unlink(dp->d_name); nb++; } } } SndLog(NOTICE,"%d fichiers ont ete efface lors du traitement expiration\n",nb); signal(SIGALRM,(void (*)())TraiteExpire); } /*************************************************************************/ /* Traitement du fichier recu. */ /*************************************************************************/ int TraiteFichier(char *nomtemp) { FILE *fichFAT; char cheminFAT[256], nouveaunom[256]; unsigned long numero; sprintf(cheminFAT,"%s/%s",REPNEWS,MSGCOUNT); if ((fichFAT = fopen(cheminFAT,"r")) == NULL) numero = 0; else fread(&numero,1,sizeof(unsigned long),fichFAT); fclose(fichFAT); sprintf(nouveaunom,"%s/news.%d",REPNEWS,numero); SndLog(NOTICE,"Reception Texte -> nom: %s\n",nouveaunom); if (rename(nomtemp,nouveaunom)){ SndLog(ERROR,"serveur.c: Renommage Impossible tmp->%s\n",nouveaunom); unlink(nomtemp); return(1); } chmod(nouveaunom,0644); numero++; if ((fichFAT = fopen(cheminFAT,"w")) == NULL){ SndLog(ERROR,"serveur.c: Fichier data.fat impossible a ecrire"); exit(1); } fwrite(&numero,1,sizeof(unsigned long),fichFAT); fclose(fichFAT); return(0); } /*************************************************************************/ int main(int argc,char *argv[]) { char subject[256], reponse[1],nomfichier[80], entete[6*80], *buffer, strtmp[256]; struct passwd *infos; time_t t; char nomtemp[256]; Bool Continuer; int pID, nbLu, pFils; key_t msgcle; int drapeau,boucle; struct messbuf tampon; int c, pidfils, fd; extern char *optarg; extern int optind, optopt; printf("\n========= %s %s =======\n\n\n",NOMPRG,VERSION); SndLog(NOTICE,"Lancement du Daemon SERVEUR\n"); /* La personne a-t-elle les droits en ecriture sur le repertoire des News ? */ if (access(REPNEWS,W_OK)){ printf("Vous n'avez pas l'autorisation d'executer ce serveur !\n"); SndLog(ERROR,"Quelqu'un tente d'executer le serveur sans autorisation\n"); exit(1); } sprintf(strtmp,"%s/%s",REPNEWS,LOCKSERV); if (!access(strtmp,F_OK)) { SndLog(WARNING,"Le serveur est deja lance !\n"); printf("Erreur, un serveur est deja lance ou bien vous avez mal quitte la derniere fois.\n"); printf("Souhaitez-vous continuer ? (verifiez que le serveur est lance)(OoYy/Nn)\n"); c = toupper(getchar()); switch(c) { case 'N': exit(1); case 'Y': case 'O': break; default: exit(99); } } if (argc < 3) usage(); #if HAVE_GETOPT while ((c = getopt(argc, argv, ":e:f")) != -1) switch (c) { case 'e': nbjours = atoi(optarg); break; case 'f': printf("Entree standard activee\n"); SndLog(NOTICE,"Entree standard activee"); break; case '?': printf("Erreur, commande non reconnue: %c !!\n",optopt); exit(1); default: break; } #else nbjours = atoi(argv[2]); /* Assez approximatif.... :-( */ #endif if ((pidfils=fork()) < 0) SndLog(ERROR,"serveur.c: Pas pu lancer fils\n"); else if (pidfils > 0) exit(0); /* On est le FILS maintenant */ #if HAVE_SETSID if (setsid() == -1){ #else if(setpgrp(getpid(),0) == -1) { #endif SndLog(ERROR,"Probleme execution du SETSID\n"); exit(1); } /*chdir("/");*/ /* Pour etre sur que l'on est pas sur un FS monte */ umask(0); /* retire tous les modes heritages precedents */ if (creat(strtmp,0711) == -1){ SndLog(ERROR,"Erreur creation du fichier .lock !\n"); exit(1); } signal(SIGTERM,SIG_IGN); signal(SIGINT,(void (*)(int))Quitte); signal(SIGHUP,(void (*)(int))Quitte); signal(SIGQUIT,(void (*)(int))Quitte); signal(SIGSEGV,(void (*)(int))Quitte); signal(SIGBUS,(void (*)(int))Quitte); signal(SIGALRM,(void (*)(int))TraiteExpire); /* recherche de la clef d'acces */ if ((msgcle = ftok("/etc",'Z')) == -1){ perror("ftok: pas de clef trouvee"); SndLog(ERROR,"serveur.c: ftok: pas de clef trouvee"); exit(1); } /* Creation de l'identifiant message */ if ((idtmsg = msgget(msgcle,IPC_EXCL | IPC_CREAT | 0600)) == -1) { SndLog(ERROR,"serveur.c: msgget: identif."); perror("msgget: identif."); /* proposer de sauver mail dans un fichier */ exit(1); } alarm(nbjours*3600*24); Continuer = False; do { /* On attend ici un nom de fichier */ if (msgrcv(idtmsg,&tampon,TAILLE,MSGSEND,MSG_NOERROR) == -1) { SndLog(ERROR,"serveur.c: msgrcv\n"); unlink(strtmp); perror("msgrcv"); exit(1); } SndLog(NOTICE,"Reception du fichier %s\n",tampon.texte); strcpy(nomtemp,tampon.texte); TraiteFichier(nomtemp); bzero(tampon.texte,512); /* Reponse indiquant que l'on a bien recu (ou mal) le mnessage */ strcpy(tampon.texte,"ACK"); tampon.mtype = 'Z'; /* Tout mais pas MSGSEND */ if (msgsnd(idtmsg,&tampon,TAILLE,0) == -1){ SndLog(ERROR,"Erreur sortie fichier FAT contenant les numeros d'index...\n"); unlink(strtmp); exit(1); } SndLog(NOTICE,"ACK envoyé\n"); } while (!Continuer); /* Ne passe JAMAIS par ici ! */ msgctl(idtmsg,IPC_RMID,0); }
/* Le Lecteur */ #include#include "../config.h" #include #include #include #include #ifdef HAVE_UNISTD_H #include #include #endif /* Configuration compatibilite structure DIR* */ #if HAVE_DIRENT_H # include # define NAMELEN(dirent) srtlen((dirent->d_name) #else # define dirent direct # define NAMELEN(dirent) (dirent->d_namlen) # if HAVE_SYS_NDIR_H # include # endif # if HAVE_NDIR_H # include # endif #endif #define NOMPRG "Lecteur" #define VERSION "0.999" /* Ce fichier contient les ref vers les articles qui ONT ete lus */ /* On n'utilise pas le tilde car non supporte par tous les systemes */ #define NOMFORUM ".forum" int *numeros; int Courant = 0; Bool modifie = False; /*****************************************************************************/ unsigned long checkMax() { DIR *dirp; struct dirent *dp; unsigned long maximum; char *ptr; int i; maximum = 0; if ((dirp = opendir(REPNEWS))==NULL){ perror("opendir"); exit(1); } while((dp = readdir(dirp)) != NULL){ if (!strstr(dp->d_name,"news.")) continue; ptr = (char *)(dp->d_name+5); if((i=atoi(ptr)) > maximum) maximum = i; } closedir(dirp); return(maximum); } /*****************************************************************************/ /* Contruit une liste statique de nb a partir d'une chaine (celle du fichier */ /* .forum. Les numeros etant a -1, signifient qu'ils ont ete lus. */ void BuildListe(char *chaine, int maxNum) { char *Pos = chaine; int numdernier, num, i, nb; int multi, dansMulti = False; /* On se replace au debut */ Pos = chaine; while ((*Pos != '\0') && (*Pos != '\n')) { sscanf(Pos,"%d",&nb); if (nb >= maxNum) fprintf(stderr,"Attention:Vous utilisez un ancien .forum !\nNous vous conseillons de l'effacer..."); numeros[nb] = -1; while ((*Pos != ' ') && (*Pos != '-') && (*Pos != '\0')) Pos++; switch(*Pos) { case '\0': case '\n':if (dansMulti) for(i=multi+1; i <= nb;i++) numeros[i] = -1; break; case ' ': Pos++; if (dansMulti) { dansMulti = False; for(i=multi+1; i <= nb;i++) numeros[i] = -1; } break; case '-': Pos++; dansMulti = True; multi = nb; break; default: fprintf(stderr,"Caractere INCONNU: '%c' rencontre !\n"); free(numeros); exit(1); break; } } } /*****************************************************************************/ int select(const struct dirent *dp) { if (strstr(dp->d_name,"news.")) return(1); else return(0); } /*****************************************************************************/ void AfficheNews(void) { DIR *dirp; /* struct dirent *dp; */ int nume; char bidon[250], bidon2[150], from[50], sujet[150], *point; FILE *fd; struct dirent **namelist, **list; int num_entrees, i, j, k; if ((num_entrees = scandir(REPNEWS, &namelist,select, alphasort)) < 0) { fprintf(stderr, "Unexpected error\n"); exit(1); } if (num_entrees) { printf("=============================================================\n"); for (i=0, list=namelist; i d_name,'.')+1); if (numeros[nume] != -1) { sprintf(bidon,"%s/%s",REPNEWS,(*list)->d_name); if ((fd = fopen(bidon,"r"))==NULL){ printf("Erreur ouverture!\n"); exit(5); } fgets(bidon,150,fd); k = j = 0; while((bidon[k] != '(') && (bidon[k] != '\0')) k++; k++; while((bidon[k] != ')') && (bidon[k] != '\0')) { from[j++] = bidon[k]; k++; } from[j] = '\0'; fgets(bidon,150,fd); fgets(bidon,150,fd); point = (char *)index(bidon,':'); point++; fclose(fd); printf("%d\t%20s \t %s",nume,from,point); free(*list); } *list++; } free(namelist); } } /*****************************************************************************/ int DelArticle(char *question, int maxnum) { int i; if (strlen(question) == 2) { i = Courant; } else { question = (char *) question+2; i = atoi(question); if (i > maxnum) { /* printf("Pas de numero de ce genre ICI !(max:%d)\n",maxnum);*/ return(-1); } } numeros[i] = -1; return(i); } /*****************************************************************************/ void SaveListe(char *maison,int maxNum) { char strtmp[200]; FILE *fd; int i, Etat=0; if (!modifie) { printf("Aucuns fichiers modifies, pas besoin d'updater le fichier .forum\n"); exit(1); } printf("Voulez-vous updater votre fichier .forum ?\n"); fgets(strtmp,10,stdin); strtmp[0] = toupper(strtmp[0]); if (strtmp[0] == 'N'){ printf("Fichier %s NON update\n",NOMFORUM); exit(1); } sprintf(strtmp,"%s/%s",maison,NOMFORUM); if ((fd = fopen(strtmp,"w"))==NULL){ fprintf(stderr,"Erreur ouverture fichier %s\n",strtmp); exit(1); } /* On cherche maintenant TOUS les numeros ayant "-1" comme index. */ /* Tres utiles, les automates finis ! */ for (i=0; i<=maxNum;i++){ switch(numeros[i]){ case 0: switch(Etat){ case 0: break; case 1: fprintf(fd," "); Etat = 0; break; case 2: fprintf(fd,"%d ",i-1); Etat = 0; break; } break; case -1: switch(Etat){ case 0: fprintf(fd,"%d",i); Etat = 1; break; case 1: fprintf(fd,"-"); Etat = 2; break; case 2: break; } break; } } if (Etat == 2) fprintf(fd,"%d",i); printf("Fichier %s update !\n",NOMFORUM); fclose(fd); } /*****************************************************************************/ void usage(void) { printf("\nCommandes Disponibles:\n"); printf("======================\n"); printf("(h)elp \tAffiche cette aide\n"); printf("(l)ist \tAffiche les articles disponibles (non lus)\n"); printf("(d) [nombre]\tEfface l'article/article courant\n"); printf("(D)elete \tEfface tous les articles\n"); printf("(q)uitte \tQuitte le programme en sauvant ou non les articles lus\n"); } /*****************************************************************************/ int main(int argc, char *argv[]) { char *maison, strtmp[256], *ligneNumeros=NULL, *Pager, question[300], *ptr; FILE *fd; int i, maxNum=checkMax(); printf("%s -- %s\n\n",NOMPRG,VERSION); signal(SIGINT,SIG_IGN); if ((maison = (char *)getenv("HOME"))==NULL){ fprintf(stderr,"Variable d'environnement HOME absente !\n"); exit(1); } if ((Pager = (char *)getenv("PAGER"))==NULL) { fprintf(stderr,"Pas de variable d'environnement PAGER definie !\n"); exit(1); } /* VerifyLength(); Verification de la longueur */ sprintf(strtmp,"%s/%s",maison,NOMFORUM); if ((numeros = (int *)calloc(maxNum+1,sizeof(int))) == NULL){ fprintf(stderr,"Pas pu allouer\n"); exit(1); } if ((fd = fopen(strtmp,"r"))!= NULL){ if ((ligneNumeros = (char *)malloc(5*1000))==NULL){ fprintf(stderr,"Pas assez de memoire !\n"); fclose(fd); exit(1); } fgets(ligneNumeros,5*1000,fd); BuildListe(ligneNumeros,maxNum); /* Plus besoin du fichier ! */ fclose(fd); } AfficheNews(); while (True) { printf("LECTEUR> "); fgets(question,30,stdin); switch(question[0]){ case 'l': AfficheNews(); break; case 'q': SaveListe(maison,maxNum); exit(1); case 'd': i = DelArticle(question,maxNum); if (i != -1) { printf("Article %d efface.\n",i); modifie = True; } break; case 'h': usage(); break; case 'D': for(i=0; i<= maxNum;i++) numeros[i] = -1; printf("Tous les articles effaces !\n"); modifie = True; break; default: sscanf(question,"%d\n",&i); if ((i > maxNum) || isalpha(question[0])) { printf("Pas de ceci ICI !(max:%d)\n",maxNum); break; } sprintf(question,"%s/news.%d",REPNEWS,i); Courant = i; if (fork() == 0){ execl(Pager,Pager,question,NULL); perror("Erreur Execution PAGER"); exit(1); } wait(NULL); modifie = True; printf("%d\n",i); numeros[i] = -1; break; } } printf("Fin\n"); }
############################################################################ # Fichier MakeFile pour tous les modules. # ############################################################################ SRCDIR = @srcdir@ VPATH = @srcdir@ INSTALL = @INSTALL@ SERVEUR = serveur CLIENT = client LECTEUR = lecteur CC = @CC@ LIBS = -L. @LIBS@ LDFLAGS = @LDFLAGS@ #DEBUG = -g -Wall -DDEBUG CPPLAGS = -I. @CPPFLAGS@ $(DEBUG) # Si vous utilisez Linux sur processeur Intel, utilisez la # ligne suivante pour optimisations. # CFLAGS = -O4 -m486 -fomit-frame-pointer -malign-loops=2 -malign-jumps=2 -malign-functions=2 CFLAGS = -O2 SHELL = /bin/sh CLIOBJS = $(CLIENT).o SEROBJS = $(SERVEUR).o LECOBJS = $(LECTEUR).o DISTDEP = Makefile DISTFILES= src/$(CLIENT).c src/$(SERVEUR).c src/$(LECTEUR).c src/general.c \ config.h.in src/Makefile.in configure configure.in install-sh INSTALL \ README REPINSTALL = /users/public/News all: $(CLIENT) $(SERVEUR) $(LECTEUR) $(LECTEUR): $(LECOBJS) general.o $(CC) -o $(LECTEUR) $(LECOBJS) $(CFLAGS) general.o strip $(LECTEUR) client: $(CLIOBJS) general.o $(CC) -o $(CLIENT) $(CLIOBJS) $(CFLAGS) general.o strip $(CLIENT) $(SERVEUR): $(SEROBJS) general.o $(CC) -o $(SERVEUR) $(SEROBJS) $(CFLAGS) general.o strip $(SERVEUR) .c.o: $(CC) $(CFLAGS) $(CPPLAGS) $(SYSTEM) -c $< install: all @echo "Installation dans $(REPINSTALL)";\ if [ ! -d $(REPINSTALL) ]; then mkdir $(REPINSTALL); chmod a+rx $(REPINSTALL); fi rm -f $(REPINSTALL)/$(CLIENT) $(REPINSTALL)/$(SERVEUR) $(REPINSTALL)/$(LECTEUR) rm -rf $(REPINSTALL)/articles $(INSTALL) -m 711 $(SERVEUR) $(LECTEUR) $(REPINSTALL) $(INSTALL) -m 4711 $(CLIENT) $(REPINSTALL) if [ ! -d $(REPINSTALL)/articles ]; then \ mkdir $(REPINSTALL)/articles; \ fi chmod 755 /users/public/News/articles clean: rm -f *.o rm -f $(CLIENT) $(SERVEUR) $(LECTEUR) ../config.log ../config.status rm -f ../config.h ../config.cache Makefile dist: $(DISTDEP) nomdist=`sed -e '/define NEWSVERSION/!d' \ -e 's/[^0-9.]*\([0-9.a-z]*\).*/stepnews-\1/' -e q ../config.h`; \ rm -rf ../$$nomdist; \ mkdir ../$$nomdist; \ mkdir ../$$nomdist/src; \ mkdir ../$$nomdist/doc; \ for file in $(DISTFILES); do \ ln ../$$file ../$$nomdist/$$file \ || { echo copie ../$$file a la place; cp -p ../$$file ../$$nomdist/$$file; }; \ done; \ chmod -R a+rX ../$$nomdist; \ cd ..; \ tar -chvf $$nomdist.tar $$nomdist; \ rm -fr $$nomdist