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, ®s, &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, ®s, &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, ®s, &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(®s, ®s, &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