1/*
2 * Copyright (c) 1997-2006 Erez Zadok
3 * Copyright (c) 1990 Jan-Simon Pendry
4 * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
5 * Copyright (c) 1990 The Regents of the University of California.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to Berkeley by
9 * Jan-Simon Pendry at Imperial College, London.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 *    must display the following acknowledgment:
21 *      This product includes software developed by the University of
22 *      California, Berkeley and its contributors.
23 * 4. Neither the name of the University nor the names of its contributors
24 *    may be used to endorse or promote products derived from this software
25 *    without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 * SUCH DAMAGE.
38 *
39 *
40 * File: am-utils/include/am_compat.h
41 *
42 */
43
44/*
45 *
46 * This file contains compatibility functions and macros, all of which
47 * should be auto-discovered, but for one reason or another (mostly
48 * brain-damage on the part of system designers and header files) they cannot.
49 *
50 * Each compatibility macro/function must include instructions on how/when
51 * it can be removed the am-utils code.
52 *
53 */
54
55#ifndef _AM_COMPAT_H
56# define _AM_COMPAT_H
57
58/*
59 * incomplete mount options definitions (sunos4, irix6, linux, etc.)
60 */
61
62
63/*
64 * Complete MNTTAB_OPT_* options based on MNT2_NFS_OPT_* mount options.
65 */
66#if defined(MNT2_NFS_OPT_ACDIRMAX) && !defined(MNTTAB_OPT_ACDIRMAX)
67# define MNTTAB_OPT_ACDIRMAX "acdirmax"
68#endif /* defined(MNT2_NFS_OPT_ACDIRMAX) && !defined(MNTTAB_OPT_ACDIRMAX) */
69
70#if defined(MNT2_NFS_OPT_ACDIRMIN) && !defined(MNTTAB_OPT_ACDIRMIN)
71# define MNTTAB_OPT_ACDIRMIN "acdirmin"
72#endif /* defined(MNT2_NFS_OPT_ACDIRMIN) && !defined(MNTTAB_OPT_ACDIRMIN) */
73
74#if defined(MNT2_NFS_OPT_ACREGMAX) && !defined(MNTTAB_OPT_ACREGMAX)
75# define MNTTAB_OPT_ACREGMAX "acregmax"
76#endif /* defined(MNT2_NFS_OPT_ACREGMAX) && !defined(MNTTAB_OPT_ACREGMAX) */
77
78#if defined(MNT2_NFS_OPT_ACREGMIN) && !defined(MNTTAB_OPT_ACREGMIN)
79# define MNTTAB_OPT_ACREGMIN "acregmin"
80#endif /* defined(MNT2_NFS_OPT_ACREGMIN) && !defined(MNTTAB_OPT_ACREGMIN) */
81
82#if !defined(MNTTAB_OPT_IGNORE)
83/* SunOS 4.1.x and others define "noauto" option, but not "auto" */
84# if defined(MNTTAB_OPT_NOAUTO) && !defined(MNTTAB_OPT_AUTO)
85#  define MNTTAB_OPT_AUTO "auto"
86# endif /* defined(MNTTAB_OPT_NOAUTO) && !defined(MNTTAB_OPT_AUTO) */
87#endif /* !defined(MNTTAB_OPT_IGNORE) */
88
89#if defined(MNT2_NFS_OPT_NOAC) && !defined(MNTTAB_OPT_NOAC)
90# define MNTTAB_OPT_NOAC "noac"
91#endif /* defined(MNT2_NFS_OPT_NOAC) && !defined(MNTTAB_OPT_NOAC) */
92
93#if defined(MNT2_NFS_OPT_NOCONN) && !defined(MNTTAB_OPT_NOCONN)
94# define MNTTAB_OPT_NOCONN "noconn"
95# ifndef MNTTAB_OPT_CONN
96#  define MNTTAB_OPT_CONN "conn"
97# endif /* MNTTAB_OPT_CONN */
98#endif /* defined(MNT2_NFS_OPT_NOCONN) && !defined(MNTTAB_OPT_NOCONN) */
99
100#if defined(MNT2_NFS_OPT_PGTHRESH) && !defined(MNTTAB_OPT_PGTHRESH)
101# define MNTTAB_OPT_PGTHRESH "pgthresh"
102#endif /* defined(MNT2_NFS_OPT_PGTHRESH) && !defined(MNTTAB_OPT_PGTHRESH) */
103
104#if defined(MNT2_NFS_OPT_PRIVATE) && !defined(MNTTAB_OPT_PRIVATE)
105# define MNTTAB_OPT_PRIVATE "private"
106#endif /* defined(MNT2_NFS_OPT_PRIVATE) && !defined(MNTTAB_OPT_PRIVATE) */
107
108#if defined(MNT2_NFS_OPT_RETRANS) && !defined(MNTTAB_OPT_RETRANS)
109# define MNTTAB_OPT_RETRANS "retrans"
110#endif /* defined(MNT2_NFS_OPT_RETRANS) && !defined(MNTTAB_OPT_RETRANS) */
111
112#if defined(MNT2_NFS_OPT_RSIZE) && !defined(MNTTAB_OPT_RSIZE)
113# define MNTTAB_OPT_RSIZE "rsize"
114#endif /* defined(MNT2_NFS_OPT_RSIZE) && !defined(MNTTAB_OPT_RSIZE) */
115
116#if defined(MNT2_NFS_OPT_SOFT) && !defined(MNTTAB_OPT_SOFT)
117# define MNTTAB_OPT_SOFT "soft"
118# ifndef MNTTAB_OPT_HARD
119#  define MNTTAB_OPT_HARD "hard"
120# endif /* not MNTTAB_OPT_HARD */
121#endif /* defined(MNT2_NFS_OPT_SOFT) && !defined(MNTTAB_OPT_SOFT) */
122
123#if defined(MNT2_NFS_OPT_TIMEO) && !defined(MNTTAB_OPT_TIMEO)
124# define MNTTAB_OPT_TIMEO "timeo"
125#endif /* defined(MNT2_NFS_OPT_TIMEO) && !defined(MNTTAB_OPT_TIMEO) */
126
127#if defined(MNT2_NFS_OPT_WSIZE) && !defined(MNTTAB_OPT_WSIZE)
128# define MNTTAB_OPT_WSIZE "wsize"
129#endif /* defined(MNT2_NFS_OPT_WSIZE) && !defined(MNTTAB_OPT_WSIZE) */
130
131#if defined(MNT2_NFS_OPT_MAXGRPS) && !defined(MNTTAB_OPT_MAXGROUPS)
132# define MNTTAB_OPT_MAXGROUPS "maxgroups"
133#endif /* defined(MNT2_NFS_OPT_MAXGRPS) && !defined(MNTTAB_OPT_MAXGROUPS) */
134
135#if defined(MNT2_NFS_OPT_PROPLIST) && !defined(MNTTAB_OPT_PROPLIST)
136# define MNTTAB_OPT_PROPLIST "proplist"
137#endif /* defined(MNT2_NFS_OPT_PROPLIST) && !defined(MNTTAB_OPT_PROPLIST) */
138
139#if defined(MNT2_NFS_OPT_NONLM) && !defined(MNTTAB_OPT_NOLOCK)
140# define MNTTAB_OPT_NOLOCK "nolock"
141#endif /* defined(MNT2_NFS_OPT_NONLM) && !defined(MNTTAB_OPT_NOLOCK) */
142
143#if defined(MNT2_NFS_OPT_XLATECOOKIE) && !defined(MNTTAB_OPT_XLATECOOKIE)
144# define MNTTAB_OPT_XLATECOOKIE "xlatecookie"
145#endif /* defined(MNT2_NFS_OPT_XLATECOOKIE) && !defined(MNTTAB_OPT_XLATECOOKIE) */
146
147/*
148 * Complete MNTTAB_OPT_* options based on MNT2_CDFS_OPT_* mount options.
149 */
150#if defined(MNT2_CDFS_OPT_DEFPERM) && !defined(MNTTAB_OPT_DEFPERM)
151# define MNTTAB_OPT_DEFPERM "defperm"
152#endif /* defined(MNT2_CDFS_OPT_DEFPERM) && !defined(MNTTAB_OPT_DEFPERM) */
153
154#if defined(MNT2_CDFS_OPT_NODEFPERM) && !defined(MNTTAB_OPT_NODEFPERM)
155# define MNTTAB_OPT_NODEFPERM "nodefperm"
156/*
157 * DEC OSF/1 V3.x/Digital UNIX V4.0 have M_NODEFPERM only, but
158 * both mnttab ops.
159 */
160# ifndef MNTTAB_OPT_DEFPERM
161#  define MNTTAB_OPT_DEFPERM "defperm"
162# endif /* not MNTTAB_OPT_DEFPERM */
163#endif /* defined(MNT2_CDFS_OPT_NODEFPERM) && !defined(MNTTAB_OPT_NODEFPERM) */
164
165#if defined(MNT2_CDFS_OPT_NOVERSION) && !defined(MNTTAB_OPT_NOVERSION)
166# define MNTTAB_OPT_NOVERSION "noversion"
167#endif /* defined(MNT2_CDFS_OPT_NOVERSION) && !defined(MNTTAB_OPT_NOVERSION) */
168
169#if defined(MNT2_CDFS_OPT_RRIP) && !defined(MNTTAB_OPT_RRIP)
170# define MNTTAB_OPT_RRIP "rrip"
171#endif /* defined(MNT2_CDFS_OPT_RRIP) && !defined(MNTTAB_OPT_RRIP) */
172#if defined(MNT2_CDFS_OPT_NORRIP) && !defined(MNTTAB_OPT_NORRIP)
173# define MNTTAB_OPT_NORRIP "norrip"
174#endif /* defined(MNT2_CDFS_OPT_NORRIP) && !defined(MNTTAB_OPT_NORRIP) */
175
176#if defined(MNT2_CDFS_OPT_GENS) && !defined(MNTTAB_OPT_GENS)
177# define MNTTAB_OPT_GENS "gens"
178#endif /* defined(MNT2_CDFS_OPT_GENS) && !defined(MNTTAB_OPT_GENS) */
179#if defined(MNT2_CDFS_OPT_EXTATT) && !defined(MNTTAB_OPT_EXTATT)
180# define MNTTAB_OPT_EXTATT "extatt"
181#endif /* defined(MNT2_CDFS_OPT_EXTATT) && !defined(MNTTAB_OPT_EXTATT) */
182
183/*
184 * Complete MNTTAB_OPT_* options based on MNT2_PCFS_OPT_* mount options.
185 */
186#if defined(MNT2_PCFS_OPT_LONGNAME) && !defined(MNTTAB_OPT_LONGNAME)
187# define MNTTAB_OPT_LONGNAME "longnames"
188#endif /* defined(MNT2_PCFS_OPT_LONGNAME) && !defined(MNTTAB_OPT_LONGNAME) */
189#if defined(MNT2_PCFS_OPT_NOWIN95) && !defined(MNTTAB_OPT_NOWIN95)
190# define MNTTAB_OPT_NOWIN95 "nowin95"
191#endif /* defined(MNT2_PCFS_OPT_NOWIN95) && !defined(MNTTAB_OPT_NOWIN95) */
192#if defined(MNT2_PCFS_OPT_SHORTNAME) && !defined(MNTTAB_OPT_SHORTNAME)
193# define MNTTAB_OPT_SHORTNAME "shortnames"
194#endif /* defined(MNT2_PCFS_OPT_SHORTNAME) && !defined(MNTTAB_OPT_SHORTNAME) */
195
196/*
197 * Complete MNTTAB_OPT_* options based on MNT2_GEN_OPT_* mount options.
198 */
199#if defined(MNT2_GEN_OPT_GRPID) && !defined(MNTTAB_OPT_GRPID)
200# define MNTTAB_OPT_GRPID "grpid"
201#endif /* defined(MNT2_GEN_OPT_GRPID) && !defined(MNTTAB_OPT_GRPID) */
202
203#if defined(MNT2_GEN_OPT_NOCACHE) && !defined(MNTTAB_OPT_NOCACHE)
204# define MNTTAB_OPT_NOCACHE "nocache"
205#endif /* defined(MNT2_GEN_OPT_NOCACHE) && !defined(MNTTAB_OPT_NOCACHE) */
206
207#if defined(MNT2_GEN_OPT_NOSUID) && !defined(MNTTAB_OPT_NOSUID)
208# define MNTTAB_OPT_NOSUID "nosuid"
209#endif /* defined(MNT2_GEN_OPT_NOSUID) && !defined(MNTTAB_OPT_NOSUID) */
210
211#if defined(MNT2_GEN_OPT_OVERLAY) && !defined(MNTTAB_OPT_OVERLAY)
212# define MNTTAB_OPT_OVERLAY "overlay"
213#endif /* defined(MNT2_GEN_OPT_OVERLAY) && !defined(MNTTAB_OPT_OVERLAY) */
214
215/*
216 * Complete MNTTAB_OPT_* options and their inverse based on MNT2_GEN_OPT_*
217 * options.
218 */
219#if defined(MNT2_GEN_OPT_NODEV) && !defined(MNTTAB_OPT_NODEV)
220# define MNTTAB_OPT_NODEV "nodev"
221#endif /* defined(MNT2_GEN_OPT_NODEV) && !defined(MNTTAB_OPT_NODEV) */
222
223#if defined(MNT2_GEN_OPT_NOEXEC) && !defined(MNTTAB_OPT_NOEXEC)
224# define MNTTAB_OPT_NOEXEC "noexec"
225/* this is missing under some versions of Linux */
226# ifndef MNTTAB_OPT_EXEC
227#  define MNTTAB_OPT_EXEC "exec"
228# endif /* not MNTTAB_OPT_EXEC */
229#endif /* defined(MNT2_GEN_OPT_NOEXEC) && !defined(MNTTAB_OPT_NOEXEC) */
230
231#if defined(MNT2_GEN_OPT_QUOTA) && !defined(MNTTAB_OPT_QUOTA)
232# define MNTTAB_OPT_QUOTA "quota"
233#endif /* defined(MNT2_GEN_OPT_QUOTA) && !defined(MNTTAB_OPT_QUOTA) */
234
235#if defined(MNT2_GEN_OPT_SYNC) && !defined(MNTTAB_OPT_SYNC)
236# define MNTTAB_OPT_SYNC "sync"
237#endif /* defined(MNT2_GEN_OPT_SYNC) && !defined(MNTTAB_OPT_SYNC) */
238
239
240/*
241 * Add missing MNTTAB_OPT_* options.
242 */
243#ifndef MNTTAB_OPT_ACTIMEO
244# define MNTTAB_OPT_ACTIMEO "actimeo"
245#endif /* not MNTTAB_OPT_ACTIMEO */
246
247#ifndef MNTTAB_OPT_INTR
248# define MNTTAB_OPT_INTR "intr"
249#endif /* not MNTTAB_OPT_INTR */
250
251#ifndef MNTTAB_OPT_PORT
252# define MNTTAB_OPT_PORT "port"
253#endif /* not MNTTAB_OPT_PORT */
254
255#ifndef MNTTAB_OPT_PUBLIC
256# define MNTTAB_OPT_PUBLIC "public"
257#endif /* not MNTTAB_OPT_PUBLIC */
258
259#ifndef MNTTAB_OPT_RETRANS
260# define MNTTAB_OPT_RETRANS "retrans"
261#endif /* not MNTTAB_OPT_RETRANS */
262
263#ifndef MNTTAB_OPT_RETRY
264# define MNTTAB_OPT_RETRY "retry"
265#endif /* not MNTTAB_OPT_RETRY */
266
267#ifndef MNTTAB_OPT_RO
268# define MNTTAB_OPT_RO "ro"
269#endif /* not MNTTAB_OPT_RO */
270
271#ifndef MNTTAB_OPT_RSIZE
272# define MNTTAB_OPT_RSIZE "rsize"
273#endif /* not MNTTAB_OPT_RSIZE */
274
275#ifndef MNTTAB_OPT_RW
276# define MNTTAB_OPT_RW "rw"
277#endif /* not MNTTAB_OPT_RW */
278
279#ifndef MNTTAB_OPT_TIMEO
280# define MNTTAB_OPT_TIMEO "timeo"
281#endif /* not MNTTAB_OPT_TIMEO */
282
283#ifndef MNTTAB_OPT_WSIZE
284# define MNTTAB_OPT_WSIZE "wsize"
285#endif /* not MNTTAB_OPT_WSIZE */
286
287/* next four are useful for pcfs mounts */
288#ifndef MNTTAB_OPT_USER
289# define MNTTAB_OPT_USER "user"
290#endif /* not MNTTAB_OPT_USER */
291#ifndef MNTTAB_OPT_GROUP
292# define MNTTAB_OPT_GROUP "group"
293#endif /* not MNTTAB_OPT_GROUP */
294#ifndef MNTTAB_OPT_MASK
295# define MNTTAB_OPT_MASK "mask"
296#endif /* not MNTTAB_OPT_MASK */
297#ifndef MNTTAB_OPT_DIRMASK
298# define MNTTAB_OPT_DIRMASK "dirmask"
299#endif /* not MNTTAB_OPT_DIRMASK */
300
301/*
302 * Incomplete filesystem definitions (sunos4, irix6, solaris2)
303 */
304#if defined(HAVE_FS_CDFS) && defined(MOUNT_TYPE_CDFS) && !defined(MNTTYPE_CDFS)
305# define MNTTYPE_CDFS "hsfs"
306#endif /* defined(HAVE_FS_CDFS) && defined(MOUNT_TYPE_CDFS) && !defined(MNTTYPE_CDFS) */
307
308#ifndef cdfs_args_t
309/*
310 * Solaris has an HSFS filesystem, but does not define hsfs_args.
311 * XXX: the definition here for solaris is wrong, since under solaris,
312 * hsfs_args should be a single integer used as a bit-field for options.
313 * so this code has to be fixed later.  -Erez.
314 */
315struct hsfs_args {
316        char *fspec;    /* name of filesystem to mount */
317        int norrip;
318};
319# define cdfs_args_t struct hsfs_args
320# define HAVE_CDFS_ARGS_T_NORRIP
321#endif /* not cdfs_args_t */
322
323/*
324 * if does not define struct pc_args, assume integer bit-field (irix6)
325 */
326#if defined(HAVE_FS_PCFS) && !defined(pcfs_args_t)
327# define pcfs_args_t u_int
328#endif /* defined(HAVE_FS_PCFS) && !defined(pcfs_args_t) */
329
330/*
331 * if does not define struct ufs_args, assume integer bit-field (linux)
332 */
333#if defined(HAVE_FS_UFS) && !defined(ufs_args_t)
334# define ufs_args_t u_int
335#endif /* defined(HAVE_FS_UFS) && !defined(ufs_args_t) */
336
337/*
338 * if does not define struct efs_args, assume integer bit-field (linux)
339 */
340#if defined(HAVE_FS_EFS) && !defined(efs_args_t)
341# define efs_args_t u_int
342#endif /* defined(HAVE_FS_EFS) && !defined(efs_args_t) */
343
344/*
345 * if does not define struct xfs_args, assume integer bit-field (linux)
346 */
347#if defined(HAVE_FS_XFS) && !defined(xfs_args_t)
348# define xfs_args_t u_int
349#endif /* defined(HAVE_FS_XFS) && !defined(xfs_args_t) */
350
351#if defined(HAVE_FS_AUTOFS) && defined(MOUNT_TYPE_AUTOFS) && !defined(MNTTYPE_AUTOFS)
352# define MNTTYPE_AUTOFS "autofs"
353#endif /* defined(HAVE_FS_AUTOFS) && defined(MOUNT_TYPE_AUTOFS) && !defined(MNTTYPE_AUTOFS) */
354
355/*
356 * If NFS3, then make sure that "proto" and "vers" mnttab options
357 * are available.
358 */
359#ifdef HAVE_FS_NFS3
360# ifndef MNTTAB_OPT_VERS
361#  define MNTTAB_OPT_VERS "vers"
362# endif /* not MNTTAB_OPT_VERS */
363# ifndef MNTTAB_OPT_PROTO
364#  define MNTTAB_OPT_PROTO "proto"
365# endif /* not MNTTAB_OPT_PROTO */
366#endif /* not HAVE_FS_NFS3 */
367
368/*
369 * If loop device (header file) exists, define mount table option
370 */
371#if defined(HAVE_LOOP_DEVICE) && !defined(MNTTAB_OPT_LOOP)
372# define MNTTAB_OPT_LOOP "loop"
373#endif /* defined(HAVE_LOOP_DEVICE) && !defined(MNTTAB_OPT_LOOP) */
374
375/*
376 * Define a dummy struct netconfig for non-TLI systems
377 */
378#if !defined(HAVE_NETCONFIG_H) && !defined(HAVE_SYS_NETCONFIG_H)
379struct netconfig {
380  int dummy;
381};
382#endif /* not HAVE_NETCONFIG_H and not HAVE_SYS_NETCONFIG_H */
383
384/* some OSs don't define INADDR_NONE and assume it's unsigned -1 */
385#ifndef INADDR_NONE
386# define INADDR_NONE	0xffffffffU
387#endif /* INADDR_NONE */
388/* some OSs don't define INADDR_LOOPBACK */
389#ifndef INADDR_LOOPBACK
390# define INADDR_LOOPBACK	0x7f000001
391#endif /* not INADDR_LOOPBACK */
392
393#endif /* not _AM_COMPAT_H */
394