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 41*31458Sminshall #if defined(MSDOS) 4231205Sminshall int86x(API_INTERRUPT_NUMBER, regs, regs, sregs); 43*31458Sminshall #endif /* defined(MSDOS) */ 44*31458Sminshall #if defined(unix) 45*31458Sminshall api_exch_api(regs, sregs); 46*31458Sminshall #endif /* defined(unix) */ 47*31458Sminshall 4831205Sminshall if (regs->h.cl != 0) { 4931205Sminshall api_sup_errno = regs->h.cl; 5031205Sminshall return -1; 5131205Sminshall } else { 5231205Sminshall return 0; 5331205Sminshall } 5431205Sminshall } 5531205Sminshall 5631205Sminshall 5731205Sminshall /* 5831205Sminshall * Issue an API request without requiring caller to supply 5931205Sminshall * registers. Most routines use this. 6031205Sminshall */ 6131205Sminshall 6231205Sminshall int 6331202Sminshall api_issue(ah, al, bh, bl, cx, dx, parms) 6431202Sminshall int 6531202Sminshall ah, 6631202Sminshall al, 6731202Sminshall bh, 6831202Sminshall bl, 6931202Sminshall cx, 7031202Sminshall dx; 7131202Sminshall char *parms; 7231202Sminshall { 7331202Sminshall union REGS regs; 7431202Sminshall struct SREGS sregs; 7531202Sminshall 7631205Sminshall return api_issue_regs(ah, al, bh, bl, cx, dx, parms, ®s, &sregs); 7731202Sminshall } 7831205Sminshall 7931205Sminshall /* 8031205Sminshall * Supervisor Services 8131205Sminshall */ 8231202Sminshall 8331202Sminshall int 8431202Sminshall api_name_resolve(name) 8531202Sminshall char *name; 8631202Sminshall { 8731202Sminshall NameResolveParms parms; 8831202Sminshall int i; 8931202Sminshall union REGS regs; 9031202Sminshall struct SREGS sregs; 9131202Sminshall 9231202Sminshall for (i = 0; i < sizeof parms.gate_name; i++) { 9331202Sminshall if (*name) { 9431202Sminshall parms.gate_name[i] = *name++; 9531202Sminshall } else { 9631202Sminshall parms.gate_name[i] = ' '; 9731202Sminshall } 9831202Sminshall } 9931202Sminshall 10031205Sminshall if (api_issue_regs(NAME_RESOLUTION, 0, 0, 0, 0, 0, &parms, ®s, &sregs) 10131205Sminshall == -1) { 10231205Sminshall return -1; 10331205Sminshall } else { 10431205Sminshall return regs.x.dx; 10531202Sminshall } 10631205Sminshall } 10731205Sminshall 10831205Sminshall /* 10931205Sminshall * Session Information Services 11031205Sminshall */ 11131202Sminshall 11231210Sminshall api_query_session_id(parms) 11331205Sminshall QuerySessionIdParms *parms; 11431205Sminshall { 11531205Sminshall if (api_issue(0x09, QUERY_SESSION_ID, 0x80, 0x20, 0, 11631205Sminshall gate_sessmgr, (char *)parms) == -1) { 11731205Sminshall api_fcn_errno = 0; 11831205Sminshall api_fcn_fcn_id = 0; 11931202Sminshall return -1; 12031205Sminshall } else if (parms->rc == 0) { 12131205Sminshall return 0; 12231202Sminshall } else { 12331205Sminshall api_fcn_errno = parms->rc; 12431205Sminshall api_fcn_fcn_id = parms->function_id; 12531205Sminshall return -1; 12631202Sminshall } 12731202Sminshall } 12831205Sminshall 12931205Sminshall 13031210Sminshall api_query_session_parameters(parms) 13131205Sminshall QuerySessionParametersParms *parms; 13231205Sminshall { 13331210Sminshall if (api_issue(0x09, QUERY_SESSION_PARAMETERS, 0x80, 0x20, 0, 13431205Sminshall gate_sessmgr, (char *)parms) == -1) { 13531205Sminshall api_fcn_errno = 0; 13631205Sminshall api_fcn_fcn_id = 0; 13731205Sminshall return -1; 13831205Sminshall } else if (parms->rc == 0) { 13931205Sminshall return 0; 14031205Sminshall } else { 14131205Sminshall api_fcn_errno = parms->rc; 14231205Sminshall api_fcn_fcn_id = parms->function_id; 14331205Sminshall return -1; 14431205Sminshall } 14531205Sminshall } 14631205Sminshall 14731205Sminshall api_query_session_cursor(parms) 14831205Sminshall QuerySessionCursorParms *parms; 14931205Sminshall { 15031210Sminshall if (api_issue(0x09, QUERY_SESSION_CURSOR, 0x80, 0x20, 0xff, 15131205Sminshall gate_sessmgr, (char *)parms) == -1) { 15231205Sminshall api_fcn_errno = 0; 15331205Sminshall api_fcn_fcn_id = 0; 15431205Sminshall return -1; 15531205Sminshall } else if (parms->rc == 0) { 15631205Sminshall return 0; 15731205Sminshall } else { 15831205Sminshall api_fcn_errno = parms->rc; 15931205Sminshall api_fcn_fcn_id = parms->function_id; 16031205Sminshall return -1; 16131205Sminshall } 16231205Sminshall } 16331205Sminshall 16431205Sminshall /* 16531205Sminshall * Keyboard Services 16631205Sminshall */ 16731205Sminshall 16831205Sminshall api_connect_to_keyboard(parms) 16931205Sminshall ConnectToKeyboardParms *parms; 17031205Sminshall { 17131205Sminshall if (api_issue(0x09, CONNECT_TO_KEYBOARD, 0x80, 0x20, 0, 17231205Sminshall gate_keyboard, (char *)parms) == -1) { 17331205Sminshall api_fcn_errno = 0; 17431205Sminshall api_fcn_fcn_id = 0; 17531205Sminshall return -1; 17631205Sminshall } else if (parms->rc == 0) { 17731205Sminshall return 0; 17831205Sminshall } else { 17931205Sminshall api_fcn_errno = parms->rc; 18031205Sminshall api_fcn_fcn_id = parms->function_id; 18131205Sminshall return -1; 18231205Sminshall } 18331205Sminshall } 18431205Sminshall 18531205Sminshall 18631205Sminshall api_disconnect_from_keyboard(parms) 18731205Sminshall DisconnectFromKeyboardParms *parms; 18831205Sminshall { 18931205Sminshall if (api_issue(0x09, DISCONNECT_FROM_KEYBOARD, 0x80, 0x20, 0, 19031205Sminshall gate_keyboard, (char *)parms) == -1) { 19131205Sminshall api_fcn_errno = 0; 19231205Sminshall api_fcn_fcn_id = 0; 19331205Sminshall return -1; 19431205Sminshall } else if (parms->rc == 0) { 19531205Sminshall return 0; 19631205Sminshall } else { 19731205Sminshall api_fcn_errno = parms->rc; 19831205Sminshall api_fcn_fcn_id = parms->function_id; 19931205Sminshall return -1; 20031205Sminshall } 20131205Sminshall } 20231205Sminshall 20331205Sminshall 20431205Sminshall api_write_keystroke(parms) 20531205Sminshall WriteKeystrokeParms *parms; 20631205Sminshall { 20731205Sminshall if (api_issue(0x09, WRITE_KEYSTROKE, 0x80, 0x20, 0, 20831205Sminshall gate_keyboard, (char *)parms) == -1) { 20931205Sminshall api_fcn_errno = 0; 21031205Sminshall api_fcn_fcn_id = 0; 21131205Sminshall return -1; 21231205Sminshall } else if (parms->rc == 0) { 21331205Sminshall return 0; 21431205Sminshall } else { 21531205Sminshall api_fcn_errno = parms->rc; 21631205Sminshall api_fcn_fcn_id = parms->function_id; 21731205Sminshall return -1; 21831205Sminshall } 21931205Sminshall } 22031205Sminshall 22131205Sminshall 22231205Sminshall api_disable_input(parms) 22331205Sminshall DisableInputParms *parms; 22431205Sminshall { 22531205Sminshall if (api_issue(0x09, DISABLE_INPUT, 0x80, 0x20, 0, 22631205Sminshall gate_keyboard, (char *)parms) == -1) { 22731205Sminshall api_fcn_errno = 0; 22831205Sminshall api_fcn_fcn_id = 0; 22931205Sminshall return -1; 23031205Sminshall } else if (parms->rc == 0) { 23131205Sminshall return 0; 23231205Sminshall } else { 23331205Sminshall api_fcn_errno = parms->rc; 23431205Sminshall api_fcn_fcn_id = parms->function_id; 23531205Sminshall return -1; 23631205Sminshall } 23731205Sminshall } 23831205Sminshall 23931205Sminshall api_enable_input(parms) 24031205Sminshall EnableInputParms *parms; 24131205Sminshall { 24231205Sminshall if (api_issue(0x09, ENABLE_INPUT, 0x80, 0x20, 0, 24331205Sminshall gate_keyboard, (char *)parms) == -1) { 24431205Sminshall api_fcn_errno = 0; 24531205Sminshall api_fcn_fcn_id = 0; 24631205Sminshall return -1; 24731205Sminshall } else if (parms->rc == 0) { 24831205Sminshall return 0; 24931205Sminshall } else { 25031205Sminshall api_fcn_errno = parms->rc; 25131205Sminshall api_fcn_fcn_id = parms->function_id; 25231205Sminshall return -1; 25331205Sminshall } 25431205Sminshall } 25531205Sminshall 25631205Sminshall /* 25731205Sminshall * Copy Services 25831205Sminshall */ 25931205Sminshall 26031205Sminshall api_copy_string(parms) 26131205Sminshall CopyStringParms *parms; 26231205Sminshall { 26331210Sminshall if (api_issue(0x09, COPY_STRING, 0x80, 0x20, 0xff, 26431205Sminshall gate_copy, (char *)parms) == -1) { 26531205Sminshall api_fcn_errno = 0; 26631205Sminshall api_fcn_fcn_id = 0; 26731205Sminshall return -1; 26831205Sminshall } else if (parms->rc == 0) { 26931205Sminshall return 0; 27031205Sminshall } else { 27131205Sminshall api_fcn_errno = parms->rc; 27231205Sminshall api_fcn_fcn_id = parms->function_id; 27331205Sminshall return -1; 27431205Sminshall } 27531205Sminshall } 27631205Sminshall 27731205Sminshall /* 27831205Sminshall * Operator Information Area Services 27931205Sminshall */ 28031205Sminshall 28131205Sminshall api_read_oia_group(parms) 28231205Sminshall ReadOiaGroupParms *parms; 28331205Sminshall { 28431210Sminshall if (api_issue(0x09, READ_OIA_GROUP, 0x80, 0x20, 0xff, 28531205Sminshall gate_oiam, (char *)parms) == -1) { 28631205Sminshall api_fcn_errno = 0; 28731205Sminshall api_fcn_fcn_id = 0; 28831205Sminshall return -1; 28931205Sminshall } else if (parms->rc == 0) { 29031205Sminshall return 0; 29131205Sminshall } else { 29231205Sminshall api_fcn_errno = parms->rc; 29331205Sminshall api_fcn_fcn_id = parms->function_id; 29431205Sminshall return -1; 29531205Sminshall } 29631205Sminshall } 29731205Sminshall 29831205Sminshall /* 29931205Sminshall * The initialization routine. Be sure to call this first. 30031205Sminshall */ 30131205Sminshall 30231205Sminshall api_init() 30331205Sminshall { 30431205Sminshall union REGS regs; 30531205Sminshall struct SREGS sregs; 30631205Sminshall 307*31458Sminshall #if defined(MSDOS) 30831205Sminshall regs.h.ah = 0x35; 30931205Sminshall regs.h.al = API_INTERRUPT_NUMBER; 31031205Sminshall intdosx(®s, ®s, &sregs); 31131205Sminshall 31231205Sminshall if ((regs.x.bx == 0) && (sregs.es == 0)) { 31331205Sminshall return 0; /* Interrupt not being handled */ 31431205Sminshall } 315*31458Sminshall #endif defined(MSDOS) 316*31458Sminshall #if defined(unix) 317*31458Sminshall if (api_open_api(0) == -1) { 318*31458Sminshall return 0; 319*31458Sminshall } 320*31458Sminshall #endif /* defined(unix) */ 32131205Sminshall 32231205Sminshall gate_sessmgr = api_name_resolve("SESSMGR"); 32331205Sminshall gate_keyboard = api_name_resolve("KEYBOARD"); 32431205Sminshall gate_copy = api_name_resolve("COPY"); 32531205Sminshall gate_oiam = api_name_resolve("OIAM"); 32631205Sminshall 32731205Sminshall if ((gate_sessmgr == gate_keyboard) || 32831205Sminshall (gate_sessmgr == gate_copy) || 32931205Sminshall (gate_sessmgr == gate_oiam) || 33031205Sminshall (gate_keyboard == gate_copy) || 33131205Sminshall (gate_keyboard == gate_oiam) || 33231205Sminshall (gate_copy == gate_oiam)) { 33331205Sminshall return 0; /* Interrupt doesn't seem correct */ 33431205Sminshall } 33531205Sminshall return 1; 33631205Sminshall } 337