X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=src%2Fserver%2Fitemdb.c;h=e5031230061eb3320d5897bdb0aa635672711fcf;hb=4de4de3c3a18dd790e9ccefadc2b7c8bb25ce9e0;hp=0cb932db2bc92dc47a292d3d21df3aff704f8b59;hpb=a189b749e46348379d2271eb7c51ca1f7334cbda;p=tpg%2Fopendispense2.git diff --git a/src/server/itemdb.c b/src/server/itemdb.c index 0cb932d..e503123 100644 --- a/src/server/itemdb.c +++ b/src/server/itemdb.c @@ -13,11 +13,19 @@ #include #include "common.h" #include +#include +#include +#include +#include // === IMPORTS === extern tHandler gCoke_Handler; +extern tHandler gSnack_Handler; +extern tHandler gDoor_Handler; // === PROTOTYPES === +void Init_Handlers(void); +void ItemList_Changed(int signum); void Load_Itemlist(void); char *trim(char *__str); @@ -25,11 +33,53 @@ char *trim(char *__str); int giNumItems = 0; tItem *gaItems = NULL; tHandler gPseudo_Handler = {Name:"pseudo"}; -tHandler *gaHandlers[] = {&gPseudo_Handler, &gCoke_Handler}; +tHandler *gaHandlers[] = {&gPseudo_Handler, &gCoke_Handler, &gSnack_Handler, &gDoor_Handler}; int giNumHandlers = sizeof(gaHandlers)/sizeof(gaHandlers[0]); char *gsItemListFile = DEFAULT_ITEM_FILE; +#if USE_INOTIFY + int giItem_INotifyFD; +#endif // === CODE === +void Init_Handlers() +{ + int i; + for( i = 0; i < giNumHandlers; i ++ ) + { + if( gaHandlers[i]->Init ) + gaHandlers[i]->Init(0, NULL); // TODO: Arguments + } + + // Use inotify to watch the snack config file + #if USE_INOTIFY + { + int oflags; + + giItem_INotifyFD = inotify_init(); + inotify_add_watch(giItem_INotifyFD, gsItemListFile, IN_MODIFY); + + // Handle SIGIO + signal(SIGIO, &ItemList_Changed); + + // Fire SIGIO when data is ready on the FD + fcntl(giItem_INotifyFD, F_SETOWN, getpid()); + oflags = fcntl(giItem_INotifyFD, F_GETFL); + fcntl(giItem_INotifyFD, F_SETFL, oflags | FASYNC); + } + #endif +} + +#if USE_INOTIFY +void ItemList_Changed(int signum) +{ + char buf[512]; + read(giItem_INotifyFD, buf, 512); + Load_Itemlist(); + + signum = 0; // Shut up GCC +} +#endif + /** * \brief Read the item list from disk */ @@ -43,7 +93,7 @@ void Load_Itemlist(void) regex_t regex; regmatch_t matches[5]; - i = regcomp(®ex, "^([a-zA-Z][a-zA-Z0-9]*)\\s+([0-9]+)\\s+([0-9]+)\\s+(.*)", REG_EXTENDED); + i = regcomp(®ex, "^-?([a-zA-Z][a-zA-Z0-9]*)\\s+([0-9]+)\\s+([0-9]+)\\s+(.*)", REG_EXTENDED); if( i ) { size_t len = regerror(i, ®ex, NULL, 0); @@ -130,6 +180,7 @@ void Load_Itemlist(void) gaItems[giNumItems].ID = num; gaItems[giNumItems].Price = price; gaItems[giNumItems].Name = strdup(desc); + gaItems[giNumItems].bHidden = (line[0] == '-'); giNumItems ++; } }