/** Esercizio 1
 * Scrivere due programmi C, tx e rx:
 * - tx deve trasferire a rx stringhe max di 8 caratteri usando i valori assegnati ai segnali [il parametro value della funzione sigqueue].
 *  - ha 2 parametri: pid di rx e il messaggio
 * - rx deve stampare il proprio pid e attendere segnali.
 * 
 * Esempio:
 * tx 22255 sigmsg
 * [posto che rx sia in esecuzione con pid 22255, rx deve stampare sigmsg]
 * 
 * testo esame https://dynamik.vercel.app/sistemi-operativi/prove/pratica/scritto-2022-06-22-testo.pdf
 */

#include <stdio.h>
#include <stdlib.h>
#include <signal.h> // sigqueue
#include <unistd.h> // wait 

void tx(int pid, char *sigmsg) {
	if (lenght(sigmsg)<= 8) {
		union sigval value;
		value.sival_ptr = (void*)sigmsg;
		int queue_return = sigqueue(pid, sigmsg, value);
		if (queue_return == -1) {
			printf("Errore nell'invio del segnale");
			exit(-1);
		}
	}
	else printf("Sigmsg too long\n");
}

void sig_handler(int sig, siginfo_t *info, void *ucontext){
	union sigval value = info->si_value;
	int64_t tmp = (int64_t)value.sival_ptr;
	char converted[8];
	for(int i=0; i<8; i++){
		converted[i]=tmp%256;
		tmp/=256;
	}
	printf("RECEIVED: %s\n", converted);
}
void rx() {
	// int signal = pause();
	// if (signal == -1) {
    //    printf("Segnali ricevuti");
    // }
	// printf("pid: %d\n", getpid());
	pid_t pid = getpid();
	printf("My pid: %d\n", (int)pid);
	
	
	struct sigaction sigact;
	sigact.sa_flags = SA_SIGINFO;
	sigact.sa_sigaction = sig_handler;
	while(1){
		int ret = sigaction(SIGUSR1, &sigact, NULL);
	}
	exit(0);
}

int main(int argc, char *argv[]) {
	if (argc != 3) {
		printf("Usage: %s <pid> <sigmsg>\n", argv[0]);
		return 1;
	}
	// salvo i parametri
	int pid = atoi(argv[1]);
	char *sigmsg = argv[2];
	// invio i segnali
	tx(pid, sigmsg);
	// attendo i segnali
	rx();
	return 0;