Home | History | Annotate | Line # | Download | only in common
linux32_stat.c revision 1.16.12.1
      1  1.16.12.1    yamt /*	$NetBSD: linux32_stat.c,v 1.16.12.1 2014/05/22 11:40:17 yamt Exp $ */
      2        1.1    manu 
      3        1.1    manu /*-
      4        1.1    manu  * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
      5        1.1    manu  *
      6        1.1    manu  * Redistribution and use in source and binary forms, with or without
      7        1.1    manu  * modification, are permitted provided that the following conditions
      8        1.1    manu  * are met:
      9        1.1    manu  * 1. Redistributions of source code must retain the above copyright
     10        1.1    manu  *    notice, this list of conditions and the following disclaimer.
     11        1.1    manu  * 2. Redistributions in binary form must reproduce the above copyright
     12        1.1    manu  *    notice, this list of conditions and the following disclaimer in the
     13        1.1    manu  *    documentation and/or other materials provided with the distribution.
     14        1.1    manu  * 3. All advertising materials mentioning features or use of this software
     15        1.1    manu  *    must display the following acknowledgement:
     16        1.1    manu  *	This product includes software developed by Emmanuel Dreyfus
     17        1.1    manu  * 4. The name of the author may not be used to endorse or promote
     18        1.1    manu  *    products derived from this software without specific prior written
     19        1.1    manu  *    permission.
     20        1.1    manu  *
     21        1.1    manu  * THIS SOFTWARE IS PROVIDED BY THE THE AUTHOR AND CONTRIBUTORS ``AS IS''
     22        1.1    manu  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     23        1.1    manu  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     24        1.1    manu  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
     25        1.1    manu  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     26        1.1    manu  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     27        1.1    manu  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     28        1.1    manu  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     29        1.1    manu  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     30        1.1    manu  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     31        1.1    manu  * POSSIBILITY OF SUCH DAMAGE.
     32        1.1    manu  */
     33        1.1    manu 
     34        1.1    manu #include <sys/cdefs.h>
     35        1.1    manu 
     36  1.16.12.1    yamt __KERNEL_RCSID(0, "$NetBSD: linux32_stat.c,v 1.16.12.1 2014/05/22 11:40:17 yamt Exp $");
     37        1.1    manu 
     38        1.1    manu #include <sys/types.h>
     39        1.1    manu #include <sys/param.h>
     40        1.1    manu #include <sys/fstypes.h>
     41        1.1    manu #include <sys/signal.h>
     42        1.1    manu #include <sys/dirent.h>
     43        1.1    manu #include <sys/kernel.h>
     44        1.4     dsl #include <sys/namei.h>
     45        1.1    manu #include <sys/fcntl.h>
     46        1.5     dsl #include <sys/filedesc.h>
     47        1.1    manu #include <sys/select.h>
     48        1.1    manu #include <sys/proc.h>
     49        1.1    manu #include <sys/ucred.h>
     50        1.1    manu #include <sys/swap.h>
     51        1.4     dsl #include <sys/vfs_syscalls.h>
     52        1.1    manu 
     53        1.1    manu #include <machine/types.h>
     54        1.1    manu 
     55        1.1    manu #include <sys/syscallargs.h>
     56        1.1    manu 
     57        1.1    manu #include <compat/netbsd32/netbsd32.h>
     58        1.1    manu #include <compat/netbsd32/netbsd32_conv.h>
     59        1.1    manu #include <compat/netbsd32/netbsd32_syscallargs.h>
     60        1.1    manu 
     61        1.1    manu #include <compat/linux/common/linux_types.h>
     62        1.1    manu #include <compat/linux/common/linux_signal.h>
     63        1.1    manu #include <compat/linux/common/linux_machdep.h>
     64        1.1    manu #include <compat/linux/common/linux_misc.h>
     65        1.1    manu #include <compat/linux/common/linux_oldolduname.h>
     66       1.12      ad #include <compat/linux/common/linux_ipc.h>
     67       1.12      ad #include <compat/linux/common/linux_sem.h>
     68  1.16.12.1    yamt #include <compat/linux/common/linux_fcntl.h>
     69        1.1    manu #include <compat/linux/linux_syscallargs.h>
     70        1.1    manu 
     71        1.1    manu #include <compat/linux32/common/linux32_types.h>
     72        1.1    manu #include <compat/linux32/common/linux32_signal.h>
     73        1.1    manu #include <compat/linux32/common/linux32_machdep.h>
     74        1.1    manu #include <compat/linux32/common/linux32_sysctl.h>
     75        1.1    manu #include <compat/linux32/common/linux32_socketcall.h>
     76        1.1    manu #include <compat/linux32/linux32_syscallargs.h>
     77        1.1    manu 
     78       1.16   njoly static inline void bsd_to_linux32_stat(struct stat *, struct linux32_stat *);
     79       1.15   njoly static inline void bsd_to_linux32_stat64(struct stat *, struct linux32_stat64 *);
     80        1.1    manu 
     81        1.1    manu #define linux_fakedev(x,y) (x)
     82       1.15   njoly 
     83        1.1    manu static inline void
     84       1.16   njoly bsd_to_linux32_stat(struct stat *st, struct linux32_stat *st32)
     85       1.16   njoly {
     86       1.16   njoly 	memset(st32, 0, sizeof(*st32));
     87       1.16   njoly 	st32->lst_dev = linux_fakedev(st->st_dev, 0);
     88       1.16   njoly 	st32->lst_ino = st->st_ino;
     89       1.16   njoly 	st32->lst_mode = st->st_mode;
     90       1.16   njoly 	if (st->st_nlink >= (1 << 15))
     91       1.16   njoly 		st32->lst_nlink = (1 << 15) - 1;
     92       1.16   njoly 	else
     93       1.16   njoly 		st32->lst_nlink = st->st_nlink;
     94       1.16   njoly 	st32->lst_uid = st->st_uid;
     95       1.16   njoly 	st32->lst_gid = st->st_gid;
     96       1.16   njoly 	st32->lst_rdev = linux_fakedev(st->st_rdev, 0);
     97       1.16   njoly 	st32->lst_size = st->st_size;
     98       1.16   njoly 	st32->lst_blksize = st->st_blksize;
     99       1.16   njoly 	st32->lst_blocks = st->st_blocks;
    100       1.16   njoly 	st32->lst_atime = st->st_atime;
    101       1.16   njoly 	st32->lst_mtime = st->st_mtime;
    102       1.16   njoly 	st32->lst_ctime = st->st_ctime;
    103       1.16   njoly #ifdef LINUX32_STAT_HAS_NSEC
    104       1.16   njoly 	st32->lst_atime_nsec = st->st_atimensec;
    105       1.16   njoly 	st32->lst_mtime_nsec = st->st_mtimensec;
    106       1.16   njoly 	st32->lst_ctime_nsec = st->st_ctimensec;
    107       1.16   njoly #endif
    108       1.16   njoly }
    109       1.16   njoly 
    110       1.16   njoly static inline void
    111       1.15   njoly bsd_to_linux32_stat64(struct stat *st, struct linux32_stat64 *st32)
    112        1.1    manu {
    113       1.13  cegger 	memset(st32, 0, sizeof(*st32));
    114        1.1    manu 	st32->lst_dev = linux_fakedev(st->st_dev, 0);
    115       1.14   njoly 	st32->lst_ino = st->st_ino;
    116        1.1    manu 	st32->lst_mode = st->st_mode;
    117        1.1    manu 	if (st->st_nlink >= (1 << 15))
    118        1.1    manu 		st32->lst_nlink = (1 << 15) - 1;
    119        1.1    manu 	else
    120        1.1    manu 		st32->lst_nlink = st->st_nlink;
    121        1.1    manu 	st32->lst_uid = st->st_uid;
    122        1.1    manu 	st32->lst_gid = st->st_gid;
    123        1.1    manu 	st32->lst_rdev = linux_fakedev(st->st_rdev, 0);
    124        1.1    manu 	st32->lst_size = st->st_size;
    125        1.1    manu 	st32->lst_blksize = st->st_blksize;
    126        1.1    manu 	st32->lst_blocks = st->st_blocks;
    127        1.1    manu 	st32->lst_atime = st->st_atime;
    128        1.1    manu 	st32->lst_mtime = st->st_mtime;
    129        1.1    manu 	st32->lst_ctime = st->st_ctime;
    130        1.1    manu #ifdef LINUX32_STAT64_HAS_NSEC
    131        1.1    manu 	st32->lst_atime_nsec = st->st_atimensec;
    132        1.1    manu 	st32->lst_mtime_nsec = st->st_mtimensec;
    133        1.1    manu 	st32->lst_ctime_nsec = st->st_ctimensec;
    134        1.1    manu #endif
    135        1.1    manu #ifdef LINUX32_STAT64_HAS_BROKEN_ST_INO
    136       1.14   njoly 	st32->__lst_ino = st->st_ino;
    137        1.1    manu #endif
    138        1.1    manu }
    139        1.1    manu 
    140        1.1    manu int
    141       1.16   njoly linux32_sys_stat(struct lwp *l, const struct linux32_sys_stat_args *uap, register_t *retval)
    142       1.16   njoly {
    143       1.16   njoly 	/* {
    144       1.16   njoly 	        syscallarg(netbsd32_charp) path;
    145       1.16   njoly 	        syscallarg(linux32_statp) sp;
    146       1.16   njoly 	} */
    147       1.16   njoly 	int error;
    148       1.16   njoly 	struct stat st;
    149       1.16   njoly 	struct linux32_stat st32;
    150       1.16   njoly 
    151       1.16   njoly 	error = do_sys_stat(SCARG_P32(uap, path), FOLLOW, &st);
    152       1.16   njoly 	if (error != 0)
    153       1.16   njoly 		return error;
    154       1.16   njoly 
    155       1.16   njoly 	bsd_to_linux32_stat(&st, &st32);
    156       1.16   njoly 	return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32));
    157       1.16   njoly }
    158       1.16   njoly 
    159       1.16   njoly int
    160       1.16   njoly linux32_sys_lstat(struct lwp *l, const struct linux32_sys_lstat_args *uap, register_t *retval)
    161       1.16   njoly {
    162       1.16   njoly 	/* {
    163       1.16   njoly 	        syscallarg(netbsd32_charp) path;
    164       1.16   njoly 	        syscallarg(linux32_statp) sp;
    165       1.16   njoly 	} */
    166       1.16   njoly 	int error;
    167       1.16   njoly 	struct stat st;
    168       1.16   njoly 	struct linux32_stat st32;
    169       1.16   njoly 
    170       1.16   njoly 	error = do_sys_stat(SCARG_P32(uap, path), NOFOLLOW, &st);
    171       1.16   njoly 	if (error != 0)
    172       1.16   njoly 		return error;
    173       1.16   njoly 
    174       1.16   njoly 	bsd_to_linux32_stat(&st, &st32);
    175       1.16   njoly 	return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32));
    176       1.16   njoly }
    177       1.16   njoly 
    178       1.16   njoly int
    179       1.16   njoly linux32_sys_fstat(struct lwp *l, const struct linux32_sys_fstat_args *uap, register_t *retval)
    180       1.16   njoly {
    181       1.16   njoly 	/* {
    182       1.16   njoly 	        syscallarg(int) fd;
    183       1.16   njoly 	        syscallarg(linux32_statp) sp;
    184       1.16   njoly 	} */
    185       1.16   njoly 	int error;
    186       1.16   njoly 	struct stat st;
    187       1.16   njoly 	struct linux32_stat st32;
    188       1.16   njoly 
    189       1.16   njoly 	error = do_sys_fstat(SCARG(uap, fd), &st);
    190       1.16   njoly 	if (error != 0)
    191       1.16   njoly 		return error;
    192       1.16   njoly 
    193       1.16   njoly 	bsd_to_linux32_stat(&st, &st32);
    194       1.16   njoly 	return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32));
    195       1.16   njoly }
    196       1.16   njoly 
    197       1.16   njoly int
    198       1.10     dsl linux32_sys_stat64(struct lwp *l, const struct linux32_sys_stat64_args *uap, register_t *retval)
    199        1.1    manu {
    200       1.10     dsl 	/* {
    201        1.1    manu 	        syscallarg(netbsd32_charp) path;
    202       1.15   njoly 	        syscallarg(linux32_stat64p) sp;
    203       1.10     dsl 	} */
    204        1.1    manu 	int error;
    205        1.1    manu 	struct stat st;
    206        1.1    manu 	struct linux32_stat64 st32;
    207        1.1    manu 
    208       1.15   njoly 	error = do_sys_stat(SCARG_P32(uap, path), FOLLOW, &st);
    209        1.4     dsl 	if (error != 0)
    210        1.1    manu 		return error;
    211        1.1    manu 
    212       1.15   njoly 	bsd_to_linux32_stat64(&st, &st32);
    213       1.15   njoly 	return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32));
    214        1.1    manu }
    215        1.1    manu 
    216        1.1    manu int
    217       1.10     dsl linux32_sys_lstat64(struct lwp *l, const struct linux32_sys_lstat64_args *uap, register_t *retval)
    218        1.1    manu {
    219       1.10     dsl 	/* {
    220        1.1    manu 	        syscallarg(netbsd32_charp) path;
    221        1.1    manu 	        syscallarg(linux32_stat64p) sp;
    222       1.10     dsl 	} */
    223        1.1    manu 	int error;
    224        1.1    manu 	struct stat st;
    225        1.1    manu 	struct linux32_stat64 st32;
    226        1.1    manu 
    227       1.15   njoly 	error = do_sys_stat(SCARG_P32(uap, path), NOFOLLOW, &st);
    228        1.4     dsl 	if (error != 0)
    229        1.1    manu 		return error;
    230        1.1    manu 
    231       1.15   njoly 	bsd_to_linux32_stat64(&st, &st32);
    232       1.15   njoly 	return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32));
    233        1.1    manu }
    234        1.1    manu 
    235        1.1    manu int
    236       1.10     dsl linux32_sys_fstat64(struct lwp *l, const struct linux32_sys_fstat64_args *uap, register_t *retval)
    237        1.1    manu {
    238       1.10     dsl 	/* {
    239        1.1    manu 	        syscallarg(int) fd;
    240        1.1    manu 	        syscallarg(linux32_stat64p) sp;
    241       1.10     dsl 	} */
    242        1.1    manu 	int error;
    243        1.1    manu 	struct stat st;
    244        1.1    manu 	struct linux32_stat64 st32;
    245        1.1    manu 
    246       1.11      ad 	error = do_sys_fstat(SCARG(uap, fd), &st);
    247        1.4     dsl 	if (error != 0)
    248        1.1    manu 		return error;
    249        1.1    manu 
    250       1.15   njoly 	bsd_to_linux32_stat64(&st, &st32);
    251       1.15   njoly 	return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32));
    252        1.1    manu }
    253  1.16.12.1    yamt 
    254  1.16.12.1    yamt int
    255  1.16.12.1    yamt linux32_sys_fstatat64(struct lwp *l, const struct linux32_sys_fstatat64_args *uap, register_t *retval)
    256  1.16.12.1    yamt {
    257  1.16.12.1    yamt 	/* {
    258  1.16.12.1    yamt 		syscallarg(int) fd;
    259  1.16.12.1    yamt 		syscallarg(netbsd32_charp) path;
    260  1.16.12.1    yamt 		syscallarg(linux32_stat64p) sp;
    261  1.16.12.1    yamt 		syscallarg(int) flag;
    262  1.16.12.1    yamt 	} */
    263  1.16.12.1    yamt 	int error, nd_flag;
    264  1.16.12.1    yamt 	struct stat st;
    265  1.16.12.1    yamt 	struct linux32_stat64 st32;
    266  1.16.12.1    yamt 
    267  1.16.12.1    yamt 	if (SCARG(uap, flag) & LINUX_AT_SYMLINK_NOFOLLOW)
    268  1.16.12.1    yamt 		nd_flag = NOFOLLOW;
    269  1.16.12.1    yamt 	else
    270  1.16.12.1    yamt 		nd_flag = FOLLOW;
    271  1.16.12.1    yamt 
    272  1.16.12.1    yamt 	error = do_sys_statat(l, SCARG(uap, fd), SCARG_P32(uap, path), nd_flag, &st);
    273  1.16.12.1    yamt 	if (error != 0)
    274  1.16.12.1    yamt 		return error;
    275  1.16.12.1    yamt 
    276  1.16.12.1    yamt 	bsd_to_linux32_stat64(&st, &st32);
    277  1.16.12.1    yamt 
    278  1.16.12.1    yamt 	return copyout(&st32, SCARG_P32(uap, sp), sizeof st32);
    279  1.16.12.1    yamt }
    280