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