iplock.c


#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

#define E_CREATE_KEY -1
#define E_CREATE_SEM -2
#define E_SEMOP      -3

key_t createKey(fileName)
char *fileName;
{
	return(ftok(fileName, 'V'));
}

int retrieveSemId(aKey)
key_t aKey;
{
	return(semget(aKey, 1, IPC_CREAT|0660));
}

int destroySem(semId)
int semId;
{
	return(semctl(semId, 0, IPC_RMID));
}

int semaphoreLock(semId, blocking)
int semId, blocking;
{
	struct sembuf lockStruct[2];

	lockStruct[0].sem_num=0;
	lockStruct[0].sem_op=0;

	if(blocking){
		lockStruct[0].sem_flg=0;
	}
	else{
		lockStruct[0].sem_flg=IPC_NOWAIT;
	}
	
	lockStruct[1].sem_num=0;
	lockStruct[1].sem_op=1;
	lockStruct[1].sem_flg=0;

	return(semop(semId, lockStruct, sizeof(lockStruct)/sizeof(struct sembuf)));
}

int semaphoreUnlock(semId)
int semId;
{
	struct sembuf unLockStruct;
	int result;

	unLockStruct.sem_num=0;
	unLockStruct.sem_op=-1;
	unLockStruct.sem_flg=IPC_NOWAIT;

	result=semop(semId, &unLockStruct, sizeof(unLockStruct)/sizeof(struct sembuf));

	switch(result){
	        case 0:
	        case EAGAIN:
	                break;
                default:
			return(E_SEMOP);
	}

	return(0);
}

long resourceLock(){
	key_t aKey;
	int semId;

	if((aKey=createKey("/usr/lib/veetest/veetest")) < (key_t) 0){
		return(E_CREATE_KEY);
	}

	if((semId=retrieveSemId(aKey)) < 0){
		return(E_CREATE_SEM);
	}

	return(semaphoreLock(semId, 0));
}

long blockingResourceLock(){
	key_t aKey;
	int semId;

	if((aKey=createKey("/usr/lib/veetest/veetest")) < (key_t) 0){
		return(E_CREATE_KEY);
	}

	if((semId=retrieveSemId(aKey)) < 0){
		return(E_CREATE_SEM);
	}

	return(semaphoreLock(semId, 1));
}

int resourceUnlock(){
	key_t aKey;
	int semId;

	if((aKey=createKey("/usr/lib/veetest/veetest")) < (key_t) 0){
		return(E_CREATE_KEY);
	}

	if((semId=retrieveSemId(aKey)) < 0){
		return(E_CREATE_SEM);
	}

	return(semaphoreUnlock(semId));
}

long destroyResourceLock(){
	key_t aKey;
	int semId;

	if((aKey=createKey("/usr/lib/veetest/veetest")) < (key_t) 0){
		return(E_CREATE_KEY);
	}

	if((semId=retrieveSemId(aKey)) < 0){
		return(E_CREATE_SEM);
	}

	return((long)destroySem(semId));
}