1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
|
page 80,132
; SCCSID = @(#)tmisc2.asm 4.3 85/06/25
; SCCSID = @(#)tmisc2.asm 4.3 85/06/25
TITLE Part7 COMMAND Transient Routines
; More misc routines
.xlist
.xcref
INCLUDE comsw.asm
INCLUDE DOSSYM.INC
INCLUDE comseg.asm
INCLUDE comequ.asm
INCLUDE ioctl.inc
.list
.cref
CODERES SEGMENT PUBLIC BYTE ;AC000;
CodeRes ENDS
DATARES SEGMENT PUBLIC BYTE ;AC000;
EXTRN IFFlag:BYTE
EXTRN PIPEFLAG:BYTE
EXTRN RE_OUTSTR:BYTE
EXTRN RE_OUT_APP:BYTE
DATARES ENDS
TRANDATA SEGMENT PUBLIC BYTE ;AC000;
EXTRN AccDen_PTR:WORD
EXTRN Extend_buf_ptr:word ;AN000;
EXTRN FULDIR_PTR:WORD
EXTRN msg_disp_class:byte ;AN000;
TRANDATA ENDS
TRANSPACE SEGMENT PUBLIC BYTE ;AC000;
EXTRN DESTINFO:BYTE
EXTRN DESTISDIR:BYTE
EXTRN KPARSE:BYTE ;AC000;
EXTRN ONE_CHAR_VAL:BYTE ;AN011;
EXTRN PATHCNT:WORD
EXTRN PATHPOS:WORD
EXTRN PATHSW:WORD
EXTRN RE_INSTR:BYTE
EXTRN RESSEG:WORD
EXTRN SRCBUF:BYTE
EXTRN SWITCHAR:BYTE
IF IBM
EXTRN ROM_CALL:BYTE
EXTRN ROM_CS:WORD
EXTRN ROM_IP:WORD
ENDIF
TRANSPACE ENDS
TRANCODE SEGMENT PUBLIC byte
ASSUME CS:TRANGROUP,DS:NOTHING,ES:NOTHING,SS:NOTHING
EXTRN CERROR:NEAR
IF IBM
EXTRN ROM_EXEC:NEAR
EXTRN ROM_SCAN:NEAR
ENDIF
PUBLIC IOSET
PUBLIC MOVE_TO_SRCBUF ;AN000;
PUBLIC PGETARG
PUBLIC SETPATH
PUBLIC TESTDOREIN
PUBLIC TESTDOREOUT
ASSUME DS:TRANGROUP
SETPATH:
;
; Get an ASCIZ argument from the unformatted parms
; DESTISDIR set if pathchars in string
; DESTINFO set if ? or * in string
;
MOV AX,[PATHCNT] ;AC000; get length of string
MOV SI,[PATHPOS] ;AC000; get start of source buffer
GETPATH:
MOV [DESTINFO],0
MOV [DESTISDIR],0
MOV SI,[PATHPOS]
MOV CX,[PATHCNT]
MOV DX,SI
JCXZ PATHDONE
PUSH CX
PUSH SI
INVOKE SWITCH
MOV [PATHSW],AX
POP BX
SUB BX,SI
POP CX
ADD CX,BX
MOV DX,SI
SKIPPATH:
;;;; IF KANJI 3/3/KK
MOV [KPARSE],0
SKIPPATH2:
;;;; ENDIF 3/3/KK
JCXZ PATHDONE
DEC CX
LODSB
;;;; IF KANJI 3/3/KK
INVOKE TESTKANJ
JZ TESTPPSEP
DEC CX
INC SI
INC [KPARSE]
JMP SKIPPATH2
TESTPPSEP:
;;;; ENDIF 3/3/KK
INVOKE PATHCHRCMP
JNZ TESTPMETA
INC [DESTISDIR]
TESTPMETA:
CMP AL,'?'
JNZ TESTPSTAR
OR [DESTINFO],2
TESTPSTAR:
CMP AL,star
JNZ TESTPDELIM
OR [DESTINFO],2
TESTPDELIM:
INVOKE DELIM
JZ PATHDONEDEC
CMP AL,[SWITCHAR]
JNZ SKIPPATH
PATHDONEDEC:
DEC SI
PATHDONE:
XOR AL,AL
XCHG AL,[SI]
INC SI
CMP AL,0DH
JNZ NOPSTORE
MOV [SI],AL ;Don't loose the CR
NOPSTORE:
MOV [PATHPOS],SI
MOV [PATHCNT],CX
return
PGETARG:
MOV SI,80H
LODSB
OR AL,AL
retz
CALL PSCANOFF
CMP AL,13
return
PSCANOFF:
LODSB
INVOKE DELIM
JNZ PSCANOFFD
CMP AL,';'
JNZ PSCANOFF ; ';' is not a delimiter
PSCANOFFD:
DEC SI ; Point to first non-delimiter
return
IOSET:
;
; ALL REGISTERS PRESERVED
;
ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING
PUSH DS
PUSH DX
PUSH AX
PUSH BX
PUSH CX
MOV DS,[RESSEG]
ASSUME DS:RESGROUP
CMP [PIPEFLAG],0
JNZ NOREDIR ; Don't muck up the pipe
TEST IFFlag,-1
JNZ NoRedir
CALL TESTDOREIN
CALL TESTDOREOUT
NOREDIR:
POP CX
POP BX
POP AX
POP DX
POP DS
ASSUME DS:NOTHING
return
TESTDOREIN:
ASSUME DS:RESGROUP
CMP [RE_INSTR],0
retz
PUSH DS
PUSH CS
POP DS
MOV DX,OFFSET tranGROUP:RE_INSTR
MOV AX,(OPEN SHL 8)
MOV BX,AX
INT int_command
POP DS
JC REDIRERR
MOV BX,AX
MOV AL,0FFH
;
; Mega sleaze!! We move the SFN from the new handle spot into the old stdin
; spot. We invalidate the new JFN we got.
;
XCHG AL,[BX.PDB_JFN_Table]
MOV DS:[PDB_JFN_Table],AL
return
;
; We had some kind of error on the redirection. Figure out what the
; appropriate message should be; BX has the system call that failed
;
REDIRERR:
PUSH CS
POP DS
Call TriageError
;
; At this point, we have recognized the network-generated access denied error.
; The correct message is in DX
;
CMP AX,65
JZ CERRORJ ;AC000; just issue message returned
CMP BH,OPEN
JZ OpenError
;
; The error was for a create operation. Report the error as a creation error.
;
MOV DX,OFFSET TranGroup:FULDIR_PTR
CERRORJ:
JMP CERROR
;
; The system call was an OPEN. Report either file not found or path not found.
;
OpenError:
mov msg_disp_class,ext_msg_class ;AN000; set up extended error msg class
mov dx,offset TranGroup:Extend_Buf_ptr ;AC000; get extended message pointer
mov Extend_Buf_ptr,ax ;AN000; get message number in control block
JMP CERROR
TESTDOREOUT:
ASSUME DS:RESGROUP
CMP [RE_OUTSTR],0
JNZ REOUTEXISTS ;AN017; need long jump
JMP NOREOUT ;AN017;
REOUTEXISTS:
CMP [RE_OUT_APP],0
JZ REOUTCRT
;
; The output redirection was for append. We open for write and seek to the
; end.
;
MOV DX,OFFSET RESGROUP:RE_OUTSTR
MOV AX,(OPEN SHL 8) OR 2 ;AC011; Open for read/write
PUSH AX
INT int_command
POP BX
JC OpenWriteError
MOV BX,AX
MOV AX,IOCTL SHL 8 ;AN035; Get attributes of handle
INT int_command ;AN035;
TEST DL,devid_ISDEV ;AN035; Is it a device?
JNZ SET_REOUT ;AN035; Yes, don't read from it
MOV AX,(LSEEK SHL 8) OR 2
MOV CX,-1 ;AC011; MOVE TO EOF -1
MOV DX,CX ;AC011;
INT int_command
PUSH CS ;AN011; Get transient seg to DS
POP DS ;AN011;
assume DS:Trangroup ;AN011;
MOV AX,(READ SHL 8) ;AN011; Read one byte from the
MOV CX,1 ;AN011; file into one_char_val
MOV DX,OFFSET Trangroup:ONE_CHAR_VAL;AN011;
INT int_command ;AN011;
JC OpenWriteError ;AN011; If error, exit
cmp ax,cx ;AN017; Did we read 1 byte?
jnz reout_0_length ;AN017; No - file must be 0 length
cmp one_char_val,01ah ;AN011; Was char an eof mark?
mov DS,[resseg] ;AN011; Get resident segment back
assume DS:Resgroup ;AN011;
JNZ SET_REOUT ;AN011; No, just continue
MOV AX,(LSEEK SHL 8) OR 1 ;AN011; EOF mark found
MOV CX,-1 ;AN011; LSEEK back one byte
MOV DX,CX ;AN011;
INT int_command ;AN011;
JMP SHORT SET_REOUT
reout_0_length: ;AN017; We have a 0 length file
mov DS,[resseg] ;AN017; Get resident segment back
assume DS:Resgroup ;AN017;
MOV AX,(LSEEK SHL 8) ;AN017; Move to beginning of file
XOR CX,CX ;AN017; Offset is 0
MOV DX,CX ;AN017;
INT int_command ;AN017;
JMP SHORT SET_REOUT ;AN017; now finish setting up redirection
OpenWriteError:
CMP AX,error_access_denied
STC ; preserve error
JNZ REOUTCRT ;AN017; need long jump
JMP REDIRERR ;AN017;
REOUTCRT:
MOV DX,OFFSET RESGROUP:RE_OUTSTR
XOR CX,CX
MOV AH,CREAT
PUSH AX
INT int_command
POP BX
JNC NOREDIRERR ;AC011;
JMP REDIRERR ;AC011;
NOREDIRERR: ;AN011;
MOV BX,AX
SET_REOUT:
;
; Mega sleaze!! We move the SFN from the new handle spot into the old stdout
; spot. We invalidate the new JFN we got.
;
MOV AL,0FFH
XCHG AL,[BX.PDB_JFN_Table]
MOV DS:[PDB_JFN_Table+1],AL
NOREOUT:
return
;
; Compute length of string (including NUL) in DS:SI into CX. Change no other
; registers
;
Procedure DSTRLEN,NEAR
SaveReg <AX>
XOR CX,CX
CLD
DLoop: LODSB
INC CX
OR AL,AL
JNZ DLoop
SUB SI,CX
RestoreReg <AX>
return
EndProc DSTRLEN
Break <Extended error support>
;
; TriageError will examine the return from a carry-set system call and
; return the correct error if applicable.
;
; Inputs: outputs from a carry-settable system call
; No system calls may be done in the interrim
; Outputs: If carry was set on input
; carry set on output
; DX contains trangroup offset to printf message
; else
; No registers changed
;
Procedure TriageError,NEAR
retnc ; no carry => do nothing...
PUSHF
SaveReg <BX,CX,SI,DI,BP,ES,DS,AX,DX>
MOV AH,GetExtendedError
INT 21h
RestoreReg <CX,BX> ; restore original AX
MOV DX,OFFSET TranGroup:AccDen_PTR
CMP AX,65 ; network access denied?
JZ NoMove ; Yes, return it.
MOV AX,BX
MOV DX,CX
NoMove:
RestoreReg <DS,ES,BP,DI,SI,CX,BX>
popf
return
EndProc TriageError
PUBLIC Triage_Init
Triage_Init proc FAR
call TriageError
ret
Triage_Init endp
; ****************************************************************
; *
; * ROUTINE: MOVE_TO_SRCBUF
; *
; * FUNCTION: Move ASCIIZ string from DS:SI to SRCBUF. Change
; * terminating 0 to 0dH. Set PATHCNT to length of
; * string. Set PATHPOS to start of SRCBUF.
; *
; * INPUT: DS:SI points to ASCIIZ string
; * ES points to TRANGROUP
; *
; * OUTPUT: SRCBUF filled in with string terminated by 0dH
; * PATHCNT set to length of string
; * PATHPOS set to start of SRCBUF
; * CX,AX changed
; *
; ****************************************************************
assume es:trangroup,ds:nothing ;AN000;
MOVE_TO_SRCBUF PROC NEAR ;AN000;
push si ;AN000; save si,di
push di ;AN000;
push cx ;AN000;
mov di,offset TRANGROUP:srcbuf ;AN000; set ES:DI to srcbuf
xor cx,cx ;AN000; clear cx for counint
mov ax,cx ;AN000; clear ax
push di ;AN000; save start of srcbuf
lodsb ;AN000; get a character from DS:SI
mts_get_chars: ;AN000;
cmp al,0 ;AN000; was it a null char?
jz mts_end_string ;AN000; yes - exit
stosb ;AN000; no - store it in srcbuf
inc cx ;AN000; increment length count
lodsb ;AN000; get a character from DS:SI
jmp short mts_get_chars ;AN000; go check it
mts_end_string: ;AN000; we've reached the end of line
mov al,end_of_line_in ;AN000; store 0dH in srcbuf
stosb ;AN000;
pop di ;AN000; restore start of srcbuf
push cs ;AN000; set DS to local segment
pop ds ;AN000;
assume ds:trangroup ;AN000;
mov [pathcnt],cx ;AN000; set patchcnt to length count
mov [pathpos],di ;AN000; set pathpos to start of srcbuf
pop cx ;AN000; restore cx,di,si
pop di ;AN000;
pop si ;AN000;
RET ;AN000; exit
MOVE_TO_SRCBUF ENDP ;AN000;
TRANCODE ENDS
END
|