summaryrefslogtreecommitdiff
path: root/sys/compat/linux/linux_file.c
diff options
context:
space:
mode:
authorfvdl <fvdl@NetBSD.org>1995-03-05 23:23:37 +0000
committerfvdl <fvdl@NetBSD.org>1995-03-05 23:23:37 +0000
commit182c23c8bc953f735285f652e318b26abdb110d5 (patch)
treec412b378bbe811dee6c821046621ac00649e418e /sys/compat/linux/linux_file.c
parent6c30f4a8925eee67df33399ec86d46da08c9612e (diff)
Added a few more system calls.
More consistent alternate root file semantics throughout.
Diffstat (limited to 'sys/compat/linux/linux_file.c')
-rw-r--r--sys/compat/linux/linux_file.c224
1 files changed, 217 insertions, 7 deletions
diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c
index cb7a942b6e1..31076a5f870 100644
--- a/sys/compat/linux/linux_file.c
+++ b/sys/compat/linux/linux_file.c
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_file.c,v 1.1 1995/02/28 23:24:53 fvdl Exp $ */
+/* $NetBSD: linux_file.c,v 1.2 1995/03/05 23:23:40 fvdl Exp $ */
/*
* Copyright (c) 1995 Frank van der Linden
@@ -118,7 +118,7 @@ linux_creat(p, uap, retval)
caddr_t sg;
sg = stackgap_init();
- CHECK_ALT(p, &sg, SCARG(uap, path));
+ CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
SCARG(&oa, path) = SCARG(uap, path);
SCARG(&oa, flags) = O_CREAT | O_TRUNC | O_WRONLY;
@@ -148,13 +148,17 @@ linux_open(p, uap, retval)
sg = stackgap_init();
- CHECK_ALT(p, &sg, SCARG(uap, path));
-
fl = linux_to_bsd_ioflags(SCARG(uap, flags));
+ if (fl & O_CREAT)
+ CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
+ else
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
SCARG(&boa, path) = SCARG(uap, path);
SCARG(&boa, flags) = fl;
SCARG(&boa, mode) = SCARG(uap, mode);
+
if ((error = open(p, &boa, retval)))
return error;
@@ -176,6 +180,41 @@ linux_open(p, uap, retval)
}
/*
+ * This appears to be part of a Linux attempt to switch to 64 bits file sizes.
+ */
+int
+linux_llseek(p, uap, retval)
+ struct proc *p;
+ struct linux_llseek_args /* {
+ syscallarg(int) fd;
+ syscallarg(uint32_t) ohigh;
+ syscallarg(uint32_t) olow;
+ syscallarg(caddr_t) res;
+ syscallarg(int) whence;
+ } */ *uap;
+ register_t *retval;
+{
+ struct lseek_args bla;
+ int error;
+ off_t off;
+
+ off = SCARG(uap, olow) | (((off_t) SCARG(uap, ohigh)) << 32);
+
+ SCARG(&bla, fd) = SCARG(uap, fd);
+ SCARG(&bla, offset) = off;
+ SCARG(&bla, whence) = SCARG(uap, whence);
+
+ if ((error = lseek(p, &bla, retval)))
+ return error;
+
+ if ((error = copyout(retval, SCARG(uap, res), sizeof (off_t))))
+ return error;
+
+ retval[0] = 0;
+ return 0;
+}
+
+/*
* The next two functions take care of converting the flock
* structure back and forth between Linux and NetBSD format.
* The only difference in the structures is the order of
@@ -405,7 +444,7 @@ linux_stat1(p, uap, retval, dolstat)
sg = stackgap_init();
- CHECK_ALT(p, &sg, SCARG(uap, path));
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
st = stackgap_alloc(&sg, sizeof (struct stat));
SCARG(&sa, ub) = st;
@@ -450,7 +489,7 @@ linux_lstat(p, uap, retval)
}
/*
- * This one is only here because of the alternate path check.
+ * The following syscalls are only here because of the alternate path check.
*/
int
linux_access(p, uap, retval)
@@ -463,7 +502,178 @@ linux_access(p, uap, retval)
{
caddr_t sg = stackgap_init();
- CHECK_ALT(p, &sg, SCARG(uap, path));
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
return access(p, uap, retval);
}
+
+int
+linux_unlink(p, uap, retval)
+ struct proc *p;
+ struct linux_unlink_args /* {
+ syscallarg(char *) path;
+ } */ *uap;
+ register_t *retval;
+
+{
+ caddr_t sg = stackgap_init();
+
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
+ return unlink(p, uap, retval);
+}
+
+int linux_chdir(p, uap, retval)
+ struct proc *p;
+ struct linux_chdir_args /* {
+ syscallarg(char *) path;
+ } */ *uap;
+ register_t *retval;
+{
+ caddr_t sg = stackgap_init();
+
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
+ return chdir(p, uap, retval);
+}
+
+int
+linux_mknod(p, uap, retval)
+ struct proc *p;
+ struct linux_mknod_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) mode;
+ syscallarg(int) dev;
+ } */ *uap;
+ register_t *retval;
+{
+ caddr_t sg = stackgap_init();
+
+ CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
+
+ return mknod(p, uap, retval);
+}
+
+int
+linux_chmod(p, uap, retval)
+ struct proc *p;
+ struct linux_chmod_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) mode;
+ } */ *uap;
+ register_t *retval;
+{
+ caddr_t sg = stackgap_init();
+
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
+ return chmod(p, uap, retval);
+}
+
+int
+linux_chown(p, uap, retval)
+ struct proc *p;
+ struct linux_chown_args /* {
+ syscallarg(char *) path;
+ syscallarg(int) uid;
+ syscallarg(int) gid;
+ } */ *uap;
+ register_t *retval;
+{
+ caddr_t sg = stackgap_init();
+
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+
+ return chmod(p, uap, retval);
+}
+
+int
+linux_rename(p, uap, retval)
+ struct proc *p;
+ struct linux_rename_args /* {
+ syscallarg(char *) from;
+ syscallarg(char *) to;
+ } */ *uap;
+ register_t *retval;
+{
+ caddr_t sg = stackgap_init();
+
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, from));
+ CHECK_ALT_CREAT(p, &sg, SCARG(uap, to));
+
+ return rename(p, uap, retval);
+}
+
+int
+linux_mkdir(p, uap, retval)
+ struct proc *p;
+ struct linux_mkdir_args /* {
+ syscallarg(char *) path;
+ } */ *uap;
+ register_t *retval;
+{
+ caddr_t sg = stackgap_init();
+
+ CHECK_ALT_CREAT(p, &sg, SCARG(uap, path));
+ return mkdir(p, uap, retval);
+}
+
+int
+linux_rmdir(p, uap, retval)
+ struct proc *p;
+ struct linux_rmdir_args /* {
+ syscallarg(char *) path;
+ } */ *uap;
+ register_t *retval;
+{
+ caddr_t sg = stackgap_init();
+
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return rmdir(p, uap, retval);
+}
+
+int
+linux_symlink(p, uap, retval)
+ struct proc *p;
+ struct linux_symlink_args /* {
+ syscallarg(char *) path;
+ syscallarg(char *) to;
+ } */ *uap;
+ register_t *retval;
+{
+ caddr_t sg = stackgap_init();
+
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ CHECK_ALT_CREAT(p, &sg, SCARG(uap, to));
+
+ return symlink(p, uap, retval);
+}
+
+int
+linux_readlink(p, uap, retval)
+ struct proc *p;
+ struct linux_readlink_args /* {
+ syscallarg(char *) name;
+ syscallarg(char *) buf;
+ syscallarg(int) count;
+ } */ *uap;
+{
+ caddr_t sg = stackgap_init();
+
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, name));
+ return readlink(p, uap, retval);
+}
+
+int
+linux_truncate(p, uap, retval)
+ struct proc *p;
+ struct linux_truncate_args /* {
+ syscallarg(char *) path;
+ syscallarg(long) length;
+ } */ *uap;
+{
+ caddr_t sg = stackgap_init();
+
+ CHECK_ALT_EXIST(p, &sg, SCARG(uap, path));
+ return compat_43_truncate(p, uap, retval);
+}