#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

typedef char paketo[30];
#define MAX_PAKETA 50

#define XWROS_KSEFORTWMATOS 100

#define SEMNUM_APOTHIKI_FULL	0
#define SEMNUM_APOTHIKI_EMPTY	1
#define SEMNUM_APOTHIKI_MUTEX	2


void stoivakseEpomenoPaketo() {
/* Pare paketo apo xwro ksefortwmatos */

/* Riks'to stin apothiki */
printf("Vale ena xeri re mitso... e, op!\n");
}


int main(int argc, char *argv[]) {
int semid, shmid, res;
char *shared_mem;
paketo fortio[MAX_PAKETA];
int numPaketa;
ushort_t arxikesTimes[3] = {0, XWROS_KSEFORTWMATOS, 1};
union semun {
	int val; struct semid_ds *buf; ushort_t *array; } arg ;
struct sembuf theSemOp;
int *apothikiSize, *firstEmptyPaketoSpace, *firstFullPaketoSpace;
paketo *paketaSpace;

/* Elegxos parametron */
if (argc < 2) {
	printf("Usage is: %s noumero_apothikis\n");
	exit(1);
}


/* Arxikopoihsh diamoirazomenhs mnhmhs kai shmaforwn */
if ((semid = semget(atoi(argv[1]), 3, IPC_CREAT | IPC_EXCL | 0600)) == -1) {
	perror("Anoigma shmaforwn apothikis");
	exit(1);
}
if ((shmid = shmget(atoi(argv[1]), sizeof(paketo) * MAX_PAKETA + 2 * sizeof(int), IPC_CREAT | IPC_EXCL | 0600)) == -1) {
	perror("Anoigma diamoirazomenhs mnhmhs apothikis\n");
	exit(1);
}
if ((shared_mem = shmat(shmid, NULL, 0)) == NULL) {
	perror("attaching shmem");
	exit(1);
}

arg.array = arxikesTimes;
if (semctl(semid, 0, SETALL, arg) == -1) {
	perror("Getting values");
	exit(1);
}


apothikiSize = (int *)shared_mem;
firstEmptyPaketoSpace = (int *)(shared_mem + sizeof(int));
firstEmptyPaketoSpace = (int *)(shared_mem + sizeof(int));
firstFullPaketoSpace = (int *)(shared_mem + 2 * sizeof(int));
paketaSpace = (paketo *)(shared_mem + 3 * sizeof(int));
*apothikiSize = XWROS_KSEFORTWMATOS;
*firstEmptyPaketoSpace = 0;
*firstFullPaketoSpace = 0;


while (1) {
	/* Anamonh mexri na einai diathesimo paketo */
	stoivakseEpomenoPaketo();
}
return 0;
}

