|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24: /* Copyright (c) 1991 NeXT Computer, Inc. All rights reserved.
25: *
26: * ddmServer.m - user-level ddm server module.
27: *
28: * HISTORY
29: * 22-Feb-91 Doug Mitchell at NeXT
30: * Created.
31: */
32:
33: #import <bsd/sys/types.h>
34: #import <driverkit/debugging.h>
35: #import <driverkit/ddmPrivate.h>
36: #import <driverkit/debuggingMsg.h>
37: #import <driverkit/generalFuncs.h>
38: #ifdef KERNEL
39: #import <m68k/dev/ldd.h>
40: #import <mach/mach_interface.h>
41: #else KERNEL
42: #import <mach/mach.h>
43: #import <bsd/libc.h>
44: #endif KERNEL
45: #import <servers/netname.h>
46: #import <machkit/NXLock.h>
47:
48: static void ddmGetString(IODDMMsg *msgp);
49:
50: /*
51: * xpr server thread. This advertises specified port name with the nmserver,
52: * the looops waiting for incoming requests from an XPR Viewer app. These
53: * requests are generally either IODDMMasks set operations or requests for
54: * strings cooked up from xprArray.
55: */
56: volatile void xprServerThread(char *portName)
57: {
58: port_name_t xprServerPort, sigPort;
59: kern_return_t krtn;
60: netname_name_t regname;
61: IODDMMsg *msgp;
62:
63:
64: /*
65: * Set up port which external utility uses to communicate with us.
66: */
67: krtn = port_allocate(task_self(), &xprServerPort);
68: if(krtn) {
69: IOLog("xprServerThread: port_allocate returned %d\n", krtn);
70: IOExitThread();
71: }
72: krtn = port_allocate(task_self(), &sigPort);
73: if(krtn) {
74: IOLog("xprServerThread: port_allocate returned %d\n", krtn);
75: IOExitThread();
76: }
77: strcpy(regname, portName);
78: krtn = netname_check_in(name_server_port,
79: regname,
80: sigPort,
81: xprServerPort);
82: if(krtn) {
83: IOLog("xprServerThread: netname_check_in returned %d\n", krtn);
84: IOExitThread();
85: }
86:
87: msgp = IOMalloc(sizeof(*msgp));
88:
89: /*
90: * Main loop.
91: */
92: while(1) {
93: msgp->header.msg_local_port = xprServerPort;
94: msgp->header.msg_size = sizeof(*msgp);
95: krtn = msg_receive(&msgp->header, MSG_OPTION_NONE, 0);
96: if(krtn) {
97: IOLog("xprServerThread: msg_receive returned %d\n",
98: krtn);
99: continue;
100: }
101: msgp->status = IO_DDM_SUCCESS;
102: switch(msgp->header.msg_id) {
103: case IO_LOCK_DDM_MSG:
104: [xprLock lock];
105: xprLocked = 1;
106: [xprLock unlock];
107: break;
108: case IO_UNLOCK_DDM_MSG:
109: [xprLock lock];
110: xprLocked = 0;
111: [xprLock unlock];
112: break;
113: case IO_GET_DDM_ENTRY_MSG:
114: ddmGetString(msgp);
115: break;
116: case IO_SET_DDM_MASK_MSG:
117: IOSetDDMMask(msgp->index, msgp->maskValue);
118: break;
119: case IO_CLEAR_DDM_MSG:
120: IOClearDDM();
121: break;
122: default:
123: IOLog("xprServerThread: bogus msg_id (0x%x)\n",
124: (u_int)msgp->header.msg_id);
125: break;
126: }
127:
128: /*
129: * Return message.
130: */
131: krtn = msg_send(&msgp->header, MSG_OPTION_NONE, 0);
132: if(krtn) {
133: IOLog("xprServerThread: msg_send returned %d\n", krtn);
134: continue;
135: }
136:
137: }
138: /* NOT REACHED */
139: }
140:
141: /*
142: * Cook up one xpr string from the entry in xprArray[msgp->index] prior to
143: * xprLast, stash it in msgp->string. xprLocked really should be true here, but
144: * if it isn't, that's the XPRViewer utility's problem.
145: */
146: static void ddmGetString(IODDMMsg *msgp)
147: {
148: unsigned long long timestamp;
149:
150: if(IOGetDDMEntry(msgp->index,
151: IO_DDM_STRING_LENGTH,
152: msgp->string,
153: ×tamp,
154: &msgp->cpuNumber)) {
155:
156: msgp->status = IO_NO_DDM_BUFFER;
157: }
158: else {
159: msgp->timestampLowInt = (unsigned)timestamp;
160: msgp->timestampHighInt = (unsigned)(timestamp >> 32);
161: }
162: return;
163: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.