1 //Written in the D programming language
2
3 /++
4 D header file for FreeBSD's sys/mount.h.
5
6 Copyright: Copyright 2018 -
7 License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
8 Authors: $(HTTP jmdavisprog.com, Jonathan M Davis)
9 +/
10 module core.sys.freebsd.sys.mount;
11
12 version (FreeBSD):
13
14 import core.sys.freebsd.config;
15 import core.stdc.config : c_long;
16 import core.sys.posix.sys.stat : stat_t;
17 import core.sys.posix.sys.types : uid_t;
18
19 extern(C) @nogc nothrow:
20
21 struct fsid_t
22 {
23 int[2] val;
24 }
25
26 enum MAXFIDSZ = 16;
27
28 struct fid
29 {
30 ushort fid_len;
31 ushort fid_data0;
32 char[MAXFIDSZ] fid_data = 0;
33 }
34
35 enum MFSNAMELEN = 16;
36
37 static if (__FreeBSD_version >= 1200000)
38 {
39 enum MNAMELEN = 1024;
40 enum STATFS_VERSION = 0x20140518;
41 }
42 else
43 {
44 enum MNAMELEN = 88;
45 enum STATFS_VERSION = 0x20030518;
46 }
47
48 struct statfs_t
49 {
50 uint f_version;
51 uint f_type;
52 ulong f_flags;
53 ulong f_bsize;
54 ulong f_iosize;
55 ulong f_blocks;
56 ulong f_bfree;
57 long f_bavail;
58 ulong f_files;
59 long f_ffree;
60 ulong f_syncwrites;
61 ulong f_asyncwrites;
62 ulong f_syncreads;
63 ulong f_asyncreads;
64 ulong[10] f_spare;
65 uint f_namemax;
66 uid_t f_owner;
67 fsid_t f_fsid;
68 char[80] f_charspare = 0;
69 char[MFSNAMELEN] f_fstypename = 0;
70 char[MNAMELEN] f_mntfromname = 0;
71 char[MNAMELEN] f_mntonname = 0;
72 }
73
74
75 enum ulong MNT_RDONLY = 0x0000000000000001;
76 enum ulong MNT_SYNCHRONOUS = 0x0000000000000002;
77 enum ulong MNT_NOEXEC = 0x0000000000000004;
78 enum ulong MNT_NOSUID = 0x0000000000000008;
79 enum ulong MNT_NFS4ACLS = 0x0000000000000010;
80 enum ulong MNT_UNION = 0x0000000000000020;
81 enum ulong MNT_ASYNC = 0x0000000000000040;
82 enum ulong MNT_SUIDDIR = 0x0000000000100000;
83 enum ulong MNT_SOFTDEP = 0x0000000000200000;
84 enum ulong MNT_NOSYMFOLLOW = 0x0000000000400000;
85 enum ulong MNT_GJOURNAL = 0x0000000002000000;
86 enum ulong MNT_MULTILABEL = 0x0000000004000000;
87 enum ulong MNT_ACLS = 0x0000000008000000;
88 enum ulong MNT_NOATIME = 0x0000000010000000;
89 enum ulong MNT_NOCLUSTERR = 0x0000000040000000;
90 enum ulong MNT_NOCLUSTERW = 0x0000000080000000;
91 enum ulong MNT_SUJ = 0x0000000100000000;
92 enum ulong MNT_AUTOMOUNTED = 0x0000000200000000;
93
94 enum ulong MNT_EXRDONLY = 0x0000000000000080;
95 enum ulong MNT_EXPORTED = 0x0000000000000100;
96 enum ulong MNT_DEFEXPORTED = 0x0000000000000200;
97 enum ulong MNT_EXPORTANON = 0x0000000000000400;
98 enum ulong MNT_EXKERB = 0x0000000000000800;
99 enum ulong MNT_EXPUBLIC = 0x0000000020000000;
100
101 enum ulong MNT_LOCAL = 0x0000000000001000;
102 enum ulong MNT_QUOTA = 0x0000000000002000;
103 enum ulong MNT_ROOTFS = 0x0000000000004000;
104 enum ulong MNT_USER = 0x0000000000008000;
105 enum ulong MNT_IGNORE = 0x0000000000800000;
106
107 enum MNT_VISFLAGMASK = MNT_RDONLY | MNT_SYNCHRONOUS | MNT_NOEXEC |
108 MNT_NOSUID | MNT_UNION | MNT_SUJ |
109 MNT_ASYNC | MNT_EXRDONLY | MNT_EXPORTED |
110 MNT_DEFEXPORTED | MNT_EXPORTANON| MNT_EXKERB |
111 MNT_LOCAL | MNT_USER | MNT_QUOTA |
112 MNT_ROOTFS | MNT_NOATIME | MNT_NOCLUSTERR |
113 MNT_NOCLUSTERW | MNT_SUIDDIR | MNT_SOFTDEP |
114 MNT_IGNORE | MNT_EXPUBLIC | MNT_NOSYMFOLLOW |
115 MNT_GJOURNAL | MNT_MULTILABEL | MNT_ACLS |
116 MNT_NFS4ACLS | MNT_AUTOMOUNTED;
117
118 enum MNT_UPDATEMASK = MNT_NOSUID | MNT_NOEXEC |
119 MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC |
120 MNT_NOATIME |
121 MNT_NOSYMFOLLOW | MNT_IGNORE |
122 MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR |
123 MNT_ACLS | MNT_USER | MNT_NFS4ACLS |
124 MNT_AUTOMOUNTED;
125
126 enum ulong MNT_UPDATE = 0x0000000000010000;
127 enum ulong MNT_DELEXPORT = 0x0000000000020000;
128 enum ulong MNT_RELOAD = 0x0000000000040000;
129 enum ulong MNT_FORCE = 0x0000000000080000;
130 enum ulong MNT_SNAPSHOT = 0x0000000001000000;
131 enum ulong MNT_NONBUSY = 0x0000000004000000;
132 enum ulong MNT_BYFSID = 0x0000000008000000;
133 enum ulong MNT_CMDFLAGS = MNT_UPDATE | MNT_DELEXPORT | MNT_RELOAD |
134 MNT_FORCE | MNT_SNAPSHOT | MNT_NONBUSY |
135 MNT_BYFSID;
136
137 enum uint MNTK_UNMOUNTF = 0x00000001;
138 enum uint MNTK_ASYNC = 0x00000002;
139 enum uint MNTK_SOFTDEP = 0x00000004;
140 enum uint MNTK_NOINSMNTQ = 0x00000008;
141 enum uint MNTK_DRAINING = 0x00000010;
142 enum uint MNTK_REFEXPIRE = 0x00000020;
143 enum uint MNTK_EXTENDED_SHARED = 0x00000040;
144 enum uint MNTK_SHARED_WRITES = 0x00000080;
145 enum uint MNTK_NO_IOPF = 0x00000100;
146 enum uint MNTK_VGONE_UPPER = 0x00000200;
147 enum uint MNTK_VGONE_WAITER = 0x00000400;
148 enum uint MNTK_LOOKUP_EXCL_DOTDOT = 0x00000800;
149 enum uint MNTK_MARKER = 0x00001000;
150 enum uint MNTK_UNMAPPED_BUFS = 0x00002000;
151 enum uint MNTK_USES_BCACHE = 0x00004000;
152 enum uint MNTK_NOASYNC = 0x00800000;
153 enum uint MNTK_UNMOUNT = 0x01000000;
154 enum uint MNTK_MWAIT = 0x02000000;
155 enum uint MNTK_SUSPEND = 0x08000000;
156 enum uint MNTK_SUSPEND2 = 0x04000000;
157 enum uint MNTK_SUSPENDED = 0x10000000;
158 enum uint MNTK_NULL_NOCACHE = 0x20000000;
159 enum uint MNTK_LOOKUP_SHARED = 0x40000000;
160 enum uint MNTK_NOKNOTE = 0x80000000;
161
162 enum VFS_VFSCONF = 0;
163 enum VFS_GENERIC = 0;
164
165 enum VFS_MAXTYPENUM = 1;
166 enum VFS_CONF = 2;
167
168 enum MNT_WAIT = 1;
169 enum MNT_NOWAIT = 2;
170 enum MNT_LAZY = 3;
171 enum MNT_SUSPEND = 4;
172
173 struct fhandle_t
174 {
175 fsid_t fh_fsid;
176 fid fh_fid;
177 }
178
179 // TODO - requires declarations from elsewhere that we don't currently have bindings for.
180 /+
181 struct oexport_args
182 {
183 int ex_flags;
184 uid_t ex_root;
185 xucred ex_anon;
186 sockaddr* ex_addr;
187 ubyte ex_addrlen;
188 sockaddr* ex_mask;
189 ubyte ex_masklen;
190 char* ex_indexfile;
191 }
192
193 enum MAXSECFLAVORS = 5;
194
195 struct export_args
196 {
197 int ex_flags;
198 uid_t ex_root;
199 xucred ex_anon;
200 sockaddr* ex_addr;
201 ubyte ex_addrlen;
202 sockaddr* ex_mask;
203 ubyte ex_masklen;
204 char* ex_indexfile;
205 int ex_numsecflavors;
206 int[MAXSECFLAVORS] ex_secflavors;
207 }
208
209 struct nfs_public
210 {
211 int np_valid;
212 fhandle_t np_handle;
213 mount_t* np_mount;
214 char* np_index;
215 }
216
217 struct vfsconf
218 {
219 uint vfc_version;
220 char[MFSNAMELEN] vfc_name = 0;
221 vfsops* vfc_vfsops;
222 int vfc_typenum;
223 int vfc_refcount;
224 int vfc_flags;
225 vfsoptdecl* vfc_opts;
226 TAILQ_ENTRY(vfsconf) vfc_list;
227 }
228
229 struct xvfsconf
230 {
231 vfsops* vfc_vfsops;
232 char[MFSNAMELEN] vfc_name = 0;
233 int vfc_typenum;
234 int vfc_refcount;
235 int vfc_flags;
236 vfsconf* vfc_next;
237 }
238 +/
239
240 struct ovfsconf
241 {
242 void* vfc_vfsops;
243 char[32] vfc_name = 0;
244 int vfc_index;
245 int vfc_refcount;
246 int vfc_flags;
247 }
248
249 enum uint VFCF_STATIC = 0x00010000;
250 enum uint VFCF_NETWORK = 0x00020000;
251 enum uint VFCF_READONLY = 0x00040000;
252 enum uint VFCF_SYNTHETIC = 0x00080000;
253 enum uint VFCF_LOOPBACK = 0x00100000;
254 enum uint VFCF_UNICODE = 0x00200000;
255 enum uint VFCF_JAIL = 0x00400000;
256 enum uint VFCF_DELEGADMIN = 0x00800000;
257 enum uint VFCF_SBDRY = 0x01000000;
258
259 alias fsctlop_t = uint;
260
261 struct vfsidctl
262 {
263 int vc_vers;
264 fsid_t vc_fsid;
265 char[MFSNAMELEN] vc_fstypename = 0;
266 fsctlop_t vc_op;
267 void* vc_ptr;
268 size_t vc_len;
269 uint[12] vc_spare;
270 }
271
272 enum uint VFS_CTL_VERS1 = 0x01;
273
274 enum uint VFS_CTL_QUERY = 0x00010001;
275 enum uint VFS_CTL_TIMEO = 0x00010002;
276 enum uint VFS_CTL_NOLOCKS = 0x00010003;
277
278 struct vfsquery
279 {
280 uint vq_flags;
281 uint[31] vq_spare;
282 }
283
284 enum uint VQ_NOTRESP = 0x0001;
285 enum uint VQ_NEEDAUTH = 0x0002;
286 enum uint VQ_LOWDISK = 0x0004;
287 enum uint VQ_MOUNT = 0x0008;
288 enum uint VQ_UNMOUNT = 0x0010;
289 enum uint VQ_DEAD = 0x0020;
290 enum uint VQ_ASSIST = 0x0040;
291 enum uint VQ_NOTRESPLOCK = 0x0080;
292 enum uint VQ_FLAG0100 = 0x0100;
293 enum uint VQ_FLAG0200 = 0x0200;
294 enum uint VQ_FLAG0400 = 0x0400;
295 enum uint VQ_FLAG0800 = 0x0800;
296 enum uint VQ_FLAG1000 = 0x1000;
297 enum uint VQ_FLAG2000 = 0x2000;
298 enum uint VQ_FLAG4000 = 0x4000;
299 enum uint VQ_FLAG8000 = 0x8000;
300
301 version (GNU)
302 {
303 int fhopen(const fhandle_t*, int);
304 int fhstat(const fhandle_t*, stat_t*);
305 int fhstatfs(const fhandle_t*, statfs_t*);
306 int fstatfs(int, statfs_t*);
307 int getfh(const char*, fhandle_t*);
308 int getfsstat(statfs_t*, c_long, int);
309 int getmntinfo(statfs_t**, int);
310 int lgetfh(const char*, fhandle_t*);
311 int mount(const char*, const char*, int, void*);
312 //int nmount(iovec*, uint, int);
313 int statfs(const char*, statfs_t*);
314 int unmount(const char*, int);
315 //int getvfsbyname(const char*, xvfsconf*);
316 }
317 else
318 {
319 static if (__FreeBSD_version >= 1200000)
320 {
321 pragma(mangle, "fhstat@FBSD_1.5") int fhstat(const fhandle_t*, stat_t*);
322 pragma(mangle, "fhstatfs@FBSD_1.5") int fhstatfs(const fhandle_t*, statfs_t*);
323 pragma(mangle, "fstatfs@FBSD_1.5") int fstatfs(int, statfs_t*);
324 pragma(mangle, "getfsstat@FBSD_1.5") int getfsstat(statfs_t*, c_long, int);
325 pragma(mangle, "getmntinfo@FBSD_1.5") int getmntinfo(statfs_t**, int);
326 pragma(mangle, "statfs@FBSD_1.5") int statfs(const char*, statfs_t*);
327 }
328 else
329 {
330 pragma(mangle, "fhstat@FBSD_1.0") int fhstat(const fhandle_t*, stat_t*);
331 pragma(mangle, "fhstatfs@FBSD_1.0") int fhstatfs(const fhandle_t*, statfs_t*);
332 pragma(mangle, "fstatfs@FBSD_1.0") int fstatfs(int, statfs_t*);
333 pragma(mangle, "getfsstat@FBSD_1.0") int getfsstat(statfs_t*, c_long, int);
334 pragma(mangle, "getmntinfo@FBSD_1.0") int getmntinfo(statfs_t**, int);
335 pragma(mangle, "statfs@FBSD_1.0") int statfs(const char*, statfs_t*);
336 }
337 pragma(mangle, "fhopen@@FBSD_1.0") int fhopen(const fhandle_t*, int);
338 pragma(mangle, "getfh@@FBSD_1.0") int getfh(const char*, fhandle_t*);
339 pragma(mangle, "lgetfh@@FBSD_1.0") int lgetfh(const char*, fhandle_t*);
340 pragma(mangle, "mount@@FBSD_1.0") int mount(const char*, const char*, int, void*);
341 //int nmount(iovec*, uint, int);
342 pragma(mangle, "unmount@@FBSD_1.0") int unmount(const char*, int);
343 //int getvfsbyname(const char*, xvfsconf*);
344 }