/* sender.c
 *
 * Operacijski sustavi -- vjezba 4, zadatak 4a
 *
 * Rijesio:
 * Filip Niksic (fniksic@gmail.com)
 * 2008-06-10
 **/

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

#define MY_MSG_TYPE 1

struct message {
    long type;
    char data[1];
};

int main(int argc, char *argv[]) {
    key_t kljuc;
    char *envKljuc;
    int msgId, i;
    struct message myMsg;
    struct msqid_ds myMsqDs;

    /* Provjera ulaznih argumenata */
    if (argc < 2) {
	printf("%s <niz znakova>\n", argv[0]);
	return EXIT_FAILURE;
    }

    /* Dobavljanje kljuca za red poruka iz okoline */
    if ((envKljuc = getenv("MSG_KEY")) != NULL) {
	kljuc = atoi(envKljuc);
	printf("[S] Nadjena varijabla okoline %s\n", envKljuc);
    }
    else {
	printf("[S] MSG_KEY varijabla okoline nije postavljena!\n");
	return EXIT_FAILURE;
    }

    /* Dobavljanje reda poruka */
    if ((msgId = msgget(kljuc, 0600 | IPC_CREAT)) == -1) {
	printf("[S] Greska pri dobavljanju reda poruka!\n");
	return EXIT_FAILURE;
    }

    /* Skracivanje reda poruka */
    if (msgctl(msgId, IPC_STAT, &myMsqDs) == -1) {
	printf("[S] Greska pri dobavljanju atributa reda poruka!\n");
	return EXIT_FAILURE;
    }
    myMsqDs.msg_qbytes = 5;
    if (msgctl(msgId, IPC_SET, &myMsqDs) == -1) {
	printf("[S] Greska pri skracivanju reda poruka!\n");
	return EXIT_FAILURE;
    }

    /* Slanje poruke (argv[1]) znak po znak */
    for (i = 0; i <= strlen(argv[1]); ++i) {
	myMsg.type = MY_MSG_TYPE;
	myMsg.data[0] = argv[1][i];
	if ((msgsnd(msgId, &myMsg, 1, 0)) == -1)
	    printf("[S] Greska pri slanju %d. znaka: '%c'\n", i, argv[1][i]);
    }

    printf("[S] Sender ends!\n");

    return EXIT_SUCCESS;
}

