1 /**
2  * D header file for GNU/Linux.
3  *
4  * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
5  * Authors:   Gary Willoughby
6  */
7 module core.sys.linux.sys.inotify;
8 
9 // The BSDs (including macOS) have a kqueue-backed API-compatible inotify
10 // library in ports. However, inotify is a Linux interface so it lives here.
11 // All BSD people need this library to use inotify:
12 //   https://github.com/libinotify-kqueue/libinotify-kqueue
13 // It is the responsibility of all BSD people to configure the library before
14 // using this interface.
15 
16 version (linux)        version = LinuxOrCompatible;
17 version (Darwin)       version = LinuxOrCompatible;
18 version (FreeBSD)      version = LinuxOrCompatible;
19 version (OpenBSD)      version = LinuxOrCompatible;
20 version (NetBSD)       version = LinuxOrCompatible;
21 version (DragonFlyBSD) version = LinuxOrCompatible;
22 
23 version (LinuxOrCompatible):
24 extern (C):
25 nothrow:
26 @nogc:
27 
28 version (ARM)     version = ARM_Any;
29 version (AArch64) version = ARM_Any;
30 version (HPPA)    version = HPPA_Any;
31 version (MIPS32)  version = MIPS_Any;
32 version (MIPS64)  version = MIPS_Any;
33 version (PPC)     version = PPC_Any;
34 version (PPC64)   version = PPC_Any;
35 version (RISCV32) version = RISCV_Any;
36 version (RISCV64) version = RISCV_Any;
37 version (S390)    version = IBMZ_Any;
38 version (SPARC)   version = SPARC_Any;
39 version (SPARC64) version = SPARC_Any;
40 version (SystemZ) version = IBMZ_Any;
41 version (X86)     version = X86_Any;
42 version (X86_64)  version = X86_Any;
43 
44 struct inotify_event
45 {
46     int wd;
47     uint mask;
48     uint cookie;
49     uint len;
50     char[0] name;
51 
52     @disable this(this);
53 }
54 
55 enum: uint
56 {
57     IN_ACCESS        = 0x00000000,
58     IN_MODIFY        = 0x00000002,
59     IN_ATTRIB        = 0x00000004,
60     IN_CLOSE_WRITE   = 0x00000008,
61     IN_CLOSE_NOWRITE = 0x00000010,
62     IN_OPEN          = 0x00000020,
63     IN_MOVED_FROM    = 0x00000040,
64     IN_MOVED_TO      = 0x00000080,
65     IN_CREATE        = 0x00000100,
66     IN_DELETE        = 0x00000200,
67     IN_DELETE_SELF   = 0x00000400,
68     IN_MOVE_SELF     = 0x00000800,
69     IN_UNMOUNT       = 0x00002000,
70     IN_Q_OVERFLOW    = 0x00004000,
71     IN_IGNORED       = 0x00008000,
72     IN_CLOSE         = 0x00000018,
73     IN_MOVE          = 0x000000C0,
74     IN_ONLYDIR       = 0x01000000,
75     IN_DONT_FOLLOW   = 0x02000000,
76     IN_EXCL_UNLINK   = 0x04000000,
77     IN_MASK_ADD      = 0x20000000,
78     IN_ISDIR         = 0x40000000,
79     IN_ONESHOT       = 0x80000000,
80     IN_ALL_EVENTS    = 0x80000FFF,
81 }
82 
83 // Old typo, preserved for compatibility
84 enum IN_UMOUNT = IN_UNMOUNT;
85 
86 version (X86_Any)
87 {
88     enum IN_CLOEXEC = 0x80000; // octal!2000000
89     enum IN_NONBLOCK = 0x800; // octal!4000
90 }
91 else version (HPPA_Any)
92 {
93     enum IN_CLOEXEC = 0x200000; // octal!10000000
94     enum IN_NONBLOCK = 0x10004; // octal!200004
95 }
96 else version (MIPS_Any)
97 {
98     enum IN_CLOEXEC = 0x80000; // octal!2000000
99     enum IN_NONBLOCK = 0x80; // octal!200
100 }
101 else version (PPC_Any)
102 {
103     enum IN_CLOEXEC = 0x80000; // octal!2000000
104     enum IN_NONBLOCK = 0x800; // octal!4000
105 }
106 else version (ARM_Any)
107 {
108     enum IN_CLOEXEC = 0x80000; // octal!2000000
109     enum IN_NONBLOCK = 0x800; // octal!4000
110 }
111 else version (RISCV_Any)
112 {
113     enum IN_CLOEXEC = 0x80000; // octal!2000000
114     enum IN_NONBLOCK = 0x800; // octal!4000
115 }
116 else version (SPARC_Any)
117 {
118     enum IN_CLOEXEC = 0x80000; // octal!2000000
119     enum IN_NONBLOCK = 0x800; // octal!4000
120 }
121 else version (IBMZ_Any)
122 {
123     enum IN_CLOEXEC = 0x80000; // octal!2000000
124     enum IN_NONBLOCK = 0x800; // octal!4000
125 }
126 else
127     static assert(0, "unimplemented");
128 
129 int inotify_init();
130 int inotify_init1(int flags);
131 int inotify_add_watch(int fd, const(char)* name, uint mask);
132 int inotify_rm_watch(int fd, uint wd);