1 /*
2  * Copyright 2008 Red Hat, Inc. All rights reserved.
3  * Copyright 2008 Ian Kent <raven@themaw.net>
4  *
5  * This file is part of the Linux kernel and is made available under
6  * the terms of the GNU General Public License, version 2, or at your
7  * option, any later version, incorporated herein by reference.
8  */
9 
10 #ifndef _LINUX_AUTO_DEV_IOCTL_H
11 #define _LINUX_AUTO_DEV_IOCTL_H
12 
13 #include <linux/auto_fs.h>
14 
15 #ifdef __KERNEL__
16 #include <linux/string.h>
17 #else
18 #include <string.h>
19 #endif /* __KERNEL__ */
20 
21 #define AUTOFS_DEVICE_NAME		"autofs"
22 
23 #define AUTOFS_DEV_IOCTL_VERSION_MAJOR	1
24 #define AUTOFS_DEV_IOCTL_VERSION_MINOR	0
25 
26 #define AUTOFS_DEVID_LEN		16
27 
28 #define AUTOFS_DEV_IOCTL_SIZE		sizeof(struct autofs_dev_ioctl)
29 
30 /*
31  * An ioctl interface for autofs mount point control.
32  */
33 
34 struct args_protover {
35 	__u32	version;
36 };
37 
38 struct args_protosubver {
39 	__u32	sub_version;
40 };
41 
42 struct args_openmount {
43 	__u32	devid;
44 };
45 
46 struct args_ready {
47 	__u32	token;
48 };
49 
50 struct args_fail {
51 	__u32	token;
52 	__s32	status;
53 };
54 
55 struct args_setpipefd {
56 	__s32	pipefd;
57 };
58 
59 struct args_timeout {
60 	__u64	timeout;
61 };
62 
63 struct args_requester {
64 	__u32	uid;
65 	__u32	gid;
66 };
67 
68 struct args_expire {
69 	__u32	how;
70 };
71 
72 struct args_askumount {
73 	__u32	may_umount;
74 };
75 
76 struct args_ismountpoint {
77 	union {
78 		struct args_in {
79 			__u32	type;
80 		} in;
81 		struct args_out {
82 			__u32	devid;
83 			__u32	magic;
84 		} out;
85 	};
86 };
87 
88 /*
89  * All the ioctls use this structure.
90  * When sending a path size must account for the total length
91  * of the chunk of memory otherwise is is the size of the
92  * structure.
93  */
94 
95 struct autofs_dev_ioctl {
96 	__u32 ver_major;
97 	__u32 ver_minor;
98 	__u32 size;		/* total size of data passed in
99 				 * including this struct */
100 	__s32 ioctlfd;		/* automount command fd */
101 
102 	/* Command parameters */
103 
104 	union {
105 		struct args_protover		protover;
106 		struct args_protosubver		protosubver;
107 		struct args_openmount		openmount;
108 		struct args_ready		ready;
109 		struct args_fail		fail;
110 		struct args_setpipefd		setpipefd;
111 		struct args_timeout		timeout;
112 		struct args_requester		requester;
113 		struct args_expire		expire;
114 		struct args_askumount		askumount;
115 		struct args_ismountpoint	ismountpoint;
116 	};
117 
118 	char path[0];
119 };
120 
init_autofs_dev_ioctl(struct autofs_dev_ioctl * in)121 static inline void init_autofs_dev_ioctl(struct autofs_dev_ioctl *in)
122 {
123 	memset(in, 0, sizeof(struct autofs_dev_ioctl));
124 	in->ver_major = AUTOFS_DEV_IOCTL_VERSION_MAJOR;
125 	in->ver_minor = AUTOFS_DEV_IOCTL_VERSION_MINOR;
126 	in->size = sizeof(struct autofs_dev_ioctl);
127 	in->ioctlfd = -1;
128 	return;
129 }
130 
131 /*
132  * If you change this make sure you make the corresponding change
133  * to autofs-dev-ioctl.c:lookup_ioctl()
134  */
135 enum {
136 	/* Get various version info */
137 	AUTOFS_DEV_IOCTL_VERSION_CMD = 0x71,
138 	AUTOFS_DEV_IOCTL_PROTOVER_CMD,
139 	AUTOFS_DEV_IOCTL_PROTOSUBVER_CMD,
140 
141 	/* Open mount ioctl fd */
142 	AUTOFS_DEV_IOCTL_OPENMOUNT_CMD,
143 
144 	/* Close mount ioctl fd */
145 	AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD,
146 
147 	/* Mount/expire status returns */
148 	AUTOFS_DEV_IOCTL_READY_CMD,
149 	AUTOFS_DEV_IOCTL_FAIL_CMD,
150 
151 	/* Activate/deactivate autofs mount */
152 	AUTOFS_DEV_IOCTL_SETPIPEFD_CMD,
153 	AUTOFS_DEV_IOCTL_CATATONIC_CMD,
154 
155 	/* Expiry timeout */
156 	AUTOFS_DEV_IOCTL_TIMEOUT_CMD,
157 
158 	/* Get mount last requesting uid and gid */
159 	AUTOFS_DEV_IOCTL_REQUESTER_CMD,
160 
161 	/* Check for eligible expire candidates */
162 	AUTOFS_DEV_IOCTL_EXPIRE_CMD,
163 
164 	/* Request busy status */
165 	AUTOFS_DEV_IOCTL_ASKUMOUNT_CMD,
166 
167 	/* Check if path is a mountpoint */
168 	AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD,
169 };
170 
171 #define AUTOFS_IOCTL 0x93
172 
173 #define AUTOFS_DEV_IOCTL_VERSION \
174 	_IOWR(AUTOFS_IOCTL, \
175 	      AUTOFS_DEV_IOCTL_VERSION_CMD, struct autofs_dev_ioctl)
176 
177 #define AUTOFS_DEV_IOCTL_PROTOVER \
178 	_IOWR(AUTOFS_IOCTL, \
179 	      AUTOFS_DEV_IOCTL_PROTOVER_CMD, struct autofs_dev_ioctl)
180 
181 #define AUTOFS_DEV_IOCTL_PROTOSUBVER \
182 	_IOWR(AUTOFS_IOCTL, \
183 	      AUTOFS_DEV_IOCTL_PROTOSUBVER_CMD, struct autofs_dev_ioctl)
184 
185 #define AUTOFS_DEV_IOCTL_OPENMOUNT \
186 	_IOWR(AUTOFS_IOCTL, \
187 	      AUTOFS_DEV_IOCTL_OPENMOUNT_CMD, struct autofs_dev_ioctl)
188 
189 #define AUTOFS_DEV_IOCTL_CLOSEMOUNT \
190 	_IOWR(AUTOFS_IOCTL, \
191 	      AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD, struct autofs_dev_ioctl)
192 
193 #define AUTOFS_DEV_IOCTL_READY \
194 	_IOWR(AUTOFS_IOCTL, \
195 	      AUTOFS_DEV_IOCTL_READY_CMD, struct autofs_dev_ioctl)
196 
197 #define AUTOFS_DEV_IOCTL_FAIL \
198 	_IOWR(AUTOFS_IOCTL, \
199 	      AUTOFS_DEV_IOCTL_FAIL_CMD, struct autofs_dev_ioctl)
200 
201 #define AUTOFS_DEV_IOCTL_SETPIPEFD \
202 	_IOWR(AUTOFS_IOCTL, \
203 	      AUTOFS_DEV_IOCTL_SETPIPEFD_CMD, struct autofs_dev_ioctl)
204 
205 #define AUTOFS_DEV_IOCTL_CATATONIC \
206 	_IOWR(AUTOFS_IOCTL, \
207 	      AUTOFS_DEV_IOCTL_CATATONIC_CMD, struct autofs_dev_ioctl)
208 
209 #define AUTOFS_DEV_IOCTL_TIMEOUT \
210 	_IOWR(AUTOFS_IOCTL, \
211 	      AUTOFS_DEV_IOCTL_TIMEOUT_CMD, struct autofs_dev_ioctl)
212 
213 #define AUTOFS_DEV_IOCTL_REQUESTER \
214 	_IOWR(AUTOFS_IOCTL, \
215 	      AUTOFS_DEV_IOCTL_REQUESTER_CMD, struct autofs_dev_ioctl)
216 
217 #define AUTOFS_DEV_IOCTL_EXPIRE \
218 	_IOWR(AUTOFS_IOCTL, \
219 	      AUTOFS_DEV_IOCTL_EXPIRE_CMD, struct autofs_dev_ioctl)
220 
221 #define AUTOFS_DEV_IOCTL_ASKUMOUNT \
222 	_IOWR(AUTOFS_IOCTL, \
223 	      AUTOFS_DEV_IOCTL_ASKUMOUNT_CMD, struct autofs_dev_ioctl)
224 
225 #define AUTOFS_DEV_IOCTL_ISMOUNTPOINT \
226 	_IOWR(AUTOFS_IOCTL, \
227 	      AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD, struct autofs_dev_ioctl)
228 
229 #endif	/* _LINUX_AUTO_DEV_IOCTL_H */
230