Module Name:    src
Committed By:   chs
Date:           Mon Nov 18 01:35:22 UTC 2013

Modified Files:
        src/sys/compat/linux32/common: linux32_unistd.c

Log Message:
implement the *at() syscalls.
bring the unimplemented syscall list up to date.


To generate a diff of this commit:
cvs rdiff -u -r1.35 -r1.36 src/sys/compat/linux32/common/linux32_unistd.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/common/linux32_unistd.c
diff -u src/sys/compat/linux32/common/linux32_unistd.c:1.35 src/sys/compat/linux32/common/linux32_unistd.c:1.36
--- src/sys/compat/linux32/common/linux32_unistd.c:1.35	Sun Apr 10 15:48:23 2011
+++ src/sys/compat/linux32/common/linux32_unistd.c	Mon Nov 18 01:35:22 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux32_unistd.c,v 1.35 2011/04/10 15:48:23 christos Exp $ */
+/*	$NetBSD: linux32_unistd.c,v 1.36 2013/11/18 01:35:22 chs Exp $ */
 
 /*-
  * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: linux32_unistd.c,v 1.35 2011/04/10 15:48:23 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_unistd.c,v 1.36 2013/11/18 01:35:22 chs Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -48,6 +48,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux32_unis
 #include <sys/swap.h>
 #include <sys/kauth.h>
 #include <sys/filedesc.h>
+#include <sys/vfs_syscalls.h>
 
 #include <machine/types.h>
 
@@ -69,6 +70,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux32_unis
 #include <compat/linux32/common/linux32_types.h>
 #include <compat/linux32/common/linux32_signal.h>
 #include <compat/linux32/common/linux32_machdep.h>
+#include <compat/linux32/common/linux32_sched.h>
 #include <compat/linux32/common/linux32_sysctl.h>
 #include <compat/linux32/common/linux32_socketcall.h>
 #include <compat/linux32/linux32_syscallargs.h>
@@ -306,6 +308,66 @@ linux32_sys_dup3(struct lwp *l, const st
 	return 0;
 }
 
+
+int
+linux32_sys_openat(struct lwp *l, const struct linux32_sys_openat_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(int) fd;
+		syscallarg(const netbsd32_charp) path;
+		syscallarg(int) flags;
+		syscallarg(int) mode;
+	} */
+	struct linux_sys_openat_args ua;
+
+	NETBSD32TO64_UAP(fd);
+	NETBSD32TOP_UAP(path, const char);
+	NETBSD32TO64_UAP(flags);
+	NETBSD32TO64_UAP(mode);
+
+	return linux_sys_openat(l, &ua, retval);
+}
+
+int
+linux32_sys_mknodat(struct lwp *l, const struct linux32_sys_mknodat_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(int) fd;
+		syscallarg(const netbsd32_charp) path;
+		syscallarg(linux_umode_t) mode;
+		syscallarg(unsigned) dev;
+	} */
+	struct linux_sys_mknodat_args ua;
+
+	NETBSD32TO64_UAP(fd);
+	NETBSD32TOP_UAP(path, const char);
+	NETBSD32TO64_UAP(mode);
+	NETBSD32TO64_UAP(dev);
+
+	return linux_sys_mknodat(l, &ua, retval);
+}
+
+int
+linux32_sys_linkat(struct lwp *l, const struct linux32_sys_linkat_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(int) fd1;
+		syscallarg(netbsd32_charp) name1;
+		syscallarg(int) fd2;
+		syscallarg(netbsd32_charp) name2;
+		syscallarg(int) flags;
+	} */
+	int fd1 = SCARG(uap, fd1);
+	const char *name1 = SCARG_P32(uap, name1);
+	int fd2 = SCARG(uap, fd2);
+	const char *name2 = SCARG_P32(uap, name2);
+	int follow;
+
+	follow = SCARG(uap, flags) & LINUX_AT_SYMLINK_FOLLOW;
+
+	return do_sys_linkat(l, fd1, name1, fd2, name2, follow, retval);
+}
+
 int
 linux32_sys_unlink(struct lwp *l, const struct linux32_sys_unlink_args *uap, register_t *retval)
 {
@@ -315,11 +377,97 @@ linux32_sys_unlink(struct lwp *l, const 
 	struct linux_sys_unlink_args ua;
 
 	NETBSD32TOP_UAP(path, const char);
-	
+
 	return linux_sys_unlink(l, &ua, retval);
 }
 
 int
+linux32_sys_unlinkat(struct lwp *l, const struct linux32_sys_unlinkat_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(int) fd;
+		syscallarg(const netbsd32_charp) path;
+		syscallarg(int) flag;
+	} */
+	struct linux_sys_unlinkat_args ua;
+
+	NETBSD32TO64_UAP(fd);
+	NETBSD32TOP_UAP(path, const char);
+	NETBSD32TO64_UAP(flag);
+
+	return linux_sys_unlinkat(l, &ua, retval);
+}
+
+int
+linux32_sys_fchmodat(struct lwp *l, const struct linux32_sys_fchmodat_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(int) fd;
+		syscallarg(netbsd_charp) path;
+		syscallarg(linux_umode_t) mode;
+	} */
+
+	return do_sys_chmodat(l, SCARG(uap, fd), SCARG_P32(uap, path),
+			      SCARG(uap, mode), AT_SYMLINK_FOLLOW);
+}
+
+int
+linux32_sys_fchownat(struct lwp *l, const struct linux32_sys_fchownat_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(int) fd;
+		syscallarg(netbsd_charp) path;
+		syscallarg(uid_t) owner;
+		syscallarg(gid_t) group;
+		syscallarg(int) flag;
+	} */
+	int flag;
+
+	flag = linux_to_bsd_atflags(SCARG(uap, flag));
+	return do_sys_chownat(l, SCARG(uap, fd), SCARG_P32(uap, path),
+			      SCARG(uap, owner), SCARG(uap, group), flag);
+}
+
+int
+linux32_sys_faccessat(struct lwp *l, const struct linux32_sys_faccessat_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(int) fd;
+		syscallarg(netbsd_charp) path;
+		syscallarg(int) amode;
+	} */
+
+	return do_sys_accessat(l, SCARG(uap, fd), SCARG_P32(uap, path),
+	     SCARG(uap, amode), AT_SYMLINK_FOLLOW);
+}
+
+int
+linux32_sys_utimensat(struct lwp *l, const struct linux32_sys_utimensat_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(int) fd;
+		syscallarg(const netbsd32_charp) path;
+		syscallarg(const linux32_timespecp_t) times;
+		syscallarg(int) flags;
+	} */
+	int error;
+	struct linux32_timespec lts[2];
+	struct timespec *tsp = NULL, ts[2];
+
+	if (SCARG_P32(uap, times)) {
+		error = copyin(SCARG_P32(uap, times), &lts, sizeof(lts));
+		if (error != 0)
+			return error;
+		linux32_to_native_timespec(&ts[0], &lts[0]);
+		linux32_to_native_timespec(&ts[1], &lts[1]);
+		tsp = ts;
+	}
+
+	return linux_do_sys_utimensat(l, SCARG(uap, fd), SCARG_P32(uap, path),
+	    tsp, SCARG(uap, flag), retval);
+}
+
+int
 linux32_sys_creat(struct lwp *l, const struct linux32_sys_creat_args *uap, register_t *retval)
 {
 	/* {

Reply via email to