1 /*	$NetBSD: netbsd32_compat_12.c,v 1.33 2012/12/10 02:21:58 chs Exp $	*/
2 
3 /*
4  * Copyright (c) 1998, 2001 Matthew R. Green
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #include <sys/cdefs.h>
30 __KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_12.c,v 1.33 2012/12/10 02:21:58 chs Exp $");
31 
32 #if defined(_KERNEL_OPT)
33 #include "opt_compat_netbsd.h"
34 #endif
35 
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/filedesc.h>
39 #include <sys/mount.h>
40 #include <sys/mman.h>
41 #include <sys/namei.h>
42 #include <sys/proc.h>
43 #include <sys/stat.h>
44 #include <sys/swap.h>
45 #include <sys/vfs_syscalls.h>
46 
47 #include <sys/syscallargs.h>
48 
49 #include <compat/sys/stat.h>
50 
51 #include <compat/netbsd32/netbsd32.h>
52 #include <compat/netbsd32/netbsd32_syscallargs.h>
53 
54 static void netbsd32_stat12_to_netbsd32(struct stat12 *,
55 		struct netbsd32_stat12 *);
56 
57 /* for use with {,fl}stat() */
58 static void
netbsd32_stat12_to_netbsd32(struct stat12 * sp12,struct netbsd32_stat12 * sp32)59 netbsd32_stat12_to_netbsd32(struct stat12 *sp12, struct netbsd32_stat12 *sp32)
60 {
61 
62 	sp32->st_dev = sp12->st_dev;
63 	sp32->st_ino = sp12->st_ino;
64 	sp32->st_mode = sp12->st_mode;
65 	sp32->st_nlink = sp12->st_nlink;
66 	sp32->st_uid = sp12->st_uid;
67 	sp32->st_gid = sp12->st_gid;
68 	sp32->st_rdev = sp12->st_rdev;
69 	if (sp12->st_size < (quad_t)1 << 32)
70 		sp32->st_size = sp12->st_size;
71 	else
72 		sp32->st_size = -2;
73 	sp32->st_atimespec.tv_sec = sp12->st_atimespec.tv_sec;
74 	sp32->st_atimespec.tv_nsec = sp12->st_atimespec.tv_nsec;
75 	sp32->st_mtimespec.tv_sec = sp12->st_mtimespec.tv_sec;
76 	sp32->st_mtimespec.tv_nsec = sp12->st_mtimespec.tv_nsec;
77 	sp32->st_ctimespec.tv_sec = sp12->st_ctimespec.tv_sec;
78 	sp32->st_ctimespec.tv_nsec = sp12->st_ctimespec.tv_nsec;
79 	sp32->st_blocks = sp12->st_blocks;
80 	sp32->st_blksize = sp12->st_blksize;
81 	sp32->st_flags = sp12->st_flags;
82 	sp32->st_gen = sp12->st_gen;
83 }
84 
85 int
compat_12_netbsd32_reboot(struct lwp * l,const struct compat_12_netbsd32_reboot_args * uap,register_t * retval)86 compat_12_netbsd32_reboot(struct lwp *l, const struct compat_12_netbsd32_reboot_args *uap, register_t *retval)
87 {
88 	/* {
89 		syscallarg(int) opt;
90 	} */
91 	struct compat_12_sys_reboot_args ua;
92 
93 	NETBSD32TO64_UAP(opt);
94 	return (compat_12_sys_reboot(l, &ua, retval));
95 }
96 
97 int
compat_12_netbsd32_msync(struct lwp * l,const struct compat_12_netbsd32_msync_args * uap,register_t * retval)98 compat_12_netbsd32_msync(struct lwp *l, const struct compat_12_netbsd32_msync_args *uap, register_t *retval)
99 {
100 	/* {
101 		syscallarg(netbsd32_voidp) addr;
102 		syscallarg(netbsd32_size_t) len;
103 	} */
104 	struct sys___msync13_args ua;
105 
106 	NETBSD32TOP_UAP(addr, void *);
107 	NETBSD32TOX_UAP(len, size_t);
108 	SCARG(&ua, flags) = MS_SYNC | MS_INVALIDATE;
109 	return (sys___msync13(l, &ua, retval));
110 }
111 
112 int
compat_12_netbsd32_oswapon(struct lwp * l,const struct compat_12_netbsd32_oswapon_args * uap,register_t * retval)113 compat_12_netbsd32_oswapon(struct lwp *l, const struct compat_12_netbsd32_oswapon_args *uap, register_t *retval)
114 {
115 	/* {
116 		syscallarg(const netbsd32_charp) name;
117 	} */
118 	struct sys_swapctl_args ua;
119 
120 	SCARG(&ua, cmd) = SWAP_ON;
121 	SCARG(&ua, arg) = SCARG_P32(uap, name);
122 	SCARG(&ua, misc) = 0;	/* priority */
123 	return (sys_swapctl(l, &ua, retval));
124 }
125 
126 int
compat_12_netbsd32_stat12(struct lwp * l,const struct compat_12_netbsd32_stat12_args * uap,register_t * retval)127 compat_12_netbsd32_stat12(struct lwp *l, const struct compat_12_netbsd32_stat12_args *uap, register_t *retval)
128 {
129 	/* {
130 		syscallarg(const netbsd32_charp) path;
131 		syscallarg(netbsd32_stat12p_t) ub;
132 	} */
133 	struct netbsd32_stat12 sb32;
134 	struct stat12 sb12;
135 	struct stat sb;
136 	int error;
137 
138 	error = do_sys_stat(SCARG_P32(uap, path), FOLLOW, &sb);
139 	if (error)
140 		return (error);
141 
142 	compat_12_stat_conv(&sb, &sb12);
143 	netbsd32_stat12_to_netbsd32(&sb12, &sb32);
144 
145 	return (copyout(&sb32, SCARG_P32(uap, ub), sizeof sb32));
146 }
147 
148 int
compat_12_netbsd32_fstat12(struct lwp * l,const struct compat_12_netbsd32_fstat12_args * uap,register_t * retval)149 compat_12_netbsd32_fstat12(struct lwp *l, const struct compat_12_netbsd32_fstat12_args *uap, register_t *retval)
150 {
151 	/* {
152 		syscallarg(int) fd;
153 		syscallarg(netbsd32_stat12p_t) sb;
154 	} */
155 	struct netbsd32_stat12 sb32;
156 	struct stat12 sb12;
157 	struct stat sb;
158 	int error;
159 
160 	error = do_sys_fstat(SCARG(uap, fd), &sb);
161 	if (error)
162 		return (error);
163 
164 	compat_12_stat_conv(&sb, &sb12);
165 	netbsd32_stat12_to_netbsd32(&sb12, &sb32);
166 
167 	return (copyout(&sb32, SCARG_P32(uap, sb), sizeof sb32));
168 }
169 
170 int
compat_12_netbsd32_lstat12(struct lwp * l,const struct compat_12_netbsd32_lstat12_args * uap,register_t * retval)171 compat_12_netbsd32_lstat12(struct lwp *l, const struct compat_12_netbsd32_lstat12_args *uap, register_t *retval)
172 {
173 	/* {
174 		syscallarg(const netbsd32_charp) path;
175 		syscallarg(netbsd32_stat12p_t) ub;
176 	} */
177 	struct netbsd32_stat12 sb32;
178 	struct stat12 sb12;
179 	struct stat sb;
180 	int error;
181 
182 	error = do_sys_stat(SCARG_P32(uap, path), NOFOLLOW, &sb);
183 	if (error)
184 		return (error);
185 
186 	compat_12_stat_conv(&sb, &sb12);
187 	netbsd32_stat12_to_netbsd32(&sb12, &sb32);
188 
189 	return (copyout(&sb32, SCARG_P32(uap, ub), sizeof sb32));
190 }
191 
192 int
compat_12_netbsd32_getdirentries(struct lwp * l,const struct compat_12_netbsd32_getdirentries_args * uap,register_t * retval)193 compat_12_netbsd32_getdirentries(struct lwp *l, const struct compat_12_netbsd32_getdirentries_args *uap, register_t *retval)
194 {
195 	/* {
196 		syscallarg(int) fd;
197 		syscallarg(netbsd32_charp) buf;
198 		syscallarg(u_int) count;
199 		syscallarg(netbsd32_longp) basep;
200 	} */
201 	struct compat_12_sys_getdirentries_args ua;
202 
203 	NETBSD32TO64_UAP(fd);
204 	NETBSD32TOP_UAP(buf, char);
205 	NETBSD32TO64_UAP(count);
206 	NETBSD32TOP_UAP(basep, long);
207 
208 	return (compat_12_sys_getdirentries(l, &ua, retval));
209 }
210