|
|
1.1 root 1: /*
2: * Copyright (c) 1988 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)apilib.c 4.1 (Berkeley) 12/4/88";
20: #endif /* not lint */
21:
22: #include "../ctlr/api.h"
23:
24: #include "apilib.h"
25:
26: int
27: api_sup_errno = 0, /* Supervisor error number */
28: api_sup_fcn_id = 0, /* Supervisor function id (0x12) */
29: api_fcn_errno = 0, /* Function error number */
30: api_fcn_fcn_id = 0; /* Function ID (0x6b, etc.) */
31:
32: static int
33: gate_sessmgr = 0,
34: gate_keyboard = 0,
35: gate_copy = 0,
36: gate_oiam = 0;
37:
38: /*
39: * Issue an API request, with reg structures supplied by the caller.
40: *
41: * Only certain routines need this (supervisor services come to mind).
42: */
43:
44: static int
45: api_issue_regs(ah, al, bh, bl, cx, dx, parms, length, regs, sregs)
46: int ah, al, bh, bl, cx, dx;
47: char *parms;
48: int length;
49: union REGS *regs;
50: struct SREGS *sregs;
51: {
52: char far *ourseg = parms;
53:
54: regs->h.ah = ah;
55: regs->h.al = al;
56: regs->h.bh = bh;
57: regs->h.bl = bl;
58: regs->x.cx = cx;
59: regs->x.dx = dx;
60: sregs->es = FP_SEG(ourseg);
61: regs->x.di = FP_OFF(ourseg);
62:
63: #if defined(MSDOS)
64: int86x(API_INTERRUPT_NUMBER, regs, regs, sregs);
65: #endif /* defined(MSDOS) */
66: #if defined(unix)
67: api_exch_api(regs, sregs, parms, length);
68: #endif /* defined(unix) */
69:
70: if (regs->h.cl != 0) {
71: api_sup_errno = regs->h.cl;
72: return -1;
73: } else {
74: return 0;
75: }
76: }
77:
78:
79: /*
80: * Issue an API request without requiring caller to supply
81: * registers. Most routines use this.
82: */
83:
84: static int
85: api_issue(ah, al, bh, bl, cx, dx, parms, length)
86: int
87: ah,
88: al,
89: bh,
90: bl,
91: cx,
92: dx;
93: char *parms;
94: int length; /* Length of parms */
95: {
96: union REGS regs;
97: struct SREGS sregs;
98:
99: return api_issue_regs(ah, al, bh, bl, cx, dx, parms, length, ®s, &sregs);
100: }
101:
102: /*
103: * Supervisor Services
104: */
105:
106: int
107: api_name_resolve(name)
108: char *name;
109: {
110: NameResolveParms parms;
111: int i;
112: union REGS regs;
113: struct SREGS sregs;
114:
115: for (i = 0; i < sizeof parms.gate_name; i++) {
116: if (*name) {
117: parms.gate_name[i] = *name++;
118: } else {
119: parms.gate_name[i] = ' ';
120: }
121: }
122:
123: if (api_issue_regs(NAME_RESOLUTION, 0, 0, 0, 0, 0, (char *) &parms,
124: sizeof parms, ®s, &sregs) == -1) {
125: return -1;
126: } else {
127: return regs.x.dx;
128: }
129: }
130:
131: #if defined(unix)
132: /*
133: * Block until the oia or ps is modified.
134: */
135:
136: int
137: api_ps_or_oia_modified()
138: {
139: union REGS regs;
140: struct SREGS sregs;
141:
142: if (api_issue_regs(PS_OR_OIA_MODIFIED, 0, 0, 0, 0, 0, (char *) 0,
143: 0, ®s, &sregs) == -1) {
144: return -1;
145: } else {
146: return 0;
147: }
148: }
149: #endif /* defined(unix) */
150:
151: /*
152: * Session Information Services
153: */
154:
155: api_query_session_id(parms)
156: QuerySessionIdParms *parms;
157: {
158: if (api_issue(0x09, QUERY_SESSION_ID, 0x80, 0x20, 0,
159: gate_sessmgr, (char *)parms, sizeof *parms) == -1) {
160: api_fcn_errno = 0;
161: api_fcn_fcn_id = 0;
162: return -1;
163: } else if (parms->rc == 0) {
164: return 0;
165: } else {
166: api_fcn_errno = parms->rc;
167: api_fcn_fcn_id = parms->function_id;
168: return -1;
169: }
170: }
171:
172:
173: api_query_session_parameters(parms)
174: QuerySessionParametersParms *parms;
175: {
176: if (api_issue(0x09, QUERY_SESSION_PARAMETERS, 0x80, 0x20, 0,
177: gate_sessmgr, (char *)parms, sizeof *parms) == -1) {
178: api_fcn_errno = 0;
179: api_fcn_fcn_id = 0;
180: return -1;
181: } else if (parms->rc == 0) {
182: return 0;
183: } else {
184: api_fcn_errno = parms->rc;
185: api_fcn_fcn_id = parms->function_id;
186: return -1;
187: }
188: }
189:
190: api_query_session_cursor(parms)
191: QuerySessionCursorParms *parms;
192: {
193: if (api_issue(0x09, QUERY_SESSION_CURSOR, 0x80, 0x20, 0xff,
194: gate_sessmgr, (char *)parms, sizeof *parms) == -1) {
195: api_fcn_errno = 0;
196: api_fcn_fcn_id = 0;
197: return -1;
198: } else if (parms->rc == 0) {
199: return 0;
200: } else {
201: api_fcn_errno = parms->rc;
202: api_fcn_fcn_id = parms->function_id;
203: return -1;
204: }
205: }
206:
207: /*
208: * Keyboard Services
209: */
210:
211: api_connect_to_keyboard(parms)
212: ConnectToKeyboardParms *parms;
213: {
214: if (api_issue(0x09, CONNECT_TO_KEYBOARD, 0x80, 0x20, 0,
215: gate_keyboard, (char *)parms, sizeof *parms) == -1) {
216: api_fcn_errno = 0;
217: api_fcn_fcn_id = 0;
218: return -1;
219: } else if (parms->rc == 0) {
220: return 0;
221: } else {
222: api_fcn_errno = parms->rc;
223: api_fcn_fcn_id = parms->function_id;
224: return -1;
225: }
226: }
227:
228:
229: api_disconnect_from_keyboard(parms)
230: DisconnectFromKeyboardParms *parms;
231: {
232: if (api_issue(0x09, DISCONNECT_FROM_KEYBOARD, 0x80, 0x20, 0,
233: gate_keyboard, (char *)parms, sizeof *parms) == -1) {
234: api_fcn_errno = 0;
235: api_fcn_fcn_id = 0;
236: return -1;
237: } else if (parms->rc == 0) {
238: return 0;
239: } else {
240: api_fcn_errno = parms->rc;
241: api_fcn_fcn_id = parms->function_id;
242: return -1;
243: }
244: }
245:
246:
247: api_write_keystroke(parms)
248: WriteKeystrokeParms *parms;
249: {
250: if (api_issue(0x09, WRITE_KEYSTROKE, 0x80, 0x20, 0,
251: gate_keyboard, (char *)parms, sizeof *parms) == -1) {
252: api_fcn_errno = 0;
253: api_fcn_fcn_id = 0;
254: return -1;
255: } else if (parms->rc == 0) {
256: return 0;
257: } else {
258: api_fcn_errno = parms->rc;
259: api_fcn_fcn_id = parms->function_id;
260: return -1;
261: }
262: }
263:
264:
265: api_disable_input(parms)
266: DisableInputParms *parms;
267: {
268: if (api_issue(0x09, DISABLE_INPUT, 0x80, 0x20, 0,
269: gate_keyboard, (char *)parms, sizeof *parms) == -1) {
270: api_fcn_errno = 0;
271: api_fcn_fcn_id = 0;
272: return -1;
273: } else if (parms->rc == 0) {
274: return 0;
275: } else {
276: api_fcn_errno = parms->rc;
277: api_fcn_fcn_id = parms->function_id;
278: return -1;
279: }
280: }
281:
282: api_enable_input(parms)
283: EnableInputParms *parms;
284: {
285: if (api_issue(0x09, ENABLE_INPUT, 0x80, 0x20, 0,
286: gate_keyboard, (char *)parms, sizeof *parms) == -1) {
287: api_fcn_errno = 0;
288: api_fcn_fcn_id = 0;
289: return -1;
290: } else if (parms->rc == 0) {
291: return 0;
292: } else {
293: api_fcn_errno = parms->rc;
294: api_fcn_fcn_id = parms->function_id;
295: return -1;
296: }
297: }
298:
299: /*
300: * Copy Services
301: */
302:
303: api_copy_string(parms)
304: CopyStringParms *parms;
305: {
306: if (api_issue(0x09, COPY_STRING, 0x80, 0x20, 0xff,
307: gate_copy, (char *)parms, sizeof *parms) == -1) {
308: api_fcn_errno = 0;
309: api_fcn_fcn_id = 0;
310: return -1;
311: } else if (parms->rc == 0) {
312: return 0;
313: } else {
314: api_fcn_errno = parms->rc;
315: api_fcn_fcn_id = parms->function_id;
316: return -1;
317: }
318: }
319:
320: /*
321: * Operator Information Area Services
322: */
323:
324: api_read_oia_group(parms)
325: ReadOiaGroupParms *parms;
326: {
327: if (api_issue(0x09, READ_OIA_GROUP, 0x80, 0x20, 0xff,
328: gate_oiam, (char *)parms, sizeof *parms) == -1) {
329: api_fcn_errno = 0;
330: api_fcn_fcn_id = 0;
331: return -1;
332: } else if (parms->rc == 0) {
333: return 0;
334: } else {
335: api_fcn_errno = parms->rc;
336: api_fcn_fcn_id = parms->function_id;
337: return -1;
338: }
339: }
340:
341: /*
342: * The "we are done" routine. This gets called last.
343: */
344:
345: api_finish()
346: {
347: #if defined(unix)
348: if (api_close_api() == -1) {
349: return -1;
350: } else {
351: return 0;
352: }
353: #endif /* defined(unix) */
354: }
355:
356:
357: /*
358: * The initialization routine. Be sure to call this first.
359: */
360:
361: api_init()
362: {
363: #if defined(MSDOS)
364: union REGS regs;
365: struct SREGS sregs;
366:
367: regs.h.ah = 0x35;
368: regs.h.al = API_INTERRUPT_NUMBER;
369: intdosx(®s, ®s, &sregs);
370:
371: if ((regs.x.bx == 0) && (sregs.es == 0)) {
372: return 0; /* Interrupt not being handled */
373: }
374: #endif /* defined(MSDOS) */
375: #if defined(unix)
376: if (api_open_api((char *)0) == -1) {
377: return 0;
378: }
379: #endif /* defined(unix) */
380:
381: gate_sessmgr = api_name_resolve("SESSMGR");
382: gate_keyboard = api_name_resolve("KEYBOARD");
383: gate_copy = api_name_resolve("COPY");
384: gate_oiam = api_name_resolve("OIAM");
385:
386: if ((gate_sessmgr == gate_keyboard) ||
387: (gate_sessmgr == gate_copy) ||
388: (gate_sessmgr == gate_oiam) ||
389: (gate_keyboard == gate_copy) ||
390: (gate_keyboard == gate_oiam) ||
391: (gate_copy == gate_oiam)) {
392: return 0; /* Interrupt doesn't seem correct */
393: }
394: return 1;
395: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.