// program proizvodjac:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <string.h>


struct msgbuf{
	long mtype;
	char mtext;
};


void posalji(int msqid, char letter){ // funkcuha
	struct msgbuf msgbuf;

	msgbuf.mtype = 1;
	msgbuf.mtext = letter; // predajem slovo 
//šalje poruku u red ciji je ID msqid dobiven primjerice od msgget. msgp pokazuje na strukturu u kojoj na prvom mjestu mora biti dugacak cijeli broj 
//veci od nule - vrsta poruke. Ostatak te strukture ovisi o podacima koji se šalju. Interno se ostatak poruke prihvaca kao niz znakova (bajtova) duljine msgsz. 
//Tip poruke omogucava primaocu da odabere iz reda poruke koje želi izvaditi, odnosno može cekati odredeni tip poruke. msgflg je obicno 0, što uzrokuje da se msgsnd 
//zablokira dok je red pun. Druga mogucnost je IPC_NOWAIT što uzrokuje da poziv msgsnd vrati grešku ako je red pun. msgsnd vraca 0 ako uspije ili -1 ako dode do greške.

	if(msgsnd(msqid, (struct msgbuf *)&msgbuf, (sizeof(char)+1), 0)==-1){
		fprintf(stderr, "Greska u slanju poruke\n");
		exit(1);
	}
}

//glavni program
int main(int argc, char *argv[]){
	key_t uid;
	int msqid;
	int i;
	char* poruka;
// ako su predani krivi parametri onda imamo problema 

	if (argc != 2) {
		printf("Ne mogu pokerenuti potrosaca kako spada!\n");
		exit(1);
	}
	
	uid = ftok("/tmp",'b'); // sa tok dobivam isti kljuc kao i u  glavnom programu jer koristim iste parametre za ftok
	if((msqid = msgget(uid, IPC_CREAT |0666)) == -1){		// spajam se na red poruka ako postoji , problem je ako ne postoji ali dobro
		printf("Ne mogu se spojiti na red poruka\n");
		exit(1);
	}
	struct ipc_perm p;     
    struct msqid_ds d;
    p.uid = getuid();
    p.gid = getgid();
    p.mode = 0600; // ovlasti
    d.msg_perm = p;
    d.msg_qbytes = 5;
    msgctl(msqid, IPC_SET, &d);
	poruka = argv[1];
	for(i=0; i < strlen(argv[1]); i++){
		posalji(msqid, *poruka); // Poziva funkciju za slati poruku
		poruka++; // ide na sljedeci dio
	}
	posalji(msqid, '*'); // dok dodje na kraj salj e'*' jer je to potrosacu znak da je to kraj poruke
	printf("Poslao sam poruku: '%s'\n", argv[1]); // ispise poruku koju je poslao
	return 0;
}

