X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fserver%2Fhandler_door.c;h=1db954fdbd304ba3e10a33a4c0b92893297c8f9e;hb=6b70240e4975aa8a5cfe1c4f01f79c64ec1ba5e1;hp=0273cbf4788d366d8b1453e04a6cb1e9ad749e2d;hpb=4a22ccac3ebf5cada0311cafd58c505dfce126f5;p=tpg%2Fopendispense2.git diff --git a/src/server/handler_door.c b/src/server/handler_door.c index 0273cbf..1db954f 100644 --- a/src/server/handler_door.c +++ b/src/server/handler_door.c @@ -8,7 +8,6 @@ * COPYING for full details. */ #define DEBUG 1 -#define USE_POPEN 0 #include "common.h" #include @@ -22,6 +21,7 @@ #include #include #include +#include #define DOOR_UNLOCKED_DELAY 10 // Time in seconds before the door re-locks @@ -43,10 +43,12 @@ tHandler gDoor_Handler = { char *gsDoor_SerialPort; // Set from config in main.c sem_t gDoor_UnlockSemaphore; pthread_t gDoor_LockThread; +bool gbDoor_LockThreadStarted; // === CODE === void* Door_Lock(void* Unused __attribute__((unused))) { + gbDoor_LockThreadStarted = true; while(1) { sem_wait(&gDoor_UnlockSemaphore); @@ -84,10 +86,7 @@ void* Door_Lock(void* Unused __attribute__((unused))) int Door_InitHandler(void) { - // Initialize semaphore, triggers door lock release if semaphore is greater than 0 - sem_init(&gDoor_UnlockSemaphore, 0, 0); - - pthread_create(&gDoor_LockThread, NULL, &Door_Lock, NULL); + // Thread started later return 0; } @@ -102,7 +101,7 @@ int Door_CanDispense(int User, int Item) // Sanity please if( Item != 0 ) return -1; - if( !(Bank_GetFlags(User) & USER_FLAG_DOORGROUP) ) + if( !(Bank_GetFlags(User) & (USER_FLAG_DOORGROUP|USER_FLAG_ADMIN)) ) { #if DEBUG printf("Door_CanDispense: User %i not in door\n", User); @@ -125,12 +124,12 @@ int Door_DoDispense(int User, int Item) #if DEBUG printf("Door_DoDispense: (User=%i,Item=%i)\n", User, Item); #endif - + // Sanity please if( Item != 0 ) return -1; // Check if user is in door - if( !(Bank_GetFlags(User) & USER_FLAG_DOORGROUP) ) + if( !(Bank_GetFlags(User) & (USER_FLAG_DOORGROUP|USER_FLAG_ADMIN)) ) { #if DEBUG printf("Door_CanDispense: User %i not in door\n", User); @@ -138,6 +137,14 @@ int Door_DoDispense(int User, int Item) return 1; } + // Door thread spun up here because program is forked after thread created + if( !gbDoor_LockThreadStarted ) + { + // Initialize semaphore, triggers door lock release if semaphore is greater than 0 + sem_init(&gDoor_UnlockSemaphore, 0, 0); + + pthread_create(&gDoor_LockThread, NULL, &Door_Lock, NULL); + } if(sem_post(&gDoor_UnlockSemaphore)) {