Annotation of 43BSDReno/usr.bin/tn3270/ctlr/api.c, revision 1.1.1.1

1.1       root        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 the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  */
                     17: 
                     18: #ifndef lint
                     19: static char sccsid[] = "@(#)api.c      4.4 (Berkeley) 10/31/89";
                     20: #endif /* not lint */
                     21: 
                     22: /*
                     23:  * This file implements the API used in the PC version.
                     24:  */
                     25: 
                     26: #include <stdio.h>
                     27: 
                     28: #include "api.h"
                     29: #include "../general/general.h"
                     30: 
                     31: #include "../api/disp_asc.h"
                     32: 
                     33: #include "screen.h"
                     34: #include "hostctlr.h"
                     35: #include "oia.h"
                     36: 
                     37: #include "../general/globals.h"
                     38: 
                     39: int apitrace = 0;
                     40: 
                     41: /*
                     42:  * Some defines for things we use internally.
                     43:  */
                     44: 
                     45: #define        PS_SESSION_ID   23
                     46: #define        BUF_SESSION_ID  0
                     47: 
                     48: /*
                     49:  * General utility routines.
                     50:  */
                     51: 
                     52: #if    defined(MSDOS)
                     53: 
                     54: #if    defined(LINT_ARGS)
                     55: static void movetous(char *, int, int, int);
                     56: static void movetothem(int, int, char *, int);
                     57: #endif /* defined(LINT_ARGS) */
                     58: 
                     59: #define        access_api(foo,length,copyin)   (foo)
                     60: #define        unaccess_api(foo,goo,length,copyout)
                     61: 
                     62: static void
                     63: movetous(parms, es, di, length)
                     64: char *parms;
                     65: int es, di;
                     66: int length;
                     67: {
                     68:     char far *farparms = parms;
                     69: 
                     70:     movedata(es, di, FP_SEG(farparms), FP_OFF(farparms), length);
                     71:     if (apitrace) {
                     72:        Dump('(', parms, length);
                     73:     }
                     74: }
                     75: 
                     76: static void
                     77: movetothem(es, di, parms, length)
                     78: int es, di;
                     79: char *parms;
                     80: int length;
                     81: {
                     82:     char far *farparms = parms;
                     83: 
                     84:     movedata(FP_SEG(farparms), FP_OFF(farparms), es, di, length);
                     85:     if (apitrace) {
                     86:        Dump(')', parms, length);
                     87:     }
                     88: }
                     89: #endif /* defined(MSDOS) */
                     90: 
                     91: #if    defined(unix)
                     92: extern char *access_api();
                     93: extern void movetous(), movetothem(), unaccess_api();
                     94: #endif /* defined(unix) */
                     95: 
                     96: 
                     97: /*
                     98:  * Supervisor Services.
                     99:  */
                    100: 
                    101: static void
                    102: name_resolution(regs, sregs)
                    103: union REGS *regs;
                    104: struct SREGS *sregs;
                    105: {
                    106:     NameResolveParms parms;
                    107: 
                    108:     movetous((char *) &parms, sregs->es, regs->x.di, sizeof parms);
                    109: 
                    110:     regs->h.cl = 0;
                    111:     if (memcmp((char *)&parms, NAME_SESSMGR, sizeof parms.gate_name) == 0) {
                    112:        regs->x.dx = GATE_SESSMGR;
                    113:     } else if (memcmp((char *)&parms, NAME_KEYBOARD,
                    114:                                        sizeof parms.gate_name) == 0) {
                    115:        regs->x.dx = GATE_KEYBOARD;
                    116:     } else if (memcmp((char *)&parms, NAME_COPY, sizeof parms.gate_name) == 0) {
                    117:        regs->x.dx = GATE_COPY;
                    118:     } else if (memcmp((char *)&parms, NAME_OIAM, sizeof parms.gate_name) == 0) {
                    119:        regs->x.dx = GATE_OIAM;
                    120:     } else {
                    121:        regs->h.cl = 0x2e;      /* Name not found */
                    122:     }
                    123:     regs->h.ch = 0x12;
                    124:     regs->h.bh = 7;
                    125: }
                    126: 
                    127: /*
                    128:  * Session Information Services.
                    129:  */
                    130: 
                    131: static void
                    132: query_session_id(regs, sregs)
                    133: union REGS *regs;
                    134: struct SREGS *sregs;
                    135: {
                    136:     QuerySessionIdParms parms;
                    137: 
                    138:     movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms);
                    139: 
                    140:     if ((parms.rc != 0) || (parms.function_id != 0)) {
                    141:        parms.rc = 0x0c;
                    142:     } else if (parms.option_code != 0x01) {
                    143:        parms.rc = 0x0d;        /* Invalid option code */
                    144: #ifdef NOTOBS
                    145:     } else if ((parms.data_code != 0x45) && (parms.data_code != 0x00/*OBS*/)) {
                    146:        parms.rc = 0x0b;
                    147: #endif /* NOTOBS */
                    148:     } else {
                    149:        NameArray list;
                    150: 
                    151:        movetous((char *)&list, FP_SEG(parms.name_array),
                    152:                    FP_OFF(parms.name_array), sizeof list);
                    153:        if ((list.length < 14) || (list.length > 170)) {
                    154:            parms.rc = 0x12;
                    155:        } else {
                    156:            list.number_matching_session = 1;
                    157:            list.name_array_element.short_name = parms.data_code;
                    158:            list.name_array_element.type = TYPE_DFT;
                    159:            list.name_array_element.session_id = PS_SESSION_ID;
                    160:            memcpy(list.name_array_element.long_name, "ONLYSESS",
                    161:                            sizeof list.name_array_element.long_name);
                    162:            movetothem(FP_SEG(parms.name_array),
                    163:                FP_OFF(parms.name_array), (char *)&list, sizeof list);
                    164:            parms.rc = 0;
                    165:        }
                    166:     }
                    167:     parms.function_id = 0x6b;
                    168:     movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms);
                    169: }
                    170: 
                    171: static void
                    172: query_session_parameters(regs, sregs)
                    173: union REGS *regs;
                    174: struct SREGS *sregs;
                    175: {
                    176:     QuerySessionParametersParms parms;
                    177: 
                    178:     movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms);
                    179: 
                    180:     if ((parms.rc !=0) || (parms.function_id != 0)) {
                    181:        parms.rc = 0x0c;
                    182:     } else if (parms.session_id != PS_SESSION_ID) {
                    183:        parms.rc = 0x02;
                    184:     } else {
                    185:        parms.rc = 0;
                    186:        parms.session_type = TYPE_DFT;
                    187:        parms.session_characteristics = 0;      /* Neither EAB nor PSS */
                    188:        parms.rows = MaxNumberLines;
                    189:        parms.columns = MaxNumberColumns;
                    190:        parms.presentation_space = 0;
                    191:     }
                    192:     parms.function_id = 0x6b;
                    193:     movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms);
                    194: }
                    195: 
                    196: static void
                    197: query_session_cursor(regs, sregs)
                    198: union REGS *regs;
                    199: struct SREGS *sregs;
                    200: {
                    201:     QuerySessionCursorParms parms;
                    202: 
                    203:     movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms);
                    204: 
                    205:     if ((parms.rc != 0) || (parms.function_id != 0)) {
                    206:        parms.rc = 0x0c;
                    207:     } else if (parms.session_id != PS_SESSION_ID) {
                    208:        parms.rc = 0x02;
                    209:     } else {
                    210:        parms.rc = 0;
                    211:        parms.cursor_type = CURSOR_BLINKING;    /* XXX what is inhibited? */
                    212:        parms.row_address = ScreenLine(CursorAddress);
                    213:        parms.column_address = ScreenLineOffset(CursorAddress);
                    214:     }
                    215: 
                    216:     parms.function_id = 0x6b;
                    217:     movetothem(sregs->es, regs->x.di, (char *) &parms, sizeof parms);
                    218: }
                    219: 
                    220: /*
                    221:  * Keyboard Services.
                    222:  */
                    223: 
                    224: 
                    225: static void
                    226: connect_to_keyboard(regs, sregs)
                    227: union REGS *regs;
                    228: struct SREGS *sregs;
                    229: {
                    230:     ConnectToKeyboardParms parms;
                    231: 
                    232:     movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms);
                    233: 
                    234:     if ((parms.rc != 0) || (parms.function_id != 0)) {
                    235:        parms.rc = 0x0c;
                    236:     } else if (parms.session_id != PS_SESSION_ID) {
                    237:        parms.rc = 0x02;
                    238:     } else if (parms.intercept_options != 0) {
                    239:        parms.rc = 0x01;
                    240:     } else {
                    241:        parms.rc = 0;
                    242:        parms.first_connection_identifier = 0;
                    243:     }
                    244:     parms.function_id = 0x62;
                    245: 
                    246:     movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms);
                    247: }
                    248: 
                    249: static void
                    250: disconnect_from_keyboard(regs, sregs)
                    251: union REGS *regs;
                    252: struct SREGS *sregs;
                    253: {
                    254:     DisconnectFromKeyboardParms parms;
                    255: 
                    256:     movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms);
                    257: 
                    258:     if ((parms.rc != 0) || (parms.function_id != 0)) {
                    259:        parms.rc = 0x0c;
                    260:     } else if (parms.session_id != PS_SESSION_ID) {
                    261:        parms.rc = 0x02;
                    262:     } else if (parms.connectors_task_id != 0) {
                    263:        parms.rc = 04;                  /* XXX */
                    264:     } else {
                    265:        parms.rc = 0;
                    266:     }
                    267:     parms.function_id = 0x62;
                    268: 
                    269:     movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms);
                    270: }
                    271: 
                    272: static void
                    273: write_keystroke(regs, sregs)
                    274: union REGS *regs;
                    275: struct SREGS *sregs;
                    276: {
                    277:     WriteKeystrokeParms parms;
                    278: 
                    279:     movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms);
                    280: 
                    281:     if ((parms.rc != 0) || (parms.function_id != 0)) {
                    282:        parms.rc = 0x0c;
                    283:     } else if (parms.session_id != PS_SESSION_ID) {
                    284:        parms.rc = 0x02;
                    285:     } else if (parms.connectors_task_id != 0) {
                    286:        parms.rc = 0x04;
                    287:     } else {
                    288:        parms.number_of_keys_sent = 0;
                    289:        parms.rc = 0;
                    290:        if (parms.options == OPTION_SINGLE_KEYSTROKE) {
                    291:            KeystrokeEntry *entry = &parms.keystroke_specifier.keystroke_entry;
                    292:            
                    293:            if (AcceptKeystroke(entry->scancode, entry->shift_state) == 0) {
                    294:                parms.rc = 0x10;                /* XXX needs 0x12 too! */
                    295:            }
                    296:            parms.number_of_keys_sent++;
                    297:        } else if (parms.options == OPTION_MULTIPLE_KEYSTROKES) {
                    298:            KeystrokeList
                    299:                list,
                    300:                far *atlist = parms.keystroke_specifier.keystroke_list;
                    301:            KeystrokeEntry
                    302:                entry[10],              /* 10 at a time */
                    303:                *ourentry,
                    304:                far *theirentry;
                    305:            int
                    306:                todo;
                    307: 
                    308:            movetous((char *)&list, FP_SEG(atlist),
                    309:                        FP_OFF(atlist), sizeof *atlist);
                    310:            todo = list.length/2;
                    311:            ourentry = entry+(highestof(entry)+1);
                    312:            theirentry = &atlist->keystrokes;
                    313: 
                    314:            while (todo) {
                    315:                if (ourentry > &entry[highestof(entry)]) {
                    316:                    int thistime;
                    317: 
                    318:                    thistime = todo;
                    319:                    if (thistime > numberof(entry)) {
                    320:                        thistime = numberof(entry);
                    321:                    }
                    322:                    movetous((char *)entry, FP_SEG(theirentry),
                    323:                            FP_OFF(theirentry), thistime*sizeof *theirentry);
                    324:                    theirentry += thistime;
                    325:                    ourentry = entry;
                    326:                }
                    327:                if (AcceptKeystroke(ourentry->scancode,
                    328:                                                ourentry->shift_state) == 0) {
                    329:                    parms.rc = 0x10;            /* XXX needs 0x12 too! */
                    330:                    break;
                    331:                }
                    332:                parms.number_of_keys_sent++;
                    333:                ourentry++;
                    334:                todo--;
                    335:            }
                    336:        } else {
                    337:            parms.rc = 0x01;
                    338:        }
                    339:     }
                    340:     parms.function_id = 0x62;
                    341: 
                    342:     movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms);
                    343: /* XXX */
                    344: }
                    345: 
                    346: 
                    347: static void
                    348: disable_input(regs, sregs)
                    349: union REGS *regs;
                    350: struct SREGS *sregs;
                    351: {
                    352:     DisableInputParms parms;
                    353: 
                    354:     movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms);
                    355: 
                    356:     if ((parms.rc != 0) || (parms.function_id != 0)) {
                    357:        parms.rc = 0x0c;
                    358:     } else if (parms.session_id != PS_SESSION_ID) {
                    359:        parms.rc = 0x02;
                    360:     } else if (parms.connectors_task_id != 0) {
                    361:        parms.rc = 0x04;
                    362:     } else {
                    363:        SetOiaApiInhibit(&OperatorInformationArea);
                    364:        parms.rc = 0;
                    365:     }
                    366:     parms.function_id = 0x62;
                    367: 
                    368:     movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms);
                    369: }
                    370: 
                    371: static void
                    372: enable_input(regs, sregs)
                    373: union REGS *regs;
                    374: struct SREGS *sregs;
                    375: {
                    376:     EnableInputParms parms;
                    377: 
                    378:     movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms);
                    379: 
                    380:     if ((parms.rc != 0) || (parms.function_id != 0)) {
                    381:        parms.rc = 0x0c;
                    382:     } else if (parms.session_id != PS_SESSION_ID) {
                    383:        parms.rc = 0x02;
                    384:     } else if (parms.connectors_task_id != 0) {
                    385:        parms.rc = 0x04;
                    386:     } else {
                    387:        ResetOiaApiInhibit(&OperatorInformationArea);
                    388:        parms.rc = 0;
                    389:     }
                    390:     parms.function_id = 0x62;
                    391: 
                    392:     movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms);
                    393: }
                    394: 
                    395: /*
                    396:  * Copy Services.
                    397:  */
                    398: 
                    399: static
                    400: copy_subroutine(target, source, parms, what_is_user, length)
                    401: BufferDescriptor *target, *source;
                    402: CopyStringParms *parms;
                    403: int what_is_user;
                    404: #define        USER_IS_TARGET  0
                    405: #define        USER_IS_SOURCE  1
                    406: {
                    407: #define        TARGET_NO_EAB           1
                    408: #define        SOURCE_NO_EAB           2
                    409: #define        TARGET_PC               4
                    410: #define        SOURCE_PC               8
                    411: #define        NO_FIELD_ATTRIBUTES     16
                    412:     int needtodo = 0;
                    413:     int access_length;
                    414:     char far *input;
                    415:     char far *output;
                    416:     char far *access_pointer;
                    417: 
                    418:     if ((target->characteristics^source->characteristics)
                    419:                    &CHARACTERISTIC_EAB) {
                    420:        if (target->characteristics&CHARACTERISTIC_EAB) {
                    421:            needtodo |= TARGET_NO_EAB;  /* Need to bump for EAB in target */
                    422:        } else {
                    423:            needtodo |= SOURCE_NO_EAB;  /* Need to bump for EAB in source */
                    424:        }
                    425:     }
                    426:     if (target->session_type != source->session_type) {
                    427:        if (target->session_type == TYPE_PC) {
                    428:            needtodo |= TARGET_PC;      /* scan codes to PC */
                    429:        } else {
                    430:            needtodo |= SOURCE_PC;      /* PC to scan codes */
                    431:        }
                    432:     }
                    433:     if ((parms->copy_mode&COPY_MODE_FIELD_ATTRIBUTES) == 0) {
                    434:        needtodo |= NO_FIELD_ATTRIBUTES;
                    435:     }
                    436:     access_length = length;
                    437:     if (what_is_user == USER_IS_TARGET) {
                    438:        if (target->characteristics&CHARACTERISTIC_EAB) {
                    439:            access_length *= 2;
                    440:        }
                    441:        input = (char far *) &Host[source->begin];
                    442:        access_pointer = target->buffer;
                    443:        output = access_api(target->buffer, access_length, 0);
                    444:     } else {
                    445:        if (source->characteristics&CHARACTERISTIC_EAB) {
                    446:            access_length *= 2;
                    447:        }
                    448:        access_pointer = source->buffer;
                    449:        input = access_api(source->buffer, access_length, 1);
                    450:        output = (char far *) &Host[target->begin];
                    451:     }
                    452:     while (length--) {
                    453:        if (needtodo&TARGET_PC) {
                    454:            *output++ = disp_asc[*input++];
                    455:        } else if (needtodo&SOURCE_PC) {
                    456:            *output++ = asc_disp[*input++];
                    457:        } else {
                    458:            *output++ = *input++;
                    459:        }
                    460:        if (needtodo&TARGET_NO_EAB) {
                    461:            input++;
                    462:        } else if (needtodo&SOURCE_NO_EAB) {
                    463:            *output++ = 0;              /* Should figure out good EAB? */
                    464:        }
                    465:     }
                    466:     if (what_is_user == USER_IS_TARGET) {
                    467:        unaccess_api(target->buffer, access_pointer, access_length, 1);
                    468:     } else {
                    469:        unaccess_api(source->buffer, access_pointer, access_length, 0);
                    470:     }
                    471: }
                    472: 
                    473: 
                    474: static void
                    475: copy_string(regs, sregs)
                    476: union REGS *regs;
                    477: struct SREGS *sregs;
                    478: {
                    479:     CopyStringParms parms;
                    480:     BufferDescriptor *target = &parms.target, *source = &parms.source;
                    481:     int length;
                    482: 
                    483:     movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms);
                    484: 
                    485:     length = 1+parms.source_end-source->begin;
                    486:     if ((parms.rc != 0) || (parms.function_id !=0)) {
                    487:        parms.rc = 0x0c;
                    488:     } else if (target->session_id == BUF_SESSION_ID) { /* Target is buffer */
                    489:        if (source->session_id != PS_SESSION_ID) {              /* A no-no */
                    490:            parms.rc = 0x2;
                    491:        } else {
                    492:            if ((source->begin < 0) || (source->begin > highestof(Host))) {
                    493:                parms.rc = 0x06;                /* invalid source definition */
                    494:            } else {
                    495:                if ((source->begin+length) > highestof(Host)) {
                    496:                    length = highestof(Host)-source->begin;
                    497:                    parms.rc = 0x0f;    /* Truncate */
                    498:                }
                    499:                if ((source->characteristics == target->characteristics) &&
                    500:                    (source->session_type == target->session_type)) {
                    501:                    if (source->characteristics&CHARACTERISTIC_EAB) {
                    502:                        length *= 2;
                    503:                    }
                    504:                    movetothem(FP_SEG(target->buffer),
                    505:                            FP_OFF(target->buffer),
                    506:                            (char *)&Host[source->begin], length);
                    507:                } else {
                    508:                    copy_subroutine(target, source, &parms,
                    509:                                                        USER_IS_TARGET, length);
                    510:                }
                    511:            }
                    512:        }
                    513:     } else if (source->session_id != BUF_SESSION_ID) {
                    514:            parms.rc = 0xd;
                    515:     } else {
                    516:        /* Send to presentation space (3270 buffer) */
                    517:        if ((target->begin < 0) || (target->begin > highestof(Host))) {
                    518:            parms.rc = 0x07;            /* invalid target definition */
                    519:        } if (!UnLocked) {
                    520:                parms.rc = 0x03;        /* Keyboard locked */
                    521:        } else if (parms.copy_mode != 0) {
                    522:                parms.rc = 0x0f;        /* Copy of field attr's not allowed */
                    523:        } else if (IsProtected(target->begin) || /* Make sure no protected */
                    524:                    (WhereAttrByte(target->begin) !=    /* in range */
                    525:                            WhereAttrByte(target->begin+length-1))) {
                    526:                parms.rc = 0x0e;        /* Attempt to write in protected */
                    527:        } else {
                    528:            if ((target->begin+length) > highestof(Host)) {
                    529:                length = highestof(Host)-target->begin;
                    530:                parms.rc = 0x0f;        /* Truncate */
                    531:            }
                    532:            TurnOnMdt(target->begin);   /* Things have changed */
                    533:            if ((source->characteristics == target->characteristics) &&
                    534:                    (source->session_type == target->session_type)) {
                    535:                if (source->characteristics&CHARACTERISTIC_EAB) {
                    536:                    length *= 2;
                    537:                }
                    538:                movetous((char *)&Host[target->begin],
                    539:                            FP_SEG(source->buffer),
                    540:                            FP_OFF(source->buffer), length);
                    541:            } else {
                    542:                copy_subroutine(target, source, &parms, USER_IS_SOURCE, length);
                    543:            }
                    544:        }
                    545:     }
                    546:     parms.function_id = 0x64;
                    547:     movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms);
                    548: }
                    549: 
                    550: 
                    551: /*
                    552:  * Operator Information Area Services.
                    553:  */
                    554: 
                    555: static void
                    556: read_oia_group(regs, sregs)
                    557: union REGS *regs;
                    558: struct SREGS *sregs;
                    559: {
                    560:     ReadOiaGroupParms parms;
                    561: 
                    562:     movetous((char *)&parms, sregs->es, regs->x.di, sizeof parms);
                    563: 
                    564:     if ((parms.rc != 0) || (parms.function_id != 0)) {
                    565:        parms.rc = 0x0c;
                    566:     } else if (parms.session_id != PS_SESSION_ID) {
                    567:        parms.rc = 0x02;
                    568:     } else {
                    569:        int group = parms.oia_group_number;
                    570:        char *from;
                    571:        int size;
                    572: 
                    573:        if ((group != API_OIA_ALL_GROUPS) &&
                    574:                ((group > API_OIA_LAST_LEGAL_GROUP) || (group < 0))) {
                    575:        } else {
                    576:            if (group == API_OIA_ALL_GROUPS) {
                    577:                size = API_OIA_BYTES_ALL_GROUPS;
                    578:                from = (char *)&OperatorInformationArea;
                    579:            } else if (group == API_OIA_INPUT_INHIBITED) {
                    580:                size = sizeof OperatorInformationArea.input_inhibited;
                    581:                from = (char *)&OperatorInformationArea.input_inhibited[0];
                    582:            } else {
                    583:                size = 1;
                    584:                from = ((char *)&OperatorInformationArea)+group;
                    585:            }
                    586:            movetothem(FP_SEG(parms.oia_buffer), FP_OFF(parms.oia_buffer),
                    587:                        from, size);
                    588:        }
                    589:     }
                    590:     parms.function_id = 0x6d;
                    591:     movetothem(sregs->es, regs->x.di, (char *)&parms, sizeof parms);
                    592: }
                    593: 
                    594: /*ARGSUSED*/
                    595: static void
                    596: unknown_op(regs, sregs)
                    597: union REGS *regs;
                    598: struct SREGS *sregs;
                    599: {
                    600:     regs->h.ch = 0x12;
                    601:     regs->h.cl = 0x05;
                    602: }
                    603: 
                    604: 
                    605: handle_api(regs, sregs)
                    606: union REGS *regs;
                    607: struct SREGS *sregs;
                    608: {
                    609: /*
                    610:  * Do we need to log this transaction?
                    611:  */
                    612:     if (apitrace) {
                    613:        Dump('<', (char *)regs, sizeof *regs);
                    614:        Dump('<', (char *)sregs, sizeof *sregs);
                    615:     }
                    616:     if (regs->h.ah == NAME_RESOLUTION) {
                    617:        name_resolution(regs, sregs);
                    618: #if    defined(unix)
                    619:     } else if (regs->h.ah == PS_OR_OIA_MODIFIED) {
                    620:        while ((oia_modified == 0) && (ps_modified == 0)) {
                    621:            (void) Scheduler(1);
                    622:        }
                    623:        oia_modified = ps_modified = 0;
                    624: #endif /* defined(unix) */
                    625:     } else if (regs->h.ah != 0x09) {
                    626:        regs->h.ch = 0x12;
                    627:        regs->h.cl = 0x0f;              /* XXX Invalid environmental access */
                    628:     } else if (regs->x.bx != 0x8020) {
                    629:        regs->h.ch = 0x12;
                    630:        regs->h.cl = 0x08;              /* XXX Invalid wait specified */
                    631:     } else if (regs->h.ch != 0) {
                    632:        regs->x.cx = 0x1206;            /* XXX Invalid priority */
                    633:     } else {
                    634:        switch (regs->x.dx) {
                    635:        case GATE_SESSMGR:
                    636:            switch (regs->h.al) {
                    637:            case QUERY_SESSION_ID:
                    638:                if (regs->h.cl != 0) {
                    639:                    regs->x.cx = 0x1206;
                    640:                } else {
                    641:                    regs->x.cx = 0x1200;
                    642:                    query_session_id(regs, sregs);
                    643:                }
                    644:                break;
                    645:            case QUERY_SESSION_PARAMETERS:
                    646:                if (regs->h.cl != 0) {
                    647:                    regs->x.cx = 0x1206;
                    648:                } else {
                    649:                    regs->x.cx = 0x1200;
                    650:                    query_session_parameters(regs, sregs);
                    651:                }
                    652:                break;
                    653:            case QUERY_SESSION_CURSOR:
                    654:                if ((regs->h.cl != 0xff) && (regs->h.cl != 0x00/*OBS*/)) {
                    655:                    regs->x.cx = 0x1206;
                    656:                } else {
                    657:                    regs->x.cx = 0x1200;
                    658:                    query_session_cursor(regs, sregs);
                    659:                }
                    660:                break;
                    661:            default:
                    662:                unknown_op(regs, sregs);
                    663:                break;
                    664:            }
                    665:            break;
                    666:        case GATE_KEYBOARD:
                    667:            if (regs->h.cl != 00) {
                    668:                regs->x.cx = 0x1206;
                    669:            } else {
                    670:                regs->x.cx = 0x1200;
                    671:                switch (regs->h.al) {
                    672:                case CONNECT_TO_KEYBOARD:
                    673:                    connect_to_keyboard(regs, sregs);
                    674:                    break;
                    675:                case DISABLE_INPUT:
                    676:                    disable_input(regs, sregs);
                    677:                    break;
                    678:                case WRITE_KEYSTROKE:
                    679:                    write_keystroke(regs, sregs);
                    680:                    break;
                    681:                case ENABLE_INPUT:
                    682:                    enable_input(regs, sregs);
                    683:                    break;
                    684:                case DISCONNECT_FROM_KEYBOARD:
                    685:                    disconnect_from_keyboard(regs, sregs);
                    686:                    break;
                    687:                default:
                    688:                    unknown_op(regs, sregs);
                    689:                    break;
                    690:                }
                    691:            }
                    692:            break;
                    693:        case GATE_COPY:
                    694:            if (regs->h.cl != 0xff) {
                    695:                regs->x.cx = 0x1206;
                    696:            } else {
                    697:                regs->x.cx = 0x1200;
                    698:                switch (regs->h.al) {
                    699:                case COPY_STRING:
                    700:                    copy_string(regs, sregs);
                    701:                    break;
                    702:                default:
                    703:                    unknown_op(regs, sregs);
                    704:                    break;
                    705:                }
                    706:            }
                    707:            break;
                    708:        case GATE_OIAM:
                    709:            if (regs->h.cl != 0xff) {
                    710:                regs->x.cx = 0x1206;
                    711:            } else {
                    712:                regs->x.cx = 0x1200;
                    713:                switch (regs->h.al) {
                    714:                case READ_OIA_GROUP:
                    715:                    read_oia_group(regs, sregs);
                    716:                    break;
                    717:                default:
                    718:                    unknown_op(regs, sregs);
                    719:                    break;
                    720:                }
                    721:            }
                    722:            break;
                    723:        default:
                    724:            regs->h.ch = 0x12;
                    725:            regs->h.cl = 0x34;          /* Invalid GATE entry */
                    726:            break;
                    727:        }
                    728:     }
                    729: /*
                    730:  * Do we need to log this transaction?
                    731:  */
                    732:     if (apitrace) {
                    733:        Dump('>', (char *)regs, sizeof *regs);
                    734:        Dump('>', (char *)sregs, sizeof *sregs);
                    735: #ifdef MSDOS
                    736:        { char buf[10];  gets(buf); }
                    737: #endif /* MSDOS */
                    738:     }
                    739: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.