xref: /csrg-svn/usr.bin/tn3270/api/apilib.c (revision 31205)
131202Sminshall #include "../api/api.h"
231202Sminshall 
3*31205Sminshall #include "apilib.h"
431202Sminshall 
531202Sminshall int
6*31205Sminshall     api_sup_errno = 0,			/* Supervisor error number */
7*31205Sminshall     api_sup_fcn_id = 0,			/* Supervisor function id (0x12) */
8*31205Sminshall     api_fcn_errno = 0,			/* Function error number */
9*31205Sminshall     api_fcn_fcn_id = 0;			/* Function ID (0x6b, etc.) */
10*31205Sminshall 
11*31205Sminshall static int
12*31205Sminshall     gate_sessmgr = 0,
13*31205Sminshall     gate_keyboard = 0,
14*31205Sminshall     gate_copy = 0,
15*31205Sminshall     gate_oiam = 0;
16*31205Sminshall 
17*31205Sminshall /*
18*31205Sminshall  * Issue an API request, with reg structures supplied by the caller.
19*31205Sminshall  *
20*31205Sminshall  * Only certain routines need this (supervisor services come to mind).
21*31205Sminshall  */
22*31205Sminshall 
23*31205Sminshall int
24*31205Sminshall api_issue_regs(ah, al, bh, bl, cx, dx, parms, regs, sregs)
25*31205Sminshall int		ah, al, bh, bl, cx, dx;
26*31205Sminshall char 		*parms;
27*31205Sminshall union REGS 	*regs;
28*31205Sminshall struct SREGS 	*sregs;
29*31205Sminshall {
30*31205Sminshall     char far *ourseg = parms;
31*31205Sminshall 
32*31205Sminshall     regs->h.ah = ah;
33*31205Sminshall     regs->h.al = al;
34*31205Sminshall     regs->h.bh = bh;
35*31205Sminshall     regs->h.bl = bl;
36*31205Sminshall     regs->x.cx = cx;
37*31205Sminshall     regs->x.dx = dx;
38*31205Sminshall     sregs->es = (int) FP_SEG(ourseg);
39*31205Sminshall     regs->x.di = (int) FP_OFF(ourseg);
40*31205Sminshall 
41*31205Sminshall     int86x(API_INTERRUPT_NUMBER, regs, regs, sregs);
42*31205Sminshall     if (regs->h.cl != 0) {
43*31205Sminshall 	api_sup_errno = regs->h.cl;
44*31205Sminshall 	return -1;
45*31205Sminshall     } else {
46*31205Sminshall 	return 0;
47*31205Sminshall     }
48*31205Sminshall }
49*31205Sminshall 
50*31205Sminshall 
51*31205Sminshall /*
52*31205Sminshall  * Issue an API request without requiring caller to supply
53*31205Sminshall  * registers.  Most routines use this.
54*31205Sminshall  */
55*31205Sminshall 
56*31205Sminshall int
5731202Sminshall api_issue(ah, al, bh, bl, cx, dx, parms)
5831202Sminshall int
5931202Sminshall     ah,
6031202Sminshall     al,
6131202Sminshall     bh,
6231202Sminshall     bl,
6331202Sminshall     cx,
6431202Sminshall     dx;
6531202Sminshall char *parms;
6631202Sminshall {
6731202Sminshall     union REGS regs;
6831202Sminshall     struct SREGS sregs;
6931202Sminshall 
70*31205Sminshall     return api_issue_regs(ah, al, bh, bl, cx, dx, parms, &regs, &sregs);
7131202Sminshall }
72*31205Sminshall 
73*31205Sminshall /*
74*31205Sminshall  * Supervisor Services
75*31205Sminshall  */
7631202Sminshall 
7731202Sminshall int
7831202Sminshall api_name_resolve(name)
7931202Sminshall char *name;
8031202Sminshall {
8131202Sminshall     NameResolveParms parms;
8231202Sminshall     int i;
8331202Sminshall     union REGS regs;
8431202Sminshall     struct SREGS sregs;
8531202Sminshall 
8631202Sminshall     for (i = 0; i < sizeof parms.gate_name; i++) {
8731202Sminshall 	if (*name) {
8831202Sminshall 	    parms.gate_name[i] = *name++;
8931202Sminshall 	} else {
9031202Sminshall 	    parms.gate_name[i] = ' ';
9131202Sminshall 	}
9231202Sminshall     }
9331202Sminshall 
94*31205Sminshall     if (api_issue_regs(NAME_RESOLUTION, 0, 0, 0, 0, 0, &parms, &regs, &sregs)
95*31205Sminshall 		    == -1) {
96*31205Sminshall 	return -1;
97*31205Sminshall     } else {
98*31205Sminshall 	return regs.x.dx;
9931202Sminshall     }
100*31205Sminshall }
101*31205Sminshall 
102*31205Sminshall /*
103*31205Sminshall  * Session Information Services
104*31205Sminshall  */
10531202Sminshall 
106*31205Sminshall api_query_sesion_id(parms)
107*31205Sminshall QuerySessionIdParms *parms;
108*31205Sminshall {
109*31205Sminshall     if (api_issue(0x09, QUERY_SESSION_ID, 0x80, 0x20, 0,
110*31205Sminshall 					gate_sessmgr, (char *)parms) == -1) {
111*31205Sminshall 	api_fcn_errno = 0;
112*31205Sminshall 	api_fcn_fcn_id = 0;
11331202Sminshall 	return -1;
114*31205Sminshall     } else if (parms->rc == 0) {
115*31205Sminshall 	return 0;
11631202Sminshall     } else {
117*31205Sminshall 	api_fcn_errno = parms->rc;
118*31205Sminshall 	api_fcn_fcn_id = parms->function_id;
119*31205Sminshall 	return -1;
12031202Sminshall     }
12131202Sminshall }
122*31205Sminshall 
123*31205Sminshall 
124*31205Sminshall api_query_session_parms(parms)
125*31205Sminshall QuerySessionParametersParms *parms;
126*31205Sminshall {
127*31205Sminshall     if (api_issue(0x09, QUERY_SESSION_PARMS, 0x80, 0x20, 0,
128*31205Sminshall 					gate_sessmgr, (char *)parms) == -1) {
129*31205Sminshall 	api_fcn_errno = 0;
130*31205Sminshall 	api_fcn_fcn_id = 0;
131*31205Sminshall 	return -1;
132*31205Sminshall     } else if (parms->rc == 0) {
133*31205Sminshall 	return 0;
134*31205Sminshall     } else {
135*31205Sminshall 	api_fcn_errno = parms->rc;
136*31205Sminshall 	api_fcn_fcn_id = parms->function_id;
137*31205Sminshall 	return -1;
138*31205Sminshall     }
139*31205Sminshall }
140*31205Sminshall 
141*31205Sminshall api_query_session_cursor(parms)
142*31205Sminshall QuerySessionCursorParms *parms;
143*31205Sminshall {
144*31205Sminshall     if (api_issue(0x09, QUERY_SESSION_CURSOR, 0x80, 0x20, 0,
145*31205Sminshall 					gate_sessmgr, (char *)parms) == -1) {
146*31205Sminshall 	api_fcn_errno = 0;
147*31205Sminshall 	api_fcn_fcn_id = 0;
148*31205Sminshall 	return -1;
149*31205Sminshall     } else if (parms->rc == 0) {
150*31205Sminshall 	return 0;
151*31205Sminshall     } else {
152*31205Sminshall 	api_fcn_errno = parms->rc;
153*31205Sminshall 	api_fcn_fcn_id = parms->function_id;
154*31205Sminshall 	return -1;
155*31205Sminshall     }
156*31205Sminshall }
157*31205Sminshall 
158*31205Sminshall /*
159*31205Sminshall  * Keyboard Services
160*31205Sminshall  */
161*31205Sminshall 
162*31205Sminshall api_connect_to_keyboard(parms)
163*31205Sminshall ConnectToKeyboardParms *parms;
164*31205Sminshall {
165*31205Sminshall     if (api_issue(0x09, CONNECT_TO_KEYBOARD, 0x80, 0x20, 0,
166*31205Sminshall 					gate_keyboard, (char *)parms) == -1) {
167*31205Sminshall 	api_fcn_errno = 0;
168*31205Sminshall 	api_fcn_fcn_id = 0;
169*31205Sminshall 	return -1;
170*31205Sminshall     } else if (parms->rc == 0) {
171*31205Sminshall 	return 0;
172*31205Sminshall     } else {
173*31205Sminshall 	api_fcn_errno = parms->rc;
174*31205Sminshall 	api_fcn_fcn_id = parms->function_id;
175*31205Sminshall 	return -1;
176*31205Sminshall     }
177*31205Sminshall }
178*31205Sminshall 
179*31205Sminshall 
180*31205Sminshall api_disconnect_from_keyboard(parms)
181*31205Sminshall DisconnectFromKeyboardParms *parms;
182*31205Sminshall {
183*31205Sminshall     if (api_issue(0x09, DISCONNECT_FROM_KEYBOARD, 0x80, 0x20, 0,
184*31205Sminshall 					gate_keyboard, (char *)parms) == -1) {
185*31205Sminshall 	api_fcn_errno = 0;
186*31205Sminshall 	api_fcn_fcn_id = 0;
187*31205Sminshall 	return -1;
188*31205Sminshall     } else if (parms->rc == 0) {
189*31205Sminshall 	return 0;
190*31205Sminshall     } else {
191*31205Sminshall 	api_fcn_errno = parms->rc;
192*31205Sminshall 	api_fcn_fcn_id = parms->function_id;
193*31205Sminshall 	return -1;
194*31205Sminshall     }
195*31205Sminshall }
196*31205Sminshall 
197*31205Sminshall 
198*31205Sminshall api_write_keystroke(parms)
199*31205Sminshall WriteKeystrokeParms *parms;
200*31205Sminshall {
201*31205Sminshall     if (api_issue(0x09, WRITE_KEYSTROKE, 0x80, 0x20, 0,
202*31205Sminshall 					gate_keyboard, (char *)parms) == -1) {
203*31205Sminshall 	api_fcn_errno = 0;
204*31205Sminshall 	api_fcn_fcn_id = 0;
205*31205Sminshall 	return -1;
206*31205Sminshall     } else if (parms->rc == 0) {
207*31205Sminshall 	return 0;
208*31205Sminshall     } else {
209*31205Sminshall 	api_fcn_errno = parms->rc;
210*31205Sminshall 	api_fcn_fcn_id = parms->function_id;
211*31205Sminshall 	return -1;
212*31205Sminshall     }
213*31205Sminshall }
214*31205Sminshall 
215*31205Sminshall 
216*31205Sminshall api_disable_input(parms)
217*31205Sminshall DisableInputParms *parms;
218*31205Sminshall {
219*31205Sminshall     if (api_issue(0x09, DISABLE_INPUT, 0x80, 0x20, 0,
220*31205Sminshall 					gate_keyboard, (char *)parms) == -1) {
221*31205Sminshall 	api_fcn_errno = 0;
222*31205Sminshall 	api_fcn_fcn_id = 0;
223*31205Sminshall 	return -1;
224*31205Sminshall     } else if (parms->rc == 0) {
225*31205Sminshall 	return 0;
226*31205Sminshall     } else {
227*31205Sminshall 	api_fcn_errno = parms->rc;
228*31205Sminshall 	api_fcn_fcn_id = parms->function_id;
229*31205Sminshall 	return -1;
230*31205Sminshall     }
231*31205Sminshall }
232*31205Sminshall 
233*31205Sminshall api_enable_input(parms)
234*31205Sminshall EnableInputParms *parms;
235*31205Sminshall {
236*31205Sminshall     if (api_issue(0x09, ENABLE_INPUT, 0x80, 0x20, 0,
237*31205Sminshall 					gate_keyboard, (char *)parms) == -1) {
238*31205Sminshall 	api_fcn_errno = 0;
239*31205Sminshall 	api_fcn_fcn_id = 0;
240*31205Sminshall 	return -1;
241*31205Sminshall     } else if (parms->rc == 0) {
242*31205Sminshall 	return 0;
243*31205Sminshall     } else {
244*31205Sminshall 	api_fcn_errno = parms->rc;
245*31205Sminshall 	api_fcn_fcn_id = parms->function_id;
246*31205Sminshall 	return -1;
247*31205Sminshall     }
248*31205Sminshall }
249*31205Sminshall 
250*31205Sminshall /*
251*31205Sminshall  * Copy Services
252*31205Sminshall  */
253*31205Sminshall 
254*31205Sminshall api_copy_string(parms)
255*31205Sminshall CopyStringParms *parms;
256*31205Sminshall {
257*31205Sminshall     if (api_issue(0x09, COPY_STRING, 0x80, 0x20, 0,
258*31205Sminshall 					    gate_copy, (char *)parms) == -1) {
259*31205Sminshall 	api_fcn_errno = 0;
260*31205Sminshall 	api_fcn_fcn_id = 0;
261*31205Sminshall 	return -1;
262*31205Sminshall     } else if (parms->rc == 0) {
263*31205Sminshall 	return 0;
264*31205Sminshall     } else {
265*31205Sminshall 	api_fcn_errno = parms->rc;
266*31205Sminshall 	api_fcn_fcn_id = parms->function_id;
267*31205Sminshall 	return -1;
268*31205Sminshall     }
269*31205Sminshall }
270*31205Sminshall 
271*31205Sminshall /*
272*31205Sminshall  * Operator Information Area Services
273*31205Sminshall  */
274*31205Sminshall 
275*31205Sminshall api_read_oia_group(parms)
276*31205Sminshall ReadOiaGroupParms *parms;
277*31205Sminshall {
278*31205Sminshall     if (api_issue(0x09, READ_OIA_GROUP, 0x80, 0x20, 0,
279*31205Sminshall 					    gate_oiam, (char *)parms) == -1) {
280*31205Sminshall 	api_fcn_errno = 0;
281*31205Sminshall 	api_fcn_fcn_id = 0;
282*31205Sminshall 	return -1;
283*31205Sminshall     } else if (parms->rc == 0) {
284*31205Sminshall 	return 0;
285*31205Sminshall     } else {
286*31205Sminshall 	api_fcn_errno = parms->rc;
287*31205Sminshall 	api_fcn_fcn_id = parms->function_id;
288*31205Sminshall 	return -1;
289*31205Sminshall     }
290*31205Sminshall }
291*31205Sminshall 
292*31205Sminshall /*
293*31205Sminshall  * The initialization routine.  Be sure to call this first.
294*31205Sminshall  */
295*31205Sminshall 
296*31205Sminshall api_init()
297*31205Sminshall {
298*31205Sminshall     union REGS regs;
299*31205Sminshall     struct SREGS sregs;
300*31205Sminshall 
301*31205Sminshall     regs.h.ah = 0x35;
302*31205Sminshall     regs.h.al = API_INTERRUPT_NUMBER;
303*31205Sminshall     intdosx(&regs, &regs, &sregs);
304*31205Sminshall 
305*31205Sminshall     if ((regs.x.bx == 0) && (sregs.es == 0)) {
306*31205Sminshall 	return 0;		/* Interrupt not being handled */
307*31205Sminshall     }
308*31205Sminshall 
309*31205Sminshall     gate_sessmgr = api_name_resolve("SESSMGR");
310*31205Sminshall     gate_keyboard = api_name_resolve("KEYBOARD");
311*31205Sminshall     gate_copy = api_name_resolve("COPY");
312*31205Sminshall     gate_oiam = api_name_resolve("OIAM");
313*31205Sminshall 
314*31205Sminshall     if ((gate_sessmgr == gate_keyboard) ||
315*31205Sminshall 	(gate_sessmgr == gate_copy) ||
316*31205Sminshall 	(gate_sessmgr == gate_oiam) ||
317*31205Sminshall 	(gate_keyboard == gate_copy) ||
318*31205Sminshall 	(gate_keyboard == gate_oiam) ||
319*31205Sminshall 	(gate_copy == gate_oiam)) {
320*31205Sminshall 	    return 0;		/* Interrupt doesn't seem correct */
321*31205Sminshall     }
322*31205Sminshall     return 1;
323*31205Sminshall }
324