Module Name: src Committed By: snj Date: Wed Mar 18 17:20:09 UTC 2015
Modified Files: src/sys/compat/linux32/arch/amd64 [netbsd-5]: syscalls.master src/sys/compat/linux32/common [netbsd-5]: linux32_misc.c linux32_stat.c Log Message: Pull up following revision(s) (requested by joerg in ticket #1149): sys/compat/linux32/arch/amd64/syscalls.master: revisions 1.52, 1.53 via patch sys/compat/linux32/common/linux32_misc.c: revision 1.17 via patch sys/compat/linux32/common/linux32_stat.c: revision 1.14-1.16 via patch Fix inverted lst_ino/__lst_ino assignment in linux32_from_stat(). -- Cleanup (no functional changes). Kill some unneeded variables and return stattement. Rename linux32_from_stat() to better bsd_to_linux32_stat64(). Fix some types. Add stat/lstat/fstat syscalls. -- Add fstatfs syscall. To generate a diff of this commit: cvs rdiff -u -r1.38.4.1 -r1.38.4.2 \ src/sys/compat/linux32/arch/amd64/syscalls.master cvs rdiff -u -r1.12 -r1.12.6.1 src/sys/compat/linux32/common/linux32_misc.c cvs rdiff -u -r1.11 -r1.11.14.1 src/sys/compat/linux32/common/linux32_stat.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/linux32/arch/amd64/syscalls.master diff -u src/sys/compat/linux32/arch/amd64/syscalls.master:1.38.4.1 src/sys/compat/linux32/arch/amd64/syscalls.master:1.38.4.2 --- src/sys/compat/linux32/arch/amd64/syscalls.master:1.38.4.1 Thu Nov 20 03:03:05 2008 +++ src/sys/compat/linux32/arch/amd64/syscalls.master Wed Mar 18 17:20:09 2015 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.38.4.1 2008/11/20 03:03:05 snj Exp $ + $NetBSD: syscalls.master,v 1.38.4.2 2015/03/18 17:20:09 snj Exp $ ; NetBSD i386 COMPAT_LINUX32 system call name/number "master" file. ; (See syscalls.conf to see what it is processed into.) @@ -199,7 +199,7 @@ 98 UNIMPL profil 99 STD { int linux32_sys_statfs(netbsd32_charp path, \ linux32_statfsp sp); } -100 UNIMPL fstatfs +100 STD { int linux32_sys_fstatfs(int fd, linux32_statfsp sp); } 101 UNIMPL ioperm 102 STD { int linux32_sys_socketcall(int what, netbsd32_voidp args); } 103 UNIMPL syslog @@ -207,9 +207,11 @@ netbsd32_itimervalp_t itv, netbsd32_itimervalp_t oitv); } 105 NOARGS { int netbsd32_getitimer(int which, \ netbsd32_itimervalp_t itv); } -106 UNIMPL stat -107 UNIMPL lstat -108 UNIMPL fstat +106 STD { int linux32_sys_stat(netbsd32_charp path, \ + linux32_statp sp); } +107 STD { int linux32_sys_lstat(netbsd32_charp path, \ + linux32_statp sp); } +108 STD { int linux32_sys_fstat(int fd, linux32_statp sp); } 109 STD { int linux32_sys_olduname(linux32_oldutsnamep_t up); } 110 UNIMPL iopl 111 UNIMPL vhangup Index: src/sys/compat/linux32/common/linux32_misc.c diff -u src/sys/compat/linux32/common/linux32_misc.c:1.12 src/sys/compat/linux32/common/linux32_misc.c:1.12.6.1 --- src/sys/compat/linux32/common/linux32_misc.c:1.12 Wed Jun 18 22:58:21 2008 +++ src/sys/compat/linux32/common/linux32_misc.c Wed Mar 18 17:20:09 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_misc.c,v 1.12 2008/06/18 22:58:21 njoly Exp $ */ +/* $NetBSD: linux32_misc.c,v 1.12.6.1 2015/03/18 17:20:09 snj Exp $ */ /*- * Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.12 2008/06/18 22:58:21 njoly Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.12.6.1 2015/03/18 17:20:09 snj Exp $"); #if defined(_KERNEL_OPT) #include "opt_ptrace.h" @@ -90,6 +90,28 @@ linux32_sys_statfs(struct lwp *l, const return error; } +int +linux32_sys_fstatfs(struct lwp *l, const struct linux32_sys_fstatfs_args *uap, register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(linux32_statfsp) sp; + } */ + struct statvfs *sb; + struct linux_statfs ltmp; + int error; + + sb = STATVFSBUF_GET(); + error = do_sys_fstatvfs(l, SCARG(uap, fd), ST_WAIT, sb); + if (error == 0) { + bsd_to_linux_statfs(sb, <mp); + error = copyout(<mp, SCARG_P32(uap, sp), sizeof ltmp); + } + STATVFSBUF_PUT(sb); + + return error; +} + extern const int linux_ptrace_request_map[]; int Index: src/sys/compat/linux32/common/linux32_stat.c diff -u src/sys/compat/linux32/common/linux32_stat.c:1.11 src/sys/compat/linux32/common/linux32_stat.c:1.11.14.1 --- src/sys/compat/linux32/common/linux32_stat.c:1.11 Fri Mar 21 21:54:58 2008 +++ src/sys/compat/linux32/common/linux32_stat.c Wed Mar 18 17:20:09 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_stat.c,v 1.11 2008/03/21 21:54:58 ad Exp $ */ +/* $NetBSD: linux32_stat.c,v 1.11.14.1 2015/03/18 17:20:09 snj Exp $ */ /*- * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved. @@ -33,7 +33,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_stat.c,v 1.11 2008/03/21 21:54:58 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_stat.c,v 1.11.14.1 2015/03/18 17:20:09 snj Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -72,15 +72,44 @@ __KERNEL_RCSID(0, "$NetBSD: linux32_stat #include <compat/linux32/common/linux32_socketcall.h> #include <compat/linux32/linux32_syscallargs.h> -static inline void linux32_from_stat(struct stat *, struct linux32_stat64 *); +static inline void bsd_to_linux32_stat(struct stat *, struct linux32_stat *); +static inline void bsd_to_linux32_stat64(struct stat *, struct linux32_stat64 *); #define linux_fakedev(x,y) (x) + static inline void -linux32_from_stat(struct stat *st, struct linux32_stat64 *st32) +bsd_to_linux32_stat(struct stat *st, struct linux32_stat *st32) { - bzero(st32, sizeof(*st32)); + memset(st32, 0, sizeof(*st32)); st32->lst_dev = linux_fakedev(st->st_dev, 0); - st32->__lst_ino = st->st_ino; + st32->lst_ino = st->st_ino; + st32->lst_mode = st->st_mode; + if (st->st_nlink >= (1 << 15)) + st32->lst_nlink = (1 << 15) - 1; + else + st32->lst_nlink = st->st_nlink; + st32->lst_uid = st->st_uid; + st32->lst_gid = st->st_gid; + st32->lst_rdev = linux_fakedev(st->st_rdev, 0); + st32->lst_size = st->st_size; + st32->lst_blksize = st->st_blksize; + st32->lst_blocks = st->st_blocks; + st32->lst_atime = st->st_atime; + st32->lst_mtime = st->st_mtime; + st32->lst_ctime = st->st_ctime; +#ifdef LINUX32_STAT_HAS_NSEC + st32->lst_atime_nsec = st->st_atimensec; + st32->lst_mtime_nsec = st->st_mtimensec; + st32->lst_ctime_nsec = st->st_ctimensec; +#endif +} + +static inline void +bsd_to_linux32_stat64(struct stat *st, struct linux32_stat64 *st32) +{ + memset(st32, 0, sizeof(*st32)); + st32->lst_dev = linux_fakedev(st->st_dev, 0); + st32->lst_ino = st->st_ino; st32->lst_mode = st->st_mode; if (st->st_nlink >= (1 << 15)) st32->lst_nlink = (1 << 15) - 1; @@ -101,14 +130,31 @@ linux32_from_stat(struct stat *st, struc st32->lst_ctime_nsec = st->st_ctimensec; #endif #ifdef LINUX32_STAT64_HAS_BROKEN_ST_INO - st32->lst_ino = st->st_ino; + st32->__lst_ino = st->st_ino; #endif +} - return; +int +linux32_sys_stat(struct lwp *l, const struct linux32_sys_stat_args *uap, register_t *retval) +{ + /* { + syscallarg(netbsd32_charp) path; + syscallarg(linux32_statp) sp; + } */ + int error; + struct stat st; + struct linux32_stat st32; + + error = do_sys_stat(SCARG_P32(uap, path), FOLLOW, &st); + if (error != 0) + return error; + + bsd_to_linux32_stat(&st, &st32); + return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32)); } int -linux32_sys_stat64(struct lwp *l, const struct linux32_sys_stat64_args *uap, register_t *retval) +linux32_sys_lstat(struct lwp *l, const struct linux32_sys_lstat_args *uap, register_t *retval) { /* { syscallarg(netbsd32_charp) path; @@ -116,23 +162,37 @@ linux32_sys_stat64(struct lwp *l, const } */ int error; struct stat st; - struct linux32_stat64 st32; - struct linux32_stat64 *st32p; - const char *path = SCARG_P32(uap, path); + struct linux32_stat st32; - error = do_sys_stat(path, FOLLOW, &st); + error = do_sys_stat(SCARG_P32(uap, path), NOFOLLOW, &st); if (error != 0) return error; - linux32_from_stat(&st, &st32); + bsd_to_linux32_stat(&st, &st32); + return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32)); +} - st32p = SCARG_P32(uap, sp); +int +linux32_sys_fstat(struct lwp *l, const struct linux32_sys_fstat_args *uap, register_t *retval) +{ + /* { + syscallarg(int) fd; + syscallarg(linux32_statp) sp; + } */ + int error; + struct stat st; + struct linux32_stat st32; + + error = do_sys_fstat(SCARG(uap, fd), &st); + if (error != 0) + return error; - return copyout(&st32, st32p, sizeof(*st32p)); + bsd_to_linux32_stat(&st, &st32); + return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32)); } int -linux32_sys_lstat64(struct lwp *l, const struct linux32_sys_lstat64_args *uap, register_t *retval) +linux32_sys_stat64(struct lwp *l, const struct linux32_sys_stat64_args *uap, register_t *retval) { /* { syscallarg(netbsd32_charp) path; @@ -141,18 +201,32 @@ linux32_sys_lstat64(struct lwp *l, const int error; struct stat st; struct linux32_stat64 st32; - struct linux32_stat64 *st32p; - const char *path = SCARG_P32(uap, path); - error = do_sys_stat(path, NOFOLLOW, &st); + error = do_sys_stat(SCARG_P32(uap, path), FOLLOW, &st); if (error != 0) return error; - linux32_from_stat(&st, &st32); + bsd_to_linux32_stat64(&st, &st32); + return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32)); +} - st32p = SCARG_P32(uap, sp); +int +linux32_sys_lstat64(struct lwp *l, const struct linux32_sys_lstat64_args *uap, register_t *retval) +{ + /* { + syscallarg(netbsd32_charp) path; + syscallarg(linux32_stat64p) sp; + } */ + int error; + struct stat st; + struct linux32_stat64 st32; + + error = do_sys_stat(SCARG_P32(uap, path), NOFOLLOW, &st); + if (error != 0) + return error; - return copyout(&st32, st32p, sizeof(*st32p)); + bsd_to_linux32_stat64(&st, &st32); + return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32)); } int @@ -165,15 +239,11 @@ linux32_sys_fstat64(struct lwp *l, const int error; struct stat st; struct linux32_stat64 st32; - struct linux32_stat64 *st32p; error = do_sys_fstat(SCARG(uap, fd), &st); if (error != 0) return error; - linux32_from_stat(&st, &st32); - - st32p = SCARG_P32(uap, sp); - - return copyout(&st32, st32p, sizeof(*st32p)); + bsd_to_linux32_stat64(&st, &st32); + return copyout(&st32, SCARG_P32(uap, sp), sizeof(st32)); }