/*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
#include <mach_rt.h>
+#include <mach/mach_types.h>
#include <mach/boolean.h>
#include <mach/kern_return.h>
#include <mach/port.h>
#include <mach/message.h>
+
+#include <kern/kern_types.h>
#include <kern/misc_protos.h>
+
+#include <ipc/ipc_types.h>
#include <ipc/port.h>
#include <ipc/ipc_space.h>
#include <ipc/ipc_entry.h>
ipc_entry_t entry;
kern_return_t kr;
- int i;
-
-
kr = ipc_entry_alloc(space, namep, &entry);
if (kr != KERN_SUCCESS)
return kr;
ipc_entry_t entry;
kern_return_t kr;
- int i;
-
-
kr = ipc_entry_alloc_name(space, name, &entry);
if (kr != KERN_SUCCESS)
return kr;
ipc_port_t soright;
kern_return_t kr;
- int i;
-
/*
* Could first try a read lock when doing
* MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND,
* Copyin a naked capability from the kernel.
*
* MACH_MSG_TYPE_MOVE_RECEIVE
- * The receiver must be ipc_space_kernel.
+ * The receiver must be ipc_space_kernel
+ * or the receive right must already be in limbo.
* Consumes the naked receive right.
* MACH_MSG_TYPE_COPY_SEND
* A naked send right must be supplied.
ip_lock(port);
assert(ip_active(port));
- assert(port->ip_receiver_name != MACH_PORT_NULL);
- assert(port->ip_receiver == ipc_space_kernel);
+ if (port->ip_destination != IP_NULL) {
+ assert(port->ip_receiver == ipc_space_kernel);
- /* relevant part of ipc_port_clear_receiver */
- ipc_port_set_mscount(port, 0);
+ /* relevant part of ipc_port_clear_receiver */
+ ipc_port_set_mscount(port, 0);
- port->ip_receiver_name = MACH_PORT_NULL;
- port->ip_destination = IP_NULL;
+ port->ip_receiver_name = MACH_PORT_NULL;
+ port->ip_destination = IP_NULL;
+ }
ip_unlock(port);
break;
}
break;
}
- case MACH_MSG_TYPE_MOVE_SEND:
+ case MACH_MSG_TYPE_MOVE_SEND: {
/* move naked send right into the message */
+ assert(((ipc_port_t)object)->ip_srights);
break;
+ }
case MACH_MSG_TYPE_MAKE_SEND_ONCE: {
ipc_port_t port = (ipc_port_t) object;
break;
}
- case MACH_MSG_TYPE_MOVE_SEND_ONCE:
+ case MACH_MSG_TYPE_MOVE_SEND_ONCE: {
/* move naked send-once right into the message */
+ assert(((ipc_port_t)object)->ip_sorights);
break;
+ }
default:
panic("ipc_object_copyin_from_kernel: strange rights");
ipc_entry_t entry;
kern_return_t kr;
- int i;
-
assert(IO_VALID(object));
assert(io_otype(object) == IOT_PORT);
default:
panic("ipc_object_copyout_dest: strange rights");
+ name = MACH_PORT_DEAD;
}
*namep = name;
ipc_entry_t oentry, nentry;
kern_return_t kr;
- int i;
-
kr = ipc_entry_alloc_name(space, nname, &nentry);
if (kr != KERN_SUCCESS)
return kr;
ipc_port_track_dealloc(port);
#endif /* MACH_ASSERT */
}
- zfree(ipc_object_zones[otype], (vm_offset_t) object);
+ zfree(ipc_object_zones[otype], object);
}
#endif /* MACH_ASSERT */
#if MACH_KDB
#include <ddb/db_output.h>
+#include <kern/ipc_kobject.h>
#define printf kdbprintf
* Pretty-print an object for kdb.
*/
-char *ikot_print_array[IKOT_MAX_TYPE] = {
+const char *ikot_print_array[IKOT_MAX_TYPE] = {
"(NONE) ",
"(THREAD) ",
"(TASK) ",