1*31158Sminshall /* 2*31158Sminshall * This file implements the API used in the PC version. 3*31158Sminshall */ 4*31158Sminshall 5*31158Sminshall #include <stdio.h> 6*31158Sminshall #include <dos.h> 7*31158Sminshall #include <stdlib.h> 8*31158Sminshall 9*31158Sminshall #include "spint.h" 10*31158Sminshall #include "api.h" 11*31158Sminshall #include "../general.h" 12*31158Sminshall 13*31158Sminshall 14*31158Sminshall /* 15*31158Sminshall * Supervisor Services. 16*31158Sminshall */ 17*31158Sminshall 18*31158Sminshall static void 19*31158Sminshall name_resolve(regs, sregs) 20*31158Sminshall union REGS *regs; 21*31158Sminshall struct SREGS *sregs; 22*31158Sminshall { 23*31158Sminshall } 24*31158Sminshall 25*31158Sminshall /* 26*31158Sminshall * Session Information Services. 27*31158Sminshall */ 28*31158Sminshall 29*31158Sminshall static void 30*31158Sminshall query_session_id(regs, sregs) 31*31158Sminshall union REGS *regs; 32*31158Sminshall struct SREGS *sregs; 33*31158Sminshall { 34*31158Sminshall } 35*31158Sminshall 36*31158Sminshall static void 37*31158Sminshall query_session_parameters(regs, sregs) 38*31158Sminshall union REGS *regs; 39*31158Sminshall struct SREGS *sregs; 40*31158Sminshall { 41*31158Sminshall } 42*31158Sminshall 43*31158Sminshall static void 44*31158Sminshall query_session_cursor(regs, sregs) 45*31158Sminshall union REGS *regs; 46*31158Sminshall struct SREGS *sregs; 47*31158Sminshall { 48*31158Sminshall } 49*31158Sminshall 50*31158Sminshall /* 51*31158Sminshall * Keyboard Services. 52*31158Sminshall */ 53*31158Sminshall 54*31158Sminshall 55*31158Sminshall static void 56*31158Sminshall connect_to_keyboard(regs, sregs) 57*31158Sminshall union REGS *regs; 58*31158Sminshall struct SREGS *sregs; 59*31158Sminshall { 60*31158Sminshall } 61*31158Sminshall 62*31158Sminshall static void 63*31158Sminshall disable_input(regs, sregs) 64*31158Sminshall union REGS *regs; 65*31158Sminshall struct SREGS *sregs; 66*31158Sminshall { 67*31158Sminshall } 68*31158Sminshall 69*31158Sminshall static void 70*31158Sminshall write_keystroke(regs, sregs) 71*31158Sminshall union REGS *regs; 72*31158Sminshall struct SREGS *sregs; 73*31158Sminshall { 74*31158Sminshall } 75*31158Sminshall 76*31158Sminshall static void 77*31158Sminshall enable_input(regs, sregs) 78*31158Sminshall union REGS *regs; 79*31158Sminshall struct SREGS *sregs; 80*31158Sminshall { 81*31158Sminshall } 82*31158Sminshall 83*31158Sminshall /* 84*31158Sminshall * Copy Services. 85*31158Sminshall */ 86*31158Sminshall 87*31158Sminshall static void 88*31158Sminshall disconnect_from_keyboard(regs, sregs) 89*31158Sminshall union REGS *regs; 90*31158Sminshall struct SREGS *sregs; 91*31158Sminshall { 92*31158Sminshall } 93*31158Sminshall 94*31158Sminshall /* 95*31158Sminshall * Operator Information Area Services. 96*31158Sminshall */ 97*31158Sminshall 98*31158Sminshall static void 99*31158Sminshall read_oia_group(regs, sregs) 100*31158Sminshall union REGS *regs; 101*31158Sminshall struct SREGS *sregs; 102*31158Sminshall { 103*31158Sminshall } 104*31158Sminshall 105*31158Sminshall static void 106*31158Sminshall unknown_op(regs, sregs) 107*31158Sminshall union REGS *regs; 108*31158Sminshall struct SREGS *sregs; 109*31158Sminshall { 110*31158Sminshall regs->h.ch = 0x12; 111*31158Sminshall regs->h.cl = 0x05; 112*31158Sminshall } 113*31158Sminshall 114*31158Sminshall 115*31158Sminshall handle_api(regs, sregs) 116*31158Sminshall union REGS *regs; 117*31158Sminshall struct SREGS *sregs; 118*31158Sminshall { 119*31158Sminshall if (regs->h.ah == NAME_RESOLUTION) { 120*31158Sminshall name_resolution(regs, sregs); 121*31158Sminshall } else { 122*31158Sminshall switch (regs->x.dx) { 123*31158Sminshall case GATE_SESSMGR: 124*31158Sminshall switch (regs->h.al) { 125*31158Sminshall case QUERY_SESSION_ID: 126*31158Sminshall query_session_id(regs, sregs); 127*31158Sminshall break; 128*31158Sminshall case QUERY_SESSION_PARMS: 129*31158Sminshall query_session_parms(regs, sregs); 130*31158Sminshall break; 131*31158Sminshall case QUERY_SESSION_CURSOR: 132*31158Sminshall query_session_cursor(regs, sregs); 133*31158Sminshall break; 134*31158Sminshall default: 135*31158Sminshall unknown_op(regs, sregs); 136*31158Sminshall break; 137*31158Sminshall } 138*31158Sminshall break; 139*31158Sminshall case GATE_KEYBOARD: 140*31158Sminshall switch (regs->h.al) { 141*31158Sminshall case CONNECT_TO_KEYBOARD: 142*31158Sminshall connect_to_keyboard(regs, sregs); 143*31158Sminshall break; 144*31158Sminshall case DISABLE_INPUT: 145*31158Sminshall disable_input(regs, sregs); 146*31158Sminshall break; 147*31158Sminshall case WRITE_KEYSTROKE: 148*31158Sminshall write_keystroke(regs, sregs); 149*31158Sminshall break; 150*31158Sminshall case ENABLE_INPUT: 151*31158Sminshall enable_input(regs, sregs); 152*31158Sminshall break; 153*31158Sminshall case DISCONNECT_FROM_KEYBOARD: 154*31158Sminshall disconnect_from_keyboard(regs, sregs); 155*31158Sminshall break; 156*31158Sminshall default: 157*31158Sminshall unknown_op(regs, sregs); 158*31158Sminshall break; 159*31158Sminshall } 160*31158Sminshall break; 161*31158Sminshall case GATE_COPY: 162*31158Sminshall switch (regs->h.al) { 163*31158Sminshall case COPY_STRING: 164*31158Sminshall copy_string(regs, sregs); 165*31158Sminshall break; 166*31158Sminshall default: 167*31158Sminshall unknown_op(regs, sregs); 168*31158Sminshall break; 169*31158Sminshall } 170*31158Sminshall break; 171*31158Sminshall case GATE_OIAM: 172*31158Sminshall switch (regs->h.al) { 173*31158Sminshall case READ_OIA_GROUP: 174*31158Sminshall read_oia_group(regs, sregs); 175*31158Sminshall break; 176*31158Sminshall default: 177*31158Sminshall unknown_op(regs, sregs); 178*31158Sminshall break; 179*31158Sminshall } 180*31158Sminshall break; 181*31158Sminshall default: 182*31158Sminshall unknown_op(regs, sregs); 183*31158Sminshall break; 184*31158Sminshall } 185*31158Sminshall } 186*31158Sminshall } 187*31158Sminshall 188*31158Sminshall 189*31158Sminshall /* 190*31158Sminshall * Called from telnet.c to fork a lower command.com. We 191*31158Sminshall * use the spint... routines so that we can pick up 192*31158Sminshall * interrupts generated by application programs. 193*31158Sminshall */ 194*31158Sminshall 195*31158Sminshall 196*31158Sminshall int 197*31158Sminshall shell(argc,argv) 198*31158Sminshall int argc; 199*31158Sminshall char *argv[]; 200*31158Sminshall { 201*31158Sminshall Spint spinted; 202*31158Sminshall static char command[256]; 203*31158Sminshall 204*31158Sminshall ClearElement(spinted); 205*31158Sminshall spinted.int_no = API_INTERRUPT_NUMBER; 206*31158Sminshall if (argc == 1) { 207*31158Sminshall command[0] = 0; 208*31158Sminshall } else { 209*31158Sminshall char *cmdptr; 210*31158Sminshall int length; 211*31158Sminshall 212*31158Sminshall argc--; 213*31158Sminshall argv++; 214*31158Sminshall strcpy(command, " /c"); 215*31158Sminshall cmdptr = command+strlen(command); 216*31158Sminshall while (argc) { 217*31158Sminshall if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) { 218*31158Sminshall fprintf(stderr, "Argument list too long at argument *%s*.\n", 219*31158Sminshall *argv); 220*31158Sminshall return 0; 221*31158Sminshall } 222*31158Sminshall *cmdptr++ = ' '; /* Blank separators */ 223*31158Sminshall strcpy(cmdptr, *argv); 224*31158Sminshall cmdptr += strlen(cmdptr); 225*31158Sminshall argc--; 226*31158Sminshall argv++; 227*31158Sminshall } 228*31158Sminshall length = strlen(command)-1; 229*31158Sminshall if (length < 0) { 230*31158Sminshall length = 0; 231*31158Sminshall } 232*31158Sminshall command[0] = length; 233*31158Sminshall } 234*31158Sminshall 235*31158Sminshall /* 236*31158Sminshall * spint_start() returns when either the command has finished, or when 237*31158Sminshall * the required interrupt comes in. In the latter case, the appropriate 238*31158Sminshall * thing to do is to process the interrupt, and then return to 239*31158Sminshall * the interrupt issuer by calling spint_continue(). 240*31158Sminshall */ 241*31158Sminshall spint_start(command, &spinted); 242*31158Sminshall while (spinted.done == 0) { 243*31158Sminshall /* Process request */ 244*31158Sminshall handle_api(&spinted.regs, &spinted.sregs); 245*31158Sminshall spint_continue(&spinted); 246*31158Sminshall } 247*31158Sminshall if (spinted.rc != 0) { 248*31158Sminshall fprintf(stderr, "Process generated a return code of 0x%x.\n", 249*31158Sminshall spinted.rc); 250*31158Sminshall } 251*31158Sminshall return 0; 252*31158Sminshall } 253