+typedef char FlagDescription[8];
+
+void LogControlFlagInfo(dispatch_queue_t log_queue,
+ FSEventStreamEventFlags flags) {
+ if (flags & kFSEventStreamEventFlagUserDropped) {
+ dispatch_async(log_queue, ^{
+ printf("User-side buffer dropped event\n");
+ });
+ } else if (flags & kFSEventStreamEventFlagKernelDropped) {
+ dispatch_async(log_queue, ^{
+ printf("Kernel-side buffer dropped event\n");
+ });
+ } else if (flags & kFSEventStreamEventFlagEventIdsWrapped) {
+ dispatch_async(log_queue, ^{
+ printf("Event IDs have wrapped\n");
+ });
+ }
+}
+
+void DescribeFlags(FSEventStreamEventFlags flags, FlagDescription description) {
+ memset(description, '-', sizeof(FlagDescription));
+ description[sizeof(FlagDescription) - 1] = '\0';
+
+ if (flags & kFSEventStreamEventFlagItemCreated)
+ description[0] = 'C';
+ else if (flags & kFSEventStreamEventFlagItemModified)
+ description[1] = 'M';
+ else if (flags & kFSEventStreamEventFlagItemRemoved)
+ description[2] = 'R';
+ else if (flags & kFSEventStreamEventFlagItemRenamed)
+ description[3] = 'N';
+ else if (flags & (kFSEventStreamEventFlagItemInodeMetaMod |
+ kFSEventStreamEventFlagItemFinderInfoMod))
+ description[4] = 'M';
+ else if (flags & kFSEventStreamEventFlagItemChangeOwner)
+ description[5] = 'O';
+ else if (flags & kFSEventStreamEventFlagItemXattrMod)
+ description[6] = 'X';
+}
+