2 * ioctl32.c: Conversion between 32bit and 64bit native ioctls.
4 * Based on sparc64 ioctl32.c by:
6 * Copyright (C) 1997-2000 Jakub Jelinek (jakub@redhat.com)
7 * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be)
11 * Copyright (C) 2000 Ken Aaker (kdaaker@rchland.vnet.ibm.com)
12 * Copyright (C) 2001 Anton Blanchard (antonb@au.ibm.com)
14 * These routines maintain argument size conversion between 32bit and 64bit
17 * This program is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU General Public License
19 * as published by the Free Software Foundation; either version
20 * 2 of the License, or (at your option) any later version.
24 #include "compat_ioctl.c"
25 #include <linux/ncp_fs.h>
26 #include <linux/syscalls.h>
27 #include <asm/ppc32.h>
30 #include "compat_ioctl.c"
32 struct ncp_ioctl_request_32 {
33 unsigned int function;
38 struct ncp_fs_info_v2_32 {
40 unsigned int mounted_uid;
41 unsigned int connection;
42 unsigned int buffer_size;
44 unsigned int volume_number;
52 struct ncp_objectname_ioctl_32
55 unsigned int object_name_len;
56 compat_caddr_t object_name; /* an userspace data, in most cases user name */
59 struct ncp_privatedata_ioctl_32
62 compat_caddr_t data; /* ~1000 for NDS */
65 #define NCP_IOC_NCPREQUEST_32 _IOR('n', 1, struct ncp_ioctl_request_32)
67 #define NCP_IOC_GETMOUNTUID2_32 _IOW('n', 2, unsigned int)
69 #define NCP_IOC_GET_FS_INFO_V2_32 _IOWR('n', 4, struct ncp_fs_info_v2_32)
71 #define NCP_IOC_GETOBJECTNAME_32 _IOWR('n', 9, struct ncp_objectname_ioctl_32)
72 #define NCP_IOC_SETOBJECTNAME_32 _IOR('n', 9, struct ncp_objectname_ioctl_32)
73 #define NCP_IOC_GETPRIVATEDATA_32 _IOWR('n', 10, struct ncp_privatedata_ioctl_32)
74 #define NCP_IOC_SETPRIVATEDATA_32 _IOR('n', 10, struct ncp_privatedata_ioctl_32)
76 static int do_ncp_ncprequest(unsigned int fd, unsigned int cmd, unsigned long arg)
78 struct ncp_ioctl_request_32 n32;
79 struct ncp_ioctl_request n;
83 if (copy_from_user(&n32, (struct ncp_ioctl_request_32*)arg,
87 n.function = n32.function;
91 n.data = vmalloc(65536); /* 65536 must be same as NCP_PACKET_SIZE_INTERNAL in ncpfs */
95 if (copy_from_user(n.data, (void *)A(n32.data), n.size))
98 old_fs = get_fs(); set_fs (KERNEL_DS);
99 err = sys_ioctl (fd, NCP_IOC_NCPREQUEST, (unsigned long)&n);
107 if (copy_to_user((void *)A(n32.data), n.data, err)) {
116 static int do_ncp_getmountuid2(unsigned int fd, unsigned int cmd, unsigned long arg)
118 mm_segment_t old_fs = get_fs();
122 cmd = NCP_IOC_GETMOUNTUID2;
125 err = sys_ioctl(fd, cmd, (unsigned long)&kuid);
129 err = put_user(kuid, (unsigned int*)arg);
134 static int do_ncp_getfsinfo2(unsigned int fd, unsigned int cmd, unsigned long arg)
136 mm_segment_t old_fs = get_fs();
137 struct ncp_fs_info_v2_32 n32;
138 struct ncp_fs_info_v2 n;
141 if (copy_from_user(&n32, (struct ncp_fs_info_v2_32*)arg, sizeof(n32)))
143 if (n32.version != NCP_GET_FS_INFO_VERSION_V2)
145 n.version = NCP_GET_FS_INFO_VERSION_V2;
148 err = sys_ioctl(fd, NCP_IOC_GET_FS_INFO_V2, (unsigned long)&n);
152 n32.version = n.version;
153 n32.mounted_uid = n.mounted_uid;
154 n32.connection = n.connection;
155 n32.buffer_size = n.buffer_size;
156 n32.volume_number = n.volume_number;
157 n32.directory_id = n.directory_id;
158 n32.dummy1 = n.dummy1;
159 n32.dummy2 = n.dummy2;
160 n32.dummy3 = n.dummy3;
161 err = copy_to_user((struct ncp_fs_info_v2_32*)arg, &n32, sizeof(n32)) ? -EFAULT : 0;
166 static int do_ncp_getobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
168 struct ncp_objectname_ioctl_32 n32;
169 struct ncp_objectname_ioctl n;
174 if (copy_from_user(&n32, (struct ncp_objectname_ioctl_32*)arg,
178 n.object_name_len = tl = n32.object_name_len;
180 n.object_name = kmalloc(tl, GFP_KERNEL);
184 n.object_name = NULL;
187 old_fs = get_fs(); set_fs (KERNEL_DS);
188 err = sys_ioctl (fd, NCP_IOC_GETOBJECTNAME, (unsigned long)&n);
193 if (tl > n.object_name_len)
194 tl = n.object_name_len;
197 if (tl && copy_to_user((void *)A(n32.object_name), n.object_name, tl))
200 n32.auth_type = n.auth_type;
201 n32.object_name_len = n.object_name_len;
203 if (copy_to_user((struct ncp_objectname_ioctl_32*)arg, &n32, sizeof(n32)))
209 kfree(n.object_name);
214 static int do_ncp_setobjectname(unsigned int fd, unsigned int cmd, unsigned long arg)
216 struct ncp_objectname_ioctl_32 n32;
217 struct ncp_objectname_ioctl n;
222 if (copy_from_user(&n32, (struct ncp_objectname_ioctl_32*)arg,
226 n.auth_type = n32.auth_type;
227 n.object_name_len = tl = n32.object_name_len;
229 n.object_name = kmalloc(tl, GFP_KERNEL);
233 if (copy_from_user(n.object_name, (void *)A(n32.object_name), tl))
236 n.object_name = NULL;
239 old_fs = get_fs(); set_fs (KERNEL_DS);
240 err = sys_ioctl (fd, NCP_IOC_SETOBJECTNAME, (unsigned long)&n);
245 kfree(n.object_name);
250 static int do_ncp_getprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
252 struct ncp_privatedata_ioctl_32 n32;
253 struct ncp_privatedata_ioctl n;
258 if (copy_from_user(&n32, (struct ncp_privatedata_ioctl_32*)arg,
262 n.len = tl = n32.len;
264 n.data = kmalloc(tl, GFP_KERNEL);
271 old_fs = get_fs(); set_fs (KERNEL_DS);
272 err = sys_ioctl (fd, NCP_IOC_GETPRIVATEDATA, (unsigned long)&n);
281 if (tl && copy_to_user((void *)A(n32.data), n.data, tl))
286 if (copy_to_user((struct ncp_privatedata_ioctl_32*)arg, &n32, sizeof(n32)))
297 static int do_ncp_setprivatedata(unsigned int fd, unsigned int cmd, unsigned long arg)
299 struct ncp_privatedata_ioctl_32 n32;
300 struct ncp_privatedata_ioctl n;
305 if (copy_from_user(&n32, (struct ncp_privatedata_ioctl_32*)arg,
309 n.len = tl = n32.len;
311 n.data = kmalloc(tl, GFP_KERNEL);
315 if (copy_from_user(n.data, (void *)A(n32.data), tl))
321 old_fs = get_fs(); set_fs (KERNEL_DS);
322 err = sys_ioctl (fd, NCP_IOC_SETPRIVATEDATA, (unsigned long)&n);
333 #define HANDLE_IOCTL(cmd,handler) { cmd, (ioctl_trans_handler_t)handler, 0 },
334 #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd,sys_ioctl)
336 #define IOCTL_TABLE_START \
337 struct ioctl_trans ioctl_start[] = {
338 #define IOCTL_TABLE_END \
342 #include <linux/compat_ioctl.h>
344 #include "compat_ioctl.c"
345 COMPATIBLE_IOCTL(TCSBRKP)
346 COMPATIBLE_IOCTL(TIOCSTART)
347 COMPATIBLE_IOCTL(TIOCSTOP)
348 COMPATIBLE_IOCTL(TIOCSLTC)
349 /* Little p (/dev/rtc, /dev/envctrl, etc.) */
350 COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */
351 COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */
353 /* And these ioctls need translation */
356 HANDLE_IOCTL(NCP_IOC_NCPREQUEST_32, do_ncp_ncprequest)
357 HANDLE_IOCTL(NCP_IOC_GETMOUNTUID2_32, do_ncp_getmountuid2)
358 HANDLE_IOCTL(NCP_IOC_GET_FS_INFO_V2_32, do_ncp_getfsinfo2)
359 HANDLE_IOCTL(NCP_IOC_GETOBJECTNAME_32, do_ncp_getobjectname)
360 HANDLE_IOCTL(NCP_IOC_SETOBJECTNAME_32, do_ncp_setobjectname)
361 HANDLE_IOCTL(NCP_IOC_GETPRIVATEDATA_32, do_ncp_getprivatedata)
362 HANDLE_IOCTL(NCP_IOC_SETPRIVATEDATA_32, do_ncp_setprivatedata)
366 int ioctl_table_size = ARRAY_SIZE(ioctl_start);