1a9643ea8Slogwang /* 22317ada5Sfengbojiang * Copyright (C) 2017-2021 THL A29 Limited, a Tencent company. 3a9643ea8Slogwang * All rights reserved. 4a9643ea8Slogwang * 5a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without 6a9643ea8Slogwang * modification, are permitted provided that the following conditions are met: 7a9643ea8Slogwang * 8a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright notice, this 9a9643ea8Slogwang * list of conditions and the following disclaimer. 10a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright notice, 11a9643ea8Slogwang * this list of conditions and the following disclaimer in the documentation 12a9643ea8Slogwang * and/or other materials provided with the distribution. 13a9643ea8Slogwang * 14a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 15a9643ea8Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16a9643ea8Slogwang * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17a9643ea8Slogwang * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 18a9643ea8Slogwang * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19a9643ea8Slogwang * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20a9643ea8Slogwang * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 21a9643ea8Slogwang * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22a9643ea8Slogwang * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 23a9643ea8Slogwang * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24a9643ea8Slogwang * 25a9643ea8Slogwang */ 26a9643ea8Slogwang 27a9643ea8Slogwang #ifndef _FSTACK_EVENT_H 28a9643ea8Slogwang #define _FSTACK_EVENT_H 29a9643ea8Slogwang 307f4229eaSlogwang #ifdef __cplusplus 317f4229eaSlogwang extern "C" { 327f4229eaSlogwang #endif 337f4229eaSlogwang 34a9643ea8Slogwang #ifndef _KERNEL 35a9643ea8Slogwang 36a9643ea8Slogwang #include <stdint.h> 37a9643ea8Slogwang #include <sys/queue.h> 38a9643ea8Slogwang 39a9643ea8Slogwang #define EVFILT_READ (-1) 40a9643ea8Slogwang #define EVFILT_WRITE (-2) 41a9643ea8Slogwang #define EVFILT_AIO (-3) /* attached to aio requests */ 42a9643ea8Slogwang #define EVFILT_VNODE (-4) /* attached to vnodes */ 43a9643ea8Slogwang #define EVFILT_PROC (-5) /* attached to struct proc */ 44a9643ea8Slogwang #define EVFILT_SIGNAL (-6) /* attached to struct proc */ 45a9643ea8Slogwang #define EVFILT_TIMER (-7) /* timers */ 4610c1fea8Sfengbojiang #define EVFILT_PROCDESC (-8) /* attached to process descriptors */ 47a9643ea8Slogwang #define EVFILT_FS (-9) /* filesystem events */ 48a9643ea8Slogwang #define EVFILT_LIO (-10) /* attached to lio requests */ 49a9643ea8Slogwang #define EVFILT_USER (-11) /* User events */ 5010c1fea8Sfengbojiang #define EVFILT_SENDFILE (-12) /* attached to sendfile requests */ 5110c1fea8Sfengbojiang #define EVFILT_EMPTY (-13) /* empty send socket buf */ 5210c1fea8Sfengbojiang #define EVFILT_SYSCOUNT 13 53a9643ea8Slogwang 5410c1fea8Sfengbojiang #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L 5510c1fea8Sfengbojiang #define EV_SET(kevp_, a, b, c, d, e, f) do { \ 5610c1fea8Sfengbojiang *(kevp_) = (struct kevent){ \ 5710c1fea8Sfengbojiang .ident = (a), \ 5810c1fea8Sfengbojiang .filter = (b), \ 5910c1fea8Sfengbojiang .flags = (c), \ 6010c1fea8Sfengbojiang .fflags = (d), \ 6110c1fea8Sfengbojiang .data = (e), \ 6210c1fea8Sfengbojiang .udata = (f), \ 6310c1fea8Sfengbojiang .ext = {0}, \ 6410c1fea8Sfengbojiang }; \ 6510c1fea8Sfengbojiang } while(0) 6610c1fea8Sfengbojiang #else /* Pre-C99 or not STDC (e.g., C++) */ 6710c1fea8Sfengbojiang /* The definition of the local variable kevp could possibly conflict 6810c1fea8Sfengbojiang * with a user-defined value passed in parameters a-f. 6910c1fea8Sfengbojiang */ 70a9643ea8Slogwang #define EV_SET(kevp_, a, b, c, d, e, f) do { \ 71a9643ea8Slogwang struct kevent *kevp = (kevp_); \ 72a9643ea8Slogwang (kevp)->ident = (a); \ 73a9643ea8Slogwang (kevp)->filter = (b); \ 74a9643ea8Slogwang (kevp)->flags = (c); \ 75a9643ea8Slogwang (kevp)->fflags = (d); \ 76a9643ea8Slogwang (kevp)->data = (e); \ 77a9643ea8Slogwang (kevp)->udata = (f); \ 7810c1fea8Sfengbojiang (kevp)->ext[0] = 0; \ 7910c1fea8Sfengbojiang (kevp)->ext[1] = 0; \ 8010c1fea8Sfengbojiang (kevp)->ext[2] = 0; \ 8110c1fea8Sfengbojiang (kevp)->ext[3] = 0; \ 82a9643ea8Slogwang } while(0) 8310c1fea8Sfengbojiang #endif 84a9643ea8Slogwang 85a9643ea8Slogwang struct kevent { 86*e7dcc16eSfengbojiang uintptr_t ident; /* identifier for this event */ 8710c1fea8Sfengbojiang short filter; /* filter for event */ 8810c1fea8Sfengbojiang unsigned short flags; /* action flags for kqueue */ 8910c1fea8Sfengbojiang unsigned int fflags; /* filter flag value */ 9010c1fea8Sfengbojiang __int64_t data; /* filter data value */ 9110c1fea8Sfengbojiang void *udata; /* opaque user data identifier */ 9210c1fea8Sfengbojiang __uint64_t ext[4]; /* extensions */ 9310c1fea8Sfengbojiang }; 9410c1fea8Sfengbojiang 9510c1fea8Sfengbojiang #if defined(_WANT_FREEBSD11_KEVENT) 9610c1fea8Sfengbojiang /* Older structure used in FreeBSD 11.x and older. */ 9710c1fea8Sfengbojiang struct kevent_freebsd11 { 98*e7dcc16eSfengbojiang uintptr_t ident; /* identifier for this event */ 9910c1fea8Sfengbojiang short filter; /* filter for event */ 10010c1fea8Sfengbojiang unsigned short flags; 10110c1fea8Sfengbojiang unsigned int fflags; 10210c1fea8Sfengbojiang __intptr_t data; 10310c1fea8Sfengbojiang void *udata; /* opaque user data identifier */ 10410c1fea8Sfengbojiang }; 10510c1fea8Sfengbojiang #endif 10610c1fea8Sfengbojiang 10710c1fea8Sfengbojiang #if defined(_WANT_KEVENT32) || (defined(_KERNEL) && defined(__LP64__)) 10810c1fea8Sfengbojiang struct kevent32 { 10910c1fea8Sfengbojiang uint32_t ident; /* identifier for this event */ 110a9643ea8Slogwang short filter; /* filter for event */ 111a9643ea8Slogwang u_short flags; 112a9643ea8Slogwang u_int fflags; 11310c1fea8Sfengbojiang #ifndef __amd64__ 11410c1fea8Sfengbojiang uint32_t pad0; 11510c1fea8Sfengbojiang #endif 11610c1fea8Sfengbojiang uint32_t data1, data2; 11710c1fea8Sfengbojiang uint32_t udata; /* opaque user data identifier */ 11810c1fea8Sfengbojiang #ifndef __amd64__ 11910c1fea8Sfengbojiang uint32_t pad1; 12010c1fea8Sfengbojiang #endif 12110c1fea8Sfengbojiang uint32_t ext64[8]; 122a9643ea8Slogwang }; 123a9643ea8Slogwang 12410c1fea8Sfengbojiang #ifdef _WANT_FREEBSD11_KEVENT 12510c1fea8Sfengbojiang struct kevent32_freebsd11 { 12610c1fea8Sfengbojiang u_int32_t ident; /* identifier for this event */ 12710c1fea8Sfengbojiang short filter; /* filter for event */ 12810c1fea8Sfengbojiang u_short flags; 12910c1fea8Sfengbojiang u_int fflags; 13010c1fea8Sfengbojiang int32_t data; 13110c1fea8Sfengbojiang u_int32_t udata; /* opaque user data identifier */ 13210c1fea8Sfengbojiang }; 13310c1fea8Sfengbojiang #endif 13410c1fea8Sfengbojiang #endif 13510c1fea8Sfengbojiang 136a9643ea8Slogwang /* actions */ 137a9643ea8Slogwang #define EV_ADD 0x0001 /* add event to kq (implies enable) */ 138a9643ea8Slogwang #define EV_DELETE 0x0002 /* delete event from kq */ 139a9643ea8Slogwang #define EV_ENABLE 0x0004 /* enable event */ 140a9643ea8Slogwang #define EV_DISABLE 0x0008 /* disable event (not reported) */ 14110c1fea8Sfengbojiang #define EV_FORCEONESHOT 0x0100 /* enable _ONESHOT and force trigger */ 142a9643ea8Slogwang 143a9643ea8Slogwang /* flags */ 144a9643ea8Slogwang #define EV_ONESHOT 0x0010 /* only report one occurrence */ 145a9643ea8Slogwang #define EV_CLEAR 0x0020 /* clear event state after reporting */ 146a9643ea8Slogwang #define EV_RECEIPT 0x0040 /* force EV_ERROR on success, data=0 */ 147a9643ea8Slogwang #define EV_DISPATCH 0x0080 /* disable event after reporting */ 148a9643ea8Slogwang 149a9643ea8Slogwang #define EV_SYSFLAGS 0xF000 /* reserved by system */ 150a9643ea8Slogwang #define EV_DROP 0x1000 /* note should be dropped */ 151a9643ea8Slogwang #define EV_FLAG1 0x2000 /* filter-specific flag */ 15210c1fea8Sfengbojiang #define EV_FLAG2 0x4000 /* filter-specific flag */ 153a9643ea8Slogwang 154a9643ea8Slogwang /* returned values */ 155a9643ea8Slogwang #define EV_EOF 0x8000 /* EOF detected */ 156a9643ea8Slogwang #define EV_ERROR 0x4000 /* error, data contains errno */ 157a9643ea8Slogwang 158a9643ea8Slogwang /* 159a9643ea8Slogwang * data/hint flags/masks for EVFILT_USER, shared with userspace 160a9643ea8Slogwang * 161a9643ea8Slogwang * On input, the top two bits of fflags specifies how the lower twenty four 162a9643ea8Slogwang * bits should be applied to the stored value of fflags. 163a9643ea8Slogwang * 164a9643ea8Slogwang * On output, the top two bits will always be set to NOTE_FFNOP and the 165a9643ea8Slogwang * remaining twenty four bits will contain the stored fflags value. 166a9643ea8Slogwang */ 167a9643ea8Slogwang #define NOTE_FFNOP 0x00000000 /* ignore input fflags */ 168a9643ea8Slogwang #define NOTE_FFAND 0x40000000 /* AND fflags */ 169a9643ea8Slogwang #define NOTE_FFOR 0x80000000 /* OR fflags */ 170a9643ea8Slogwang #define NOTE_FFCOPY 0xc0000000 /* copy fflags */ 171a9643ea8Slogwang #define NOTE_FFCTRLMASK 0xc0000000 /* masks for operations */ 172a9643ea8Slogwang #define NOTE_FFLAGSMASK 0x00ffffff 173a9643ea8Slogwang 174a9643ea8Slogwang #define NOTE_TRIGGER 0x01000000 /* Cause the event to be 175a9643ea8Slogwang triggered for output. */ 176a9643ea8Slogwang 177a9643ea8Slogwang /* 178a9643ea8Slogwang * data/hint flags for EVFILT_{READ|WRITE}, shared with userspace 179a9643ea8Slogwang */ 180a9643ea8Slogwang #define NOTE_LOWAT 0x0001 /* low water mark */ 18110c1fea8Sfengbojiang #define NOTE_FILE_POLL 0x0002 /* behave like poll() */ 182a9643ea8Slogwang 183a9643ea8Slogwang /* 184a9643ea8Slogwang * data/hint flags for EVFILT_VNODE, shared with userspace 185a9643ea8Slogwang */ 186a9643ea8Slogwang #define NOTE_DELETE 0x0001 /* vnode was removed */ 187a9643ea8Slogwang #define NOTE_WRITE 0x0002 /* data contents changed */ 188a9643ea8Slogwang #define NOTE_EXTEND 0x0004 /* size increased */ 189a9643ea8Slogwang #define NOTE_ATTRIB 0x0008 /* attributes changed */ 190a9643ea8Slogwang #define NOTE_LINK 0x0010 /* link count changed */ 191a9643ea8Slogwang #define NOTE_RENAME 0x0020 /* vnode was renamed */ 192a9643ea8Slogwang #define NOTE_REVOKE 0x0040 /* vnode access was revoked */ 19310c1fea8Sfengbojiang #define NOTE_OPEN 0x0080 /* vnode was opened */ 19410c1fea8Sfengbojiang #define NOTE_CLOSE 0x0100 /* file closed, fd did not 19510c1fea8Sfengbojiang allowed write */ 19610c1fea8Sfengbojiang #define NOTE_CLOSE_WRITE 0x0200 /* file closed, fd did allowed 19710c1fea8Sfengbojiang write */ 19810c1fea8Sfengbojiang #define NOTE_READ 0x0400 /* file was read */ 199a9643ea8Slogwang 200a9643ea8Slogwang /* 20110c1fea8Sfengbojiang * data/hint flags for EVFILT_PROC and EVFILT_PROCDESC, shared with userspace 202a9643ea8Slogwang */ 203a9643ea8Slogwang #define NOTE_EXIT 0x80000000 /* process exited */ 204a9643ea8Slogwang #define NOTE_FORK 0x40000000 /* process forked */ 205a9643ea8Slogwang #define NOTE_EXEC 0x20000000 /* process exec'd */ 206a9643ea8Slogwang #define NOTE_PCTRLMASK 0xf0000000 /* mask for hint bits */ 207a9643ea8Slogwang #define NOTE_PDATAMASK 0x000fffff /* mask for pid */ 208a9643ea8Slogwang 209a9643ea8Slogwang /* additional flags for EVFILT_PROC */ 210a9643ea8Slogwang #define NOTE_TRACK 0x00000001 /* follow across forks */ 211a9643ea8Slogwang #define NOTE_TRACKERR 0x00000002 /* could not track child */ 212a9643ea8Slogwang #define NOTE_CHILD 0x00000004 /* am a child process */ 213a9643ea8Slogwang 21410c1fea8Sfengbojiang /* additional flags for EVFILT_TIMER */ 21510c1fea8Sfengbojiang #define NOTE_SECONDS 0x00000001 /* data is seconds */ 21610c1fea8Sfengbojiang #define NOTE_MSECONDS 0x00000002 /* data is milliseconds */ 21710c1fea8Sfengbojiang #define NOTE_USECONDS 0x00000004 /* data is microseconds */ 21810c1fea8Sfengbojiang #define NOTE_NSECONDS 0x00000008 /* data is nanoseconds */ 21910c1fea8Sfengbojiang #define NOTE_ABSTIME 0x00000010 /* timeout is absolute */ 22010c1fea8Sfengbojiang 221a9643ea8Slogwang struct knote; 222a9643ea8Slogwang SLIST_HEAD(klist, knote); 223a9643ea8Slogwang struct kqueue; 224a9643ea8Slogwang TAILQ_HEAD(kqlist, kqueue); 225a9643ea8Slogwang struct knlist { 226a9643ea8Slogwang struct klist kl_list; 227a9643ea8Slogwang void (*kl_lock)(void *); /* lock function */ 228a9643ea8Slogwang void (*kl_unlock)(void *); 22910c1fea8Sfengbojiang void (*kl_assert_lock)(void *, int); 23010c1fea8Sfengbojiang void *kl_lockarg; /* argument passed to lock functions */ 23110c1fea8Sfengbojiang int kl_autodestroy; 232a9643ea8Slogwang }; 233a9643ea8Slogwang 234a9643ea8Slogwang #endif 2357f4229eaSlogwang 2367f4229eaSlogwang #ifdef __cplusplus 2377f4229eaSlogwang } 2387f4229eaSlogwang #endif 239a9643ea8Slogwang #endif 240a9643ea8Slogwang 241