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 23*31500Sminshall static int 24*31500Sminshall api_issue_regs(ah, al, bh, bl, cx, dx, parms, length, regs, sregs) 2531205Sminshall int ah, al, bh, bl, cx, dx; 2631205Sminshall char *parms; 27*31500Sminshall 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) 46*31500Sminshall 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 63*31500Sminshall static int 64*31500Sminshall 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; 73*31500Sminshall int length; /* Length of parms */ 7431202Sminshall { 7531202Sminshall union REGS regs; 7631202Sminshall struct SREGS sregs; 7731202Sminshall 78*31500Sminshall 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 102*31500Sminshall 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 } 10931205Sminshall 11031205Sminshall /* 11131205Sminshall * Session Information Services 11231205Sminshall */ 11331202Sminshall 11431210Sminshall api_query_session_id(parms) 11531205Sminshall QuerySessionIdParms *parms; 11631205Sminshall { 11731205Sminshall if (api_issue(0x09, QUERY_SESSION_ID, 0x80, 0x20, 0, 118*31500Sminshall gate_sessmgr, (char *)parms, sizeof *parms) == -1) { 11931205Sminshall api_fcn_errno = 0; 12031205Sminshall api_fcn_fcn_id = 0; 12131202Sminshall return -1; 12231205Sminshall } else if (parms->rc == 0) { 12331205Sminshall return 0; 12431202Sminshall } else { 12531205Sminshall api_fcn_errno = parms->rc; 12631205Sminshall api_fcn_fcn_id = parms->function_id; 12731205Sminshall return -1; 12831202Sminshall } 12931202Sminshall } 13031205Sminshall 13131205Sminshall 13231210Sminshall api_query_session_parameters(parms) 13331205Sminshall QuerySessionParametersParms *parms; 13431205Sminshall { 13531210Sminshall if (api_issue(0x09, QUERY_SESSION_PARAMETERS, 0x80, 0x20, 0, 136*31500Sminshall gate_sessmgr, (char *)parms, sizeof *parms) == -1) { 13731205Sminshall api_fcn_errno = 0; 13831205Sminshall api_fcn_fcn_id = 0; 13931205Sminshall return -1; 14031205Sminshall } else if (parms->rc == 0) { 14131205Sminshall return 0; 14231205Sminshall } else { 14331205Sminshall api_fcn_errno = parms->rc; 14431205Sminshall api_fcn_fcn_id = parms->function_id; 14531205Sminshall return -1; 14631205Sminshall } 14731205Sminshall } 14831205Sminshall 14931205Sminshall api_query_session_cursor(parms) 15031205Sminshall QuerySessionCursorParms *parms; 15131205Sminshall { 15231210Sminshall if (api_issue(0x09, QUERY_SESSION_CURSOR, 0x80, 0x20, 0xff, 153*31500Sminshall gate_sessmgr, (char *)parms, sizeof *parms) == -1) { 15431205Sminshall api_fcn_errno = 0; 15531205Sminshall api_fcn_fcn_id = 0; 15631205Sminshall return -1; 15731205Sminshall } else if (parms->rc == 0) { 15831205Sminshall return 0; 15931205Sminshall } else { 16031205Sminshall api_fcn_errno = parms->rc; 16131205Sminshall api_fcn_fcn_id = parms->function_id; 16231205Sminshall return -1; 16331205Sminshall } 16431205Sminshall } 16531205Sminshall 16631205Sminshall /* 16731205Sminshall * Keyboard Services 16831205Sminshall */ 16931205Sminshall 17031205Sminshall api_connect_to_keyboard(parms) 17131205Sminshall ConnectToKeyboardParms *parms; 17231205Sminshall { 17331205Sminshall if (api_issue(0x09, CONNECT_TO_KEYBOARD, 0x80, 0x20, 0, 174*31500Sminshall gate_keyboard, (char *)parms, sizeof *parms) == -1) { 17531205Sminshall api_fcn_errno = 0; 17631205Sminshall api_fcn_fcn_id = 0; 17731205Sminshall return -1; 17831205Sminshall } else if (parms->rc == 0) { 17931205Sminshall return 0; 18031205Sminshall } else { 18131205Sminshall api_fcn_errno = parms->rc; 18231205Sminshall api_fcn_fcn_id = parms->function_id; 18331205Sminshall return -1; 18431205Sminshall } 18531205Sminshall } 18631205Sminshall 18731205Sminshall 18831205Sminshall api_disconnect_from_keyboard(parms) 18931205Sminshall DisconnectFromKeyboardParms *parms; 19031205Sminshall { 19131205Sminshall if (api_issue(0x09, DISCONNECT_FROM_KEYBOARD, 0x80, 0x20, 0, 192*31500Sminshall gate_keyboard, (char *)parms, sizeof *parms) == -1) { 19331205Sminshall api_fcn_errno = 0; 19431205Sminshall api_fcn_fcn_id = 0; 19531205Sminshall return -1; 19631205Sminshall } else if (parms->rc == 0) { 19731205Sminshall return 0; 19831205Sminshall } else { 19931205Sminshall api_fcn_errno = parms->rc; 20031205Sminshall api_fcn_fcn_id = parms->function_id; 20131205Sminshall return -1; 20231205Sminshall } 20331205Sminshall } 20431205Sminshall 20531205Sminshall 20631205Sminshall api_write_keystroke(parms) 20731205Sminshall WriteKeystrokeParms *parms; 20831205Sminshall { 20931205Sminshall if (api_issue(0x09, WRITE_KEYSTROKE, 0x80, 0x20, 0, 210*31500Sminshall gate_keyboard, (char *)parms, sizeof *parms) == -1) { 21131205Sminshall api_fcn_errno = 0; 21231205Sminshall api_fcn_fcn_id = 0; 21331205Sminshall return -1; 21431205Sminshall } else if (parms->rc == 0) { 21531205Sminshall return 0; 21631205Sminshall } else { 21731205Sminshall api_fcn_errno = parms->rc; 21831205Sminshall api_fcn_fcn_id = parms->function_id; 21931205Sminshall return -1; 22031205Sminshall } 22131205Sminshall } 22231205Sminshall 22331205Sminshall 22431205Sminshall api_disable_input(parms) 22531205Sminshall DisableInputParms *parms; 22631205Sminshall { 22731205Sminshall if (api_issue(0x09, DISABLE_INPUT, 0x80, 0x20, 0, 228*31500Sminshall gate_keyboard, (char *)parms, sizeof *parms) == -1) { 22931205Sminshall api_fcn_errno = 0; 23031205Sminshall api_fcn_fcn_id = 0; 23131205Sminshall return -1; 23231205Sminshall } else if (parms->rc == 0) { 23331205Sminshall return 0; 23431205Sminshall } else { 23531205Sminshall api_fcn_errno = parms->rc; 23631205Sminshall api_fcn_fcn_id = parms->function_id; 23731205Sminshall return -1; 23831205Sminshall } 23931205Sminshall } 24031205Sminshall 24131205Sminshall api_enable_input(parms) 24231205Sminshall EnableInputParms *parms; 24331205Sminshall { 24431205Sminshall if (api_issue(0x09, ENABLE_INPUT, 0x80, 0x20, 0, 245*31500Sminshall gate_keyboard, (char *)parms, sizeof *parms) == -1) { 24631205Sminshall api_fcn_errno = 0; 24731205Sminshall api_fcn_fcn_id = 0; 24831205Sminshall return -1; 24931205Sminshall } else if (parms->rc == 0) { 25031205Sminshall return 0; 25131205Sminshall } else { 25231205Sminshall api_fcn_errno = parms->rc; 25331205Sminshall api_fcn_fcn_id = parms->function_id; 25431205Sminshall return -1; 25531205Sminshall } 25631205Sminshall } 25731205Sminshall 25831205Sminshall /* 25931205Sminshall * Copy Services 26031205Sminshall */ 26131205Sminshall 26231205Sminshall api_copy_string(parms) 26331205Sminshall CopyStringParms *parms; 26431205Sminshall { 26531210Sminshall if (api_issue(0x09, COPY_STRING, 0x80, 0x20, 0xff, 266*31500Sminshall gate_copy, (char *)parms, sizeof *parms) == -1) { 26731205Sminshall api_fcn_errno = 0; 26831205Sminshall api_fcn_fcn_id = 0; 26931205Sminshall return -1; 27031205Sminshall } else if (parms->rc == 0) { 27131205Sminshall return 0; 27231205Sminshall } else { 27331205Sminshall api_fcn_errno = parms->rc; 27431205Sminshall api_fcn_fcn_id = parms->function_id; 27531205Sminshall return -1; 27631205Sminshall } 27731205Sminshall } 27831205Sminshall 27931205Sminshall /* 28031205Sminshall * Operator Information Area Services 28131205Sminshall */ 28231205Sminshall 28331205Sminshall api_read_oia_group(parms) 28431205Sminshall ReadOiaGroupParms *parms; 28531205Sminshall { 28631210Sminshall if (api_issue(0x09, READ_OIA_GROUP, 0x80, 0x20, 0xff, 287*31500Sminshall gate_oiam, (char *)parms, sizeof *parms) == -1) { 28831205Sminshall api_fcn_errno = 0; 28931205Sminshall api_fcn_fcn_id = 0; 29031205Sminshall return -1; 29131205Sminshall } else if (parms->rc == 0) { 29231205Sminshall return 0; 29331205Sminshall } else { 29431205Sminshall api_fcn_errno = parms->rc; 29531205Sminshall api_fcn_fcn_id = parms->function_id; 29631205Sminshall return -1; 29731205Sminshall } 29831205Sminshall } 29931205Sminshall 30031205Sminshall /* 30131493Sminshall * The "we are done" routine. This gets called last. 30231493Sminshall */ 30331493Sminshall 30431493Sminshall api_finish() 30531493Sminshall { 30631493Sminshall #if defined(unix) 30731493Sminshall if (api_close_api() == -1) { 30831493Sminshall return -1; 30931493Sminshall } else { 31031493Sminshall return 0; 31131493Sminshall } 31231493Sminshall #endif /* defined(unix) */ 31331493Sminshall } 31431493Sminshall 31531493Sminshall 31631493Sminshall /* 31731205Sminshall * The initialization routine. Be sure to call this first. 31831205Sminshall */ 31931205Sminshall 32031205Sminshall api_init() 32131205Sminshall { 32231205Sminshall union REGS regs; 32331205Sminshall struct SREGS sregs; 32431205Sminshall 32531458Sminshall #if defined(MSDOS) 32631205Sminshall regs.h.ah = 0x35; 32731205Sminshall regs.h.al = API_INTERRUPT_NUMBER; 32831205Sminshall intdosx(®s, ®s, &sregs); 32931205Sminshall 33031205Sminshall if ((regs.x.bx == 0) && (sregs.es == 0)) { 33131205Sminshall return 0; /* Interrupt not being handled */ 33231205Sminshall } 33331458Sminshall #endif defined(MSDOS) 33431458Sminshall #if defined(unix) 33531458Sminshall if (api_open_api(0) == -1) { 33631458Sminshall return 0; 33731458Sminshall } 33831458Sminshall #endif /* defined(unix) */ 33931205Sminshall 34031205Sminshall gate_sessmgr = api_name_resolve("SESSMGR"); 34131205Sminshall gate_keyboard = api_name_resolve("KEYBOARD"); 34231205Sminshall gate_copy = api_name_resolve("COPY"); 34331205Sminshall gate_oiam = api_name_resolve("OIAM"); 34431205Sminshall 34531205Sminshall if ((gate_sessmgr == gate_keyboard) || 34631205Sminshall (gate_sessmgr == gate_copy) || 34731205Sminshall (gate_sessmgr == gate_oiam) || 34831205Sminshall (gate_keyboard == gate_copy) || 34931205Sminshall (gate_keyboard == gate_oiam) || 35031205Sminshall (gate_copy == gate_oiam)) { 35131205Sminshall return 0; /* Interrupt doesn't seem correct */ 35231205Sminshall } 35331205Sminshall return 1; 35431205Sminshall } 355