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));
}