summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/IFSFUNC/IFSHAND.ASM')
-rw-r--r--v4.0/src/CMD/IFSFUNC/IFSHAND.ASM903
1 files changed, 903 insertions, 0 deletions
diff --git a/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM b/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM
new file mode 100644
index 0000000..19a997f
--- /dev/null
+++ b/v4.0/src/CMD/IFSFUNC/IFSHAND.ASM
@@ -0,0 +1,903 @@
1 PAGE ,132 ;  ;AN000;
2; SCCSID = @(#)ifshand.asm 1.0 87/05/11 ;AN000;
3TITLE IFSFUNC HANDLE ROUTINES - Routines for FS dispatch ;AN000;
4NAME IFSHANDLE ;AN000;
5;******************************************************************************
6;
7; HANDLE (SFT) related FS calls
8;
9;
10; IFS_CLOSE
11; IFS_COMMIT
12; IFS_LSEEK
13; IFS_READ
14; IFS_WRITE
15; IFS_LOCK
16; IFS_XATTR
17;
18; REVISION HISTORY:
19; A000 Original version 4.00 May 1987
20; A001 P635 - Correct Read problem - restore es:di -> sft
21; RG Sept 1,1987
22; A002 P659 - Copy cmd problems (xattr)
23; RG Sept 1,1987
24; A003 P868 - Lock problems R.G
25; A004 P849 - Printer problems R.G
26; A005 P1601- lock/xattr problems R.G
27; A006 P????- Write Only Lock support in Lock Read/Write 10/27 FEIGENBAUM
28; A007 P2339- Not getting count back to user in xattr call 11/09 RG
29; A008 P2433- redir copy problem (Xattr) 11/17 RG
30; A009 P2566- xattrs not propagated across network 12/3 RG
31; (due to size check on set that does not offer size)
32; A010 D285 - Remove Extended Attributes/Lock 1/88 RG
33; A011 P2994- double close problem 1/88 RG
34; A012 P3149- basica file redirection - seek problem 1/88 RMG
35; A013 P3185- get ea cx check 1/88 RMG
36; A014 P3249- lock problem 1/88 RMG
37; A015 P3432- copy to remote ptr problem - write 2/88 RMG
38; A016 P3513- return cx on xattr wrong 2/88 RMG
39; A017 P3968- set sf time/date on close 3/25/88 RMG
40; A018 P4839- fcb open/ren/term problem on abort close 5/13/88 RMG
41; A019 P4791- don't overwrite ax on error 5/19/88 RMG
42; A020 P5003- LSEEK hang using Austin Test tool 6/01/88 RPS
43;
44; LOC - 251
45; Programming note: In the prologues to the routines, the input/output are
46; accurate. The pseudocode, however, is outdated and does
47; not reflect the code.
48;
49;******************************************************************************
50 ;AN000;
51.xlist ;AN000;
52.xcref ;AN000;
53INCLUDE IFSSYM.INC ;AN000;
54INCLUDE IFSFSYM.INC ;AN000;
55INCLUDE DOSSYM.INC ;AN000;
56INCLUDE DEVSYM.INC ;AN000;
57 ;AN000;
58.cref ;AN000;
59.list ;AN000;
60 ;AN000;
61AsmVars <IBM, Installed, DEBUG> ;AN000;
62 ;AN000;
63; define the base code segment of the network support first ;AN000;
64 ;AN000;
65IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
66IFSSEG ENDS ;AN000;
67 ;AN000;
68; include THE REST of the segment definitions for normal MSDOS ;AN000;
69 ;AN000;
70include dosseg.asm ;AN000;
71 ;AN000;
72DATA SEGMENT WORD PUBLIC 'DATA' ;AN000;
73 ;DOSGROUP Data ;AN000;
74 Extrn THISSFT:DWORD ;AN000;
75 Extrn DMAADD:DWORD ;AN000;
76 Extrn CurrentPDB:WORD ;AN000;
77 Extrn SAVE_BX:WORD
78 Extrn SAVE_CX:WORD
79 Extrn SAVE_DS:WORD
80 Extrn SAVE_SI:WORD
81 Extrn SAVE_ES:WORD
82 Extrn SAVE_DI:WORD
83DATA ENDS ;AN000;
84 ;AN000;
85 ;AN000;
86; define our own code segment ;AN000;
87 ;AN000;
88IFSSEG SEGMENT BYTE PUBLIC 'IFSSEG' ;AN000;
89 ASSUME SS:DOSGROUP,CS:IFSSEG ;AN000;
90 ;AN000;
91 ;IFS Data ;AN000;
92 Extrn THISDFL:DWORD ;AN000;
93 Extrn THISIFS:DWORD ;AN000;
94 Extrn IFSPROC_FLAGS:WORD ;AN000;
95 Extrn IFSR:WORD ;AN000;
96 Extrn DEVICE_CB@_OFFSET:WORD ;AN000;
97 ;AN000;
98BREAK <IFS_CLOSE Close a FS SFT> ;AN000;
99 ;AN000;
100;****************************************************************************** ;AN000;
101; ;AN000;
102; IFS_CLOSE - see IFS_COMMIT for details ;AN000;
103; ;AN000;
104;****************************************************************************** ;AN000;
105 ;AN000;
106 procedure IFS_CLOSE,NEAR ;AN000;
107ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
108 ;AN000;
109 ifsr_fcn_def EXECAPI ; define ifsr for close ;AN000;
110 ifsr_api_def CLOSEFILE ;AN000;
111 ;AN000;
112 TEST ES:[DI.SF_FLAGS],devid_file_clean + sf_close_nodate ;AN017;
113 JNZ C_05 ;AN017;
114 CallInstall DATE16,MultDOS,13 ; set sf date/time on close ;AN017;
115 MOV ES:[DI.SF_DATE],AX ;AN017;
116 MOV ES:[DI.SF_TIME],DX ;AN017;
117C_05: ;AN017;
118
119 SaveReg <ES,DI> ; save SFT ptr ;AN000;
120 CallInstall FREE_SFT,MultDOS,8 ; set SFT busy ;AN000;
121 PUSH AX ; save old ref count ;AN000;
122 ;AN000;
123 TEST ES:[DI.SF_MODE],SF_ISFCB ; always close fcb ;AN011;
124 JNZ C_10 ; only do real close when ;AN011;
125 CMP AX,1 ; sft being freed ;AN011;
126 JE C_10 ;AN011;
127 JMP C_80 ;AN011;
128C_10: ;AN011;
129 MOV CS:IFSPROC_FLAGS,ISCLOSE + SETDEVICECB ;AN000;
130 ; 2nd flag causes sft_to_sff to ;AN000;
131 ; set device cb@ ;AN000;
132 JMP C_20 ; cont. in ifs_commit ;AN000;
133 ;AN000;
134EndProc IFS_CLOSE ;AN000;
135 ;AN000;
136BREAK <IFS_COMMIT Commit a FS SFT> ;AN000;
137 ;AN000;
138;****************************************************************************** ;AN000;
139; ;AN000;
140; IFS_COMMIT ;AN000;
141; ;AN000;
142; Called by: IFSFUNC dispatcher ;AN000;
143; ;AN000;
144; Routines called: CALL_IFS DRIVE_FROM_SFT ;AN000;
145; SFT_TO_SFF ;AN000;
146; SFF_TO_SFT ;AN000;
147; ;AN000;
148; Inputs: ;AN000;
149; [THISSFT] set to the SFT for the file being used ;AN000;
150; ES:DI = [THISSFT] (date time are NOT correct) ;AN000;
151; SFT must never be for an FCB on commit (error not detected) ;AN000;
152; ;AN000;
153; Function: ;AN000;
154; Prep IFSRH: ;AN000;
155; * IFSR_LENGTH DW 40 ; Total length of request ;AN000;
156; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
157; + IFSR_RETCODE DW ? ;AN000;
158; + IFSR_RETCLASS DB ? ;AN000;
159; IFSR_RESV1 DB 16 DUP(0) ;AN000;
160; * IFSR_APIFUNC DB 14 ; Close/commit file ;AN000;
161; + IFSR_ERROR_CLASS DB ? ;AN000;
162; + IFSR_ERROR_ACTION DB ? ;AN000;
163; + IFSR_ERROR_LOCUS DB ? ;AN000;
164; + IFSR_ALLOWED DB ? ;AN000;
165; + IFSR_I24_RETRY DB ? ;AN000;
166; + IFSR_I24_RESP DB ? ;AN000;
167; IFSR_RESV2 DB ? ;AN000;
168; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
169; *+ IFSR_OPEN_CB@ DD ? ; SF ;AN000;
170; * IFSR_FUNC DB ? ; 0=CLOSE, 1=COMMIT ;AN000;
171; IFSR_RESV2 DB 0 ;AN000;
172; ;AN000;
173; IF close THEN ;AN000;
174; IFSR_FUNC = 0 ;AN000;
175; ELSE IFSR_FUNC = 1 ;AN000;
176; CALL routine, CALL_IFS, with pointer to SF_IFS_HDR ;AN000;
177; IF IFSR_RETCODE = 0 THEN ;AN000;
178; DO ;AN000;
179; Call SFF_TO_SFT ;AN000;
180; Decrement SF_REF_COUNT if close ;AN000;
181; Clear carry ;AN000;
182; ENDDO ;AN000;
183; ELSE DO {error} ;AN000;
184; AX = IFSR_RETCODE ;AN000;
185; Set carry ;AN000;
186; ENDDO ;AN000;
187; ENDIF ;AN000;
188; ;AN000;
189; Outputs: ;AN000;
190; sf_ref_count decremented on close unless FAIL ;AN000;
191; (AX has old value for COMMIT) ;AN000;
192; ES:DI point to SFT ;AN000;
193; Carry set if error (file deleted or disk changed) ;AN000;
194; ;AN000;
195; DS preserved, others destroyed ;AN000;
196; ;AN000;
197;****************************************************************************** ;AN000;
198 ;AN000;
199 procedure IFS_COMMIT,NEAR ;AN000;
200ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
201 ;AN000;
202 ifsr_fcn_def EXECAPI ;AN000;
203 ifsr_api_def CLOSEFILE ;AN000;
204 ;AN000;
205 MOV CS:IFSPROC_FLAGS,SETDEVICECB ; set ifsproc_flags ;AN000;
206C_20: ; (welcome ifs_close) ;AN000;
207 invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
208 invoke PREP_IFSR ; clear ifsrh ;AN000;
209 MOV DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
210 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
211 ; ES:BX -> IFSRH ;AN000;
212 ; IFSR_OPEN_CB@ ;AN000;
213 ; ds - IFSSEG ;AN000;
214 ;AN000;
215 MOV ES:[BX.IFSR_LENGTH],LENGTH_CLOSEFILE ; prep IFSRH ;AN000;
216 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
217 MOV ES:[BX.IFSR_APIFUNC],IFSCLOSEFILE ;AN000;
218 XOR AL,AL ;AN000;
219 TEST IFSPROC_FLAGS,ISCLOSE ;AN000;
220 JNZ C_40 ;AN000;
221 INC AL ;AN000;
222C_40: ;AN000;
223 MOV ES:[BX.IFSR_FUNC],AL ;AN000;
224 ;AN000;
225 invoke CALL_IFS ; *** call fs with close request ;AN000;
226 ;AN000;
227 JNC C_60 ;AN000;
228 TEST IFSPROC_FLAGS,ISCLOSE ; ifs error ;AN000;
229 JZ C_980 ; return w/carry, if close ;AN000;
230;;;;;;;;ADD SP,6 ; restore stack first ;AD018;
231 RestoreReg <CX,DI,ES> ; old ref count & sft ;AN018;;AC019;
232 CMP CX,1 ;AN018;;AC019;
233 JNE C_980 ;AN018;
234 MOV ES:[DI.sf_ref_count],0 ; If freeing, need to zap ;AN018;
235 JMP C_980 ;AN000;
236C_60: ;AN000;
237 invoke SFF_TO_SFT ;AN000;
238 TEST IFSPROC_FLAGS,ISCLOSE ;AN000;
239 JZ C_990 ; finished w/commit ;AN000;
240C_80: ;AN011;
241 RestoreReg <AX,DI,ES> ; old ref count & sft ;AN000;
242 CMP AX,1 ;AN000;
243 JNE C_990 ;AN000;
244 MOV ES:[DI.sf_ref_count],0 ; If freeing, need to zap ;AN000;
245 JMP C_990 ; busy mark ;AN000;
246 ;AN000;
247 ;AN000;
248C_980: ; Return area ;AN000;
249 STC ;AN000;
250 JMP C_1000 ;AN000;
251C_990: ;AN000;
252 CLC ;AN000;
253C_1000: ; preserve ds - dosgroup ;AN000;
254 PUSH SS ;AN000;
255 POP DS ;AN000;
256 return ;AN000;
257 ;AN000;
258EndProc IFS_COMMIT ;AN000;
259 ;AN000;
260BREAK <IFS_LSEEK Seek on a NET SFT> ;AN000;
261 ;AN000;
262;****************************************************************************** ;AN000;
263; ;AN000;
264; IFS_LSEEK ;AN000;
265; ;AN000;
266; Inputs: ;AN000;
267; ES:DI -> SFT ;AN000;
268; CX:DX = Input CX:DX to $Lseek (offset) ;AN000;
269; NOTE: THIS LSEEK IS ALWAYS ASSUMED TO BE A TYPE 2 (relative to EOF) ;AN000;
270; Function: ;AN000;
271; Prep IFSRH: ;AN000;
272; * IFSR_LENGTH DW 44 ; Request length ;AN000;
273; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
274; + IFSR_RETCODE DW ? ;AN000;
275; + IFSR_RETCLASS DB ? ;AN000;
276; IFSR_RESV1 DB 16 DUP(0) ;AN000;
277; * IFSR_APIFUNC DB 10 ; Lseek file ;AN000;
278; + IFSR_ERROR_CLASS DB ? ;AN000;
279; + IFSR_ERROR_ACTION DB ? ;AN000;
280; + IFSR_ERROR_LOCUS DB ? ;AN000;
281; + IFSR_ALLOWED DB ? ;AN000;
282; + IFSR_I24_RETRY DB ? ;AN000;
283; + IFSR_I24_RESP DB ? ;AN000;
284; IFSR_RESV2 DB ? ;AN000;
285; IFSR_DEVICE_CB@ DD ? ;AN000;
286; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SF ;AN000;
287; ; and set this as pointer to it. ;AN000;
288; * IFSR_MODE DB 2 ; Position mode: - BL ;AN000;
289; ; 2 = ptr moved eof + offset ;AN000;
290; IFSR_RESV2 DB 0 ;AN000;
291; * IFSR_POSITION DD ? ; displacement of LSEEK - CX:DX ;AN000;
292; ;AN000;
293; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
294; IF IFSR_RETCODE = 0 THEN ;AN000;
295; DO ;AN000;
296; Call SFF_TO_SFT ;AN000;
297; Set DX:AX = IFSR_POSITION ;AN000;
298; Clear carry ;AN000;
299; ENDDO ;AN000;
300; ELSE DO {error} ;AN000;
301; AX = IFSR_RETCODE ;AN000;
302; Set carry ;AN000;
303; ENDDO ;AN000;
304; ENDIF ;AN000;
305; Returns: ;AN000;
306; ES:DI -> SFT ;AN000;
307; Carry clear ;AN000;
308; DX:AX return as with local $Lseek ;AN000;
309; Carry Set ;AN000;
310; AX is error code ;AN000;
311; All destroyed ;AN000;
312; ;AN000;
313;****************************************************************************** ;AN000;
314 ;AN000;
315 procedure IFS_LSEEK,NEAR ;AN000;
316ASSUME DS:Nothing,ES:NOTHING ; Initially DS is unknown ;AN020;
317 ;AN000;
318 ifsr_fcn_def EXECAPI ; define ifsr for lseek ;AN000;
319 ifsr_api_def LSEEKFILE ;AN000;
320 ;AN000;
321 PUSH SS ; Set DS to DOSGROUP ;AN020;
322 POP DS ; ;AN020;
323ASSUME DS:DOSGROUP ; ;AN020;
324
325 MOV CS:IFSPROC_FLAGS,SETDEVICECB ; init processing flags ;AN000;
326 MOV WORD PTR [THISSFT],DI ;AN020;
327 MOV WORD PTR [THISSFT+2],ES ;AN020;
328 SaveReg <ES,DI> ; save for later restore before leave ;AN012;;AN020;
329
330 invoke PREP_IFSR ;AN000;
331 ;AN000;
332 invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
333 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
334 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
335 ; ES:BX -> IFSRH ;AN000;
336 ; IFSR_OPEN_CB@ ;AN000;
337 ; ds - IFSSEG ;AN000;
338 ;AN000;
339 MOV ES:[BX.IFSR_LENGTH],LENGTH_LSEEKFILE ; prep IFSRH ;AN000;
340 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
341 MOV ES:[BX.IFSR_APIFUNC],IFSLSEEKFILE ;AN000;
342 MOV ES:[BX.IFSR_MODE],MODE2 ;AN000;
343 MOV WORD PTR ES:[BX.IFSR_POSITION],DX ;AN000;
344 MOV WORD PTR ES:[BX.IFSR_POSITION+2],CX ;AN000;
345 ;AN000;
346 invoke CALL_IFS ; call fs with lseek request ;AN000;
347 ;AN000;
348 JC LS_1000 ;AN000;
349 MOV AX,WORD PTR ES:[BX.IFSR_POSITION] ;AN000;
350 MOV DX,WORD PTR ES:[BX.IFSR_POSITION+2] ;AN000;
351 invoke SFF_TO_SFT ;AN000;
352 ;AN000;
353 CLC ;AN000;
354LS_1000: ;AN000;
355 RestoreReg <DI,ES> ; restore sft ptr for ibmdos ;AN012;
356 return ;AN000;
357 ;AN000;
358EndProc IFS_LSEEK ;AN000;
359 ;AN000;
360BREAK <IFS_READ Read from a NET SFT> ;AN000;
361 ;AN000;
362;****************************************************************************** ;AN000;
363; ;AN000;
364; IFS_READ ;AN000;
365; ;AN000;
366; Called by: IFSFUNC dispatcher ;AN000;
367; ;AN000;
368; Routines called: CALL_IFS ;AN000;
369; SFT_TO_SFF ;AN000;
370; SFF_TO_SFT ;AN000;
371; ;AN000;
372; Inputs: ;AN000;
373; Outputs of SETUP: ;AN000;
374; CX = byte count ;AN000;
375; ES:DI Points to SFT ;AN000;
376; [DMAADD] = transfer addr ;AN000;
377; SFT checked for access mode ;AN000;
378; Function: ;AN000;
379; Prep IFSRH: ;AN000;
380; * IFSR_LENGTH DW 46 ; Total length of request ;AN000;
381; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
382; + IFSR_RETCODE DW ? ;AN000;
383; + IFSR_RETCLASS DB ? ;AN000;
384; IFSR_RESV1 DB 16 DUP(0) ;AN000;
385; * IFSR_APIFUNC DB 11 ; Read Byte Block ;AN000;
386; + IFSR_ERROR_CLASS DB ? ;AN000;
387; + IFSR_ERROR_ACTION DB ? ;AN000;
388; + IFSR_ERROR_LOCUS DB ? ;AN000;
389; + IFSR_ALLOWED DB ? ;AN000;
390; + IFSR_I24_RETRY DB ? ;AN000;
391; + IFSR_I24_RESP DB ? ;AN000;
392; IFSR_RESV2 DB ? ;AN000;
393; *+ IFSR_DEVICE_CB@ DD ? ; CD/DF - specified in SF_DEVPTR ;AN000;
394; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SF ;AN000;
395; ; and set this as pointer to it. ;AN000;
396; IFSR_RESV3 DW 0 ;AN000;
397; IFSR_COUNT DW 0 ;AN000;
398; *+ IFSR_BUFFER@ DD ? ; [DMAADD] ;AN000;
399; ;AN000;
400; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
401; IF IFSR_RETCODE = 0 THEN ;AN000;
402; DO ;AN000;
403; Call SFF_TO_SFT ;AN000;
404; CX = IFSR_COUNT ;AN000;
405; ES:DI -> SFT ;AN000;
406; ENDDO ;AN000;
407; ELSE DO {error} ;AN000;
408; AX = IFSR_RETCODE ;AN000;
409; CX = 0 ;AN000;
410; ES:DI -> SFT ;AN000;
411; Set carry ;AN000;
412; ENDDO ;AN000;
413; ENDIF ;AN000;
414; Outputs: ;AN000;
415; Carry clear ;AN000;
416; SFT Position updated ;AN000;
417; CX = No. of bytes read ;AN000;
418; ES:DI point to SFT ;AN000;
419; [DMAADD] filled with info read ;AN000;
420; Carry set ;AN000;
421; AX is error code ;AN000;
422; CX = 0 ;AN000;
423; ES:DI point to SFT ;AN000;
424; DS preserved, all other registers destroyed ;AN000;
425; ;AN000;
426;****************************************************************************** ;AN000;
427 ;AN000;
428 procedure IFS_READ,NEAR ;AN000;
429ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
430 ;AN000;
431 ifsr_fcn_def EXECAPI ; define ifsr for read ;AN000;
432 MOV CS:IFSPROC_FLAGS,SetDeviceCB ;AN000;
433 MOV WORD PTR [THISSFT],DI ; set thissft ;AN000;
434 MOV WORD PTR [THISSFT+2],ES ;AN000;
435 ;AN000;
436R_20: ; (welcome lock/read) ;AN000;
437 ifsr_api_def READFILE ;AN000;
438 invoke PREP_IFSR ; zero out ifsr, es:bx -> ifsr ;AN000;
439 MOV ES:[BX.IFSR_LENGTH],LENGTH_READFILE ; prep IFSRH ;AN000;
440 MOV ES:[BX.IFSR_APIFUNC],IFSREADFILE ;AN000;
441; XOR AL,AL ; for now, set mode = read (0) ;AD010;
442; TEST CS:IFSPROC_FLAGS,ISLOCKREAD ;AD010;
443; JZ W_80 ;AD010;
444; INC AL ; inc mode to mode_lock_read ;AD010;
445 JMP W_80 ; cont. read/write common code ;AN000;
446 ; in ifs_write below ;AN000;
447 ;AN000;
448EndProc IFS_READ ;AN000;
449 ;AN000;
450BREAK <IFS_WRITE Write to a NET SFT> ;AN000;
451 ;AN000;
452;****************************************************************************** ;AN000;
453; ;AN000;
454; IFS_WRITE ;AN000;
455; ;AN000;
456; Called by: IFSFUNC dispatcher ;AN000;
457; ;AN000;
458; Routines called: CALL_IFS ;AN000;
459; SFT_TO_SFF ;AN000;
460; SFF_TO_SFT ;AN000;
461; ;AN000;
462; Inputs: ;AN000;
463; Outputs of SETUP: ;AN000;
464; CX = byte count ;AN000;
465; ES:DI Points to SFT ;AN000;
466; [DMAADD] = transfer addr ;AN000;
467; SFT checked for access mode ;AN000;
468; Function: ;AN000;
469; Prep IFSRH: ;AN000;
470; * IFSR_LENGTH DW 46 ; Length of request ;AN000;
471; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
472; + IFSR_RETCODE DW ? ;AN000;
473; + IFSR_RETCLASS DB ? ;AN000;
474; IFSR_RESV1 DB 16 DUP(0) ;AN000;
475; * IFSR_APIFUNC DB 12 ; Write Byte Block ;AN000;
476; + IFSR_ERROR_CLASS DB ? ;AN000;
477; + IFSR_ERROR_ACTION DB ? ;AN000;
478; + IFSR_ERROR_LOCUS DB ? ;AN000;
479; + IFSR_ALLOWED DB ? ;AN000;
480; + IFSR_I24_RETRY DB ? ;AN000;
481; + IFSR_I24_RESP DB ? ;AN000;
482; IFSR_RESV2 DB ? ;AN000;
483; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
484; *+ IFSR_OPEN_CB@ DD ? ; call SFT_TO_SFF & set this as ptr ;AN000;
485; IFSR_RESV3 DW 0 ;AN000;
486; * IFSR_COUNT DW ? ; # bytes to write - CX ;AN000;
487; * IFSR_BUFFER@ DD ? ; Data buffer - [DMAADD] ;AN000;
488; ;AN000;
489; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
490; IF IFSR_RETCODE = 0 THEN ;AN000;
491; DO ;AN000;
492; Call SFF_TO_SFT ;AN000;
493; CX = IFSR_COUNT ;AN000;
494; ES:DI -> SFT ;AN000;
495; Clear carry ;AN000;
496; ENDDO ;AN000;
497; ELSE DO {error} ;AN000;
498; AX = IFSR_RETCODE ;AN000;
499; CX = 0 ;AN000;
500; ES:DI -> SFT ;AN000;
501; Set carry ;AN000;
502; ENDDO ;AN000;
503; ENDIF ;AN000;
504; Outputs: ;AN000;
505; Carry clear ;AN000;
506; SFT Position updated ;AN000;
507; CX = No. of bytes written ;AN000;
508; ES:DI point to SFT ;AN000;
509; Carry set ;AN000;
510; AX is error code ;AN000;
511; CX = 0 ;AN000;
512; ES:DI point to SFT ;AN000;
513; DS preserved, all other registers destroyed ;AN000;
514; ;AN000;
515;****************************************************************************** ;AN000;
516 ;AN000;
517 procedure IFS_WRITE,NEAR ;AN000;
518ASSUME DS:DOSGROUP,ES:NOTHING ;AN000;
519 ;AN000;
520 ifsr_fcn_def EXECAPI ; define ifsr for write ;AN000;
521 MOV CS:IFSPROC_FLAGS,SetDeviceCB ; init processing flags ;AN000;
522 MOV WORD PTR [THISSFT],DI ; set thissft ;AN000;
523 MOV WORD PTR [THISSFT+2],ES ;AN000;
524 ;AN000;
525W_20: ; (welcome write/unlock) ;AN000;
526 ifsr_api_def WRITEFILE ;AN000;
527 invoke PREP_IFSR ;AN000;
528 MOV ES:[BX.IFSR_LENGTH],LENGTH_WRITEFILE ; prep IFSRH ;AN000;
529 MOV ES:[BX.IFSR_APIFUNC],IFSWRITEFILE ;AN000;
530; XOR AL,AL ; for now set mode to write (bit0=0) ;AD010;
531; TEST CS:IFSPROC_FLAGS,ISWRITEUNLOCK ;AD010;
532; JZ W_40 ;AD010;
533; INC AL ; set mode to write/unlock (bit0=1) ;AD010;
534;W_40: ;AD010;
535; TEST CS:IFSPROC_FLAGS,ISADD ;AD010;
536; JZ W_80 ;AD010;
537; OR AL,MODE_ADD_MASK ; set mode to add (bit 1) ;AD010;
538;W_80: ; (welcome read) ;AD010;
539; TEST CS:IFSPROC_FLAGS,ISWOLOCK ;AD010; BAF
540; JZ W_90 ;AD010; BAF
541; OR AL,MODE_WO_MASK ; set mode to Write Only Lock ;AD010; BAF
542;W_90: ;AD010; BAF
543; MOV ES:[BX.IFSR_MODE],AL ;AD010;
544W_80: ; (welcome read) ;AN010;
545 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AC015;
546 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
547 MOV ES:[BX.IFSR_COUNT],CX ;AN000;
548 ;AN000;
549 MOV AX,WORD PTR [DMAADD] ; to access dmaadd ;AN000;
550 MOV WORD PTR ES:[BX.IFSR_BUFFER@],AX ;AN000;
551 MOV AX,WORD PTR [DMAADD+2] ;AN000;
552 MOV WORD PTR ES:[BX.IFSR_BUFFER@+2],AX ;AN000;
553 ;AN000;
554 invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
555 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
556 ; ES:BX -> IFSRH ;AN000;
557 ; IFSR_OPEN_CB@ ;AN000;
558 ; ds - IFSSEG ;AN000;
559 ;AN000;
560 invoke CALL_IFS ; *** call fs with read/write request ;AN000;
561 ;AN000;
562 JNC W_100 ;AN000;
563 Context DS ; restore ds-dosgroup ;AN001;
564 LES DI,[THISSFT] ; restore esdi-sft ;AN001;
565 transfer ifs_1000 ; transfer to general ret as carry set ;AC001;
566W_100: ;AN000;
567 MOV CX,ES:[BX.IFSR_COUNT] ; prep reg output ;AN000;
568 invoke SFF_TO_SFT ;AN000;
569
570 Context DS ; restore ds-dosgroup ;AN001;
571 LES DI,[THISSFT] ; restore esdi-sft ;AN001;
572 transfer ifs_990 ; transfer to general good ret in util ;AN001;
573 ;AN000;
574EndProc IFS_WRITE ;AN000;
575 ;AN000;
576BREAK <IFS_XLOCK Lock a FS SFT> ;AN000;
577 ;AN000;
578;****************************************************************************** ;AN000;
579; ;AN000;
580; IFS_XLOCK ;AN000;
581; ;AN000;
582; Called by: IFSFUNC dispatcher ;AN000;
583; ;AN000;
584; Routines called: CALL_IFS DRIVE_FROM_SFT ;AN000;
585; SFT_TO_SFF ;AN000;
586; SFF_TO_SFT ;AN000;
587; ;AN000;
588; Inputs: ;AN000;
589; BL = 80H bit: 0 lock all operations ;AN000;
590; 1 lock write operations only ;AN000;
591; 0 Lock
592; 1 Unlock
593; 2 lock multiple range ;AN000;
594; 3 unlock multiple range ;AN000;
595; 4 lock/read ;AN000;
596; 5 write/unlock ;AN000;
597; 6 add (lseek eof/lock/write/unlock) ;AN000;
598; ES:DI -> SFT ;AN000;
599; CX = count/size Number of ranges/block size ;AN000;
600; DS:DX -> BUFFER LABEL DWORD ;AN000;
601; DD POSITION ; lock range, repeats CX times ;AN000;
602; DD LENGTH ; ;AN000;
603; ;AN000;
604; ;AN000;
605; Function: ;AN000;
606; Prep IFSRH: ;AN000;
607; * IFSR_LENGTH DW 46+ ; Length of request ;AN000;
608; * IFSR_FUNCTION DB 4 ; Execute API function ;AN000;
609; + IFSR_RETCODE DW ? ;AN000;
610; + IFSR_RETCLASS DB ? ;AN000;
611; IFSR_RESV1 DB 16 DUP(0) ;AN000;
612; * IFSR_APIFUNC DB 13 ; Lock Function ;AN000;
613; + IFSR_ERROR_CLASS DB ? ;AN000;
614; + IFSR_ERROR_ACTION DB ? ;AN000;
615; + IFSR_ERROR_LOCUS DB ? ;AN000;
616; + IFSR_ALLOWED DB ? ;AN000;
617; + IFSR_I24_RETRY DB ? ;AN000;
618; + IFSR_I24_RESP DB ? ;AN000;
619; IFSR_RESV2 DB ? ;AN000;
620; *+ IFSR_DEVICE_CB@ DD ? ;AN000;
621; *+ IFSR_OPEN_CB@ DD ? ; Call SFT_TO_SFFto convert SFT to SFF ;AN000;
622; ; and set this as pointer to it. ;AN000;
623; * IFSR_FUNC DB subfunction ; 0=LOCK, 1=UNLOCK ;AN000;
624; IFSR_RESV3 DB DOS reserved ;AN000;
625; * IFSR_POSITION DD range start ; single range ;AN000;
626; * IFSR_LENGTH DD range length ;AN000;
627; ;AN000;
628; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR ;AN000;
629; IF IFSR_RETCODE = 0 THEN ;AN000;
630; DO ;AN000;
631; Call SFF_TO_SFT ;AN000;
632; Clear carry ;AN000;
633; ENDDO ;AN000;
634; ELSE DO {error} ;AN000;
635; AX = IFSR_RETCODE ;AN000;
636; Set carry ;AN000;
637; ENDDO ;AN000;
638; ENDIF ;AN000;
639; ;AN000;
640; Outputs: ;AN000;
641; AX set on error: Lock conflict ;AN000;
642; Too many locks ;AN000;
643; ;AN000;
644;****************************************************************************** ;AN000;
645 ;AN000;
646 procedure IFS_XLOCK,NEAR ;AN000;
647 ;AN000;
648 ifsr_fcn_def EXECAPI ;AN000;
649 ifsr_api_def LOCKFILE ;AN000;
650 ;AN000;
651 SaveReg <BX> ; save input bl ;AN014;
652 MOV CS:IFSPROC_FLAGS,SetDeviceCB ;AC002;
653;;;;;;;;TEST BL,80H ;AN006;AD010;
654; JZ L_10 ;AN006;AD010;
655; OR CS:IFSPROC_FLAGS,IsWOLock ; This is Write Only lock ;AN006;AD010;
656;L_10: ;AN006;AD010;
657; SaveReg <BX> ; save function (int 21h al value) ;AD010;
658; AND BL,07FH ; ditch 80h bit for now ;AD010;
659; CMP BL,INT21AL_LOCK_READ ; Check for special case locks ;AD010;
660; JB L_60 ; these generate different ;AD010;
661; JNE L_20 ; ifsrh's. ;AD010;
662; OR CS:IFSPROC_FLAGS,IsLockRead ; This is lock/read request ;AD010;
663; RestoreReg <BX> ; restore bx with 80 bit ;AD010;
664; Context DS ;AD010;
665; JMP R_20 ; let ifs_read above handle this ;AD010;
666;L_20: ;AD010;
667; CMP BL,INT21AL_WRITE_UNLOCK ;AD010;
668; RestoreReg <BX> ; restore bx with 80 bit ;AD010;
669; JNE L_40 ;AD010;
670; OR CS:IFSPROC_FLAGS,IsWriteUnlock ; This is write/unlock request ;AD010;
671; JMP SHORT L_50 ; cont. ifs_write above ;AD010;
672;L_40: ;AD010;
673; OR IFSPROC_FLAGS,IsAdd ;AD010;
674;L_50: ;AD010;
675; Context DS ;AD010;
676;;;;;;;;JMP W_20 ; cont. in ifs_write above ;AD010;
677 ;AN000;
678L_60: ;AN000;
679 SaveReg <DS> ; save input ds (buffer ptr) ;AN000;
680 Context DS ; ds-dosgroup to access thissft ;AN000;
681 MOV WORD PTR [THISSFT],DI ; set [THISSFT] ;AN000;
682 MOV WORD PTR [THISSFT+2],ES ;AN000;
683 invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
684 invoke PREP_IFSR ; clear ifsrh ;AM003;
685 MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
686 invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
687 ; ES:BX -> IFSRH ;AN000;
688 ; IFSR_OPEN_CB@ ;AN000;
689 ; ds - IFSSEG ;AN000;
690 MOV ES:[BX.IFSR_LENGTH],LENGTH_LOCKFILE ; prep IFSRH ;AN000;
691 MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
692 MOV ES:[BX.IFSR_APIFUNC],IFSLOCKFILE ;AN000;
693;;;;;;;;MOV ES:[BX.IFSR_COUNT],CX ;AN003;AD010;
694 RestoreReg <DS> ; range segment, mode (input bl) ;AC003;AC010;
695;;;;;;;;MOV AL,CL ;AN003;AD010;
696; AND AL,07FH ; mask off hi 80 bit ;AN003;AD010;
697; CMP AL,2 ;AN003;AD010;
698; JGE L_70 ;AN003;AD010;
699; ADD CL,2 ;AN003;AD010;
700;L_70: ;AN003;AD010;
701; MOV ES:[BX.IFSR_MODE],CL ;AN000;AD010;
702; AND ES:[BX.IFSR_MODE],80H ; ditch input bl in low nibble ;AN005;AD010;
703; AND CL,07FH ;AN003;AD010;
704;;;;;;;;SUB CL,2 ; set func (0-lock,1-unlock) ;AC003;AD010;
705 RestoreReg <AX> ; restore input bl into al ;AN014;
706 MOV ES:[BX.IFSR_FUNC],AL ;AC003;AC010;
707;;;;;;;;MOV WORD PTR ES:[BX.IFSR_RANGE@],DX ;AD010;
708;;;;;;;;MOV WORD PTR ES:[BX.IFSR_RANGE@+2],DS ;AD010;
709 SaveReg <SI,DX> ;AN010;
710 RestoreReg <SI> ;AN010;
711 MOV AX,WORD PTR DS:[SI] ;AN010;
712 MOV WORD PTR ES:[BX.IFSR_LK_POSITION],AX ;AN010;
713 MOV AX,WORD PTR DS:[SI+2] ;AN010;
714 MOV WORD PTR ES:[BX.IFSR_LK_POSITION+2],AX ;AN010;
715 MOV AX,WORD PTR DS:[SI+4] ;AN010;
716 MOV WORD PTR ES:[BX.IFSR_LK_LENGTH],AX ;AN010;
717 MOV AX,WORD PTR DS:[SI+6] ;AN010;
718 MOV WORD PTR ES:[BX.IFSR_LK_LENGTH+2],AX ;AN010;
719 RestoreReg <SI>
720 SaveReg <CS> ; set ds=ifsseg for ifs call ;AN003;
721 RestoreReg <DS> ;AN003;
722
723 invoke CALL_IFS ; *** call fs with lock request ;AN000;
724 ;AN000;
725 JNC L_100 ;AN000;
726 transfer ifs_1000 ; go to general return (util) ;AN000;
727L_100: ;AN000;
728 invoke SFF_TO_SFT ;AN000;
729 transfer ifs_990 ; go to general good ret (util) ;AN000;
730 ;AN000;
731 ;AN000;
732EndProc IFS_XLOCK ;AN000;
733 ;AN000;
734BREAK <IFS_FILE_XATTRIBUTES Get/Set File Extended Attributes by handle> ;AN000;
735
736;******************************************************************************
737;
738; IFS_FILE_XATTRIBUTES
739;
740; Called by: IFSFUNC dispatcher
741;
742; Routines called: CALL_IFS DRIVE_FROM_SFT
743; SFT_TO_SFF
744; SFF_TO_SFT
745;
746; Inputs:
747; [THISSFT] Points to SFT being used
748; [SAVE_ES:DI] -> Buffer for EA or EA names list
749; [SAVE_DS:SI] -> Query List (BL=2)
750; [SAVE_CX] = buffer size (BL=2,3)
751; BL = function - 2=Get EA
752; 3=Get EA Names
753; 4=Set EA
754;
755; Function:
756; This call is driven by the new INT 21H call 57H. *** REMOVED
757; Prep IFSRH:
758; * IFSR_LENGTH DW 50 ; Total length of request
759; * IFSR_FUNCTION DB 4 ; Execute API function
760; + IFSR_RETCODE DW ?
761; + IFSR_RETCLASS DB ?
762; IFSR_RESV1 DB 16 DUP(0)
763; * IFSR_APIFUNC DB 15 ; File Attributes - get/set by name
764; + IFSR_ERROR_CLASS DB ?
765; + IFSR_ERROR_ACTION DB ?
766; + IFSR_ERROR_LOCUS DB ?
767; + IFSR_ALLOWED DB ?
768; + IFSR_I24_RETRY DB ?
769; + IFSR_I24_RESP DB ?
770; IFSR_RESV2 DB ?
771; IFSR_DEVICE_CB@ DD ?
772; *+ IFSR_OPEN_CB@ DD ?
773; * IFSR_FUNC DB ? ; 0-get 1-set
774; * IFSR_SUBFUNC DB ? ; 2-EA 3-EA names
775; *+ IFSR_BUFFER1@ DD ? ; Query List
776; *+ IFSR_BUFFER2@ DD ? ; EA List
777; *+ IFSR_COUNT DW ? ; count
778;
779; CALL routine, CALL_IFS, with pointer to SF_IFSR_HDR
780; IF IFSR_RETCODE = 0 THEN
781; DO
782; Call SFF_TO_SFT
783; Clear carry
784; ENDDO
785; ELSE DO
786; AX = IFSR_RETCODE
787; Set carry
788; ENDDO
789; ENDIF
790; ENDDO
791;
792; Outputs:
793; Carry clear: On Get:
794; QUERY LIST or LIST filled in.
795; On Set:
796; Extended attributes set. All SFTs are updated.
797; CARRY SET
798; Carry set: AX is error code
799; error_file_not_found
800; Last element of path not found
801; error_path_not_found
802; Bad path (not in curr dir part if present)
803; error_access_denied
804; Attempt to set an attribute which cannot be set
805; (attr_directory, attr_volume_ID)
806; error_sharing_violation
807; Sharing mode of file did not allow the change
808; (this request requires exclusive write/read access)
809; (INT 24H generated)
810; DS preserved, others destroyed
811;
812;******************************************************************************
813 ;AN000;
814 procedure IFS_FILE_XATTRIBUTES,NEAR ;AN000;
815 ;AN000;
816;;;;;;;;ifsr_fcn_def EXECAPI ; define ifsr for fileattr ;AN000;
817; ifsr_api_def FILEATTR ;AN000;
818; ;AN000;
819; MOV CS:IFSPROC_FLAGS,SetDeviceCB ; init processing flags ;AN000;
820; SaveReg <BX> ; save input function (2,3,4) ;AN000;
821; ;AN000;
822; invoke PREP_IFSR ; init ifsr ;AN000;
823; Context DS ; ds - dosgroup ;AN000;
824; ;AN000;
825; invoke DRIVE_FROM_SFT ; set IFSDRV for possible criter ;AN000;
826; MOV CS:DEVICE_CB@_OFFSET,IFSR_DEVICE_CB@ ;AN000;
827; MOV ES:[BX.IFSR_LENGTH],LENGTH_FILEATTR ; prep IFSRH ;AN000;
828; MOV ES:[BX.IFSR_FUNCTION],IFSEXECAPI ;AN000;
829; MOV ES:[BX.IFSR_APIFUNC],IFSFILEATTR ;AN000;
830; MOV AL,FUNC_GET_BY_HANDLE ; start ifsr_func with get ;AN000;
831;;;;;;;;RestoreReg <CX> ; get original BX - func ;AN000;
832
833 CMP BL,4 ; ;AC010;
834 JNE XFA_40 ; ;AC010;
835 JMP C_990 ; just ret success if set ;AC010;
836XFA_40: ;AN000;
837
838;;;;;;;;MOV ES:[BX.IFSR_FUNC],AL ;AN000;
839; MOV AL,SUBFUNC_EA ; start ifsr_subfunc w/ea list ;AN000;
840; CMP CL,3 ; (input get ea names) ;AN000;
841; JNE XFA_80 ;AN000;
842; INC AL ; inc ifsr_subfunc to ea names ;AN000;
843;FA_80: ;AN000;
844; MOV ES:[BX.IFSR_SUBFUNC],AL ;AN000;
845; CMP CL,4 ; no size offered on set so don't check ;AN009;
846; JE XFA_82 ;AN009;
847;
848;FA_82: ;AN009;
849; MOV AX,[SAVE_DI] ;AN000;
850; MOV WORD PTR ES:[BX.IFSR_BUFFER2@],AX ; get list ptr into buffer2@ ;AC002;
851; MOV AX,[SAVE_ES] ;AN000;
852; MOV WORD PTR ES:[BX.IFSR_BUFFER2@+2],AX ; get list ptr into buffer2@ ;AC002;
853;FA_85: ;AN008;
854; CMP CL,2 ; get ea list with qlist ;AN000;
855; JNE XFA_90 ;AN000;
856; MOV AX,[SAVE_SI] ;AN000;
857; CMP AX,NULL_PTR ; if null, don't set buffer1 ;AN005;
858; JE XFA_90 ;AN005;
859; MOV WORD PTR ES:[BX.IFSR_BUFFER1@],AX ; get list ptr into buffer2@ ;AC002;
860; MOV AX,[SAVE_DS] ;AN000;
861; MOV WORD PTR ES:[BX.IFSR_BUFFER1@+2],AX ; get list ptr into buffer2@ ;AC002;
862;FA_90: ;AN000;
863; PUSH [SAVE_CX] ; buffer size ;AN000;
864; POP ES:[BX.IFSR_COUNT] ;AN000;
865; invoke SFT_TO_SFF ; sets: [THISIFS] ;AN000;
866; ; ES:BX -> IFSRH ;AN000;
867; ; IFSR_OPEN_CB@ ;AN000;
868; ; ds - IFSSEG ;AN000;
869;************************************************
870; invoke CALL_IFS ; *** call fs with fileattr request ;AN000;
871;************************************************
872; JNC XFA_100 ;AN000;
873; JMP C_1000 ;AN000;
874;FA_100: ;AN000;
875;;;;;;;;invoke SFF_TO_SFT ;AN000;
876
877
878 Context DS ; on get - set size to 2 and count=0 ;AN010;
879 MOV AX,[SAVE_CX] ; if count < 2 than no buffer2 ;AN008;;AC013;
880 CMP AX,2 ;AN008;;AC013;
881 JGE XFA_120 ;AN008;;AC013;
882 XOR AX,AX
883 JMP SHORT XFA_140
884XFA_120: ;AN013;
885 PUSH [SAVE_ES] ;AN010;
886 POP ES ;AN010;
887 MOV DI,[SAVE_DI] ;AN010;
888 XOR AX,AX ;AN010;
889 STOSW ; count in buffer ;AN010;
890 MOV AX,2 ;AN007;AC010;
891XFA_140: ;AN013;
892 SaveReg <AX> ; preserve future cx ;AN016;
893 CallInstall Get_User_Stack,multDOS,24 ; put size in user cx ;AN007;
894 RestoreReg <AX> ; restore future cx ;AN016;
895 MOV DS:[SI.USER_CX],AX ;AN007;
896 JMP C_990 ; go ret in close to get ds-dosgroup ;AN000;
897 ;AN000;
898 ;AN000;
899EndProc IFS_FILE_XATTRIBUTES ;AN000;
900 ;AN000;
901 ;AN000;
902IFSSEG ENDS ;AN000;
903 END ;AN000;