1*31869Sminshall #include "../ctlr/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, ®s, &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, ®s, &sregs) 10331205Sminshall == -1) { 10431205Sminshall return -1; 10531205Sminshall } else { 10631205Sminshall return regs.x.dx; 10731202Sminshall } 10831205Sminshall } 10931513Sminshall 11031513Sminshall #if defined(unix) 11131513Sminshall /* 11231513Sminshall * Block until the oia or ps is modified. 11331513Sminshall */ 11431513Sminshall 11531513Sminshall int 11631513Sminshall api_ps_or_oia_modified() 11731513Sminshall { 11831513Sminshall union REGS regs; 11931513Sminshall struct SREGS sregs; 12031513Sminshall 12131513Sminshall if (api_issue_regs(PS_OR_OIA_MODIFIED, 0, 0, 0, 0, 0, 0, 0, ®s, &sregs) 12231513Sminshall == -1) { 12331513Sminshall return -1; 12431513Sminshall } else { 12531513Sminshall return 0; 12631513Sminshall } 12731513Sminshall } 12831513Sminshall #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(®s, ®s, &sregs); 34931205Sminshall 35031205Sminshall if ((regs.x.bx == 0) && (sregs.es == 0)) { 35131205Sminshall return 0; /* Interrupt not being handled */ 35231205Sminshall } 35331760Sminshall #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