1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 #ifndef _LX_MOUNT_H
27 #define _LX_MOUNT_H
28
29 #pragma ident "%Z%%M% %I% %E% SMI"
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 #include <rpc/rpc.h>
36 #include <nfs/nfs.h>
37
38 /*
39 * mount() is significantly different between Linux and Solaris. The main
40 * difference is between the set of flags. Some flags on Linux can be
41 * translated to a Solaris equivalent, some are converted to a
42 * filesystem-specific option, while others have no equivalent whatsoever.
43 */
44 #define LX_MS_MGC_VAL 0xC0ED0000
45 #define LX_MS_RDONLY 0x00000001
46 #define LX_MS_NOSUID 0x00000002
47 #define LX_MS_NODEV 0x00000004
48 #define LX_MS_NOEXEC 0x00000008
49 #define LX_MS_SYNCHRONOUS 0x00000010
50 #define LX_MS_REMOUNT 0x00000020
51 #define LX_MS_MANDLOCK 0x00000040
52 #define LX_MS_NOATIME 0x00000400
53 #define LX_MS_NODIRATIME 0x00000800
54 #define LX_MS_BIND 0x00001000
55 #define LX_MS_SUPPORTED (LX_MS_MGC_VAL | \
56 LX_MS_RDONLY | LX_MS_NOSUID | \
57 LX_MS_NODEV | LX_MS_NOEXEC | \
58 LX_MS_REMOUNT | LX_MS_NOATIME | \
59 LX_MS_BIND)
60
61 /*
62 * support for nfs mounts
63 */
64 #define LX_NMD_MAXHOSTNAMELEN 256
65
66 #define LX_NFS_MOUNT_SOFT 0x00000001
67 #define LX_NFS_MOUNT_INTR 0x00000002
68 #define LX_NFS_MOUNT_SECURE 0x00000004
69 #define LX_NFS_MOUNT_POSIX 0x00000008
70 #define LX_NFS_MOUNT_NOCTO 0x00000010
71 #define LX_NFS_MOUNT_NOAC 0x00000020
72 #define LX_NFS_MOUNT_TCP 0x00000040
73 #define LX_NFS_MOUNT_VER3 0x00000080
74 #define LX_NFS_MOUNT_KERBEROS 0x00000100
75 #define LX_NFS_MOUNT_NONLM 0x00000200
76 #define LX_NFS_MOUNT_BROKEN_SUID 0x00000400
77 #define LX_NFS_MOUNT_SUPPORTED (LX_NFS_MOUNT_SOFT | \
78 LX_NFS_MOUNT_INTR | \
79 LX_NFS_MOUNT_POSIX | \
80 LX_NFS_MOUNT_NOCTO | \
81 LX_NFS_MOUNT_NOAC | \
82 LX_NFS_MOUNT_TCP | \
83 LX_NFS_MOUNT_VER3 | \
84 LX_NFS_MOUNT_NONLM)
85
86 #define LX_NMD_DEFAULT_RSIZE 0
87 #define LX_NMD_DEFAULT_WSIZE 0
88
89 /*
90 * the nfs v3 file handle structure definitions are _almost_ the same
91 * on linux and solaris. the key difference are:
92 *
93 * 1) on linux fh3_length is an unsigned short where as on solaris it's
94 * an int.
95 *
96 * 2) on linux the file handle data doesn't 32 bit members, so the structure
97 * is not 32 bit aligned. (where as on solaris it is.)
98 *
99 * so rather than defining a structure that would allow us to intrepret
100 * all the contents of the nfs v3 file handle here, we decide to treate
101 * the file handle as an array of chars. this works just fine since it
102 * avoids the alignment issues and the actual file handle handle contects
103 * are defined by the nfs specification so they are common across solaris
104 * and linux. we do the same thing for nfs v2 file handles.
105 */
106 struct lx_nfs_fh2 {
107 unsigned char lx_fh_data[NFS_FHSIZE];
108 } lx_nfs_fh2;
109
110 struct lx_nfs_fh3 {
111 unsigned short lx_fh3_length;
112 unsigned char lx_fh3_data[NFS3_FHSIZE];
113 } lx_nfs_fh3;
114
115 typedef struct lx_nfs_mount_data {
116 int nmd_version;
117 int nmd_fd;
118 struct lx_nfs_fh2 nmd_old_root;
119 int nmd_flags;
120 int nmd_rsize;
121 int nmd_wsize;
122 int nmd_timeo;
123 int nmd_retrans;
124 int nmd_acregmin;
125 int nmd_acregmax;
126 int nmd_acdirmin;
127 int nmd_acdirmax;
128 struct sockaddr_in nmd_addr;
129 char nmd_hostname[LX_NMD_MAXHOSTNAMELEN];
130 int nmd_namlen;
131 uint_t nmd_bsize;
132 struct lx_nfs_fh3 nmd_root;
133 } lx_nfs_mount_data_t;
134
135 #ifdef __cplusplus
136 }
137 #endif
138
139 #endif /* _LX_MOUNT_H */