xref: /csrg-svn/usr.bin/tn3270/api/apilib.c (revision 31210)
131202Sminshall #include "../api/api.h"
231202Sminshall 
331205Sminshall #include "apilib.h"
431202Sminshall 
531202Sminshall int
631205Sminshall     api_sup_errno = 0,			/* Supervisor error number */
731205Sminshall     api_sup_fcn_id = 0,			/* Supervisor function id (0x12) */
831205Sminshall     api_fcn_errno = 0,			/* Function error number */
931205Sminshall     api_fcn_fcn_id = 0;			/* Function ID (0x6b, etc.) */
1031205Sminshall 
1131205Sminshall static int
1231205Sminshall     gate_sessmgr = 0,
1331205Sminshall     gate_keyboard = 0,
1431205Sminshall     gate_copy = 0,
1531205Sminshall     gate_oiam = 0;
1631205Sminshall 
1731205Sminshall /*
1831205Sminshall  * Issue an API request, with reg structures supplied by the caller.
1931205Sminshall  *
2031205Sminshall  * Only certain routines need this (supervisor services come to mind).
2131205Sminshall  */
2231205Sminshall 
2331205Sminshall int
2431205Sminshall api_issue_regs(ah, al, bh, bl, cx, dx, parms, regs, sregs)
2531205Sminshall int		ah, al, bh, bl, cx, dx;
2631205Sminshall char 		*parms;
2731205Sminshall union REGS 	*regs;
2831205Sminshall struct SREGS 	*sregs;
2931205Sminshall {
3031205Sminshall     char far *ourseg = parms;
3131205Sminshall 
3231205Sminshall     regs->h.ah = ah;
3331205Sminshall     regs->h.al = al;
3431205Sminshall     regs->h.bh = bh;
3531205Sminshall     regs->h.bl = bl;
3631205Sminshall     regs->x.cx = cx;
3731205Sminshall     regs->x.dx = dx;
3831205Sminshall     sregs->es = (int) FP_SEG(ourseg);
3931205Sminshall     regs->x.di = (int) FP_OFF(ourseg);
4031205Sminshall 
4131205Sminshall     int86x(API_INTERRUPT_NUMBER, regs, regs, sregs);
4231205Sminshall     if (regs->h.cl != 0) {
4331205Sminshall 	api_sup_errno = regs->h.cl;
4431205Sminshall 	return -1;
4531205Sminshall     } else {
4631205Sminshall 	return 0;
4731205Sminshall     }
4831205Sminshall }
4931205Sminshall 
5031205Sminshall 
5131205Sminshall /*
5231205Sminshall  * Issue an API request without requiring caller to supply
5331205Sminshall  * registers.  Most routines use this.
5431205Sminshall  */
5531205Sminshall 
5631205Sminshall 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 
7031205Sminshall     return api_issue_regs(ah, al, bh, bl, cx, dx, parms, &regs, &sregs);
7131202Sminshall }
7231205Sminshall 
7331205Sminshall /*
7431205Sminshall  * Supervisor Services
7531205Sminshall  */
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 
9431205Sminshall     if (api_issue_regs(NAME_RESOLUTION, 0, 0, 0, 0, 0, &parms, &regs, &sregs)
9531205Sminshall 		    == -1) {
9631205Sminshall 	return -1;
9731205Sminshall     } else {
9831205Sminshall 	return regs.x.dx;
9931202Sminshall     }
10031205Sminshall }
10131205Sminshall 
10231205Sminshall /*
10331205Sminshall  * Session Information Services
10431205Sminshall  */
10531202Sminshall 
106*31210Sminshall api_query_session_id(parms)
10731205Sminshall QuerySessionIdParms *parms;
10831205Sminshall {
10931205Sminshall     if (api_issue(0x09, QUERY_SESSION_ID, 0x80, 0x20, 0,
11031205Sminshall 					gate_sessmgr, (char *)parms) == -1) {
11131205Sminshall 	api_fcn_errno = 0;
11231205Sminshall 	api_fcn_fcn_id = 0;
11331202Sminshall 	return -1;
11431205Sminshall     } else if (parms->rc == 0) {
11531205Sminshall 	return 0;
11631202Sminshall     } else {
11731205Sminshall 	api_fcn_errno = parms->rc;
11831205Sminshall 	api_fcn_fcn_id = parms->function_id;
11931205Sminshall 	return -1;
12031202Sminshall     }
12131202Sminshall }
12231205Sminshall 
12331205Sminshall 
124*31210Sminshall api_query_session_parameters(parms)
12531205Sminshall QuerySessionParametersParms *parms;
12631205Sminshall {
127*31210Sminshall     if (api_issue(0x09, QUERY_SESSION_PARAMETERS, 0x80, 0x20, 0,
12831205Sminshall 					gate_sessmgr, (char *)parms) == -1) {
12931205Sminshall 	api_fcn_errno = 0;
13031205Sminshall 	api_fcn_fcn_id = 0;
13131205Sminshall 	return -1;
13231205Sminshall     } else if (parms->rc == 0) {
13331205Sminshall 	return 0;
13431205Sminshall     } else {
13531205Sminshall 	api_fcn_errno = parms->rc;
13631205Sminshall 	api_fcn_fcn_id = parms->function_id;
13731205Sminshall 	return -1;
13831205Sminshall     }
13931205Sminshall }
14031205Sminshall 
14131205Sminshall api_query_session_cursor(parms)
14231205Sminshall QuerySessionCursorParms *parms;
14331205Sminshall {
144*31210Sminshall     if (api_issue(0x09, QUERY_SESSION_CURSOR, 0x80, 0x20, 0xff,
14531205Sminshall 					gate_sessmgr, (char *)parms) == -1) {
14631205Sminshall 	api_fcn_errno = 0;
14731205Sminshall 	api_fcn_fcn_id = 0;
14831205Sminshall 	return -1;
14931205Sminshall     } else if (parms->rc == 0) {
15031205Sminshall 	return 0;
15131205Sminshall     } else {
15231205Sminshall 	api_fcn_errno = parms->rc;
15331205Sminshall 	api_fcn_fcn_id = parms->function_id;
15431205Sminshall 	return -1;
15531205Sminshall     }
15631205Sminshall }
15731205Sminshall 
15831205Sminshall /*
15931205Sminshall  * Keyboard Services
16031205Sminshall  */
16131205Sminshall 
16231205Sminshall api_connect_to_keyboard(parms)
16331205Sminshall ConnectToKeyboardParms *parms;
16431205Sminshall {
16531205Sminshall     if (api_issue(0x09, CONNECT_TO_KEYBOARD, 0x80, 0x20, 0,
16631205Sminshall 					gate_keyboard, (char *)parms) == -1) {
16731205Sminshall 	api_fcn_errno = 0;
16831205Sminshall 	api_fcn_fcn_id = 0;
16931205Sminshall 	return -1;
17031205Sminshall     } else if (parms->rc == 0) {
17131205Sminshall 	return 0;
17231205Sminshall     } else {
17331205Sminshall 	api_fcn_errno = parms->rc;
17431205Sminshall 	api_fcn_fcn_id = parms->function_id;
17531205Sminshall 	return -1;
17631205Sminshall     }
17731205Sminshall }
17831205Sminshall 
17931205Sminshall 
18031205Sminshall api_disconnect_from_keyboard(parms)
18131205Sminshall DisconnectFromKeyboardParms *parms;
18231205Sminshall {
18331205Sminshall     if (api_issue(0x09, DISCONNECT_FROM_KEYBOARD, 0x80, 0x20, 0,
18431205Sminshall 					gate_keyboard, (char *)parms) == -1) {
18531205Sminshall 	api_fcn_errno = 0;
18631205Sminshall 	api_fcn_fcn_id = 0;
18731205Sminshall 	return -1;
18831205Sminshall     } else if (parms->rc == 0) {
18931205Sminshall 	return 0;
19031205Sminshall     } else {
19131205Sminshall 	api_fcn_errno = parms->rc;
19231205Sminshall 	api_fcn_fcn_id = parms->function_id;
19331205Sminshall 	return -1;
19431205Sminshall     }
19531205Sminshall }
19631205Sminshall 
19731205Sminshall 
19831205Sminshall api_write_keystroke(parms)
19931205Sminshall WriteKeystrokeParms *parms;
20031205Sminshall {
20131205Sminshall     if (api_issue(0x09, WRITE_KEYSTROKE, 0x80, 0x20, 0,
20231205Sminshall 					gate_keyboard, (char *)parms) == -1) {
20331205Sminshall 	api_fcn_errno = 0;
20431205Sminshall 	api_fcn_fcn_id = 0;
20531205Sminshall 	return -1;
20631205Sminshall     } else if (parms->rc == 0) {
20731205Sminshall 	return 0;
20831205Sminshall     } else {
20931205Sminshall 	api_fcn_errno = parms->rc;
21031205Sminshall 	api_fcn_fcn_id = parms->function_id;
21131205Sminshall 	return -1;
21231205Sminshall     }
21331205Sminshall }
21431205Sminshall 
21531205Sminshall 
21631205Sminshall api_disable_input(parms)
21731205Sminshall DisableInputParms *parms;
21831205Sminshall {
21931205Sminshall     if (api_issue(0x09, DISABLE_INPUT, 0x80, 0x20, 0,
22031205Sminshall 					gate_keyboard, (char *)parms) == -1) {
22131205Sminshall 	api_fcn_errno = 0;
22231205Sminshall 	api_fcn_fcn_id = 0;
22331205Sminshall 	return -1;
22431205Sminshall     } else if (parms->rc == 0) {
22531205Sminshall 	return 0;
22631205Sminshall     } else {
22731205Sminshall 	api_fcn_errno = parms->rc;
22831205Sminshall 	api_fcn_fcn_id = parms->function_id;
22931205Sminshall 	return -1;
23031205Sminshall     }
23131205Sminshall }
23231205Sminshall 
23331205Sminshall api_enable_input(parms)
23431205Sminshall EnableInputParms *parms;
23531205Sminshall {
23631205Sminshall     if (api_issue(0x09, ENABLE_INPUT, 0x80, 0x20, 0,
23731205Sminshall 					gate_keyboard, (char *)parms) == -1) {
23831205Sminshall 	api_fcn_errno = 0;
23931205Sminshall 	api_fcn_fcn_id = 0;
24031205Sminshall 	return -1;
24131205Sminshall     } else if (parms->rc == 0) {
24231205Sminshall 	return 0;
24331205Sminshall     } else {
24431205Sminshall 	api_fcn_errno = parms->rc;
24531205Sminshall 	api_fcn_fcn_id = parms->function_id;
24631205Sminshall 	return -1;
24731205Sminshall     }
24831205Sminshall }
24931205Sminshall 
25031205Sminshall /*
25131205Sminshall  * Copy Services
25231205Sminshall  */
25331205Sminshall 
25431205Sminshall api_copy_string(parms)
25531205Sminshall CopyStringParms *parms;
25631205Sminshall {
257*31210Sminshall     if (api_issue(0x09, COPY_STRING, 0x80, 0x20, 0xff,
25831205Sminshall 					    gate_copy, (char *)parms) == -1) {
25931205Sminshall 	api_fcn_errno = 0;
26031205Sminshall 	api_fcn_fcn_id = 0;
26131205Sminshall 	return -1;
26231205Sminshall     } else if (parms->rc == 0) {
26331205Sminshall 	return 0;
26431205Sminshall     } else {
26531205Sminshall 	api_fcn_errno = parms->rc;
26631205Sminshall 	api_fcn_fcn_id = parms->function_id;
26731205Sminshall 	return -1;
26831205Sminshall     }
26931205Sminshall }
27031205Sminshall 
27131205Sminshall /*
27231205Sminshall  * Operator Information Area Services
27331205Sminshall  */
27431205Sminshall 
27531205Sminshall api_read_oia_group(parms)
27631205Sminshall ReadOiaGroupParms *parms;
27731205Sminshall {
278*31210Sminshall     if (api_issue(0x09, READ_OIA_GROUP, 0x80, 0x20, 0xff,
27931205Sminshall 					    gate_oiam, (char *)parms) == -1) {
28031205Sminshall 	api_fcn_errno = 0;
28131205Sminshall 	api_fcn_fcn_id = 0;
28231205Sminshall 	return -1;
28331205Sminshall     } else if (parms->rc == 0) {
28431205Sminshall 	return 0;
28531205Sminshall     } else {
28631205Sminshall 	api_fcn_errno = parms->rc;
28731205Sminshall 	api_fcn_fcn_id = parms->function_id;
28831205Sminshall 	return -1;
28931205Sminshall     }
29031205Sminshall }
29131205Sminshall 
29231205Sminshall /*
29331205Sminshall  * The initialization routine.  Be sure to call this first.
29431205Sminshall  */
29531205Sminshall 
29631205Sminshall api_init()
29731205Sminshall {
29831205Sminshall     union REGS regs;
29931205Sminshall     struct SREGS sregs;
30031205Sminshall 
30131205Sminshall     regs.h.ah = 0x35;
30231205Sminshall     regs.h.al = API_INTERRUPT_NUMBER;
30331205Sminshall     intdosx(&regs, &regs, &sregs);
30431205Sminshall 
30531205Sminshall     if ((regs.x.bx == 0) && (sregs.es == 0)) {
30631205Sminshall 	return 0;		/* Interrupt not being handled */
30731205Sminshall     }
30831205Sminshall 
30931205Sminshall     gate_sessmgr = api_name_resolve("SESSMGR");
31031205Sminshall     gate_keyboard = api_name_resolve("KEYBOARD");
31131205Sminshall     gate_copy = api_name_resolve("COPY");
31231205Sminshall     gate_oiam = api_name_resolve("OIAM");
31331205Sminshall 
31431205Sminshall     if ((gate_sessmgr == gate_keyboard) ||
31531205Sminshall 	(gate_sessmgr == gate_copy) ||
31631205Sminshall 	(gate_sessmgr == gate_oiam) ||
31731205Sminshall 	(gate_keyboard == gate_copy) ||
31831205Sminshall 	(gate_keyboard == gate_oiam) ||
31931205Sminshall 	(gate_copy == gate_oiam)) {
32031205Sminshall 	    return 0;		/* Interrupt doesn't seem correct */
32131205Sminshall     }
32231205Sminshall     return 1;
32331205Sminshall }
324