//telegram link: https://t.me/c/1449061520/1326
//dopo avvenuta discussione tra @LLibera e @rd235

/*
Prova Pratica di Laboratorio di Sistemi Operativi
23 gennaio 2023

Esercizio 1: Linguaggio C (obbligatorio) 20 punti
Scrivere un programma fifotext che:
* crei una named pipe (FIFO) al pathname indicato come primo (e unico) argomento.
* apra la named pipe in lettura
* stampi ogni riga di testo ricevuta
* se la named pipe viene chiusa la riapra
* se riceve la riga "FINE" termini cancellando la named pipe.
Esempio:
fifotext /tmp/ff
....
se in un altra shell si fornisce il comando: "echo ciao > /tmp/ff", fifotext stampa ciao e rimane in attesa
(questo esperimento si può provare più volte). Con il comando "echo FINE > /tmp/ff" fifotext termina.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
	if( argc < 2 ) {
		perror( "Bad usage! u have to specify pipe name\n" );
		return -1;
	}

	FILE *mypipe;
	size_t buflen = 0;
	char *buf = NULL;
	size_t len;

	// crea una named pipe (fifo) al path indicato come primo e unico argomento
	// mkfifo(<pathname>, <permission>)
	char *myname = argv[1];

	if( mkfifo(myname, 0666) < 0 ){
		perror( "Cannot create a pipe\n" );
	}
	while (1) { 
		//apra la named pipe in lettura
		mypipe = fopen( myname, "r" );

		while ( len = getline(&buf, &buflen, mypipe ) > 0 ) {
	    		printf( "Received: %s", buf );
			int exit = ! strcmp(buf, "FINE\n");
	    		if( exit ) {	//compare buf con "FINE"
				printf("fine!\n");
				unlink(myname);
				return 0;
			}
		}

		fclose(mypipe);

	}
	return 0;
}