|
|
1.1 root 1: /*
2: * Copyright (c) 1994 The University of Utah and
3: * the Computer Systems Laboratory (CSL). All rights reserved.
4: *
5: * Permission to use, copy, modify and distribute this software is hereby
6: * granted provided that (1) source code retains these copyright, permission,
7: * and disclaimer notices, and (2) redistributions including binaries
8: * reproduce the notices in supporting documentation, and (3) all advertising
9: * materials mentioning features or use of this software display the following
10: * acknowledgement: ``This product includes software developed by the
11: * Computer Systems Laboratory at the University of Utah.''
12: *
13: * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
14: * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
15: * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
16: *
17: * CSL requests users of this software to return to [email protected] any
18: * improvements that they make and grant CSL redistribution rights.
19: *
20: */
21:
22: #ifdef MIGRATING_THREADS
23:
24: #include <mach/kern_return.h>
25: #include <mach/port.h>
26: #include <mach/rpc.h>
27: #include <mach/notify.h>
28: #include <mach/mach_param.h>
29: #include <mach/vm_param.h>
30: #include <mach/vm_prot.h>
31: #include <kern/task.h>
32: #include <kern/act.h>
33: #include <vm/vm_map.h>
34: #include <vm/vm_kern.h>
35: #include <vm/vm_user.h>
36: #include <ipc/ipc_entry.h>
37: #include <ipc/ipc_space.h>
38: #include <ipc/ipc_object.h>
39: #include <ipc/ipc_notify.h>
40: #include <ipc/ipc_port.h>
41: #include <ipc/ipc_pset.h>
42: #include <ipc/ipc_right.h>
43:
44: #undef DEBUG_MPRC
45:
46: /*
47: * XXX need to identify if one endpoint of an RPC is the kernel to
48: * ensure proper port name translation (or lack of). This is bogus.
49: */
50: #define ISKERNELACT(act) ((act)->task == kernel_task)
51:
52: /*
53: * Copy the indicated port from the task associated with the source
54: * activation into the task associated with the destination activation.
55: *
56: * XXX on errors we should probably clear the portp to avoid leaking
57: * info to the other side.
58: */
59: kern_return_t
60: mach_port_rpc_copy(portp, sact, dact)
61: struct rpc_port_desc *portp;
62: struct Act *sact, *dact;
63: {
64: ipc_space_t sspace, dspace;
65: mach_msg_type_name_t tname;
66: ipc_object_t iname;
67: kern_return_t kr;
68:
69: #ifdef DEBUG_MPRC
70: printf("m_p_rpc_copy(portp=%x/%x, sact=%x, dact=%x): ",
71: portp->name, portp->msgt_name, sact, dact);
72: #endif
73: sspace = sact->task->itk_space;
74: dspace = dact->task->itk_space;
75: if (sspace == IS_NULL || dspace == IS_NULL) {
76: #ifdef DEBUG_MPRC
77: printf("bogus src (%x) or dst (%x) space\n", sspace, dspace);
78: #endif
79: return KERN_INVALID_TASK;
80: }
81:
82: if (!MACH_MSG_TYPE_PORT_ANY(portp->msgt_name)) {
83: #ifdef DEBUG_MPRC
84: printf("invalid port type\n");
85: #endif
86: return KERN_INVALID_VALUE;
87: }
88:
89: if (ISKERNELACT(sact)) {
90: iname = (ipc_object_t) portp->name;
91: ipc_object_copyin_from_kernel(iname, portp->msgt_name);
92: kr = KERN_SUCCESS;
93: } else {
94: kr = ipc_object_copyin(sspace, portp->name, portp->msgt_name,
95: &iname);
96: }
97: if (kr != KERN_SUCCESS) {
98: #ifdef DEBUG_MPRC
99: printf("copyin returned %x\n", kr);
100: #endif
101: return kr;
102: }
103:
104: tname = ipc_object_copyin_type(portp->msgt_name);
105: if (!IO_VALID(iname)) {
106: portp->name = (mach_port_t) iname;
107: portp->msgt_name = tname;
108: #ifdef DEBUG_MPRC
109: printf("iport %x invalid\n", iname);
110: #endif
111: return KERN_SUCCESS;
112: }
113:
114: if (ISKERNELACT(dact)) {
115: portp->name = (mach_port_t) iname;
116: kr = KERN_SUCCESS;
117: } else {
118: kr = ipc_object_copyout(dspace, iname, tname, TRUE,
119: &portp->name);
120: }
121: if (kr != KERN_SUCCESS) {
122: ipc_object_destroy(iname, tname);
123:
124: if (kr == KERN_INVALID_CAPABILITY)
125: portp->name = MACH_PORT_DEAD;
126: else {
127: portp->name = MACH_PORT_NULL;
128: #ifdef DEBUG_MPRC
129: printf("copyout iport %x returned %x\n", iname);
130: #endif
131: return kr;
132: }
133: }
134:
135: portp->msgt_name = tname;
136: #ifdef DEBUG_MPRC
137: printf("portp=%x/%x, iname=%x\n", portp->name, portp->msgt_name, iname);
138: #endif
139: return KERN_SUCCESS;
140: }
141:
142: kern_return_t
143: mach_port_rpc_sig(space, name, buffer, buflen)
144: {
145: return KERN_FAILURE;
146: }
147:
148: #endif /* MIGRATING_THREADS */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.