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