summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordsl <dsl@NetBSD.org>2007-07-12 19:41:57 +0000
committerdsl <dsl@NetBSD.org>2007-07-12 19:41:57 +0000
commit758f9f5cdec00ef079d6dcfb9a82332e96e23a80 (patch)
treea75d5f0d0b64a55815246ad091a6b4410db92ec3
parent34d9cdbea2f1852deeb7b377991085e324250857 (diff)
Change compat mount code to pass do_sys_mount() kernel resident buffers.
Possibly the standard nfs code needs teaching how to set the length and address family in order to support non-netbsd sockaddr. There are now no active stackgap() calls in the compat tree.
-rw-r--r--sys/compat/freebsd/freebsd_file.c25
-rw-r--r--sys/compat/irix/irix_usema.c6
-rw-r--r--sys/compat/osf1/osf1_mount.c72
-rw-r--r--sys/compat/sunos/sunos_misc.c50
-rw-r--r--sys/compat/sunos32/sunos32_misc.c53
-rw-r--r--sys/compat/ultrix/ultrix_fs.c123
6 files changed, 118 insertions, 211 deletions
diff --git a/sys/compat/freebsd/freebsd_file.c b/sys/compat/freebsd/freebsd_file.c
index 22df4bed3a8..278ece3959b 100644
--- a/sys/compat/freebsd/freebsd_file.c
+++ b/sys/compat/freebsd/freebsd_file.c
@@ -1,4 +1,4 @@
-/* $NetBSD: freebsd_file.c,v 1.25 2007/04/22 08:29:56 dsl Exp $ */
+/* $NetBSD: freebsd_file.c,v 1.26 2007/07/12 19:41:57 dsl Exp $ */
/*
* Copyright (c) 1995 Frank van der Linden
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: freebsd_file.c,v 1.25 2007/04/22 08:29:56 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: freebsd_file.c,v 1.26 2007/07/12 19:41:57 dsl Exp $");
#if defined(_KERNEL_OPT)
#include "fs_nfs.h"
@@ -105,23 +105,18 @@ freebsd_sys_mount(l, v, retval)
syscallarg(int) flags;
syscallarg(void *) data;
} */ *uap = v;
- struct proc *p = l->l_proc;
- int error;
const char *type;
- char *s;
- void *sg = stackgap_init(p, 0);
- struct sys_mount_args bma;
+ struct vfsops *vfsops;
+ register_t dummy;
if ((type = convert_from_freebsd_mount_type(SCARG(uap, type))) == NULL)
return ENODEV;
- s = stackgap_alloc(p, &sg, MFSNAMELEN + 1);
- if ((error = copyout(type, s, strlen(type) + 1)) != 0)
- return error;
- SCARG(&bma, type) = s;
- SCARG(&bma, path) = SCARG(uap, path);
- SCARG(&bma, flags) = SCARG(uap, flags);
- SCARG(&bma, data) = SCARG(uap, data);
- return sys_mount(l, &bma, retval);
+ vfsops = vfs_getopsbyname(type);
+ if (vfsops == NULL)
+ return ENODEV;
+
+ return do_sys_mount(l, vfsops, NULL, SCARG(uap, path),
+ SCARG(uap, flags), SCARG(uap, data), UIO_USERSPACE, 0, &dummy);
}
/*
diff --git a/sys/compat/irix/irix_usema.c b/sys/compat/irix/irix_usema.c
index f03ce23b2b5..29ac0fd8c61 100644
--- a/sys/compat/irix/irix_usema.c
+++ b/sys/compat/irix/irix_usema.c
@@ -1,4 +1,4 @@
-/* $NetBSD: irix_usema.c,v 1.19 2007/05/13 15:57:39 dsl Exp $ */
+/* $NetBSD: irix_usema.c,v 1.20 2007/07/12 19:41:57 dsl Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: irix_usema.c,v 1.19 2007/05/13 15:57:39 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: irix_usema.c,v 1.20 2007/07/12 19:41:57 dsl Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -103,7 +103,7 @@ static struct irix_waiting_proc_rec *iur_proc_getfirst
* at driver attach time, in irix_usemaattach().
*/
struct vfsops irix_usema_dummy_vfsops = {
- "usema_dummy",
+ "usema_dummy", 0,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, irix_usema_dummy_vfs_init, NULL, NULL, NULL, NULL, NULL,
NULL,
diff --git a/sys/compat/osf1/osf1_mount.c b/sys/compat/osf1/osf1_mount.c
index 002a589ea7e..c8e762e4c09 100644
--- a/sys/compat/osf1/osf1_mount.c
+++ b/sys/compat/osf1/osf1_mount.c
@@ -1,4 +1,4 @@
-/* $NetBSD: osf1_mount.c,v 1.34 2007/04/22 08:29:58 dsl Exp $ */
+/* $NetBSD: osf1_mount.c,v 1.35 2007/07/12 19:41:58 dsl Exp $ */
/*
* Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: osf1_mount.c,v 1.34 2007/04/22 08:29:58 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: osf1_mount.c,v 1.35 2007/07/12 19:41:58 dsl Exp $");
#if defined(_KERNEL_OPT)
#include "fs_nfs.h"
@@ -105,10 +105,8 @@ __KERNEL_RCSID(0, "$NetBSD: osf1_mount.c,v 1.34 2007/04/22 08:29:58 dsl Exp $");
#define OSF1_UNMOUNT_FLAGS (OSF1_MNT_FORCE|OSF1_MNT_NOFORCE)
-static int osf1_mount_mfs __P((struct proc *,
- struct osf1_sys_mount_args *, struct sys_mount_args *));
-static int osf1_mount_nfs __P((struct proc *,
- struct osf1_sys_mount_args *, struct sys_mount_args *));
+static int osf1_mount_mfs(struct lwp *, struct osf1_sys_mount_args *);
+static int osf1_mount_nfs(struct lwp *, struct osf1_sys_mount_args *);
int
osf1_sys_fstatfs(l, v, retval)
@@ -195,31 +193,23 @@ osf1_sys_mount(l, v, retval)
register_t *retval;
{
struct osf1_sys_mount_args *uap = v;
- struct sys_mount_args a;
- int error;
-
- SCARG(&a, path) = SCARG(uap, path);
if (SCARG(uap, flags) & ~OSF1_MOUNT_FLAGS)
return (EINVAL);
- SCARG(&a, flags) = SCARG(uap, flags); /* XXX - xlate */
+
+ /* XXX - xlate flags */
switch (SCARG(uap, type)) {
case OSF1_MOUNT_NFS:
- if ((error = osf1_mount_nfs(l->l_proc, uap, &a)))
- return error;
+ return osf1_mount_nfs(l, uap);
break;
case OSF1_MOUNT_MFS:
- if ((error = osf1_mount_mfs(l->l_proc, uap, &a)))
- return error;
- break;
+ return osf1_mount_mfs(l, uap);
default:
return (EINVAL);
}
-
- return sys_mount(l, &a, retval);
}
int
@@ -271,18 +261,14 @@ osf1_sys_unmount(l, v, retval)
}
static int
-osf1_mount_mfs(p, osf_argp, bsd_argp)
- struct proc *p;
- struct osf1_sys_mount_args *osf_argp;
- struct sys_mount_args *bsd_argp;
+osf1_mount_mfs(struct lwp *l, struct osf1_sys_mount_args *uap)
{
struct osf1_mfs_args osf_ma;
struct mfs_args bsd_ma;
- void *sg = stackgap_init(p, 0);
- int error, len;
- static const char mfs_name[] = MOUNT_MFS;
+ int error;
+ register_t dummy;
- if ((error = copyin(SCARG(osf_argp, data), &osf_ma, sizeof osf_ma)))
+ if ((error = copyin(SCARG(uap, data), &osf_ma, sizeof osf_ma)))
return error;
memset(&bsd_ma, 0, sizeof bsd_ma);
@@ -291,32 +277,20 @@ osf1_mount_mfs(p, osf_argp, bsd_argp)
bsd_ma.base = osf_ma.base;
bsd_ma.size = osf_ma.size;
- SCARG(bsd_argp, data) = stackgap_alloc(p, &sg, sizeof bsd_ma);
- if ((error = copyout(&bsd_ma, SCARG(bsd_argp, data), sizeof bsd_ma)))
- return error;
-
- len = strlen(mfs_name) + 1;
- SCARG(bsd_argp, type) = stackgap_alloc(p, &sg, len);
- if ((error = copyout(mfs_name, __UNCONST(SCARG(bsd_argp, type)), len)))
- return error;
-
- return 0;
+ return do_sys_mount(l, vfs_getopsbyname("mfs"), NULL, SCARG(uap, path),
+ SCARG(uap, flags), &bsd_ma, UIO_SYSSPACE, sizeof bsd_ma, &dummy);
}
static int
-osf1_mount_nfs(p, osf_argp, bsd_argp)
- struct proc *p;
- struct osf1_sys_mount_args *osf_argp;
- struct sys_mount_args *bsd_argp;
+osf1_mount_nfs(struct lwp *l, struct osf1_sys_mount_args *uap)
{
struct osf1_nfs_args osf_na;
struct nfs_args bsd_na;
- void *sg = stackgap_init(p, 0);
- int error, len;
- static const char nfs_name[] = MOUNT_NFS;
+ int error;
unsigned long leftovers;
+ register_t dummy;
- if ((error = copyin(SCARG(osf_argp, data), &osf_na, sizeof osf_na)))
+ if ((error = copyin(SCARG(uap, data), &osf_na, sizeof osf_na)))
return error;
memset(&bsd_na, 0, sizeof bsd_na);
@@ -354,14 +328,8 @@ osf1_mount_nfs(p, osf_argp, bsd_argp)
if (bsd_na.flags & NFSMNT_RETRANS)
bsd_na.retrans = osf_na.retrans;
- SCARG(bsd_argp, data) = stackgap_alloc(p, &sg, sizeof bsd_na);
- if ((error = copyout(&bsd_na, SCARG(bsd_argp, data), sizeof bsd_na)))
- return error;
-
- len = strlen(nfs_name) + 1;
- SCARG(bsd_argp, type) = stackgap_alloc(p, &sg, len);
- if ((error = copyout(MOUNT_NFS, __UNCONST(SCARG(bsd_argp, type)), len)))
- return error;
+ return do_sys_mount(l, vfs_getopsbyname("nfs"), NULL, SCARG(uap, path),
+ SCARG(uap, flags), &bsd_na, UIO_SYSSPACE, sizeof bsd_na, &dummy);
return 0;
}
diff --git a/sys/compat/sunos/sunos_misc.c b/sys/compat/sunos/sunos_misc.c
index d7b8447fa83..3de8d1ec5ab 100644
--- a/sys/compat/sunos/sunos_misc.c
+++ b/sys/compat/sunos/sunos_misc.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sunos_misc.c,v 1.149 2007/05/12 20:27:56 dsl Exp $ */
+/* $NetBSD: sunos_misc.c,v 1.150 2007/07/12 19:41:58 dsl Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -50,7 +50,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos_misc.c,v 1.149 2007/05/12 20:27:56 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos_misc.c,v 1.150 2007/07/12 19:41:58 dsl Exp $");
#if defined(_KERNEL_OPT)
#include "opt_nfsserver.h"
@@ -291,10 +291,9 @@ sunos_sys_mount(l, v, retval)
register_t *retval;
{
struct sunos_sys_mount_args *uap = v;
- struct proc *p = l->l_proc;
int oflags = SCARG(uap, flags), nflags, error;
char fsname[MFSNAMELEN];
- void *sg = stackgap_init(p, 0);
+ register_t dummy;
if (oflags & (SUNM_NOSUB | SUNM_SYS5))
return (EINVAL);
@@ -307,40 +306,26 @@ sunos_sys_mount(l, v, retval)
nflags |= MNT_NOSUID;
if (oflags & SUNM_REMOUNT)
nflags |= MNT_UPDATE;
- SCARG(uap, flags) = nflags;
- error = copyinstr((void *)SCARG(uap, type), fsname,
- sizeof fsname, (size_t *)0);
+ error = copyinstr(SCARG(uap, type), fsname, sizeof fsname, NULL);
if (error)
return (error);
- if (strncmp(fsname, "4.2", sizeof fsname) == 0) {
- SCARG(uap, type) = stackgap_alloc(p, &sg, sizeof("ffs"));
- error = copyout("ffs", SCARG(uap, type), sizeof("ffs"));
- if (error)
- return (error);
- } else if (strncmp(fsname, "nfs", sizeof fsname) == 0) {
+ if (strcmp(fsname, "nfs") == 0) {
struct sunos_nfs_args sna;
- struct sockaddr_in sain;
struct nfs_args na;
- struct sockaddr sa;
int n;
error = copyin(SCARG(uap, data), &sna, sizeof sna);
if (error)
return (error);
- error = copyin(sna.addr, &sain, sizeof sain);
- if (error)
- return (error);
- memcpy(&sa, &sain, sizeof sa);
- sa.sa_len = sizeof(sain);
- SCARG(uap, data) = stackgap_alloc(p, &sg, sizeof(na));
+ /* sa.sa_len = sizeof(sain); */
na.version = NFS_ARGSVERSION;
- na.addr = stackgap_alloc(p, &sg, sizeof(struct sockaddr));
+ na.addr = (void *)sna.addr;
na.addrlen = sizeof(struct sockaddr);
na.sotype = SOCK_DGRAM;
na.proto = IPPROTO_UDP;
- na.fh = (void *)sna.fh;
+ na.fh = sna.fh;
na.fhsize = NFSX_V2FH;
na.flags = 0;
n = sizeof(sunnfs_flgtab) / sizeof(sunnfs_flgtab[0]);
@@ -355,16 +340,19 @@ sunos_sys_mount(l, v, retval)
}
na.timeo = sna.timeo;
na.retrans = sna.retrans;
- na.hostname = (char *)(u_long)sna.hostname;
+ na.hostname = /* (char *)(u_long) */ sna.hostname;
- error = copyout(&sa, na.addr, sizeof sa);
- if (error)
- return (error);
- error = copyout(&na, SCARG(uap, data), sizeof na);
- if (error)
- return (error);
+ return do_sys_mount(l, vfs_getopsbyname("nfs"), NULL,
+ SCARG(uap, dir), nflags, &na,
+ UIO_SYSSPACE, sizeof na, &dummy);
}
- return (sys_mount(l, (struct sys_mount_args *)uap, retval));
+
+ if (strcmp(fsname, "4.2") == 0)
+ strcpy(fsname, "ffs");
+
+ return do_sys_mount(l, vfs_getopsbyname(fsname), NULL,
+ SCARG(uap, dir), nflags, SCARG(uap, data),
+ UIO_USERSPACE, 0, &dummy);
}
#if defined(NFS)
diff --git a/sys/compat/sunos32/sunos32_misc.c b/sys/compat/sunos32/sunos32_misc.c
index b5bea248a86..7918ece5021 100644
--- a/sys/compat/sunos32/sunos32_misc.c
+++ b/sys/compat/sunos32/sunos32_misc.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sunos32_misc.c,v 1.49 2007/05/12 20:27:56 dsl Exp $ */
+/* $NetBSD: sunos32_misc.c,v 1.50 2007/07/12 19:41:58 dsl Exp $ */
/* from :NetBSD: sunos_misc.c,v 1.107 2000/12/01 19:25:10 jdolecek Exp */
/*
@@ -79,7 +79,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos32_misc.c,v 1.49 2007/05/12 20:27:56 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos32_misc.c,v 1.50 2007/07/12 19:41:58 dsl Exp $");
#define COMPAT_SUNOS 1
@@ -499,11 +499,9 @@ sunos32_sys_mount(l, v, retval)
syscallarg(int) flags;
syscallarg(netbsd32_caddr_t) data;
} */ *uap = v;
- struct proc *p = l->l_proc;
- struct sys_mount_args ua;
int oflags = SCARG(uap, flags), nflags, error;
char fsname[MFSNAMELEN];
- void *sg = stackgap_init(p, 0);
+ register_t dummy;
if (oflags & (SUNM_NOSUB | SUNM_SYS5))
return (EINVAL);
@@ -516,40 +514,26 @@ sunos32_sys_mount(l, v, retval)
nflags |= MNT_NOSUID;
if (oflags & SUNM_REMOUNT)
nflags |= MNT_UPDATE;
- SCARG(uap, flags) = nflags;
- error = copyinstr(SCARG_P32(uap, type), fsname,
- sizeof fsname, (size_t *)0);
+ error = copyinstr(SCARG_P32(uap, type), fsname, sizeof fsname, NULL);
if (error)
return (error);
- if (strncmp(fsname, "4.2", sizeof fsname) == 0) {
- NETBSD32PTR32(SCARG(uap, type), stackgap_alloc(p, &sg, sizeof("ffs")));
- error = copyout("ffs", SCARG_P32(uap, type), sizeof("ffs"));
- if (error)
- return (error);
- } else if (strncmp(fsname, "nfs", sizeof fsname) == 0) {
+ if (strncmp(fsname, "nfs", sizeof fsname) == 0) {
struct sunos_nfs_args sna;
- struct sockaddr_in sain;
struct nfs_args na; /* XXX */
- struct sockaddr sa;
int n;
error = copyin(SCARG_P32(uap, data), &sna, sizeof sna);
if (error)
return (error);
- error = copyin(sna.addr, &sain, sizeof sain);
- if (error)
- return (error);
- memcpy(&sa, &sain, sizeof sa);
- sa.sa_len = sizeof(sain);
- NETBSD32PTR32(SCARG(uap, data), stackgap_alloc(p, &sg, sizeof(na)));
+ /* sa.sa_len = sizeof(sain); */
na.version = NFS_ARGSVERSION;
- na.addr = stackgap_alloc(p, &sg, sizeof(struct sockaddr));
+ na.addr = (void *)sna.addr;
na.addrlen = sizeof(struct sockaddr);
na.sotype = SOCK_DGRAM;
na.proto = IPPROTO_UDP;
- na.fh = (void *)sna.fh;
+ na.fh = sna.fh;
na.fhsize = NFSX_V2FH;
na.flags = 0;
n = sizeof(sunnfs_flgtab) / sizeof(sunnfs_flgtab[0]);
@@ -566,18 +550,17 @@ sunos32_sys_mount(l, v, retval)
na.retrans = sna.retrans;
na.hostname = (char *)(u_long)sna.hostname;
- error = copyout(&sa, na.addr, sizeof sa);
- if (error)
- return (error);
- error = copyout(&na, SCARG_P32(uap, data), sizeof na);
- if (error)
- return (error);
+ return do_sys_mount(l, vfs_getopsbyname("nfs"), NULL,
+ SCARG_P32(uap, path), nflags, &na, UIO_SYSSPACE, sizeof na,
+ &dummy);
}
- SUNOS32TOP_UAP(type, const char);
- SUNOS32TOP_UAP(path, const char);
- SUNOS32TO64_UAP(flags);
- SUNOS32TOP_UAP(data, void);
- return (sys_mount(l, &ua, retval));
+
+ if (strcmp(fsname, "4.2") == 0)
+ strcpy(fsname, "ffs");
+
+ return do_sys_mount(l, vfs_getopsbyname(fsname), NULL,
+ SCARG_P32(uap, path), nflags, SCARG_P32(uap, data), UIO_USERSPACE,
+ 0, &dummy);
}
#if defined(NFS)
diff --git a/sys/compat/ultrix/ultrix_fs.c b/sys/compat/ultrix/ultrix_fs.c
index 370f659b159..6c594831bc8 100644
--- a/sys/compat/ultrix/ultrix_fs.c
+++ b/sys/compat/ultrix/ultrix_fs.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ultrix_fs.c,v 1.37 2007/03/05 13:56:24 he Exp $ */
+/* $NetBSD: ultrix_fs.c,v 1.38 2007/07/12 19:41:58 dsl Exp $ */
/*
* Copyright (c) 1995, 1997 Jonathan Stone
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ultrix_fs.c,v 1.37 2007/03/05 13:56:24 he Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ultrix_fs.c,v 1.38 2007/07/12 19:41:58 dsl Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -346,92 +346,38 @@ int
ultrix_sys_mount(struct lwp *l, void *v, register_t *retval)
{
struct ultrix_sys_mount_args *uap = v;
- struct proc *p = l->l_proc;
int error;
int otype = SCARG(uap, type);
char fsname[MFSNAMELEN];
- const char *fstype;
- struct sys_mount_args nuap;
char *native_fstype;
+ int nflags;
- char *usp = stackgap_init(p, 0);
-
- memset(&nuap, 0, sizeof(nuap));
- SCARG(&nuap, flags) = 0;
+ nflags = 0;
/*
* Translate Ultrix integer mount codes for UFS and NFS to
* NetBSD fstype strings. Other Ultrix filesystem types
* (msdos, DEC ods-2) are not supported.
- * Copy resulting string out to userspace (on stack)
- * so we can pass it to the native mount syscall.
*/
- if (otype == ULTRIX_FSTYPE_ULTRIX)
- fstype = "ufs";
- else if (otype == ULTRIX_FSTYPE_NFS)
- fstype = "nfs";
- else
- return (EINVAL);
/* Translate the Ultrix mount-readonly option parameter */
if (SCARG(uap, rdonly))
- SCARG(&nuap, flags) |= MNT_RDONLY;
-
- /* Copy string-ified version of mount type back out to user space */
- native_fstype = (char *)usp;
- SCARG(&nuap, type) = native_fstype;
- if ((error = copyout(fstype, native_fstype,
- strlen(fstype)+1)) != 0) {
- return (error);
- }
- usp += strlen(fstype)+1;
+ nflags |= MNT_RDONLY;
+
#ifdef later
parse ultrix mount option string and set NetBSD flags
#endif
- SCARG(&nuap, path) = SCARG(uap, dir);
-
- /*
- * Translate fstype-dependent mount options from
- * Ultrix format to native.
- */
- if (otype == ULTRIX_FSTYPE_ULTRIX) {
- /* attempt to mount a native, rather than 4.2bsd, ffs */
- struct ufs_args ua;
+ path) = SCARG(uap, dir);
- memset(&ua, 0, sizeof(ua));
- ua.fspec = SCARG(uap, special);
- SCARG(&nuap, data) = usp;
-
- if ((error = copyout(&ua, SCARG(&nuap, data),
- sizeof ua)) !=0) {
- return(error);
- }
- /*
- * Ultrix mount has no MNT_UPDATE flag.
- * Attempt to see if this is the root we're mounting,
- * and if so, set MNT_UPDATE so we can mount / read-write.
- */
- fsname[0] = 0;
- if ((error = copyinstr(SCARG(&nuap, path), fsname,
- sizeof fsname, NULL)) != 0)
- return(error);
- if (strcmp(fsname, "/") == 0) {
- SCARG(&nuap, flags) |= MNT_UPDATE;
- printf("COMPAT_ULTRIX: mount with MNT_UPDATE on %s\n",
- fsname);
- }
- } else if (otype == ULTRIX_FSTYPE_NFS) {
+ if (otype == ULTRIX_FSTYPE_NFS) {
struct ultrix_nfs_args una;
struct nfs_args na;
- struct osockaddr_in osa;
- struct sockaddr_in *sap = (struct sockaddr_in *)& osa;
- memset(&osa, 0, sizeof(osa));
- memset(&una, 0, sizeof(una));
if ((error = copyin(SCARG(uap, data), &una, sizeof una)) !=0) {
return (error);
}
+#if 0
/*
* This is the only syscall boundary the
* address of the server passes, so do backwards
@@ -443,14 +389,11 @@ ultrix_sys_mount(struct lwp *l, void *v, register_t *retval)
}
sap->sin_family = (u_char)osa.sin_family;
sap->sin_len = sizeof(*sap);
- /* allocate space above caller's stack for nfs_args */
- SCARG(&nuap, data) = usp;
- usp += sizeof (na);
- /* allocate space above caller's stack for server sockaddr */
+ /* XXXX teach nfs how to do the above */
+#endif
na.version = NFS_ARGSVERSION;
- na.addr = (struct sockaddr *)usp;
- usp += sizeof(*sap);
- na.addrlen = sap->sin_len;
+ na.addr = una.addr;
+ na.addrlen = sizeof (struct sockaddr_in);
na.sotype = SOCK_DGRAM;
na.proto = IPPROTO_UDP;
na.fh = una.fh;
@@ -461,10 +404,40 @@ ultrix_sys_mount(struct lwp *l, void *v, register_t *retval)
na.timeo = una.timeo;
na.retrans = una.retrans;
na.hostname = una.hostname;
- if ((error = copyout(sap, na.addr, sizeof (*sap) )) != 0)
- return (error);
- if ((error = copyout(&na, SCARG(&nuap, data), sizeof na)) != 0)
- return (error);
+ return do_sys_mount(l, vfs_getopsbyname("ngs"), NULL,
+ SCARG(uap, special), nflags, &na, UIO_SYSSPACE,
+ sizeof na, &dummy);
+ }
+
+ /*
+ * Translate fstype-dependent mount options from
+ * Ultrix format to native.
+ */
+ if (otype == ULTRIX_FSTYPE_ULTRIX) {
+ /* attempt to mount a native, rather than 4.2bsd, ffs */
+ struct ufs_args ua;
+
+ memset(&ua, 0, sizeof(ua));
+ ua.fspec = SCARG(uap, special);
+
+ /*
+ * Ultrix mount has no MNT_UPDATE flag.
+ * Attempt to see if this is the root we're mounting,
+ * and if so, set MNT_UPDATE so we can mount / read-write.
+ */
+ fsname[0] = 0;
+ if ((error = copyinstr(SCARG(&nuap, path), fsname,
+ sizeof fsname, NULL)) != 0)
+ return(error);
+ if (strcmp(fsname, "/") == 0) {
+ nflags |= MNT_UPDATE;
+ printf("COMPAT_ULTRIX: mount with MNT_UPDATE on %s\n",
+ fsname);
+ }
+ return do_sys_mount(l, vfs_getopsbyname("ffs"), NULL,
+ SCARG(uap, root), nflags, &ua, UIO_SYSSPACE, sizeof ua,
+ &dummy);
}
- return (sys_mount(l, &nuap, retval));
+
+ return (EINVAL);
}