]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
more than one NOTE can be returned
authorAlan T. DeKok <aland@freeradius.org>
Tue, 17 Oct 2017 18:18:22 +0000 (14:18 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 17 Oct 2017 18:18:22 +0000 (14:18 -0400)
src/lib/util/event.c

index bf4b50c259d610d446993b8ac890734aa0025dc3..bb65bf28e944db04fa9fa1f5bb2a676be4a23822 100644 (file)
@@ -1603,42 +1603,54 @@ service:
                case FR_EVENT_FILTER_VNODE:
                        if (unlikely(!fr_cond_assert(el->events[i].filter == EVFILT_VNODE))) break;
 
-                       switch (el->events[i].fflags) {
-                       case NOTE_DELETE:
+                       if ((el->events[i].fflags & NOTE_DELETE) != 0) {
                                ef->active.vnode.delete(el, ef->fd, flags, ef->uctx);
-                               break;
+                               el->events[i].fflags &= ~NOTE_DELETE;
+                       }
 
-                       case NOTE_WRITE:
+                       if ((el->events[i].fflags & NOTE_WRITE) != 0) {
                                ef->active.vnode.write(el, ef->fd, flags, ef->uctx);
-                               break;
+                               el->events[i].fflags &= ~NOTE_WRITE;
+                       }
 
-                       case NOTE_EXTEND:
+                       if ((el->events[i].fflags & NOTE_EXTEND) != 0) {
                                ef->active.vnode.extend(el, ef->fd, flags, ef->uctx);
-                               break;
+                               el->events[i].fflags &= ~NOTE_EXTEND;
+                       }
 
-                       case NOTE_ATTRIB:
+                       if ((el->events[i].fflags & NOTE_ATTRIB) != 0) {
                                ef->active.vnode.attrib(el, ef->fd, flags, ef->uctx);
-                               break;
+                               el->events[i].fflags &= ~NOTE_ATTRIB;
+                       }
 
-                       case NOTE_LINK:
-                               ef->active.vnode.link(el, ef->fd, flags, ef->uctx);
-                               break;
+                       /*
+                        *      NOTE_LINK is sometimes added even if we didn't ask for it.
+                        */
+                       if ((el->events[i].fflags & NOTE_LINK) != 0) {
+                               if (ef->active.vnode.link) ef->active.vnode.link(el, ef->fd, flags, ef->uctx);
+                               el->events[i].fflags &= ~NOTE_LINK;
+                       }
 
-                       case NOTE_RENAME:
+                       if ((el->events[i].fflags & NOTE_RENAME) != 0) {
                                ef->active.vnode.rename(el, ef->fd, flags, ef->uctx);
-                               break;
+                               el->events[i].fflags &= ~NOTE_RENAME;
+                       }
+
 #ifdef NOTE_REVOKE
-                       case NOTE_REVOKE:
+                       if ((el->events[i].fflags & NOTE_REVOKE) != 0) {
                                ef->active.vnode.revoke(el, ef->fd, flags, ef->uctx);
-                               break;
+                               el->events[i].fflags &= ~NOTE_REVOKE;
+                       }
 #endif
+
 #ifdef NOTE_FUNLOCK
-                       case NOTE_FUNLOCK:
+                       if ((el->events[i].fflags & NOTE_FUNLOCK) != 0) {
                                ef->active.vnode.funlock(el, ef->fd, flags, ef->uctx);
-#endif
-                       default:
-                               if (unlikely(!fr_cond_assert(false))) break;
+                               el->events[i].fflags &= ~NOTE_FUNLOCK;
                        }
+#endif
+
+                       if (el->events[i].fflags && unlikely(!fr_cond_assert(false))) break;
                        break;
 
                default: