xref: /csrg-svn/usr.bin/tn3270/api/apilib.c (revision 31890)
1*31890Sminshall /*
2*31890Sminshall  *	Copyright (c) 1984-1987 by the Regents of the
3*31890Sminshall  *	University of California and by Gregory Glenn Minshall.
4*31890Sminshall  *
5*31890Sminshall  *	Permission to use, copy, modify, and distribute these
6*31890Sminshall  *	programs and their documentation for any purpose and
7*31890Sminshall  *	without fee is hereby granted, provided that this
8*31890Sminshall  *	copyright and permission appear on all copies and
9*31890Sminshall  *	supporting documentation, the name of the Regents of
10*31890Sminshall  *	the University of California not be used in advertising
11*31890Sminshall  *	or publicity pertaining to distribution of the programs
12*31890Sminshall  *	without specific prior permission, and notice be given in
13*31890Sminshall  *	supporting documentation that copying and distribution is
14*31890Sminshall  *	by permission of the Regents of the University of California
15*31890Sminshall  *	and by Gregory Glenn Minshall.  Neither the Regents of the
16*31890Sminshall  *	University of California nor Gregory Glenn Minshall make
17*31890Sminshall  *	representations about the suitability of this software
18*31890Sminshall  *	for any purpose.  It is provided "as is" without
19*31890Sminshall  *	express or implied warranty.
20*31890Sminshall  */
21*31890Sminshall 
22*31890Sminshall #ifndef lint
23*31890Sminshall static char sccsid[] = "@(#)apilib.c	1.10 (Berkeley) 07/17/87";
24*31890Sminshall #endif	/* not lint */
25*31890Sminshall 
2631869Sminshall #include "../ctlr/api.h"
2731202Sminshall 
2831205Sminshall #include "apilib.h"
2931202Sminshall 
3031202Sminshall int
3131205Sminshall     api_sup_errno = 0,			/* Supervisor error number */
3231205Sminshall     api_sup_fcn_id = 0,			/* Supervisor function id (0x12) */
3331205Sminshall     api_fcn_errno = 0,			/* Function error number */
3431205Sminshall     api_fcn_fcn_id = 0;			/* Function ID (0x6b, etc.) */
3531205Sminshall 
3631205Sminshall static int
3731205Sminshall     gate_sessmgr = 0,
3831205Sminshall     gate_keyboard = 0,
3931205Sminshall     gate_copy = 0,
4031205Sminshall     gate_oiam = 0;
4131205Sminshall 
4231205Sminshall /*
4331205Sminshall  * Issue an API request, with reg structures supplied by the caller.
4431205Sminshall  *
4531205Sminshall  * Only certain routines need this (supervisor services come to mind).
4631205Sminshall  */
4731205Sminshall 
4831500Sminshall static int
4931500Sminshall api_issue_regs(ah, al, bh, bl, cx, dx, parms, length, regs, sregs)
5031205Sminshall int		ah, al, bh, bl, cx, dx;
5131205Sminshall char 		*parms;
5231500Sminshall int		length;
5331205Sminshall union REGS 	*regs;
5431205Sminshall struct SREGS 	*sregs;
5531205Sminshall {
5631205Sminshall     char far *ourseg = parms;
5731205Sminshall 
5831205Sminshall     regs->h.ah = ah;
5931205Sminshall     regs->h.al = al;
6031205Sminshall     regs->h.bh = bh;
6131205Sminshall     regs->h.bl = bl;
6231205Sminshall     regs->x.cx = cx;
6331205Sminshall     regs->x.dx = dx;
6431205Sminshall     sregs->es = (int) FP_SEG(ourseg);
6531205Sminshall     regs->x.di = (int) FP_OFF(ourseg);
6631205Sminshall 
6731458Sminshall #if	defined(MSDOS)
6831205Sminshall     int86x(API_INTERRUPT_NUMBER, regs, regs, sregs);
6931458Sminshall #endif	/* defined(MSDOS) */
7031458Sminshall #if	defined(unix)
7131500Sminshall     api_exch_api(regs, sregs, parms, length);
7231458Sminshall #endif	/* defined(unix) */
7331458Sminshall 
7431205Sminshall     if (regs->h.cl != 0) {
7531205Sminshall 	api_sup_errno = regs->h.cl;
7631205Sminshall 	return -1;
7731205Sminshall     } else {
7831205Sminshall 	return 0;
7931205Sminshall     }
8031205Sminshall }
8131205Sminshall 
8231205Sminshall 
8331205Sminshall /*
8431205Sminshall  * Issue an API request without requiring caller to supply
8531205Sminshall  * registers.  Most routines use this.
8631205Sminshall  */
8731205Sminshall 
8831500Sminshall static int
8931500Sminshall api_issue(ah, al, bh, bl, cx, dx, parms, length)
9031205Sminshall int
9131202Sminshall     ah,
9231202Sminshall     al,
9331202Sminshall     bh,
9431202Sminshall     bl,
9531202Sminshall     cx,
9631202Sminshall     dx;
9731202Sminshall char *parms;
9831500Sminshall int length;				/* Length of parms */
9931202Sminshall {
10031202Sminshall     union REGS regs;
10131202Sminshall     struct SREGS sregs;
10231202Sminshall 
10331500Sminshall     return api_issue_regs(ah, al, bh, bl, cx, dx, parms, length, &regs, &sregs);
10431202Sminshall }
10531205Sminshall 
10631205Sminshall /*
10731205Sminshall  * Supervisor Services
10831205Sminshall  */
10931202Sminshall 
11031202Sminshall int
11131202Sminshall api_name_resolve(name)
11231202Sminshall char *name;
11331202Sminshall {
11431202Sminshall     NameResolveParms parms;
11531202Sminshall     int i;
11631202Sminshall     union REGS regs;
11731202Sminshall     struct SREGS sregs;
11831202Sminshall 
11931202Sminshall     for (i = 0; i < sizeof parms.gate_name; i++) {
12031202Sminshall 	if (*name) {
12131202Sminshall 	    parms.gate_name[i] = *name++;
12231202Sminshall 	} else {
12331202Sminshall 	    parms.gate_name[i] = ' ';
12431202Sminshall 	}
12531202Sminshall     }
12631202Sminshall 
12731500Sminshall     if (api_issue_regs(NAME_RESOLUTION, 0, 0, 0, 0, 0, &parms, sizeof parms, &regs, &sregs)
12831205Sminshall 		    == -1) {
12931205Sminshall 	return -1;
13031205Sminshall     } else {
13131205Sminshall 	return regs.x.dx;
13231202Sminshall     }
13331205Sminshall }
13431513Sminshall 
13531513Sminshall #if	defined(unix)
13631513Sminshall /*
13731513Sminshall  * Block until the oia or ps is modified.
13831513Sminshall  */
13931513Sminshall 
14031513Sminshall int
14131513Sminshall api_ps_or_oia_modified()
14231513Sminshall {
14331513Sminshall     union REGS regs;
14431513Sminshall     struct SREGS sregs;
14531513Sminshall 
14631513Sminshall     if (api_issue_regs(PS_OR_OIA_MODIFIED, 0, 0, 0, 0, 0, 0, 0, &regs, &sregs)
14731513Sminshall 		    == -1) {
14831513Sminshall 	return -1;
14931513Sminshall     } else {
15031513Sminshall 	return 0;
15131513Sminshall     }
15231513Sminshall }
15331513Sminshall #endif	/* defined(unix) */
15431205Sminshall 
15531205Sminshall /*
15631205Sminshall  * Session Information Services
15731205Sminshall  */
15831202Sminshall 
15931210Sminshall api_query_session_id(parms)
16031205Sminshall QuerySessionIdParms *parms;
16131205Sminshall {
16231205Sminshall     if (api_issue(0x09, QUERY_SESSION_ID, 0x80, 0x20, 0,
16331500Sminshall 					gate_sessmgr, (char *)parms, sizeof *parms) == -1) {
16431205Sminshall 	api_fcn_errno = 0;
16531205Sminshall 	api_fcn_fcn_id = 0;
16631202Sminshall 	return -1;
16731205Sminshall     } else if (parms->rc == 0) {
16831205Sminshall 	return 0;
16931202Sminshall     } else {
17031205Sminshall 	api_fcn_errno = parms->rc;
17131205Sminshall 	api_fcn_fcn_id = parms->function_id;
17231205Sminshall 	return -1;
17331202Sminshall     }
17431202Sminshall }
17531205Sminshall 
17631205Sminshall 
17731210Sminshall api_query_session_parameters(parms)
17831205Sminshall QuerySessionParametersParms *parms;
17931205Sminshall {
18031210Sminshall     if (api_issue(0x09, QUERY_SESSION_PARAMETERS, 0x80, 0x20, 0,
18131500Sminshall 			    gate_sessmgr, (char *)parms, sizeof *parms) == -1) {
18231205Sminshall 	api_fcn_errno = 0;
18331205Sminshall 	api_fcn_fcn_id = 0;
18431205Sminshall 	return -1;
18531205Sminshall     } else if (parms->rc == 0) {
18631205Sminshall 	return 0;
18731205Sminshall     } else {
18831205Sminshall 	api_fcn_errno = parms->rc;
18931205Sminshall 	api_fcn_fcn_id = parms->function_id;
19031205Sminshall 	return -1;
19131205Sminshall     }
19231205Sminshall }
19331205Sminshall 
19431205Sminshall api_query_session_cursor(parms)
19531205Sminshall QuerySessionCursorParms *parms;
19631205Sminshall {
19731210Sminshall     if (api_issue(0x09, QUERY_SESSION_CURSOR, 0x80, 0x20, 0xff,
19831500Sminshall 			gate_sessmgr, (char *)parms, sizeof *parms) == -1) {
19931205Sminshall 	api_fcn_errno = 0;
20031205Sminshall 	api_fcn_fcn_id = 0;
20131205Sminshall 	return -1;
20231205Sminshall     } else if (parms->rc == 0) {
20331205Sminshall 	return 0;
20431205Sminshall     } else {
20531205Sminshall 	api_fcn_errno = parms->rc;
20631205Sminshall 	api_fcn_fcn_id = parms->function_id;
20731205Sminshall 	return -1;
20831205Sminshall     }
20931205Sminshall }
21031205Sminshall 
21131205Sminshall /*
21231205Sminshall  * Keyboard Services
21331205Sminshall  */
21431205Sminshall 
21531205Sminshall api_connect_to_keyboard(parms)
21631205Sminshall ConnectToKeyboardParms *parms;
21731205Sminshall {
21831205Sminshall     if (api_issue(0x09, CONNECT_TO_KEYBOARD, 0x80, 0x20, 0,
21931500Sminshall 			gate_keyboard, (char *)parms, sizeof *parms) == -1) {
22031205Sminshall 	api_fcn_errno = 0;
22131205Sminshall 	api_fcn_fcn_id = 0;
22231205Sminshall 	return -1;
22331205Sminshall     } else if (parms->rc == 0) {
22431205Sminshall 	return 0;
22531205Sminshall     } else {
22631205Sminshall 	api_fcn_errno = parms->rc;
22731205Sminshall 	api_fcn_fcn_id = parms->function_id;
22831205Sminshall 	return -1;
22931205Sminshall     }
23031205Sminshall }
23131205Sminshall 
23231205Sminshall 
23331205Sminshall api_disconnect_from_keyboard(parms)
23431205Sminshall DisconnectFromKeyboardParms *parms;
23531205Sminshall {
23631205Sminshall     if (api_issue(0x09, DISCONNECT_FROM_KEYBOARD, 0x80, 0x20, 0,
23731500Sminshall 			gate_keyboard, (char *)parms, sizeof *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 api_write_keystroke(parms)
25231205Sminshall WriteKeystrokeParms *parms;
25331205Sminshall {
25431205Sminshall     if (api_issue(0x09, WRITE_KEYSTROKE, 0x80, 0x20, 0,
25531500Sminshall 			gate_keyboard, (char *)parms, sizeof *parms) == -1) {
25631205Sminshall 	api_fcn_errno = 0;
25731205Sminshall 	api_fcn_fcn_id = 0;
25831205Sminshall 	return -1;
25931205Sminshall     } else if (parms->rc == 0) {
26031205Sminshall 	return 0;
26131205Sminshall     } else {
26231205Sminshall 	api_fcn_errno = parms->rc;
26331205Sminshall 	api_fcn_fcn_id = parms->function_id;
26431205Sminshall 	return -1;
26531205Sminshall     }
26631205Sminshall }
26731205Sminshall 
26831205Sminshall 
26931205Sminshall api_disable_input(parms)
27031205Sminshall DisableInputParms *parms;
27131205Sminshall {
27231205Sminshall     if (api_issue(0x09, DISABLE_INPUT, 0x80, 0x20, 0,
27331500Sminshall 			gate_keyboard, (char *)parms, sizeof *parms) == -1) {
27431205Sminshall 	api_fcn_errno = 0;
27531205Sminshall 	api_fcn_fcn_id = 0;
27631205Sminshall 	return -1;
27731205Sminshall     } else if (parms->rc == 0) {
27831205Sminshall 	return 0;
27931205Sminshall     } else {
28031205Sminshall 	api_fcn_errno = parms->rc;
28131205Sminshall 	api_fcn_fcn_id = parms->function_id;
28231205Sminshall 	return -1;
28331205Sminshall     }
28431205Sminshall }
28531205Sminshall 
28631205Sminshall api_enable_input(parms)
28731205Sminshall EnableInputParms *parms;
28831205Sminshall {
28931205Sminshall     if (api_issue(0x09, ENABLE_INPUT, 0x80, 0x20, 0,
29031500Sminshall 			gate_keyboard, (char *)parms, sizeof *parms) == -1) {
29131205Sminshall 	api_fcn_errno = 0;
29231205Sminshall 	api_fcn_fcn_id = 0;
29331205Sminshall 	return -1;
29431205Sminshall     } else if (parms->rc == 0) {
29531205Sminshall 	return 0;
29631205Sminshall     } else {
29731205Sminshall 	api_fcn_errno = parms->rc;
29831205Sminshall 	api_fcn_fcn_id = parms->function_id;
29931205Sminshall 	return -1;
30031205Sminshall     }
30131205Sminshall }
30231205Sminshall 
30331205Sminshall /*
30431205Sminshall  * Copy Services
30531205Sminshall  */
30631205Sminshall 
30731205Sminshall api_copy_string(parms)
30831205Sminshall CopyStringParms *parms;
30931205Sminshall {
31031210Sminshall     if (api_issue(0x09, COPY_STRING, 0x80, 0x20, 0xff,
31131500Sminshall 			    gate_copy, (char *)parms, sizeof *parms) == -1) {
31231205Sminshall 	api_fcn_errno = 0;
31331205Sminshall 	api_fcn_fcn_id = 0;
31431205Sminshall 	return -1;
31531205Sminshall     } else if (parms->rc == 0) {
31631205Sminshall 	return 0;
31731205Sminshall     } else {
31831205Sminshall 	api_fcn_errno = parms->rc;
31931205Sminshall 	api_fcn_fcn_id = parms->function_id;
32031205Sminshall 	return -1;
32131205Sminshall     }
32231205Sminshall }
32331205Sminshall 
32431205Sminshall /*
32531205Sminshall  * Operator Information Area Services
32631205Sminshall  */
32731205Sminshall 
32831205Sminshall api_read_oia_group(parms)
32931205Sminshall ReadOiaGroupParms *parms;
33031205Sminshall {
33131210Sminshall     if (api_issue(0x09, READ_OIA_GROUP, 0x80, 0x20, 0xff,
33231500Sminshall 			    gate_oiam, (char *)parms, sizeof *parms) == -1) {
33331205Sminshall 	api_fcn_errno = 0;
33431205Sminshall 	api_fcn_fcn_id = 0;
33531205Sminshall 	return -1;
33631205Sminshall     } else if (parms->rc == 0) {
33731205Sminshall 	return 0;
33831205Sminshall     } else {
33931205Sminshall 	api_fcn_errno = parms->rc;
34031205Sminshall 	api_fcn_fcn_id = parms->function_id;
34131205Sminshall 	return -1;
34231205Sminshall     }
34331205Sminshall }
34431205Sminshall 
34531205Sminshall /*
34631493Sminshall  * The "we are done" routine.  This gets called last.
34731493Sminshall  */
34831493Sminshall 
34931493Sminshall api_finish()
35031493Sminshall {
35131493Sminshall #if	defined(unix)
35231493Sminshall     if (api_close_api() == -1) {
35331493Sminshall 	return -1;
35431493Sminshall     } else {
35531493Sminshall 	return 0;
35631493Sminshall     }
35731493Sminshall #endif	/* defined(unix) */
35831493Sminshall }
35931493Sminshall 
36031493Sminshall 
36131493Sminshall /*
36231205Sminshall  * The initialization routine.  Be sure to call this first.
36331205Sminshall  */
36431205Sminshall 
36531205Sminshall api_init()
36631205Sminshall {
36731205Sminshall     union REGS regs;
36831205Sminshall     struct SREGS sregs;
36931205Sminshall 
37031458Sminshall #if	defined(MSDOS)
37131205Sminshall     regs.h.ah = 0x35;
37231205Sminshall     regs.h.al = API_INTERRUPT_NUMBER;
37331205Sminshall     intdosx(&regs, &regs, &sregs);
37431205Sminshall 
37531205Sminshall     if ((regs.x.bx == 0) && (sregs.es == 0)) {
37631205Sminshall 	return 0;		/* Interrupt not being handled */
37731205Sminshall     }
37831760Sminshall #endif	/* defined(MSDOS) */
37931458Sminshall #if	defined(unix)
38031458Sminshall     if (api_open_api(0) == -1) {
38131458Sminshall 	return 0;
38231458Sminshall     }
38331458Sminshall #endif	/* defined(unix) */
38431205Sminshall 
38531205Sminshall     gate_sessmgr = api_name_resolve("SESSMGR");
38631205Sminshall     gate_keyboard = api_name_resolve("KEYBOARD");
38731205Sminshall     gate_copy = api_name_resolve("COPY");
38831205Sminshall     gate_oiam = api_name_resolve("OIAM");
38931205Sminshall 
39031205Sminshall     if ((gate_sessmgr == gate_keyboard) ||
39131205Sminshall 	(gate_sessmgr == gate_copy) ||
39231205Sminshall 	(gate_sessmgr == gate_oiam) ||
39331205Sminshall 	(gate_keyboard == gate_copy) ||
39431205Sminshall 	(gate_keyboard == gate_oiam) ||
39531205Sminshall 	(gate_copy == gate_oiam)) {
39631205Sminshall 	    return 0;		/* Interrupt doesn't seem correct */
39731205Sminshall     }
39831205Sminshall     return 1;
39931205Sminshall }
400