#include <ctype.h>
#include "common.h"
#include <regex.h>
+#include <sys/inotify.h>
+#include <signal.h>
+#include <sys/fcntl.h>
+#include <unistd.h>
// === 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);
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
*/
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-Z]*)\\s+([0-9]+)\\s+([0-9]+)\\s+(.*)", REG_EXTENDED);
if( i )
{
size_t len = regerror(i, ®ex, NULL, 0);
gaItems[giNumItems].ID = num;
gaItems[giNumItems].Price = price;
gaItems[giNumItems].Name = strdup(desc);
+ gaItems[giNumItems].bHidden = (line[0] == '-');
giNumItems ++;
}
}