Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/compat/mach mach_port_get_attributes (incomplete and unt...



details:   https://anonhg.NetBSD.org/src/rev/e2b593b4e81e
branches:  trunk
changeset: 554893:e2b593b4e81e
user:      manu <manu%NetBSD.org@localhost>
date:      Mon Nov 03 22:17:42 2003 +0000

description:
mach_port_get_attributes (incomplete and untested)

diffstat:

 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(-)

diffs (229 lines):

diff -r 2bef4a5d09c6 -r e2b593b4e81e sys/compat/mach/mach_namemap.c
--- a/sys/compat/mach/mach_namemap.c    Mon Nov 03 20:58:18 2003 +0000
+++ b/sys/compat/mach/mach_namemap.c    Mon Nov 03 22:17:42 2003 +0000
@@ -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 <sys/cdefs.h>
-__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 <sys/types.h>
 #include <sys/param.h>
@@ -118,6 +118,7 @@
        { 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 -r 2bef4a5d09c6 -r e2b593b4e81e sys/compat/mach/mach_port.c
--- a/sys/compat/mach/mach_port.c       Mon Nov 03 20:58:18 2003 +0000
+++ b/sys/compat/mach/mach_port.c       Mon Nov 03 22:17:42 2003 +0000
@@ -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 <sys/cdefs.h>
-__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 <sys/types.h>
 #include <sys/param.h>
@@ -342,7 +342,7 @@
        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 @@
        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 -r 2bef4a5d09c6 -r e2b593b4e81e sys/compat/mach/mach_port.h
--- a/sys/compat/mach/mach_port.h       Mon Nov 03 20:58:18 2003 +0000
+++ b/sys/compat/mach/mach_port.h       Mon Nov 03 22:17:42 2003 +0000
@@ -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 @@
        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 @@
        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 @@
        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 @@
        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_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;



Home | Main Index | Thread Index | Old Index