]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DOS/LOCK.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DOS / LOCK.ASM
1 ; SCCSID = @(#)lock.asm 1.1 85/04/10
2 TITLE LOCK ROUTINES - Routines for file locking
3 NAME LOCK
4
5 ;
6 ; LOCK_CHECK
7 ; LOCK_VIOLATION
8 ; $LockOper
9 ;
10 ; Revision history:
11 ; A000 version 4.00 Jan. 1988
12 ;
13 include dosseg.asm
14
15 CODE SEGMENT BYTE PUBLIC 'CODE'
16 ASSUME SS:DOSGROUP,CS:DOSGROUP
17
18 .xlist
19 .xcref
20 INCLUDE DOSSYM.INC
21 INCLUDE DEVSYM.INC
22 include lock.inc ;AN000;
23 .cref
24 .list
25
26 AsmVars <IBM, Installed>
27
28 Installed = TRUE
29
30 i_need THISSFT,DWORD
31 i_need THISDPB,DWORD
32 i_need EXTERR,WORD
33 i_need ALLOWED,BYTE
34 i_need RetryCount,WORD
35 I_need fShare,BYTE
36 I_Need EXTERR_LOCUS,BYTE ; Extended Error Locus
37 i_need JShare,DWORD
38 i_need Lock_Buffer,DWORD ;AN000; DOS 4.00
39 i_need Temp_Var,WORD ;AN000; DOS 4.00
40
41 BREAK <$LockOper - Lock Calls>
42
43 ;
44 ; Assembler usage:
45 ; MOV BX, Handle (DOS 3.3)
46 ; MOV CX, OffsetHigh
47 ; MOV DX, OffsetLow
48 ; MOV SI, LengthHigh
49 ; MOV DI, LengthLow
50 ; MOV AH, LockOper
51 ; MOV AL, Request
52 ; INT 21h
53 ;
54 ; Error returns:
55 ; AX = error_invalid_handle
56 ; = error_invalid_function
57 ; = error_lock_violation
58 ;
59 ; Assembler usage:
60 ; MOV AX, 5C?? (DOS 4.00)
61 ;
62 ; 0? lock all
63 ; 8? lock write
64 ; ?2 lock multiple
65 ; ?3 unlock multiple
66 ; ?4 lock/read
67 ; ?5 write/unlock
68 ; ?6 add (lseek EOF/lock/write/unlock)
69 ; MOV BX, Handle
70 ; MOV CX, count or size
71 ; LDS DX, buffer
72 ; INT 21h
73 ;
74 ; Error returns:
75 ; AX = error_invalid_handle
76 ; = error_invalid_function
77 ; = error_lock_violation
78
79 procedure $LockOper,NEAR
80 ASSUME DS:NOTHING,ES:NOTHING
81 ; MOV BP,AX ;MS. BP=AX ;AN000;
82 ; AND BP,7FH ;MS. clear bit 7 ;AN000;
83 ; CMP BP,Lock_add ;MS. supported function ? ;AN000;
84 ; JA lock_bad_func ;MS. no, ;AN000;
85
86 CMP AL,1 ;AN000;;MS. no,
87 JA lock_bad_func ;AN000;;MS. no,
88
89 PUSH DI ; Save LengthLow
90 invoke SFFromHandle ; ES:DI -> SFT
91 JNC lock_do ; have valid handle
92 POP DI ; Clean stack
93 error error_invalid_handle
94 lock_bad_func:
95 MOV EXTERR_LOCUS,errLoc_Unk ; Extended Error Locus
96 error error_invalid_function
97
98 ; Align_buffer call has been deleted, since it corrupts the DTA (6/5/88) P5013
99
100 lock_do:
101 ; PUSH AX ;AN000;;MS. save ax
102 ; PUSH BX ;AN000;;MS. save handle
103 ; MOV [Temp_Var],DX ;AN000;;MS. save DX
104 ; invoke Align_Buffer ;AN000;;MS. align ds:dx and set DMAADD
105 ; POP BX ;AN000;;MS. restore handle
106 ; POP AX ;AN000;;MS. save ax
107 ;AN000;
108 ; CMP BP,Unlock_all ;AN000;;MS. old function 0 or 1 ?
109 ; JA chk_lock_mul ;AN000;;MS. no, new function
110 ; TEST AL,80H ;AN000;;MS. 80H bit on ?
111 ; JZ old_33 ;AN000;;MS. no, old DOS 3.3 interface
112 ; MOV CX,1 ;AN000;;MS. adjust for new interface
113 ; ADD BP,2 ;AN000;;MS.
114 ; JMP SHORT chk_lock_mul ;AN000;;MS.
115 old_33:
116 MOV BX,AX ;AN000;;MS. save AX
117 ;AN000;
118 ;; MOV DX,[Temp_Var] ;AN000;;MS. retore DX (P5013) 6/5/88
119
120 MOV BP, OFFSET DOSGROUP:Lock_Buffer ;AN000;;MS. get DOS LOCK buffer
121 MOV WORD PTR [BP.Lock_position],DX ;AN000;;MS. set low offset
122 MOV WORD PTR [BP.Lock_position+2],CX;AN000;;MS. set high offset
123 POP CX ;AN000;;MS. get low length
124 MOV WORD PTR [BP.Lock_length],CX ;AN000;;MS. set low length
125 MOV WORD PTR [BP.Lock_length+2],SI ;AN000;;MS. set high length
126 MOV CX,1 ;AN000;;MS. one range
127 PUSH CS ;AN000;;MS.
128 POP DS ;AN000;;MS. DS:DX points to
129 MOV DX,BP ;AN000;;MS. Lock_Buffer
130 TEST AL,Unlock_all ;AN000;;MS. function 1
131 JNZ DOS_Unlock ;AN000;;MS. yes
132 JMP DOS_Lock ;AN000;;MS. function 0
133 ;;chk_lock_mul: ;AN000;
134 ; POP SI ;AN000;;MS. pop low length
135 ; TEST ES:[DI.sf_flags],sf_isnet ;AN000;;MS. net handle?
136 ; JZ LOCAL_DOS_LOCK ;AN000;;MS. no
137 ; invoke OWN_SHARE ;AN000;;MS. IFS owns share ?
138 ; JNZ LOCAL_DOS_LOCK ;AN000;;MS. no
139 ; MOV BX,AX ;AN000;;MS. BX=AX
140 ; CallInstall NET_XLock,multNet,10 ;AN000;;MS. issue Net Extended Lock
141 ; MOV [Temp_Var],CX ;AN000;;MS. cx= retuened from IFS
142 ; JMP ValChk ;AN000;;MS. check return
143 ;LOCAL_DOS_LOCK: ;AN000;
144 ; CMP BP,Lock_mul_range ;AN000;;MS. lock mul range?
145 ; JNZ unmul ;AN000;;MS. lock mul range?
146 ; JMP LOCAL_LOCK ;AN000;;MS. yes
147 ;unmul:
148 ; CMP BP,Unlock_mul_range ;AN000;;MS. unlock mul range?
149 ; JZ LOCAL_UNLOCK ;AN000;;MS. yes
150 ; CMP BP,Lock_read ;AN000;;MS. lock read?
151 ; JNZ chk_write_unlock ;AN000;;MS. no
152 ; CALL Set_Lock_Buffer ;AN000;;MS. set DOS lock buffer
153 ; CALL Set_Lock ;AN000;;MS. set the lock
154 ; JC lockerror ;AN000;;MS. error
155 ; invoke $READ ;AN000;;MS. do read
156 ; JC lockerror ;AN000;;MS. error
157 ;lockend: ;AN000;
158 ; transfer SYS_RET_OK ;AN000;;MS. return
159 ;chk_write_unlock: ;AN000;
160 ; CMP BP,Write_unlock ;AN000;;MS. write unlock ?
161 ; JNZ Lock_addf ;AN000;;MS. no
162 ; CALL Set_Lock_Buffer ;AN000;;MS. set DOS lock buffer
163 ;WriteUnlock: ;AN000;
164 ; PUSH AX ;AN000;;MS. save AX for unlock
165 ; invoke $WRITE ;AN000;;MS. do write
166 ; MOV [Temp_Var],AX ;AN000;;MS. save number of bytes writ
167 ; POP AX ;AN000;;MS. restore AX
168 ; JC lockerror ;AN000;;MS. error
169 ; MOV CX,1 ;AN000;;MS. one range unlock
170 ; PUSH CS ;AN000;;MS.
171 ; POP DS ;AN000;;MS. DS:DX points to
172 ; MOV DX,OFFSET DOSGROUP:Lock_Buffer ;AN000;;MS. Lock_BUffer
173 ; JMP LOCAL_UNLOCK ;AN000;;MS. do unlock
174 ;Lock_addf: ;AN000;
175 ; MOV SI,WORD PTR ES:[DI.SF_Size] ;AN000;;MS. must be lock add
176 ; MOV WORD PTR ES:[DI.SF_Position],SI ;AN000;;MS. set file position to
177 ; MOV SI,WORD PTR ES:[DI.SF_Size+2] ;AN000;;MS. EOF
178 ; MOV WORD PTR ES:[DI.SF_Position+2],SI;AN000;;MS.
179 ; CALL Set_Lock_Buffer ;AN000;;MS. set DOS lock buffer
180 ; CALL Set_Lock ;AN000;;MS. set the lock
181 ; JC lockerror ;AN000;;MS. error
182 ; JMP WriteUnlock ;AN000;;MS. do write unlock
183 ;AN000;;MS.
184 DOS_Unlock:
185 TEST ES:[DI.sf_flags],sf_isnet
186 JZ LOCAL_UNLOCK
187 ;; invoke OWN_SHARE ;AN000;;MS. IFS owns share ?
188 ;; JNZ LOCAL_UNLOCK ;AN000;;MS. no
189
190 CallInstall Net_Xlock,multNet,10
191 JMP SHORT ValChk
192 LOCAL_UNLOCK:
193 if installed
194 Call JShare + 7 * 4
195 else
196 Call clr_block
197 endif
198 ValChk:
199 JNC Lock_OK
200 lockerror:
201 transfer SYS_RET_ERR
202 Lock_OK:
203 MOV AX,[Temp_VAR] ;AN000;;MS. AX= number of bytes
204 transfer SYS_Ret_OK
205 DOS_Lock:
206 TEST ES:[DI.sf_flags],sf_isnet
207 JZ LOCAL_LOCK
208 ;; invoke OWN_SHARE ;AN000;;MS. IFS owns share ?
209 ;; JNZ LOCAL_LOCK ;AN000;;MS. no
210 CallInstall NET_XLock,multNet,10
211 JMP ValChk
212 LOCAL_LOCK:
213 if installed
214 Call JShare + 6 * 4
215 else
216 Call Set_Block
217 endif
218 JMP ValChk
219
220 EndProc $LockOper
221
222 BREAK <Set_Lock>
223
224 ; Input:
225 ; BP = Lock_Buffer addr
226 ; CX = lock length
227 ; Function:
228 ; set the lock
229 ; Output:
230 ; carry clear ,Lock is set
231 ; DS:DX = addr of
232 ; carry set Lock is not set
233 ; DS,DX,CX preserved
234
235 ; procedure Set_Lock,NEAR ;AN000;
236 ;ASSUME DS:NOTHING,ES:NOTHING ;AN000;
237 ;AN000;
238 ; PUSH DS ;MS. save regs ;AN000;
239 ; PUSH DX ;MS. ;AN000;
240 ; PUSH CX ;MS. ;AN000;
241 ; ;AN000;
242 ; PUSH CS ;MS. ;AN000;
243 ; POP DS ;MS. DS:DX poits to Lock_Buffer ;AN000;
244 ; MOV DX,BP ;MS. ;AN000;
245 ; PUSH BX ;MS. save handle ;AN000;
246 ; PUSH AX ;MS. save functions ;AN000;
247 ; MOV CX,1 ;MS. set one lock ;AN000;
248 ;if installed ;AN000;
249 ; Call JShare + 6 * 4 ;MS. call share set block ;AN000;
250 ;else ;AN000;
251 ; Call Set_Block ;MS. ;AN000;
252 ;endif ;AN000;
253 ; POP AX ;MS. restore regs ;AN000;
254 ; POP BX ;MS. ;AN000;
255 ; POP CX ;MS. ;AN000;
256 ; POP DX ;MS. ;AN000;
257 ; POP DS ;MS. ;AN000;
258 ; return ;MS. ;AN000;
259 ; ;AN000;
260 ;EndProc Set_Lock ;AN000;
261
262 BREAK <Set_Lock_Buffer>
263
264 ; Input:
265 ; ES:DI = addr of SFT
266 ; CX = lock length
267 ; Function:
268 ; set up the lock buffer
269 ; Output:
270 ; Lock_Buffer is filled with position and lock length
271 ; BP = Lock_Buffer addr
272 ;
273
274 ; procedure Set_Lock_Buffer,NEAR
275 ;ASSUME DS:NOTHING,ES:NOTHING
276 ;
277 ; MOV BP, OFFSET DOSGROUP:Lock_Buffer ;MS. move file position ;AN000;
278 ; MOV SI,WORD PTR ES:[DI.sf_position] ;MS. to DOS lock_buffer ;AN000;
279 ; MOV WORD PTR [BP.Lock_position],SI ;MS. ;AN000;
280 ; MOV SI,WORD PTR ES:[DI.sf_position+2] ;MS. ;AN000;
281 ; MOV WORD PTR [BP.Lock_position+2],SI ;MS. ;AN000;
282 ; MOV WORD PTR [BP.Lock_length],CX ;MS. move cx to lock_buffer ;AN000;
283 ; MOV WORD PTR [BP.Lock_length+2],0 ;MS. ;AN000;
284 ; return ;MS. ;AN000;
285 ;
286 ;EndProc Set_Lock_Buffer
287
288 ; Inputs:
289 ; Outputs of SETUP
290 ; [USER_ID] Set
291 ; [PROC_ID] Set
292 ; Function:
293 ; Check for lock violations on local I/O
294 ; Retries are attempted with sleeps in between
295 ; Outputs:
296 ; Carry clear
297 ; Operation is OK
298 ; Carry set
299 ; A lock violation detected
300 ; Outputs of SETUP preserved
301
302 procedure LOCK_CHECK,NEAR
303 DOSAssume CS,<DS>,"Lock_Check"
304 ASSUME ES:NOTHING
305
306 MOV BX,RetryCount ; Number retries
307 LockRetry:
308 SaveReg <BX,AX> ; MS. save regs ;AN000;
309 if installed
310 call JShare + 8 * 4
311 else
312 Call chk_block
313 endif
314 RestoreReg <AX,BX> ; MS. restrore regs ;AN000;
315 retnc ; There are no locks
316 Invoke Idle ; wait a while
317 DEC BX ; remember a retry
318 JNZ LockRetry ; more retries left...
319 STC
320 return
321 EndProc LOCK_CHECK
322
323 ; Inputs:
324 ; [THISDPB] set
325 ; [READOP] indicates whether error on read or write
326 ; Function:
327 ; Handle Lock violation on compatibility (FCB) mode SFTs
328 ; Outputs:
329 ; Carry set if user says FAIL, causes error_lock_violation
330 ; Carry clear if user wants a retry
331 ;
332 ; DS, ES, DI, CX preserved, others destroyed
333
334 procedure LOCK_VIOLATION,NEAR
335 DOSAssume CS,<DS>,"Lock_Violation"
336 ASSUME ES:NOTHING
337
338 PUSH DS
339 PUSH ES
340 PUSH DI
341 PUSH CX
342 MOV AX,error_lock_violation
343 MOV [ALLOWED],allowed_FAIL + allowed_RETRY
344 LES BP,[THISDPB]
345 MOV DI,1 ; Fake some registers
346 MOV CX,DI
347 MOV DX,ES:[BP.dpb_first_sector]
348 invoke HARDERR
349 POP CX
350 POP DI
351 POP ES
352 POP DS
353 CMP AL,1
354 retz ; 1 = retry, carry clear
355 STC
356 return
357
358 EndProc LOCK_VIOLATION
359
360 IF INSTALLED
361 ;
362 ; do a retz to return error
363 ;
364 Procedure CheckShare,NEAR
365 ASSUME CS:DOSGROUP,ES:NOTHING,DS:NOTHING,SS:NOTHING
366 CMP fShare,0
367 return
368 EndProc CheckShare
369 ENDIF
370
371 CODE ENDS
372 END