xref: /csrg-svn/usr.bin/tn3270/ctlr/api.c (revision 31158)
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