1 /* 2 * Copyright (c) 1988 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that this notice is preserved and that due credit is given 7 * to the University of California at Berkeley. The name of the University 8 * may not be used to endorse or promote products derived from this 9 * software without specific prior written permission. This software 10 * is provided ``as is'' without express or implied warranty. 11 */ 12 13 #ifndef lint 14 static char sccsid[] = "@(#)apilib.c 3.2 (Berkeley) 03/28/88"; 15 #endif /* not lint */ 16 17 #include "../ctlr/api.h" 18 19 #include "apilib.h" 20 21 int 22 api_sup_errno = 0, /* Supervisor error number */ 23 api_sup_fcn_id = 0, /* Supervisor function id (0x12) */ 24 api_fcn_errno = 0, /* Function error number */ 25 api_fcn_fcn_id = 0; /* Function ID (0x6b, etc.) */ 26 27 static int 28 gate_sessmgr = 0, 29 gate_keyboard = 0, 30 gate_copy = 0, 31 gate_oiam = 0; 32 33 /* 34 * Issue an API request, with reg structures supplied by the caller. 35 * 36 * Only certain routines need this (supervisor services come to mind). 37 */ 38 39 static int 40 api_issue_regs(ah, al, bh, bl, cx, dx, parms, length, regs, sregs) 41 int ah, al, bh, bl, cx, dx; 42 char *parms; 43 int length; 44 union REGS *regs; 45 struct SREGS *sregs; 46 { 47 char far *ourseg = parms; 48 49 regs->h.ah = ah; 50 regs->h.al = al; 51 regs->h.bh = bh; 52 regs->h.bl = bl; 53 regs->x.cx = cx; 54 regs->x.dx = dx; 55 sregs->es = (int) FP_SEG(ourseg); 56 regs->x.di = (int) FP_OFF(ourseg); 57 58 #if defined(MSDOS) 59 int86x(API_INTERRUPT_NUMBER, regs, regs, sregs); 60 #endif /* defined(MSDOS) */ 61 #if defined(unix) 62 api_exch_api(regs, sregs, parms, length); 63 #endif /* defined(unix) */ 64 65 if (regs->h.cl != 0) { 66 api_sup_errno = regs->h.cl; 67 return -1; 68 } else { 69 return 0; 70 } 71 } 72 73 74 /* 75 * Issue an API request without requiring caller to supply 76 * registers. Most routines use this. 77 */ 78 79 static int 80 api_issue(ah, al, bh, bl, cx, dx, parms, length) 81 int 82 ah, 83 al, 84 bh, 85 bl, 86 cx, 87 dx; 88 char *parms; 89 int length; /* Length of parms */ 90 { 91 union REGS regs; 92 struct SREGS sregs; 93 94 return api_issue_regs(ah, al, bh, bl, cx, dx, parms, length, ®s, &sregs); 95 } 96 97 /* 98 * Supervisor Services 99 */ 100 101 int 102 api_name_resolve(name) 103 char *name; 104 { 105 NameResolveParms parms; 106 int i; 107 union REGS regs; 108 struct SREGS sregs; 109 110 for (i = 0; i < sizeof parms.gate_name; i++) { 111 if (*name) { 112 parms.gate_name[i] = *name++; 113 } else { 114 parms.gate_name[i] = ' '; 115 } 116 } 117 118 if (api_issue_regs(NAME_RESOLUTION, 0, 0, 0, 0, 0, &parms, sizeof parms, ®s, &sregs) 119 == -1) { 120 return -1; 121 } else { 122 return regs.x.dx; 123 } 124 } 125 126 #if defined(unix) 127 /* 128 * Block until the oia or ps is modified. 129 */ 130 131 int 132 api_ps_or_oia_modified() 133 { 134 union REGS regs; 135 struct SREGS sregs; 136 137 if (api_issue_regs(PS_OR_OIA_MODIFIED, 0, 0, 0, 0, 0, 0, 0, ®s, &sregs) 138 == -1) { 139 return -1; 140 } else { 141 return 0; 142 } 143 } 144 #endif /* defined(unix) */ 145 146 /* 147 * Session Information Services 148 */ 149 150 api_query_session_id(parms) 151 QuerySessionIdParms *parms; 152 { 153 if (api_issue(0x09, QUERY_SESSION_ID, 0x80, 0x20, 0, 154 gate_sessmgr, (char *)parms, sizeof *parms) == -1) { 155 api_fcn_errno = 0; 156 api_fcn_fcn_id = 0; 157 return -1; 158 } else if (parms->rc == 0) { 159 return 0; 160 } else { 161 api_fcn_errno = parms->rc; 162 api_fcn_fcn_id = parms->function_id; 163 return -1; 164 } 165 } 166 167 168 api_query_session_parameters(parms) 169 QuerySessionParametersParms *parms; 170 { 171 if (api_issue(0x09, QUERY_SESSION_PARAMETERS, 0x80, 0x20, 0, 172 gate_sessmgr, (char *)parms, sizeof *parms) == -1) { 173 api_fcn_errno = 0; 174 api_fcn_fcn_id = 0; 175 return -1; 176 } else if (parms->rc == 0) { 177 return 0; 178 } else { 179 api_fcn_errno = parms->rc; 180 api_fcn_fcn_id = parms->function_id; 181 return -1; 182 } 183 } 184 185 api_query_session_cursor(parms) 186 QuerySessionCursorParms *parms; 187 { 188 if (api_issue(0x09, QUERY_SESSION_CURSOR, 0x80, 0x20, 0xff, 189 gate_sessmgr, (char *)parms, sizeof *parms) == -1) { 190 api_fcn_errno = 0; 191 api_fcn_fcn_id = 0; 192 return -1; 193 } else if (parms->rc == 0) { 194 return 0; 195 } else { 196 api_fcn_errno = parms->rc; 197 api_fcn_fcn_id = parms->function_id; 198 return -1; 199 } 200 } 201 202 /* 203 * Keyboard Services 204 */ 205 206 api_connect_to_keyboard(parms) 207 ConnectToKeyboardParms *parms; 208 { 209 if (api_issue(0x09, CONNECT_TO_KEYBOARD, 0x80, 0x20, 0, 210 gate_keyboard, (char *)parms, sizeof *parms) == -1) { 211 api_fcn_errno = 0; 212 api_fcn_fcn_id = 0; 213 return -1; 214 } else if (parms->rc == 0) { 215 return 0; 216 } else { 217 api_fcn_errno = parms->rc; 218 api_fcn_fcn_id = parms->function_id; 219 return -1; 220 } 221 } 222 223 224 api_disconnect_from_keyboard(parms) 225 DisconnectFromKeyboardParms *parms; 226 { 227 if (api_issue(0x09, DISCONNECT_FROM_KEYBOARD, 0x80, 0x20, 0, 228 gate_keyboard, (char *)parms, sizeof *parms) == -1) { 229 api_fcn_errno = 0; 230 api_fcn_fcn_id = 0; 231 return -1; 232 } else if (parms->rc == 0) { 233 return 0; 234 } else { 235 api_fcn_errno = parms->rc; 236 api_fcn_fcn_id = parms->function_id; 237 return -1; 238 } 239 } 240 241 242 api_write_keystroke(parms) 243 WriteKeystrokeParms *parms; 244 { 245 if (api_issue(0x09, WRITE_KEYSTROKE, 0x80, 0x20, 0, 246 gate_keyboard, (char *)parms, sizeof *parms) == -1) { 247 api_fcn_errno = 0; 248 api_fcn_fcn_id = 0; 249 return -1; 250 } else if (parms->rc == 0) { 251 return 0; 252 } else { 253 api_fcn_errno = parms->rc; 254 api_fcn_fcn_id = parms->function_id; 255 return -1; 256 } 257 } 258 259 260 api_disable_input(parms) 261 DisableInputParms *parms; 262 { 263 if (api_issue(0x09, DISABLE_INPUT, 0x80, 0x20, 0, 264 gate_keyboard, (char *)parms, sizeof *parms) == -1) { 265 api_fcn_errno = 0; 266 api_fcn_fcn_id = 0; 267 return -1; 268 } else if (parms->rc == 0) { 269 return 0; 270 } else { 271 api_fcn_errno = parms->rc; 272 api_fcn_fcn_id = parms->function_id; 273 return -1; 274 } 275 } 276 277 api_enable_input(parms) 278 EnableInputParms *parms; 279 { 280 if (api_issue(0x09, ENABLE_INPUT, 0x80, 0x20, 0, 281 gate_keyboard, (char *)parms, sizeof *parms) == -1) { 282 api_fcn_errno = 0; 283 api_fcn_fcn_id = 0; 284 return -1; 285 } else if (parms->rc == 0) { 286 return 0; 287 } else { 288 api_fcn_errno = parms->rc; 289 api_fcn_fcn_id = parms->function_id; 290 return -1; 291 } 292 } 293 294 /* 295 * Copy Services 296 */ 297 298 api_copy_string(parms) 299 CopyStringParms *parms; 300 { 301 if (api_issue(0x09, COPY_STRING, 0x80, 0x20, 0xff, 302 gate_copy, (char *)parms, sizeof *parms) == -1) { 303 api_fcn_errno = 0; 304 api_fcn_fcn_id = 0; 305 return -1; 306 } else if (parms->rc == 0) { 307 return 0; 308 } else { 309 api_fcn_errno = parms->rc; 310 api_fcn_fcn_id = parms->function_id; 311 return -1; 312 } 313 } 314 315 /* 316 * Operator Information Area Services 317 */ 318 319 api_read_oia_group(parms) 320 ReadOiaGroupParms *parms; 321 { 322 if (api_issue(0x09, READ_OIA_GROUP, 0x80, 0x20, 0xff, 323 gate_oiam, (char *)parms, sizeof *parms) == -1) { 324 api_fcn_errno = 0; 325 api_fcn_fcn_id = 0; 326 return -1; 327 } else if (parms->rc == 0) { 328 return 0; 329 } else { 330 api_fcn_errno = parms->rc; 331 api_fcn_fcn_id = parms->function_id; 332 return -1; 333 } 334 } 335 336 /* 337 * The "we are done" routine. This gets called last. 338 */ 339 340 api_finish() 341 { 342 #if defined(unix) 343 if (api_close_api() == -1) { 344 return -1; 345 } else { 346 return 0; 347 } 348 #endif /* defined(unix) */ 349 } 350 351 352 /* 353 * The initialization routine. Be sure to call this first. 354 */ 355 356 api_init() 357 { 358 union REGS regs; 359 struct SREGS sregs; 360 361 #if defined(MSDOS) 362 regs.h.ah = 0x35; 363 regs.h.al = API_INTERRUPT_NUMBER; 364 intdosx(®s, ®s, &sregs); 365 366 if ((regs.x.bx == 0) && (sregs.es == 0)) { 367 return 0; /* Interrupt not being handled */ 368 } 369 #endif /* defined(MSDOS) */ 370 #if defined(unix) 371 if (api_open_api(0) == -1) { 372 return 0; 373 } 374 #endif /* defined(unix) */ 375 376 gate_sessmgr = api_name_resolve("SESSMGR"); 377 gate_keyboard = api_name_resolve("KEYBOARD"); 378 gate_copy = api_name_resolve("COPY"); 379 gate_oiam = api_name_resolve("OIAM"); 380 381 if ((gate_sessmgr == gate_keyboard) || 382 (gate_sessmgr == gate_copy) || 383 (gate_sessmgr == gate_oiam) || 384 (gate_keyboard == gate_copy) || 385 (gate_keyboard == gate_oiam) || 386 (gate_copy == gate_oiam)) { 387 return 0; /* Interrupt doesn't seem correct */ 388 } 389 return 1; 390 } 391