2 * <fstab.h> wrapper functions.
5 * Jonathan Pryor (jonpryor@vt.edu)
7 * Copyright (C) 2004-2005 Jonathan Pryor
19 #if defined (HAVE_CHECKLIST_H)
20 #include <checklist.h>
21 #elif defined (HAVE_FSTAB_H)
23 #endif /* def HAVE_FSTAB_H */
25 #ifdef HAVE_SYS_VFSTAB_H
26 #include <sys/vfstab.h>
27 #endif /* def HAVE_SYS_VFSTAB_H */
31 #ifdef HAVE_CHECKLIST_H
33 typedef struct checklist mph_fstab;
35 static const mph_string_offset_t
37 MPH_STRING_OFFSET (struct checklist, fs_spec, MPH_STRING_OFFSET_PTR),
38 MPH_STRING_OFFSET (struct checklist, fs_dir, MPH_STRING_OFFSET_PTR),
39 MPH_STRING_OFFSET (struct checklist, fs_type, MPH_STRING_OFFSET_PTR)
42 static const mph_string_offset_t
43 mph_fstab_offsets[] = {
44 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_spec, MPH_STRING_OFFSET_PTR),
45 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_file, MPH_STRING_OFFSET_PTR),
46 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_type, MPH_STRING_OFFSET_PTR)
49 #elif defined (HAVE_FSTAB_H)
51 typedef struct fstab mph_fstab;
53 static const mph_string_offset_t
55 MPH_STRING_OFFSET (struct fstab, fs_spec, MPH_STRING_OFFSET_PTR),
56 MPH_STRING_OFFSET (struct fstab, fs_file, MPH_STRING_OFFSET_PTR),
57 MPH_STRING_OFFSET (struct fstab, fs_vfstype, MPH_STRING_OFFSET_PTR),
58 MPH_STRING_OFFSET (struct fstab, fs_mntops, MPH_STRING_OFFSET_PTR),
59 MPH_STRING_OFFSET (struct fstab, fs_type, MPH_STRING_OFFSET_PTR)
62 static const mph_string_offset_t
63 mph_fstab_offsets[] = {
64 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_spec, MPH_STRING_OFFSET_PTR),
65 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_file, MPH_STRING_OFFSET_PTR),
66 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_vfstype, MPH_STRING_OFFSET_PTR),
67 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_mntops, MPH_STRING_OFFSET_PTR),
68 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_type, MPH_STRING_OFFSET_PTR)
71 #endif /* def HAVE_FSTAB_H */
73 #if defined (HAVE_CHECKLIST_H) || defined (HAVE_FSTAB_H)
76 * Copy the native `fstab' structure to it's managed representation.
78 * To minimize separate mallocs, all the strings are allocated within the same
79 * memory block (stored in _fs_buf_).
82 copy_fstab (struct Mono_Posix_Syscall__Fstab *to, mph_fstab *from)
86 memset (to, 0, sizeof(*to));
88 buf = _mph_copy_structure_strings (to, mph_fstab_offsets,
89 from, fstab_offsets, sizeof(fstab_offsets)/sizeof(fstab_offsets[0]));
91 to->fs_freq = from->fs_freq;
92 to->fs_passno = from->fs_passno;
102 #endif /* def HAVE_CHECKLIST_H || def HAVE_FSTAB_H */
104 #ifdef HAVE_SYS_VFSTAB_H
107 * Solaris doesn't provide <fstab.h> but has equivalent functionality in
108 * <sys/fstab.h> via getvfsent(3C) and company.
111 typedef struct vfstab mph_fstab;
113 static const mph_string_offset_t
115 MPH_STRING_OFFSET (struct vfstab, vfs_special, MPH_STRING_OFFSET_PTR),
116 MPH_STRING_OFFSET (struct vfstab, vfs_mountp, MPH_STRING_OFFSET_PTR),
117 MPH_STRING_OFFSET (struct vfstab, vfs_fstype, MPH_STRING_OFFSET_PTR),
118 MPH_STRING_OFFSET (struct vfstab, vfs_mntopts, MPH_STRING_OFFSET_PTR)
121 static const mph_string_offset_t
122 mph_fstab_offsets[] = {
123 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_spec, MPH_STRING_OFFSET_PTR),
124 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_file, MPH_STRING_OFFSET_PTR),
125 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_vfstype, MPH_STRING_OFFSET_PTR),
126 MPH_STRING_OFFSET (struct Mono_Posix_Syscall__Fstab, fs_mntops, MPH_STRING_OFFSET_PTR)
130 * Copy the native `vfstab' structure to it's managed representation.
132 * To minimize separate mallocs, all the strings are allocated within the same
133 * memory block (stored in _fs_buf_).
136 copy_fstab (struct Mono_Posix_Syscall__Fstab *to, struct vfstab *from)
140 memset (to, 0, sizeof(*to));
142 buf = _mph_copy_structure_strings (to, mph_fstab_offsets,
143 from, vfstab_offsets, sizeof(vfstab_offsets)/sizeof(vfstab_offsets[0]));
158 * Implement Linux/BSD getfsent(3) in terms of Solaris getvfsent(3C)...
166 /* protect from bad users calling setfsent(), setfsent(), ... endfsent() */
167 if (etc_fstab != NULL)
169 etc_fstab = fopen ("/etc/vfstab", "r");
170 if (etc_fstab != NULL)
185 static struct vfstab*
189 r = getvfsent (etc_fstab, &cur_vfstab_entry);
191 return &cur_vfstab_entry;
195 static struct vfstab*
196 getfsfile (const char *mount_point)
200 if (etc_fstab == 0) {
202 if (setfsent () != 1)
206 r = getvfsfile (etc_fstab, &cur_vfstab_entry, (char*) mount_point);
210 return &cur_vfstab_entry;
214 static struct vfstab*
215 getfsspec (const char *special_file)
219 if (etc_fstab == 0) {
221 if (setfsent () != 1)
225 r = getvfsspec (etc_fstab, &cur_vfstab_entry, (char*) special_file);
229 return &cur_vfstab_entry;
233 #endif /* def HAVE_SYS_VFSTAB_H */
235 #if defined (HAVE_FSTAB_H) || defined (HAVE_CHECKPOINT_H) || defined (HAVE_SYS_VFSTAB_H)
238 Mono_Posix_Syscall_endfsent (void)
245 Mono_Posix_Syscall_getfsent (struct Mono_Posix_Syscall__Fstab *fsbuf)
258 if (copy_fstab (fsbuf, fs) == -1) {
266 Mono_Posix_Syscall_getfsfile (const char *mount_point,
267 struct Mono_Posix_Syscall__Fstab *fsbuf)
276 fs = getfsfile (mount_point);
280 if (copy_fstab (fsbuf, fs) == -1) {
288 Mono_Posix_Syscall_getfsspec (const char *special_file,
289 struct Mono_Posix_Syscall__Fstab *fsbuf)
298 fs = getfsspec (special_file);
302 if (copy_fstab (fsbuf, fs) == -1) {
310 Mono_Posix_Syscall_setfsent (void)
315 #endif /* def HAVE_FSTAB_H || def HAVE_CHECKPOINT_H || def HAVE_SYS_VFSTAB_H */