start at (new) sendmsg and recvmsg. right now, the former doesn't

handle control messages and the latter is just a stub.
This commit is contained in:
cgd 1999-05-10 05:58:44 +00:00
parent 4cd55c6082
commit 798cd0a332
4 changed files with 130 additions and 6 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: osf1_cvt.c,v 1.5 1999/05/05 00:57:43 cgd Exp $ */
/* $NetBSD: osf1_cvt.c,v 1.6 1999/05/10 05:58:44 cgd Exp $ */
/*
* Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
@ -307,6 +307,38 @@ const struct emul_flags_xtab osf1_wait_options_xtab[] = {
{ 0 }
};
int
osf1_cvt_msghdr_xopen_to_native(omh, bmh)
const struct osf1_msghdr_xopen *omh;
struct msghdr *bmh;
{
unsigned long leftovers;
memset(bmh, 0, sizeof bmh);
bmh->msg_name = omh->msg_name; /* XXX sockaddr translation */
bmh->msg_namelen = omh->msg_namelen;
bmh->msg_iov = NULL; /* iovec xlation separate */
bmh->msg_iovlen = omh->msg_iovlen;
/* XXX we don't translate control messages (yet) */
if (bmh->msg_control != NULL || bmh->msg_controllen != 0)
{
printf("osf1_cvt_msghdr_xopen_to_native: control\n");
return (EINVAL);
}
/* translate flags */
bmh->msg_flags = emul_flags_translate(osf1_sendrecv_msg_flags_xtab,
omh->msg_flags, &leftovers);
if (leftovers != 0)
{
printf("osf1_cvt_msghdr_xopen_to_native: leftovers 0x%lx\n", leftovers);
return (EINVAL);
}
return (0);
}
int
osf1_cvt_pathconf_name_to_native(oname, bnamep)
int oname, *bnamep;

View File

@ -1,4 +1,4 @@
/* $NetBSD: osf1_cvt.h,v 1.4 1999/05/04 02:12:15 cgd Exp $ */
/* $NetBSD: osf1_cvt.h,v 1.5 1999/05/10 05:58:44 cgd Exp $ */
/*
* Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
@ -47,6 +47,8 @@
#define osf1_cvt_dev_to_native(dev) \
makedev(osf1_major(dev), osf1_minor(dev))
int osf1_cvt_msghdr_xopen_to_native(const struct osf1_msghdr_xopen *omh,
struct msghdr *nmh);
int osf1_cvt_pathconf_name_to_native(int oname, int *bnamep);
void osf1_cvt_rusage_from_native(const struct rusage *nru,
struct osf1_rusage *oru);

View File

@ -1,4 +1,4 @@
/* $NetBSD: osf1_socket.c,v 1.4 1999/05/10 01:58:37 cgd Exp $ */
/* $NetBSD: osf1_socket.c,v 1.5 1999/05/10 05:58:44 cgd Exp $ */
/*
* Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
@ -65,12 +65,100 @@
#include <sys/mount.h>
#include <sys/syscallargs.h>
#include <sys/socketvar.h>
#include <sys/exec.h>
#include <compat/osf1/osf1.h>
#include <compat/osf1/osf1_syscallargs.h>
#include <compat/osf1/osf1_util.h>
#include <compat/osf1/osf1_cvt.h>
int
osf1_sys_recvmsg_xopen(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
/* XXX */
return (EINVAL);
}
int
osf1_sys_sendmsg_xopen(p, v, retval)
struct proc *p;
void *v;
register_t *retval;
{
struct osf1_sys_sendmsg_xopen_args *uap = v;
struct sys_sendmsg_args a;
struct osf1_msghdr_xopen osf_msghdr;
struct osf1_iovec_xopen osf_iovec, *osf_iovec_ptr;
struct msghdr bsd_msghdr;
struct iovec bsd_iovec, *bsd_iovec_ptr;
unsigned long leftovers;
caddr_t sg;
unsigned int i;
int error;
sg = stackgap_init(p->p_emul);
SCARG(&a, s) = SCARG(uap, s);
/*
* translate msghdr structure
*/
if ((error = copyin(SCARG(uap, msg), &osf_msghdr,
sizeof osf_msghdr)) != 0)
return (error);
error = osf1_cvt_msghdr_xopen_to_native(&osf_msghdr, &bsd_msghdr);
if (error != 0)
return (error);
if (STACKGAPLEN < (bsd_msghdr.msg_iovlen * sizeof (struct iovec) +
sizeof (struct msghdr)))
{
printf("sendmsg space\n");
return (EINVAL);
}
SCARG(&a, msg) = stackgap_alloc(&sg, sizeof bsd_msghdr);
bsd_msghdr.msg_iov = stackgap_alloc(&sg,
bsd_msghdr.msg_iovlen * sizeof (struct iovec));
if ((error = copyout(&bsd_msghdr, (caddr_t)SCARG(&a, msg),
sizeof bsd_msghdr)) != 0)
return (error);
osf_iovec_ptr = osf_msghdr.msg_iov;
bsd_iovec_ptr = bsd_msghdr.msg_iov;
for (i = 0; i < bsd_msghdr.msg_iovlen; i++) {
if ((error = copyin(&osf_iovec_ptr[i], &osf_iovec,
sizeof osf_iovec)) != 0)
return (error);
bsd_iovec.iov_base = osf_iovec.iov_base;
bsd_iovec.iov_len = osf_iovec.iov_len;
if ((error = copyout(&bsd_iovec, &bsd_iovec_ptr[i],
sizeof bsd_iovec)) != 0)
return (error);
}
/*
* translate flags
*/
SCARG(&a, flags) = emul_flags_translate(osf1_sendrecv_msg_flags_xtab,
SCARG(uap, flags), &leftovers);
if (leftovers != 0)
{
printf("sendmsg flags leftover: 0x%lx\n", leftovers);
return (EINVAL);
}
return sys_sendmsg(p, &a, retval);
}
int
osf1_sys_sendto(p, v, retval)
struct proc *p;

View File

@ -1,4 +1,4 @@
$NetBSD: syscalls.master,v 1.29 1999/05/10 03:33:04 cgd Exp $
$NetBSD: syscalls.master,v 1.30 1999/05/10 05:58:44 cgd Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@ -77,8 +77,10 @@
24 NOARGS { uid_t sys_getuid(void); }
25 UNIMPL exec_with_loader
26 UNIMPL ptrace
27 UNIMPL recvmsg
28 UNIMPL sendmsg
27 STD { int osf1_sys_recvmsg_xopen(int s, \
struct osf1_msghdr_xopen *msg, int flags); }
28 STD { int osf1_sys_sendmsg_xopen(int s, \
const struct osf1_msghdr_xopen *msg, int flags); }
29 UNIMPL recvfrom
30 UNIMPL accept
31 UNIMPL getpeername