Exemple #1
0
int initTest(struct donneesPub *dp){
   
    P("Maitre ouvre %s\n",dp->fname);
    dp->fd = open(dp->fname, OPENFLAGS, MANDMODES);
    if (dp->fd < 0) {
        perror("lock test : can't open test file :");
        terminer(1);
    }
    P("fd=%d\n", dp->fd);
    return 0;
}
Exemple #2
0
void * esclave(void *donnees)
{
    struct donneesFils *df;
    int i, cmd,a, resultat,ftest;
    int maitre;
    struct flock request;
    char tmp[16];
    char *phraseTest="L'écriture a réussi";
    int len;
    enum etat_t etat;
    
    len=strlen(phraseTest);
    df=(struct donneesFils *)donnees; 
    i=df->dpr->whoami;
    P("Escalve n=%d\n", i);
    cmd=df->dp->lclnt[i][0];
    maitre=df->dp->maitre[1];
    etat=SYNC;
    errno=0;
    memset(tmp,0,16);
    while(1){
        switch(etat){
            case SELECT: /* NOT reached */
            case SYNC:
                if(read(cmd,&etat,sizeof(int))<0){
                    perror("Lecture du pipe \n");
                    exit(1);
                }
                P("State :%d\n", etat);
                continue;
            case RDONLY:
                /* On tente de lire un fichier */
                P("TEST READ ONLY %d\n", RDONLY);
                if((ftest=open(df->dp->fname, O_RDONLY|O_NONBLOCK))<0){
                    resultat=ECHEC;
                    etat=RESULTAT;
                    if(df->dp->verbose)
                        perror("Open:");
                    continue;
                }
                P("fd=%d\n",ftest);
                a=read(ftest, tmp, 16);
                if(a<16)
                    resultat=ECHEC;
                else
                    resultat=SUCCES;
                etat=RESULTAT;
                continue;
                        
            case WRONLY:
                /* On tente de lire un fichier */
                P("TEST WRITE ONLY %d\n", WRONLY);
                if((ftest=open(df->dp->fname, O_WRONLY|O_NONBLOCK))<0){
                    resultat=ECHEC;
                    etat=RESULTAT;
                    if(df->dp->verbose)
                        perror("Open read only:");
                    continue;
                }
                P("fd=%d\n",ftest);
                if(write(ftest, phraseTest, len)<len)
                    resultat=ECHEC;
                else
                    resultat=SUCCES;
                etat=RESULTAT;
                continue;

            case LOCK: /* NOT reached */
                
                
            case READLOCK:
                /* On essaie de lire une section lockée en lecture sur le fichier */
                P("READ LOCK %d\n", F_RDLCK);
                if((ftest=open(df->dp->fname, O_RDONLY|O_NONBLOCK))<0){
                    resultat=ECHEC;
                    etat=RESULTAT;
                    if(df->dp->verbose)
                        perror("Open read-write:");
                    continue;
                }

                P("fd=%d\n",ftest);
                /* Lock de l'ensemble du fichier*/
                request.l_type=F_RDLCK;
                request.l_whence = SEEK_SET;
                request.l_start =  0;
                request.l_len = 0;
                
                if(fcntl(ftest, F_SETLK, &request)<0){
                    if(df->dp->verbose || errno != EAGAIN)
                        perror("RDONLY: fcntl");
                    resultat=ECHEC;
                }
                else
                    resultat=SUCCES;
                etat=RESULTAT;
                continue;

            case WRITELOCK:
                /* On essaie d'écrire  le fichier */
                P("WRITE LOCK %d\n", F_WRLCK);
                if((ftest=open(df->dp->fname, O_WRONLY|O_NONBLOCK))<0){
                    resultat=ECHEC;
                    etat=RESULTAT;
                    if(df->dp->verbose)
                        perror("\nOpen:");
                    continue;
                }
                /* Lock de l'ensemble du fichier*/
                P("fd=%d\n",ftest);
                request.l_type=F_WRLCK;
                request.l_whence = SEEK_SET;
                request.l_start =  0;
                request.l_len = 0;
                
                if(fcntl(ftest, F_SETLK, &request)<0){
                    if(df->dp->verbose || errno != EAGAIN)
                        perror("\nWRONLY: fcntl");
                    resultat=ECHEC;
                }
                else                    
                    resultat=SUCCES;
                etat=RESULTAT;
                continue;

            case BYTELOCK_READ:
                etat=BYTELOCK;
                continue;

            case BYTELOCK_WRITE:
                etat=BYTELOCK;
                continue;
                
            case BYTELOCK:
                /* On se met en attente de la section à locker. L'ensemble de la structure est 
                 * donnée par le maitre et transmise par le tube.
                 */
                P("WRITE LOCK %d\n", etat);
                if(read(cmd, &request, sizeof(struct flock))<0){
                    perror("Pipe : read error");
                    terminer(1);
                }

                if((ftest=open(df->dp->fname, O_RDWR|O_NONBLOCK))<0){
                    resultat=ECHEC;
                    etat=RESULTAT;
                    if(df->dp->verbose)
                        perror("\nOpen:");
                    continue;
                }
                if(fcntl(ftest, F_SETLK, &request)<0){
                    if(df->dp->verbose || errno != EAGAIN)
                        perror("\nBTLOCK: fcntl");
                    resultat=ECHEC;
                    etat=RESULTAT;
                    continue;
                }
                /* On change le caractère à la place donnée pour vérification */
                a=lseek(ftest, request.l_start,SEEK_SET);
                write(ftest,"=",1);
                resultat=SUCCES;
                etat=RESULTAT;
                continue;
                 
            case RESULTAT:
                if(resultat==SUCCES)
                    write(0,"=",1);
                else
                    write(0,"x",1);
                P("RESULTAT: %d\n", resultat);
                if(write(maitre,&resultat,sizeof(int))<0){
                    P("Slave num %d\n", df->dpr->whoami);
                    perror("Slave\n");
                }
                
                etat=SYNC;
                continue;

            case CLEAN:
                close(ftest);
                /* Send CLEAN Ack */
                if(write(maitre,&resultat,sizeof(int))<0){
                    P("Slave num %d\n", df->dpr->whoami);
                    perror("Slave\n");
                }
                etat=SYNC;
                continue;
            
            
            case FIN:
                E("(End)\n");
                terminer(0);
            printf("Unknown command\n");
            terminer(1);

        }
    }



}
Exemple #3
0
void *esclave(void *donnees)
{
	struct donneesFils *df;
	int i, a, resultat, ftest;
	struct s_test tLock;
	struct flock request;
	char tmp[16];
#ifdef DEBUG
	char dbg[16];
#endif
	char *phraseTest = "L'ecriture a reussi";
	int len;
	enum etat_t etat;

	resultat = -1;
	ftest = -1;
	len = strlen(phraseTest);
	df = (struct donneesFils *)donnees;
	i = df->dpr->whoami;
	P("Esclave n=%d\n", i);
	esclaveLecteur = dp.lclnt[i][0];
	esclaveEcrivain = dp.maitre[1];
	etat = SYNC;
	errno = 0;
	memset(tmp, 0, 16);
	while (1) {
		switch (etat) {
		case SELECT:
		case SYNC:
			getLockTest(&tLock);
			etat = tLock.test;
			P("Esclave Etat=%d\n", etat);

			continue;
		case RDONLY:
			/* On tente de lire un fichier */
			/* Try to read a file */
			P("TEST READ ONLY %d\n", RDONLY);
			if ((ftest = open(dp.fname, O_RDONLY | O_NONBLOCK)) < 0) {
				resultat = ECHEC;
				etat = RESULTAT;
				if (dp.verbose)
					perror("Open:");
				continue;
			}
			P("fd=%d\n", ftest);
			a = read(ftest, tmp, 16);
			if (a < 16)
				resultat = ECHEC;
			else
				resultat = SUCCES;
			etat = RESULTAT;
			continue;

		case WRONLY:
			/* On tente d'ecrire un fichier */
			/* Try to write a file */
			P("TEST WRITE ONLY %d\n", WRONLY);
			if ((ftest = open(dp.fname, O_WRONLY | O_NONBLOCK)) < 0) {
				resultat = ECHEC;
				etat = RESULTAT;
				if (dp.verbose)
					perror("Open read only:");
				continue;
			}
			P("fd=%d\n", ftest);
			if (write(ftest, phraseTest, len) < len)
				resultat = ECHEC;
			else
				resultat = SUCCES;
			etat = RESULTAT;
			continue;

		case LOCK:

		case READLOCK:
			/* On essaie de lire une section lockee en lecture sur le fichier */
			/* Try to read a read-locked section */
			P("READ LOCK %d\n", F_RDLCK);
			if ((ftest = open(dp.fname, O_RDONLY | O_NONBLOCK)) < 0) {
				resultat = ECHEC;
				etat = RESULTAT;
				if (dp.verbose)
					perror("Open read-write:");
				continue;
			}

			P("fd=%d\n", ftest);
			/* Lock de l'ensemble du fichier */
			/* Lock the whole file */
			request.l_type = F_RDLCK;
			request.l_whence = SEEK_SET;
			request.l_start = 0;
			request.l_len = 0;

			if (fcntl(ftest, F_SETLK, &request) < 0) {
				if (dp.verbose || errno != EAGAIN)
					perror("RDONLY: fcntl");
				resultat = ECHEC;
			} else
				resultat = SUCCES;
			etat = RESULTAT;
			continue;

		case WRITELOCK:
			/* On essaie d'ecrire le fichier */
			/* Try to write a file */
			P("WRITE LOCK %d\n", F_WRLCK);
			if ((ftest = open(dp.fname, O_WRONLY | O_NONBLOCK)) < 0) {
				resultat = ECHEC;
				etat = RESULTAT;
				if (dp.verbose)
					perror("\nOpen:");
				continue;
			}
			/* Lock de l'ensemble du fichier */
			/* Lock the whole file */
			P("fd=%d\n", ftest);
			request.l_type = F_WRLCK;
			request.l_whence = SEEK_SET;
			request.l_start = 0;
			request.l_len = 0;

			if (fcntl(ftest, F_SETLK, &request) < 0) {
				if (dp.verbose || errno != EAGAIN)
					perror("\nWRONLY: fcntl");
				resultat = ECHEC;
			} else
				resultat = SUCCES;
			etat = RESULTAT;
			continue;

		case BYTELOCK_READ:
			P("BYTE LOCK READ: %d\n", etat);
			etat = BYTELOCK;
			continue;

		case BYTELOCK_WRITE:
			P("BYTE LOCK WRITE: %d\n", etat);
			etat = BYTELOCK;
			continue;

		case BYTELOCK:
			/* On se met en attente de la section a locker. L'ensemble de la structure est
			 * donnee par le maitre et transmise par le tube.
			 */
			/* Wait for the exact section to lock. The whole file is sent by the master */

			P("BYTE LOCK %d\n", etat);
			getLockSection(&request);
			if ((ftest = open(dp.fname, O_RDWR | O_NONBLOCK)) < 0) {
				resultat = ECHEC;
				etat = RESULTAT;
				if (dp.verbose)
					perror("\nOpen:");
				continue;
			}

			if (fcntl(ftest, F_SETLK, &request) < 0) {
				if (dp.verbose || errno != EAGAIN)
					perror("\nBTLOCK: fcntl");
				resultat = ECHEC;
				etat = RESULTAT;
				continue;
			}
			/* On change le caractere a la place donnee pour verification */
			/* Change the character at the given position for an easier verification */
			a = lseek(ftest, request.l_start, SEEK_SET);
			write(ftest, "=", 1);
			resultat = SUCCES;
			etat = RESULTAT;
			continue;

		case RESULTAT:
			if (resultat == SUCCES)
				write(0, "=", 1);
			else
				write(0, "x", 1);
			P("RESULTAT: %d\n", resultat);
			sendResult(resultat);
			etat = SYNC;
			continue;

		case CLEAN:
			close(ftest);
			/* Send CLEAN Ack */
			sendResult(resultat);
			etat = SYNC;
			continue;

		case FIN:
			E("(End)\n");
			terminer(0);
			printf("Unknown command\n");
			terminer(1);

		}
	}

}