xref: /csrg-svn/usr.bin/tn3270/api/apilib.c (revision 31513)
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 
2331500Sminshall static int
2431500Sminshall api_issue_regs(ah, al, bh, bl, cx, dx, parms, length, regs, sregs)
2531205Sminshall int		ah, al, bh, bl, cx, dx;
2631205Sminshall char 		*parms;
2731500Sminshall int		length;
2831205Sminshall union REGS 	*regs;
2931205Sminshall struct SREGS 	*sregs;
3031205Sminshall {
3131205Sminshall     char far *ourseg = parms;
3231205Sminshall 
3331205Sminshall     regs->h.ah = ah;
3431205Sminshall     regs->h.al = al;
3531205Sminshall     regs->h.bh = bh;
3631205Sminshall     regs->h.bl = bl;
3731205Sminshall     regs->x.cx = cx;
3831205Sminshall     regs->x.dx = dx;
3931205Sminshall     sregs->es = (int) FP_SEG(ourseg);
4031205Sminshall     regs->x.di = (int) FP_OFF(ourseg);
4131205Sminshall 
4231458Sminshall #if	defined(MSDOS)
4331205Sminshall     int86x(API_INTERRUPT_NUMBER, regs, regs, sregs);
4431458Sminshall #endif	/* defined(MSDOS) */
4531458Sminshall #if	defined(unix)
4631500Sminshall     api_exch_api(regs, sregs, parms, length);
4731458Sminshall #endif	/* defined(unix) */
4831458Sminshall 
4931205Sminshall     if (regs->h.cl != 0) {
5031205Sminshall 	api_sup_errno = regs->h.cl;
5131205Sminshall 	return -1;
5231205Sminshall     } else {
5331205Sminshall 	return 0;
5431205Sminshall     }
5531205Sminshall }
5631205Sminshall 
5731205Sminshall 
5831205Sminshall /*
5931205Sminshall  * Issue an API request without requiring caller to supply
6031205Sminshall  * registers.  Most routines use this.
6131205Sminshall  */
6231205Sminshall 
6331500Sminshall static int
6431500Sminshall api_issue(ah, al, bh, bl, cx, dx, parms, length)
6531205Sminshall int
6631202Sminshall     ah,
6731202Sminshall     al,
6831202Sminshall     bh,
6931202Sminshall     bl,
7031202Sminshall     cx,
7131202Sminshall     dx;
7231202Sminshall char *parms;
7331500Sminshall int length;				/* Length of parms */
7431202Sminshall {
7531202Sminshall     union REGS regs;
7631202Sminshall     struct SREGS sregs;
7731202Sminshall 
7831500Sminshall     return api_issue_regs(ah, al, bh, bl, cx, dx, parms, length, &regs, &sregs);
7931202Sminshall }
8031205Sminshall 
8131205Sminshall /*
8231205Sminshall  * Supervisor Services
8331205Sminshall  */
8431202Sminshall 
8531202Sminshall int
8631202Sminshall api_name_resolve(name)
8731202Sminshall char *name;
8831202Sminshall {
8931202Sminshall     NameResolveParms parms;
9031202Sminshall     int i;
9131202Sminshall     union REGS regs;
9231202Sminshall     struct SREGS sregs;
9331202Sminshall 
9431202Sminshall     for (i = 0; i < sizeof parms.gate_name; i++) {
9531202Sminshall 	if (*name) {
9631202Sminshall 	    parms.gate_name[i] = *name++;
9731202Sminshall 	} else {
9831202Sminshall 	    parms.gate_name[i] = ' ';
9931202Sminshall 	}
10031202Sminshall     }
10131202Sminshall 
10231500Sminshall     if (api_issue_regs(NAME_RESOLUTION, 0, 0, 0, 0, 0, &parms, sizeof parms, &regs, &sregs)
10331205Sminshall 		    == -1) {
10431205Sminshall 	return -1;
10531205Sminshall     } else {
10631205Sminshall 	return regs.x.dx;
10731202Sminshall     }
10831205Sminshall }
109*31513Sminshall 
110*31513Sminshall #if	defined(unix)
111*31513Sminshall /*
112*31513Sminshall  * Block until the oia or ps is modified.
113*31513Sminshall  */
114*31513Sminshall 
115*31513Sminshall int
116*31513Sminshall api_ps_or_oia_modified()
117*31513Sminshall {
118*31513Sminshall     union REGS regs;
119*31513Sminshall     struct SREGS sregs;
120*31513Sminshall 
121*31513Sminshall     if (api_issue_regs(PS_OR_OIA_MODIFIED, 0, 0, 0, 0, 0, 0, 0, &regs, &sregs)
122*31513Sminshall 		    == -1) {
123*31513Sminshall 	return -1;
124*31513Sminshall     } else {
125*31513Sminshall 	return 0;
126*31513Sminshall     }
127*31513Sminshall }
128*31513Sminshall #endif	/* defined(unix) */
12931205Sminshall 
13031205Sminshall /*
13131205Sminshall  * Session Information Services
13231205Sminshall  */
13331202Sminshall 
13431210Sminshall api_query_session_id(parms)
13531205Sminshall QuerySessionIdParms *parms;
13631205Sminshall {
13731205Sminshall     if (api_issue(0x09, QUERY_SESSION_ID, 0x80, 0x20, 0,
13831500Sminshall 					gate_sessmgr, (char *)parms, sizeof *parms) == -1) {
13931205Sminshall 	api_fcn_errno = 0;
14031205Sminshall 	api_fcn_fcn_id = 0;
14131202Sminshall 	return -1;
14231205Sminshall     } else if (parms->rc == 0) {
14331205Sminshall 	return 0;
14431202Sminshall     } else {
14531205Sminshall 	api_fcn_errno = parms->rc;
14631205Sminshall 	api_fcn_fcn_id = parms->function_id;
14731205Sminshall 	return -1;
14831202Sminshall     }
14931202Sminshall }
15031205Sminshall 
15131205Sminshall 
15231210Sminshall api_query_session_parameters(parms)
15331205Sminshall QuerySessionParametersParms *parms;
15431205Sminshall {
15531210Sminshall     if (api_issue(0x09, QUERY_SESSION_PARAMETERS, 0x80, 0x20, 0,
15631500Sminshall 			    gate_sessmgr, (char *)parms, sizeof *parms) == -1) {
15731205Sminshall 	api_fcn_errno = 0;
15831205Sminshall 	api_fcn_fcn_id = 0;
15931205Sminshall 	return -1;
16031205Sminshall     } else if (parms->rc == 0) {
16131205Sminshall 	return 0;
16231205Sminshall     } else {
16331205Sminshall 	api_fcn_errno = parms->rc;
16431205Sminshall 	api_fcn_fcn_id = parms->function_id;
16531205Sminshall 	return -1;
16631205Sminshall     }
16731205Sminshall }
16831205Sminshall 
16931205Sminshall api_query_session_cursor(parms)
17031205Sminshall QuerySessionCursorParms *parms;
17131205Sminshall {
17231210Sminshall     if (api_issue(0x09, QUERY_SESSION_CURSOR, 0x80, 0x20, 0xff,
17331500Sminshall 			gate_sessmgr, (char *)parms, sizeof *parms) == -1) {
17431205Sminshall 	api_fcn_errno = 0;
17531205Sminshall 	api_fcn_fcn_id = 0;
17631205Sminshall 	return -1;
17731205Sminshall     } else if (parms->rc == 0) {
17831205Sminshall 	return 0;
17931205Sminshall     } else {
18031205Sminshall 	api_fcn_errno = parms->rc;
18131205Sminshall 	api_fcn_fcn_id = parms->function_id;
18231205Sminshall 	return -1;
18331205Sminshall     }
18431205Sminshall }
18531205Sminshall 
18631205Sminshall /*
18731205Sminshall  * Keyboard Services
18831205Sminshall  */
18931205Sminshall 
19031205Sminshall api_connect_to_keyboard(parms)
19131205Sminshall ConnectToKeyboardParms *parms;
19231205Sminshall {
19331205Sminshall     if (api_issue(0x09, CONNECT_TO_KEYBOARD, 0x80, 0x20, 0,
19431500Sminshall 			gate_keyboard, (char *)parms, sizeof *parms) == -1) {
19531205Sminshall 	api_fcn_errno = 0;
19631205Sminshall 	api_fcn_fcn_id = 0;
19731205Sminshall 	return -1;
19831205Sminshall     } else if (parms->rc == 0) {
19931205Sminshall 	return 0;
20031205Sminshall     } else {
20131205Sminshall 	api_fcn_errno = parms->rc;
20231205Sminshall 	api_fcn_fcn_id = parms->function_id;
20331205Sminshall 	return -1;
20431205Sminshall     }
20531205Sminshall }
20631205Sminshall 
20731205Sminshall 
20831205Sminshall api_disconnect_from_keyboard(parms)
20931205Sminshall DisconnectFromKeyboardParms *parms;
21031205Sminshall {
21131205Sminshall     if (api_issue(0x09, DISCONNECT_FROM_KEYBOARD, 0x80, 0x20, 0,
21231500Sminshall 			gate_keyboard, (char *)parms, sizeof *parms) == -1) {
21331205Sminshall 	api_fcn_errno = 0;
21431205Sminshall 	api_fcn_fcn_id = 0;
21531205Sminshall 	return -1;
21631205Sminshall     } else if (parms->rc == 0) {
21731205Sminshall 	return 0;
21831205Sminshall     } else {
21931205Sminshall 	api_fcn_errno = parms->rc;
22031205Sminshall 	api_fcn_fcn_id = parms->function_id;
22131205Sminshall 	return -1;
22231205Sminshall     }
22331205Sminshall }
22431205Sminshall 
22531205Sminshall 
22631205Sminshall api_write_keystroke(parms)
22731205Sminshall WriteKeystrokeParms *parms;
22831205Sminshall {
22931205Sminshall     if (api_issue(0x09, WRITE_KEYSTROKE, 0x80, 0x20, 0,
23031500Sminshall 			gate_keyboard, (char *)parms, sizeof *parms) == -1) {
23131205Sminshall 	api_fcn_errno = 0;
23231205Sminshall 	api_fcn_fcn_id = 0;
23331205Sminshall 	return -1;
23431205Sminshall     } else if (parms->rc == 0) {
23531205Sminshall 	return 0;
23631205Sminshall     } else {
23731205Sminshall 	api_fcn_errno = parms->rc;
23831205Sminshall 	api_fcn_fcn_id = parms->function_id;
23931205Sminshall 	return -1;
24031205Sminshall     }
24131205Sminshall }
24231205Sminshall 
24331205Sminshall 
24431205Sminshall api_disable_input(parms)
24531205Sminshall DisableInputParms *parms;
24631205Sminshall {
24731205Sminshall     if (api_issue(0x09, DISABLE_INPUT, 0x80, 0x20, 0,
24831500Sminshall 			gate_keyboard, (char *)parms, sizeof *parms) == -1) {
24931205Sminshall 	api_fcn_errno = 0;
25031205Sminshall 	api_fcn_fcn_id = 0;
25131205Sminshall 	return -1;
25231205Sminshall     } else if (parms->rc == 0) {
25331205Sminshall 	return 0;
25431205Sminshall     } else {
25531205Sminshall 	api_fcn_errno = parms->rc;
25631205Sminshall 	api_fcn_fcn_id = parms->function_id;
25731205Sminshall 	return -1;
25831205Sminshall     }
25931205Sminshall }
26031205Sminshall 
26131205Sminshall api_enable_input(parms)
26231205Sminshall EnableInputParms *parms;
26331205Sminshall {
26431205Sminshall     if (api_issue(0x09, ENABLE_INPUT, 0x80, 0x20, 0,
26531500Sminshall 			gate_keyboard, (char *)parms, sizeof *parms) == -1) {
26631205Sminshall 	api_fcn_errno = 0;
26731205Sminshall 	api_fcn_fcn_id = 0;
26831205Sminshall 	return -1;
26931205Sminshall     } else if (parms->rc == 0) {
27031205Sminshall 	return 0;
27131205Sminshall     } else {
27231205Sminshall 	api_fcn_errno = parms->rc;
27331205Sminshall 	api_fcn_fcn_id = parms->function_id;
27431205Sminshall 	return -1;
27531205Sminshall     }
27631205Sminshall }
27731205Sminshall 
27831205Sminshall /*
27931205Sminshall  * Copy Services
28031205Sminshall  */
28131205Sminshall 
28231205Sminshall api_copy_string(parms)
28331205Sminshall CopyStringParms *parms;
28431205Sminshall {
28531210Sminshall     if (api_issue(0x09, COPY_STRING, 0x80, 0x20, 0xff,
28631500Sminshall 			    gate_copy, (char *)parms, sizeof *parms) == -1) {
28731205Sminshall 	api_fcn_errno = 0;
28831205Sminshall 	api_fcn_fcn_id = 0;
28931205Sminshall 	return -1;
29031205Sminshall     } else if (parms->rc == 0) {
29131205Sminshall 	return 0;
29231205Sminshall     } else {
29331205Sminshall 	api_fcn_errno = parms->rc;
29431205Sminshall 	api_fcn_fcn_id = parms->function_id;
29531205Sminshall 	return -1;
29631205Sminshall     }
29731205Sminshall }
29831205Sminshall 
29931205Sminshall /*
30031205Sminshall  * Operator Information Area Services
30131205Sminshall  */
30231205Sminshall 
30331205Sminshall api_read_oia_group(parms)
30431205Sminshall ReadOiaGroupParms *parms;
30531205Sminshall {
30631210Sminshall     if (api_issue(0x09, READ_OIA_GROUP, 0x80, 0x20, 0xff,
30731500Sminshall 			    gate_oiam, (char *)parms, sizeof *parms) == -1) {
30831205Sminshall 	api_fcn_errno = 0;
30931205Sminshall 	api_fcn_fcn_id = 0;
31031205Sminshall 	return -1;
31131205Sminshall     } else if (parms->rc == 0) {
31231205Sminshall 	return 0;
31331205Sminshall     } else {
31431205Sminshall 	api_fcn_errno = parms->rc;
31531205Sminshall 	api_fcn_fcn_id = parms->function_id;
31631205Sminshall 	return -1;
31731205Sminshall     }
31831205Sminshall }
31931205Sminshall 
32031205Sminshall /*
32131493Sminshall  * The "we are done" routine.  This gets called last.
32231493Sminshall  */
32331493Sminshall 
32431493Sminshall api_finish()
32531493Sminshall {
32631493Sminshall #if	defined(unix)
32731493Sminshall     if (api_close_api() == -1) {
32831493Sminshall 	return -1;
32931493Sminshall     } else {
33031493Sminshall 	return 0;
33131493Sminshall     }
33231493Sminshall #endif	/* defined(unix) */
33331493Sminshall }
33431493Sminshall 
33531493Sminshall 
33631493Sminshall /*
33731205Sminshall  * The initialization routine.  Be sure to call this first.
33831205Sminshall  */
33931205Sminshall 
34031205Sminshall api_init()
34131205Sminshall {
34231205Sminshall     union REGS regs;
34331205Sminshall     struct SREGS sregs;
34431205Sminshall 
34531458Sminshall #if	defined(MSDOS)
34631205Sminshall     regs.h.ah = 0x35;
34731205Sminshall     regs.h.al = API_INTERRUPT_NUMBER;
34831205Sminshall     intdosx(&regs, &regs, &sregs);
34931205Sminshall 
35031205Sminshall     if ((regs.x.bx == 0) && (sregs.es == 0)) {
35131205Sminshall 	return 0;		/* Interrupt not being handled */
35231205Sminshall     }
35331458Sminshall #endif	defined(MSDOS)
35431458Sminshall #if	defined(unix)
35531458Sminshall     if (api_open_api(0) == -1) {
35631458Sminshall 	return 0;
35731458Sminshall     }
35831458Sminshall #endif	/* defined(unix) */
35931205Sminshall 
36031205Sminshall     gate_sessmgr = api_name_resolve("SESSMGR");
36131205Sminshall     gate_keyboard = api_name_resolve("KEYBOARD");
36231205Sminshall     gate_copy = api_name_resolve("COPY");
36331205Sminshall     gate_oiam = api_name_resolve("OIAM");
36431205Sminshall 
36531205Sminshall     if ((gate_sessmgr == gate_keyboard) ||
36631205Sminshall 	(gate_sessmgr == gate_copy) ||
36731205Sminshall 	(gate_sessmgr == gate_oiam) ||
36831205Sminshall 	(gate_keyboard == gate_copy) ||
36931205Sminshall 	(gate_keyboard == gate_oiam) ||
37031205Sminshall 	(gate_copy == gate_oiam)) {
37131205Sminshall 	    return 0;		/* Interrupt doesn't seem correct */
37231205Sminshall     }
37331205Sminshall     return 1;
37431205Sminshall }
375