From 10d03389ac30f80c018134b4391fa987798cd8ea Mon Sep 17 00:00:00 2001 From: manu Date: Mon, 3 Nov 2003 22:17:42 +0000 Subject: [PATCH] mach_port_get_attributes (incomplete and untested) --- sys/compat/mach/mach_namemap.c | 5 +- sys/compat/mach/mach_port.c | 86 ++++++++++++++++++++++++++++++++-- sys/compat/mach/mach_port.h | 35 ++++++++++++-- 3 files changed, 116 insertions(+), 10 deletions(-) diff --git a/sys/compat/mach/mach_namemap.c b/sys/compat/mach/mach_namemap.c index 11c75d796d47..11163efce5a3 100644 --- a/sys/compat/mach/mach_namemap.c +++ b/sys/compat/mach/mach_namemap.c @@ -1,4 +1,4 @@ -/* $NetBSD: mach_namemap.c,v 1.32 2003/09/06 23:52:24 manu Exp $ */ +/* $NetBSD: mach_namemap.c,v 1.33 2003/11/03 22:17:42 manu Exp $ */ /*- * Copyright (c) 2002-2003 The NetBSD Foundation, Inc. @@ -37,7 +37,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: mach_namemap.c,v 1.32 2003/09/06 23:52:24 manu Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mach_namemap.c,v 1.33 2003/11/03 22:17:42 manu Exp $"); #include #include @@ -118,6 +118,7 @@ struct mach_subsystem_namemap mach_namemap[] = { { 3212, mach_port_move_member, "port_move_member" }, { 3213, mach_port_request_notification, "port_request_notification" }, { 3214, mach_port_insert_right, "port_insert_right" }, + { 3217, mach_port_get_attributes, "port_get_attribute" }, { 3218, mach_port_set_attributes, "port_set_attributes" }, { 3226, mach_port_insert_member, "port_insert_member" }, { 3402, mach_task_threads, "task_threads" }, diff --git a/sys/compat/mach/mach_port.c b/sys/compat/mach/mach_port.c index 9dc131293ad6..3eebe0ade4e3 100644 --- a/sys/compat/mach/mach_port.c +++ b/sys/compat/mach/mach_port.c @@ -1,4 +1,4 @@ -/* $NetBSD: mach_port.c,v 1.39 2003/09/11 23:18:10 manu Exp $ */ +/* $NetBSD: mach_port.c,v 1.40 2003/11/03 22:17:42 manu Exp $ */ /*- * Copyright (c) 2002-2003 The NetBSD Foundation, Inc. @@ -39,7 +39,7 @@ #include "opt_compat_darwin.h" #include -__KERNEL_RCSID(0, "$NetBSD: mach_port.c,v 1.39 2003/09/11 23:18:10 manu Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mach_port.c,v 1.40 2003/11/03 22:17:42 manu Exp $"); #include #include @@ -342,7 +342,7 @@ mach_port_set_attributes(args) case MACH_PORT_DNREQUESTS_SIZE: break; default: - uprintf("mach_port_get_attributes: unknown flavor %d\n", + uprintf("mach_port_set_attributes: unknown flavor %d\n", req->req_flavor); break; } @@ -358,6 +358,86 @@ mach_port_set_attributes(args) return 0; } +int +mach_port_get_attributes(args) + struct mach_trap_args *args; +{ + mach_port_get_attributes_request_t *req = args->smsg; + mach_port_get_attributes_reply_t *rep = args->rmsg; + size_t *msglen = args->rsize; + struct lwp *l = args->l; + mach_port_t mn; + struct mach_right *mr; + + mn = req->req_msgh.msgh_remote_port; + if ((mr = mach_right_check(mn, l, MACH_PORT_TYPE_ALL_RIGHTS)) == NULL) + return mach_msg_error(args, EPERM); + + switch (req->req_flavor) { + case MACH_PORT_LIMITS_INFO: { + struct mach_port_limits *mpl; + + if (req->req_count < sizeof(*mpl)) + return mach_msg_error(args, EINVAL); + + mpl = (struct mach_port_limits *)&rep->rep_info[0]; + mpl->mpl_qlimit = MACH_PORT_QLIMIT_DEFAULT; /* XXX fake limit */ + + rep->rep_count = sizeof(*mpl); + + break; + } + + case MACH_PORT_RECEIVE_STATUS: { + struct mach_port_status *mps; + struct mach_port *mp; + + if (req->req_count < sizeof(*mps)) + return mach_msg_error(args, EINVAL); + + mps = (struct mach_port_status *)&rep->rep_info[0]; + memset(mps, 0, sizeof(*mps)); + + if (mr->mr_sethead != NULL) + mps->mps_pset = mr->mr_sethead->mr_name; + mps->mps_seqno = 0; /* XXX */ + mps->mps_mscount = mp->mp_refcount; /* XXX */ + mps->mps_qlimit = MACH_PORT_QLIMIT_DEFAULT; /* XXX fake limit */ + if ((mp = mr->mr_port) != NULL) + mps->mps_msgcount = mp->mp_count; + mps->mps_sorights = 0; /* XXX */ + mps->mps_srights = 0; /* XXX */ + if (mr->mr_notify_destroyed != NULL) + mps->mps_pdrequest = 1; + if (mr->mr_notify_no_senders != NULL) + mps->mps_nsrequest = 1; + mps->mps_flags = 0; /* XXX */ + + rep->rep_count = sizeof(*mps); + break; + } + + default: + printf("mach_port_get_attributes: unknwo flavor %d\n", + req->req_flavor); + return mach_msg_error(args, EINVAL); + + break; + }; + + *msglen = sizeof(*rep) - 10 + rep->rep_count; + + rep->rep_msgh.msgh_bits = + MACH_MSGH_REPLY_LOCAL_BITS(MACH_MSG_TYPE_MOVE_SEND_ONCE); + rep->rep_msgh.msgh_size = sizeof(*rep) - sizeof(rep->rep_trailer); + rep->rep_msgh.msgh_local_port = req->req_msgh.msgh_local_port; + rep->rep_msgh.msgh_id = req->req_msgh.msgh_id + 100; + rep->rep_retval = 0; + rep->rep_info[rep->rep_count + 1] = 8; + + return 0; +} + /* XXX insert a recv right into a port set without removing it from another */ int mach_port_insert_member(args) diff --git a/sys/compat/mach/mach_port.h b/sys/compat/mach/mach_port.h index fd9f7ffdf72c..73df0d2a8948 100644 --- a/sys/compat/mach/mach_port.h +++ b/sys/compat/mach/mach_port.h @@ -1,4 +1,4 @@ -/* $NetBSD: mach_port.h,v 1.27 2003/11/03 20:58:18 manu Exp $ */ +/* $NetBSD: mach_port.h,v 1.28 2003/11/03 22:17:42 manu Exp $ */ /*- * Copyright (c) 2002-2003 The NetBSD Foundation, Inc. @@ -63,7 +63,6 @@ #define MACH_PORT_TYPE_REF_RIGHTS \ (MACH_PORT_TYPE_SEND | MACH_PORT_TYPE_SEND_ONCE | MACH_PORT_TYPE_DEAD_NAME) - /* port_deallocate */ typedef struct { @@ -128,9 +127,12 @@ typedef struct { mach_msg_trailer_t rep_trailer; } mach_port_type_reply_t; -/* port_get_attributes */ +/* port_set_attributes */ #define MACH_PORT_LIMITS_INFO 1 +#define MACH_PORT_RECEIVE_STATUS 2 +#define MACH_PORT_DNREQUESTS_SIZE 3 + typedef struct mach_port_status { mach_port_name_t mps_pset; mach_port_seqno_t mps_seqno; @@ -143,11 +145,10 @@ typedef struct mach_port_status { mach_boolean_t mps_nsrequest; unsigned int mps_flags; } mach_port_status_t; -#define MACH_PORT_RECEIVE_STATUS 2 + typedef struct mach_port_limits { mach_port_msgcount_t mpl_qlimit; } mach_port_limits_t; -#define MACH_PORT_DNREQUESTS_SIZE 3 typedef struct { mach_msg_header_t req_msgh; @@ -165,6 +166,28 @@ typedef struct { mach_msg_trailer_t rep_trailer; } mach_port_set_attributes_reply_t; +/* port_get_attributes */ + +#define MACH_PORT_QLIMIT_DEFAULT ((mach_port_msgcount_t) 5) +#define MACH_PORT_QLIMIT_MAX ((mach_port_msgcount_t) 16) + +typedef struct { + mach_msg_header_t req_msgh; + mach_ndr_record_t req_ndr; + mach_port_name_t req_name; + mach_port_flavor_t req_flavor; + mach_msg_type_number_t req_count; +} mach_port_get_attributes_request_t; + +typedef struct { + mach_msg_header_t rep_msgh; + mach_ndr_record_t rep_ndr; + mach_kern_return_t rep_retval; + mach_msg_type_number_t rep_count; + mach_integer_t rep_info[10]; + mach_msg_trailer_t rep_trailer; +} mach_port_get_attributes_reply_t; + /* port_insert_member */ typedef struct { @@ -231,6 +254,7 @@ typedef struct { mach_msg_trailer_t rep_trailer; } mach_port_request_notification_reply_t; + int mach_port_deallocate(struct mach_trap_args *); int mach_port_allocate(struct mach_trap_args *); int mach_port_insert_right(struct mach_trap_args *); @@ -240,6 +264,7 @@ int mach_port_insert_member(struct mach_trap_args *); int mach_port_move_member(struct mach_trap_args *); int mach_port_destroy(struct mach_trap_args *); int mach_port_request_notification(struct mach_trap_args *); +int mach_port_get_attributes(struct mach_trap_args *); extern struct mach_port *mach_clock_port; extern struct mach_port *mach_io_master_port;