#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 SEMNUM_APOTHIKI_FULL	0
#define SEMNUM_APOTHIKI_EMPTY	1
#define SEMNUM_APOTHIKI_MUTEX	2


int loadNtalika(paketo *thePaketa, int numPaketa) {
int i;

for (i = 0; i < numPaketa; i++)
	sprintf(thePaketa[i], "Ntalika %ld: Paketo #%d", (long)(getpid()), i + 1);
return numPaketa;
}

int unloadNtalika(paketo *thePaketa, int numPaketa) {
	/* anamonh gia xwro sthn apothiki iso me to numPaketa */
	
	/* Topothetisi ton paketwn */

	/* Enhmerwsh tou apothikariou oti irthan numPaketa paketa */
}


int main(int argc, char *argv[]) {
int semid, shmid, res;
char *shared_mem;
paketo fortio[MAX_PAKETA];
int numPaketa;
ushort_t semValue;
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, 0)) == -1) {
	printf("Pou einai o apothikarios;\n");
	exit(1);
}
if ((shmid = shmget(atoi(argv[1]), sizeof(paketo) * MAX_PAKETA + 2 * sizeof(int), 0)) == -1) {
	printf("Pou einai o apothikarios;\n");
	exit(1);
}
if ((shared_mem = shmat(shmid, NULL, 0)) == NULL) {
	perror("attaching shmem");
	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));


while (1) {
	printf("Posa kivotia na fortwsw (mexri %d - 0 = parkarw); ", MAX_PAKETA);
	scanf("%d", &numPaketa);
	if (numPaketa > MAX_PAKETA) {
		printf("Kala, tha parw ta %d twra kai ta alla meta\n", MAX_PAKETA);
		numPaketa = MAX_PAKETA;
	}
	else
		if (numPaketa <= 0) break;
	loadNtalika(fortio, numPaketa);
	printf("Ksekinaw...\n");
	sleep(rand() % 4); /* Diadromh mexri apothiki */
	printf("Eftasa apothiki...\n");
	unloadNtalika(fortio, numPaketa);
	printf("Ksefortwsa, paw gia epomeno dromologio\n");
}
printf("Xeirofreno!\n");
return 0;
}

