1 /* $NetBSD: aoutm68k_stat.c,v 1.10 2003/06/29 22:29:12 fvdl Exp $ */ 2 3 /*- 4 * Copyright (c) 2000 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Steve C. Woodford. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the NetBSD 21 * Foundation, Inc. and its contributors. 22 * 4. Neither the name of The NetBSD Foundation nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * POSSIBILITY OF SUCH DAMAGE. 37 */ 38 39 #include <sys/cdefs.h> 40 __KERNEL_RCSID(0, "$NetBSD: aoutm68k_stat.c,v 1.10 2003/06/29 22:29:12 fvdl Exp $"); 41 42 #if defined(_KERNEL_OPT) 43 #include "opt_compat_netbsd.h" 44 #include "opt_compat_43.h" 45 #endif 46 47 #include <sys/param.h> 48 #include <sys/systm.h> 49 #include <sys/mount.h> 50 #include <sys/proc.h> 51 #include <sys/stat.h> 52 53 #include <sys/syscall.h> 54 #include <sys/sa.h> 55 #include <sys/syscallargs.h> 56 57 #include <compat/aoutm68k/aoutm68k_util.h> 58 #include <compat/aoutm68k/aoutm68k_stat.h> 59 #include <compat/aoutm68k/aoutm68k_syscall.h> 60 #include <compat/aoutm68k/aoutm68k_syscallargs.h> 61 62 #ifdef COMPAT_43 63 static void aoutm68k_stat43_convert(struct stat43 *, struct aoutm68k_stat43 *); 64 #endif 65 #ifdef COMPAT_12 66 static void aoutm68k_stat12_convert(struct stat12 *, struct aoutm68k_stat12 *); 67 #endif 68 static void aoutm68k_stat13_convert(struct stat *, struct aoutm68k_stat *); 69 70 71 #ifdef COMPAT_43 72 int 73 aoutm68k_compat_43_sys_stat(l, v, retval) 74 struct lwp *l; 75 void *v; 76 register_t *retval; 77 { 78 struct aoutm68k_compat_43_sys_stat_args *uap = v; 79 struct proc *p = l->l_proc; 80 caddr_t sg = stackgap_init(p, 0); 81 struct compat_43_sys_stat_args cup; 82 struct aoutm68k_stat43 ast; 83 struct stat43 st; 84 int error; 85 86 SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st)); 87 #ifdef COMPAT_AOUT_ALTPATH 88 CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); 89 #endif 90 SCARG(&cup, path) = SCARG(uap, path); 91 92 if ((error = compat_43_sys_stat(l, &cup, retval)) != 0 || 93 (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0) 94 return (error); 95 96 aoutm68k_stat43_convert(&st, &ast); 97 98 return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast))); 99 } 100 101 int 102 aoutm68k_compat_43_sys_fstat(l, v, retval) 103 struct lwp *l; 104 void *v; 105 register_t *retval; 106 { 107 struct aoutm68k_compat_43_sys_fstat_args *uap = v; 108 struct proc *p = l->l_proc; 109 caddr_t sg = stackgap_init(p, 0); 110 struct compat_43_sys_fstat_args cup; 111 struct aoutm68k_stat43 ast; 112 struct stat43 st; 113 int error; 114 115 SCARG(&cup, fd) = SCARG(uap, fd); 116 SCARG(&cup, sb) = stackgap_alloc(p, &sg, sizeof(st)); 117 118 if ((error = compat_43_sys_fstat(l, &cup, retval)) != 0 || 119 (error = copyin(SCARG(&cup, sb), &st, sizeof(st))) != 0) 120 return (error); 121 122 aoutm68k_stat43_convert(&st, &ast); 123 124 return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, sb), sizeof(ast))); 125 } 126 127 int 128 aoutm68k_compat_43_sys_lstat(l, v, retval) 129 struct lwp *l; 130 void *v; 131 register_t *retval; 132 { 133 struct aoutm68k_compat_43_sys_lstat_args *uap = v; 134 struct proc *p = l->l_proc; 135 caddr_t sg = stackgap_init(p, 0); 136 struct compat_43_sys_lstat_args cup; 137 struct aoutm68k_stat43 ast; 138 struct stat43 st; 139 int error; 140 141 SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st)); 142 #ifdef COMPAT_AOUT_ALTPATH 143 CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); 144 #endif 145 SCARG(&cup, path) = SCARG(uap, path); 146 147 if ((error = compat_43_sys_lstat(l, &cup, retval)) != 0 || 148 (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0) 149 return (error); 150 151 aoutm68k_stat43_convert(&st, &ast); 152 153 return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast))); 154 } 155 #endif /* COMPAT_43 */ 156 157 #ifdef COMPAT_12 158 int 159 aoutm68k_compat_12_sys_stat(l, v, retval) 160 struct lwp *l; 161 void *v; 162 register_t *retval; 163 { 164 struct aoutm68k_compat_12_sys_stat_args *uap = v; 165 struct proc *p = l->l_proc; 166 caddr_t sg = stackgap_init(p, 0); 167 struct compat_12_sys_stat_args cup; 168 struct aoutm68k_stat12 ast; 169 struct stat12 st; 170 int error; 171 172 SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st)); 173 #ifdef COMPAT_AOUT_ALTPATH 174 CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); 175 #endif 176 SCARG(&cup, path) = SCARG(uap, path); 177 178 if ((error = compat_12_sys_stat(l, &cup, retval)) != 0 || 179 (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0) 180 return (error); 181 182 aoutm68k_stat12_convert(&st, &ast); 183 184 return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast))); 185 } 186 187 int 188 aoutm68k_compat_12_sys_fstat(l, v, retval) 189 struct lwp *l; 190 void *v; 191 register_t *retval; 192 { 193 struct aoutm68k_compat_12_sys_fstat_args *uap = v; 194 struct proc *p = l->l_proc; 195 caddr_t sg = stackgap_init(p, 0); 196 struct compat_12_sys_fstat_args cup; 197 struct aoutm68k_stat12 ast; 198 struct stat12 st; 199 int error; 200 201 SCARG(&cup, fd) = SCARG(uap, fd); 202 SCARG(&cup, sb) = stackgap_alloc(p, &sg, sizeof(st)); 203 204 if ((error = compat_12_sys_fstat(l, &cup, retval)) != 0 || 205 (error = copyin(SCARG(&cup, sb), &st, sizeof(st))) != 0) 206 return (error); 207 208 aoutm68k_stat12_convert(&st, &ast); 209 210 return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, sb), sizeof(ast))); 211 } 212 213 int 214 aoutm68k_compat_12_sys_lstat(l, v, retval) 215 struct lwp *l; 216 void *v; 217 register_t *retval; 218 { 219 struct aoutm68k_compat_12_sys_lstat_args *uap = v; 220 struct proc *p = l->l_proc; 221 caddr_t sg = stackgap_init(p, 0); 222 struct compat_12_sys_lstat_args cup; 223 struct aoutm68k_stat12 ast; 224 struct stat12 st; 225 int error; 226 227 SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st)); 228 #ifdef COMPAT_AOUT_ALTPATH 229 CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); 230 #endif 231 SCARG(&cup, path) = SCARG(uap, path); 232 233 if ((error = compat_12_sys_lstat(l, &cup, retval)) != 0 || 234 (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0) 235 return (error); 236 237 aoutm68k_stat12_convert(&st, &ast); 238 239 return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast))); 240 } 241 #endif /* COMPAT_12 */ 242 243 int 244 aoutm68k_sys___stat13(l, v, retval) 245 struct lwp *l; 246 void *v; 247 register_t *retval; 248 { 249 struct aoutm68k_sys___stat13_args *uap = v; 250 struct proc *p = l->l_proc; 251 caddr_t sg = stackgap_init(p, 0); 252 struct sys___stat13_args cup; 253 struct aoutm68k_stat ast; 254 struct stat st; 255 int error; 256 257 SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st)); 258 #ifdef COMPAT_AOUT_ALTPATH 259 CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); 260 #endif 261 SCARG(&cup, path) = SCARG(uap, path); 262 263 if ((error = sys___stat13(l, &cup, retval)) != 0 || 264 (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0) 265 return (error); 266 267 aoutm68k_stat13_convert(&st, &ast); 268 269 return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast))); 270 } 271 272 int 273 aoutm68k_sys___fstat13(l, v, retval) 274 struct lwp *l; 275 void *v; 276 register_t *retval; 277 { 278 struct aoutm68k_sys___fstat13_args *uap = v; 279 struct proc *p = l->l_proc; 280 caddr_t sg = stackgap_init(p, 0); 281 struct sys___fstat13_args cup; 282 struct aoutm68k_stat ast; 283 struct stat st; 284 int error; 285 286 SCARG(&cup, fd) = SCARG(uap, fd); 287 SCARG(&cup, sb) = stackgap_alloc(p, &sg, sizeof(st)); 288 289 if ((error = sys___fstat13(l, &cup, retval)) != 0 || 290 (error = copyin(SCARG(&cup, sb), &st, sizeof(st))) != 0) 291 return (error); 292 293 aoutm68k_stat13_convert(&st, &ast); 294 295 return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, sb), sizeof(ast))); 296 297 } 298 299 int 300 aoutm68k_sys___lstat13(l, v, retval) 301 struct lwp *l; 302 void *v; 303 register_t *retval; 304 { 305 struct aoutm68k_sys___lstat13_args *uap = v; 306 struct proc *p = l->l_proc; 307 caddr_t sg = stackgap_init(p, 0); 308 struct sys___lstat13_args cup; 309 struct aoutm68k_stat ast; 310 struct stat st; 311 int error; 312 313 SCARG(&cup, ub) = stackgap_alloc(p, &sg, sizeof(st)); 314 #ifdef COMPAT_AOUT_ALTPATH 315 CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); 316 #endif 317 SCARG(&cup, path) = SCARG(uap, path); 318 319 if ((error = sys___lstat13(l, &cup, retval)) != 0 || 320 (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) != 0) 321 return (error); 322 323 aoutm68k_stat13_convert(&st, &ast); 324 325 return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, ub), sizeof(ast))); 326 } 327 328 int 329 aoutm68k_sys_fhstat(l, v, retval) 330 struct lwp *l; 331 void *v; 332 register_t *retval; 333 { 334 struct aoutm68k_sys_fhstat_args *uap = v; 335 struct proc *p = l->l_proc; 336 caddr_t sg = stackgap_init(p, 0); 337 struct sys_fhstat_args cup; 338 struct aoutm68k_stat ast; 339 struct stat st; 340 int error; 341 342 SCARG(&cup, fhp) = SCARG(uap, fhp); 343 SCARG(&cup, sb) = stackgap_alloc(p, &sg, sizeof(st)); 344 345 if ((error = sys_fhstat(l, &cup, retval)) != 0 || 346 (error = copyin(SCARG(&cup, sb), &st, sizeof(st))) != 0) 347 return (error); 348 349 aoutm68k_stat13_convert(&st, &ast); 350 351 return (copyout((caddr_t)&ast, (caddr_t)SCARG(uap, sb), sizeof(ast))); 352 } 353 354 #ifdef COMPAT_43 355 static void 356 aoutm68k_stat43_convert(st, ast) 357 struct stat43 *st; 358 struct aoutm68k_stat43 *ast; 359 { 360 361 memset(ast, 0, sizeof(*ast)); 362 ast->st_dev = st->st_dev; 363 ast->st_ino = st->st_ino; 364 ast->st_mode = st->st_mode; 365 ast->st_nlink = st->st_nlink; 366 ast->st_uid = st->st_uid; 367 ast->st_gid = st->st_gid; 368 ast->st_rdev = st->st_rdev; 369 ast->st_size = st->st_size; 370 ast->st_atimespec.tv_sec = st->st_atimespec.tv_sec; 371 ast->st_atimespec.tv_nsec = st->st_atimespec.tv_nsec; 372 ast->st_mtimespec.tv_sec = st->st_mtimespec.tv_sec; 373 ast->st_mtimespec.tv_nsec = st->st_mtimespec.tv_nsec; 374 ast->st_ctimespec.tv_sec = st->st_ctimespec.tv_sec; 375 ast->st_ctimespec.tv_nsec = st->st_ctimespec.tv_nsec; 376 ast->st_blksize = st->st_blksize; 377 ast->st_blocks = st->st_blocks; 378 ast->st_flags = st->st_flags; 379 ast->st_gen = st->st_gen; 380 } 381 #endif /* COMPAT_43 */ 382 383 #ifdef COMPAT_12 384 static void 385 aoutm68k_stat12_convert(st, ast) 386 struct stat12 *st; 387 struct aoutm68k_stat12 *ast; 388 { 389 390 memset(ast, 0, sizeof(*ast)); 391 ast->st_dev = st->st_dev; 392 ast->st_ino = st->st_ino; 393 ast->st_mode = st->st_mode; 394 ast->st_nlink = st->st_nlink; 395 ast->st_uid = st->st_uid; 396 ast->st_gid = st->st_gid; 397 ast->st_rdev = st->st_rdev; 398 ast->st_atimespec.tv_sec = st->st_atimespec.tv_sec; 399 ast->st_atimespec.tv_nsec = st->st_atimespec.tv_nsec; 400 ast->st_mtimespec.tv_sec = st->st_mtimespec.tv_sec; 401 ast->st_mtimespec.tv_nsec = st->st_mtimespec.tv_nsec; 402 ast->st_ctimespec.tv_sec = st->st_ctimespec.tv_sec; 403 ast->st_ctimespec.tv_nsec = st->st_ctimespec.tv_nsec; 404 ast->st_size = st->st_size; 405 ast->st_blocks = st->st_blocks; 406 ast->st_blksize = st->st_blksize; 407 ast->st_flags = st->st_flags; 408 ast->st_gen = st->st_gen; 409 ast->st_lspare = st->st_lspare; 410 ast->st_qspare[0] = st->st_qspare[0]; 411 ast->st_qspare[1] = st->st_qspare[1]; 412 } 413 #endif /* COMPAT_12 */ 414 415 static void 416 aoutm68k_stat13_convert(st, ast) 417 struct stat *st; 418 struct aoutm68k_stat *ast; 419 { 420 421 memset(ast, 0, sizeof(*ast)); 422 ast->st_dev = st->st_dev; 423 ast->st_ino = st->st_ino; 424 ast->st_mode = st->st_mode; 425 ast->st_nlink = st->st_nlink; 426 ast->st_uid = st->st_uid; 427 ast->st_gid = st->st_gid; 428 ast->st_rdev = st->st_rdev; 429 ast->st_atimespec.tv_sec = st->st_atimespec.tv_sec; 430 ast->st_atimespec.tv_nsec = st->st_atimespec.tv_nsec; 431 ast->st_mtimespec.tv_sec = st->st_mtimespec.tv_sec; 432 ast->st_mtimespec.tv_nsec = st->st_mtimespec.tv_nsec; 433 ast->st_ctimespec.tv_sec = st->st_ctimespec.tv_sec; 434 ast->st_ctimespec.tv_nsec = st->st_ctimespec.tv_nsec; 435 ast->st_size = st->st_size; 436 ast->st_blocks = st->st_blocks; 437 ast->st_blksize = st->st_blksize; 438 ast->st_flags = st->st_flags; 439 ast->st_gen = st->st_gen; 440 ast->st_qspare[0] = 0; 441 ast->st_qspare[1] = 0; 442 } 443