diff options
author | jasoni <jasoni@cvs.openbsd.org> | 2000-12-22 07:34:03 +0000 |
---|---|---|
committer | jasoni <jasoni@cvs.openbsd.org> | 2000-12-22 07:34:03 +0000 |
commit | b4175d2311819c0e1150cf2535e6bfe03252fc84 (patch) | |
tree | efe864024707523a93e63fd114874ae14f3f904d /sys | |
parent | c7fdee10a430c084ce8226be9d552d4dec00b16e (diff) |
Implement truncate64, stat64, lstat64, fstat64; from NetBSD
Diffstat (limited to 'sys')
-rw-r--r-- | sys/compat/linux/files.linux | 3 | ||||
-rw-r--r-- | sys/compat/linux/linux_dummy.c | 6 | ||||
-rw-r--r-- | sys/compat/linux/linux_file64.c | 224 | ||||
-rw-r--r-- | sys/compat/linux/linux_types.h | 38 | ||||
-rw-r--r-- | sys/compat/linux/syscalls.master | 14 |
5 files changed, 273 insertions, 12 deletions
diff --git a/sys/compat/linux/files.linux b/sys/compat/linux/files.linux index 49e7d6acf8a..b7ab1852dd2 100644 --- a/sys/compat/linux/files.linux +++ b/sys/compat/linux/files.linux @@ -1,4 +1,4 @@ -# $OpenBSD: files.linux,v 1.10 2000/07/07 02:13:40 jasoni Exp $ +# $OpenBSD: files.linux,v 1.11 2000/12/22 07:34:01 jasoni Exp $ # $NetBSD: files.linux,v 1.4 1996/03/08 04:55:59 mycroft Exp $ # # Config.new file description for machine-independent Linux compat code. @@ -11,6 +11,7 @@ file compat/linux/linux_cdrom.c compat_linux file compat/linux/linux_error.c compat_linux file compat/linux/linux_exec.c compat_linux file compat/linux/linux_file.c compat_linux +file compat/linux/linux_file64.c compat_linux file compat/linux/linux_getcwd.c compat_linux file compat/linux/linux_ioctl.c compat_linux file compat/linux/linux_ipc.c compat_linux diff --git a/sys/compat/linux/linux_dummy.c b/sys/compat/linux/linux_dummy.c index 89413f2028b..304692cfdd0 100644 --- a/sys/compat/linux/linux_dummy.c +++ b/sys/compat/linux/linux_dummy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: linux_dummy.c,v 1.1 2000/07/07 02:13:40 jasoni Exp $ */ +/* $OpenBSD: linux_dummy.c,v 1.2 2000/12/22 07:34:02 jasoni Exp $ */ /*- * Copyright (c) 1994-1995 Søren Schmidt @@ -115,8 +115,4 @@ DUMMY(sendfile); /* #187 */ DUMMY(getpmsg); /* #188 */ DUMMY(putpmsg); /* #189 */ DUMMY(mmap2); /* #192 */ -DUMMY(truncate64); /* #193 */ DUMMY(ftruncate64); /* #194 */ -DUMMY(stat64); /* #195 */ -DUMMY(lstat64); /* #196 */ -DUMMY(fstat64); /* #197 */ diff --git a/sys/compat/linux/linux_file64.c b/sys/compat/linux/linux_file64.c new file mode 100644 index 00000000000..a6172d0339b --- /dev/null +++ b/sys/compat/linux/linux_file64.c @@ -0,0 +1,224 @@ +/* $OpenBSD: linux_file64.c,v 1.1 2000/12/22 07:34:02 jasoni Exp $ */ +/* $NetBSD: linux_file64.c,v 1.2 2000/12/12 22:24:56 jdolecek Exp $ */ + +/*- + * Copyright (c) 1995, 1998, 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Frank van der Linden and Eric Haszlakiewicz. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Linux 64bit filesystem calls. Used on 32bit archs, not used on 64bit ones. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/namei.h> +#include <sys/proc.h> +#include <sys/file.h> +#include <sys/stat.h> +#include <sys/filedesc.h> +#include <sys/ioctl.h> +#include <sys/kernel.h> +#include <sys/mount.h> +#include <sys/malloc.h> +#include <sys/vnode.h> +#include <sys/tty.h> +#include <sys/conf.h> + +#include <sys/syscallargs.h> + +#include <compat/linux/linux_types.h> +#include <compat/linux/linux_signal.h> +#include <compat/linux/linux_syscallargs.h> +#include <compat/linux/linux_fcntl.h> +#include <compat/linux/linux_util.h> + +#include <machine/linux_machdep.h> + + +static void bsd_to_linux_stat __P((struct stat *, struct linux_stat64 *)); +static int linux_do_stat64 __P((struct proc *, void *, register_t *, int)); + +/* + * Convert a OpenBSD stat structure to a Linux stat structure. + * Only the order of the fields and the padding in the structure + * is different. linux_fakedev is a machine-dependent function + * which optionally converts device driver major/minor numbers + * (XXX horrible, but what can you do against code that compares + * things against constant major device numbers? sigh) + */ +static void +bsd_to_linux_stat(bsp, lsp) + struct stat *bsp; + struct linux_stat64 *lsp; +{ + lsp->lst_dev = bsp->st_dev; + lsp->lst_ino = bsp->st_ino; + lsp->lst_mode = (linux_mode_t)bsp->st_mode; + if (bsp->st_nlink >= (1 << 15)) + lsp->lst_nlink = (1 << 15) - 1; + else + lsp->lst_nlink = (linux_nlink_t)bsp->st_nlink; + lsp->lst_uid = bsp->st_uid; + lsp->lst_gid = bsp->st_gid; + lsp->lst_rdev = linux_fakedev(bsp->st_rdev); + lsp->lst_size = bsp->st_size; + lsp->lst_blksize = bsp->st_blksize; + lsp->lst_blocks = bsp->st_blocks; + lsp->lst_atime = bsp->st_atime; + lsp->lst_mtime = bsp->st_mtime; + lsp->lst_ctime = bsp->st_ctime; +} + +/* + * The stat functions below are plain sailing. stat and lstat are handled + * by one function to avoid code duplication. + */ +int +linux_sys_fstat64(p, v, retval) + struct proc *p; + void *v; + register_t *retval; +{ + struct linux_sys_fstat64_args /* { + syscallarg(int) fd; + syscallarg(linux_stat64 *) sp; + } */ *uap = v; + struct sys_fstat_args fsa; + struct linux_stat64 tmplst; + struct stat *st,tmpst; + caddr_t sg; + int error; + + sg = stackgap_init(p->p_emul); + + st = stackgap_alloc(&sg, sizeof (struct stat)); + + SCARG(&fsa, fd) = SCARG(uap, fd); + SCARG(&fsa, sb) = st; + + if ((error = sys_fstat(p, &fsa, retval))) + return error; + + if ((error = copyin(st, &tmpst, sizeof tmpst))) + return error; + + bsd_to_linux_stat(&tmpst, &tmplst); + + if ((error = copyout(&tmplst, SCARG(uap, sp), sizeof tmplst))) + return error; + + return 0; +} + +static int +linux_do_stat64(p, v, retval, dolstat) + struct proc *p; + void *v; + register_t *retval; + int dolstat; +{ + struct sys_stat_args sa; + struct linux_stat64 tmplst; + struct stat *st, tmpst; + caddr_t sg; + int error; + struct linux_sys_stat64_args *uap = v; + + sg = stackgap_init(p->p_emul); + st = stackgap_alloc(&sg, sizeof (struct stat)); + LINUX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); + + SCARG(&sa, ub) = st; + SCARG(&sa, path) = SCARG(uap, path); + + if ((error = (dolstat ? sys_lstat(p, &sa, retval) : + sys_stat(p, &sa, retval)))) + return error; + + if ((error = copyin(st, &tmpst, sizeof tmpst))) + return error; + + bsd_to_linux_stat(&tmpst, &tmplst); + + if ((error = copyout(&tmplst, SCARG(uap, sp), sizeof tmplst))) + return error; + + return 0; +} + +int +linux_sys_stat64(p, v, retval) + struct proc *p; + void *v; + register_t *retval; +{ + struct linux_sys_stat64_args /* { + syscallarg(const char *) path; + syscallarg(struct linux_stat64 *) sp; + } */ *uap = v; + + return linux_do_stat64(p, uap, retval, 0); +} + +int +linux_sys_lstat64(p, v, retval) + struct proc *p; + void *v; + register_t *retval; +{ + struct linux_sys_lstat64_args /* { + syscallarg(char *) path; + syscallarg(struct linux_stat64 *) sp; + } */ *uap = v; + + return linux_do_stat64(p, uap, retval, 1); +} + +int +linux_sys_truncate64(p, v, retval) + struct proc *p; + void *v; + register_t *retval; +{ + struct linux_sys_truncate64_args /* { + syscallarg(char *) path; + syscallarg(off_t) length; + } */ *uap = v; + caddr_t sg = stackgap_init(p->p_emul); + + LINUX_CHECK_ALT_EXIST(p, &sg, SCARG(uap, path)); + + return sys_truncate(p, uap, retval); +} diff --git a/sys/compat/linux/linux_types.h b/sys/compat/linux/linux_types.h index 64561e4cd64..7cc183a66b8 100644 --- a/sys/compat/linux/linux_types.h +++ b/sys/compat/linux/linux_types.h @@ -1,4 +1,4 @@ -/* $OpenBSD: linux_types.h,v 1.3 1996/05/22 12:01:51 deraadt Exp $ */ +/* $OpenBSD: linux_types.h,v 1.4 2000/12/22 07:34:02 jasoni Exp $ */ /* $NetBSD: linux_types.h,v 1.5 1996/05/20 01:59:28 fvdl Exp $ */ /* @@ -159,4 +159,40 @@ struct linux___sysctl { unsigned long __unused[4]; }; +/* This matches struct stat64 in glibc2.1, hence the absolutely + * insane amounts of padding around dev_t's. + */ +struct linux_stat64 { + unsigned short lst_dev; + unsigned char __pad0[10]; + + unsigned long lst_ino; + unsigned int lst_mode; + unsigned int lst_nlink; + + unsigned long lst_uid; + unsigned long lst_gid; + + unsigned short lst_rdev; + unsigned char __pad3[10]; + + long long lst_size; + unsigned long lst_blksize; + + unsigned long lst_blocks; /* Number 512-byte blocks allocated. */ + unsigned long __pad4; /* future possible st_blocks high bits*/ + + unsigned long lst_atime; + unsigned long __pad5; + + unsigned long lst_mtime; + unsigned long __pad6; + + unsigned long lst_ctime; + unsigned long __pad7; /* will be high 32 bits of ctime someday */ + + unsigned long __unused1; + unsigned long __unused2; +}; + #endif /* !_LINUX_TYPES_H */ diff --git a/sys/compat/linux/syscalls.master b/sys/compat/linux/syscalls.master index 1999b6d5255..033c3d53f4b 100644 --- a/sys/compat/linux/syscalls.master +++ b/sys/compat/linux/syscalls.master @@ -1,4 +1,4 @@ - $OpenBSD: syscalls.master,v 1.25 2000/07/07 02:13:40 jasoni Exp $ + $OpenBSD: syscalls.master,v 1.26 2000/12/22 07:34:02 jasoni Exp $ ; $NetBSD: syscalls.master,v 1.15 1995/12/18 14:35:10 fvdl Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -306,9 +306,13 @@ 191 STD { int linux_sys_ugetrlimit(u_int which, \ struct linux_rlimit *rlp); } 192 STD { int linux_sys_mmap2(void); } -193 STD { int linux_sys_truncate64(void); } +193 STD { int linux_sys_truncate64(char *path, \ + off_t length); } 194 STD { int linux_sys_ftruncate64(void); } -195 STD { int linux_sys_stat64(void); } -196 STD { int linux_sys_lstat64(void); } -197 STD { int linux_sys_fstat64(void); } +195 STD { int linux_sys_stat64(char *path, \ + struct linux_stat64 *sp); } +196 STD { int linux_sys_lstat64(char *path, \ + struct linux_stat64 *sp); } +197 STD { int linux_sys_fstat64(int fd, \ + struct linux_stat64 *sp); } |