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
|
; SCCSID = @(#)share.asm 1.1 85/04/10
TITLE SHARING ROUTINES - Routines for file Sharing
NAME SHARE
include dosseg.asm
CODE SEGMENT BYTE PUBLIC 'CODE'
ASSUME SS:DOSGROUP,CS:DOSGROUP
.xlist
.xcref
INCLUDE DOSSYM.INC
INCLUDE DEVSYM.INC
.cref
.list
AsmVars <IBM, Installed>
Installed = True
i_need THISDPB,DWORD
i_need EXTERR,WORD
i_need ReadOp,BYTE
i_need ThisSFT,DWORD
i_need ALLOWED,BYTE
I_need RetryCount,WORD
i_need JShare,DWORD
; Inputs:
; [THISSFT] Points to filled in local file/device SFT for new
; instance of file sf_mode ALWAYS has mode (even on FCB SFTs)
; [WFP_START] has full path of name
; [USER_ID] Set
; [PROC_ID] Set
; Function:
; Check for sharing violations on local file/device access
; Outputs:
; Carry clear
; Sharing approved
; Carry set
; A sharing violation detected
; AX is error code
; USES ALL but DS
procedure SHARE_CHECK,NEAR
DOSAssume CS,<DS>,"Share_Check"
ASSUME ES:NOTHING
if installed
call JShare + 1 * 4
else
Call MFT_Enter
endif
return
EndProc SHARE_CHECK
; Inputs:
; [THISDPB] Set
; AX has error code
; Function:
; Handle Sharing errors
; Outputs:
; Carry set if user says FAIL, causes error_sharing_violation
; Carry clear if user wants a retry
;
; DS, ES, DI preserved, others destroyed
procedure SHARE_VIOLATION,NEAR
DOSAssume CS,<DS>,"Share_Violation"
ASSUME ES:NOTHING
PUSH DS
PUSH ES
PUSH DI
MOV [READOP],0 ; All share errors are reading
MOV [ALLOWED],allowed_FAIL + allowed_RETRY
LES BP,[THISDPB]
MOV DI,1 ; Fake some registers
MOV CX,DI
MOV DX,ES:[BP.dpb_dir_sector]
invoke HARDERR
POP DI
POP ES
POP DS
CMP AL,1
retz ; 1 = retry, carry clear
STC
return
EndProc SHARE_VIOLATION
; ShareEnd - terminate sharing info on a particular SFT/UID/PID. This does
; NOT perform a close, it merely asserts that the sharing information
; for the SFT/UID/PID may be safely released.
;
; Inputs: ES:DI points to an SFT
; Outputs: None
; Registers modified: all except DS,ES,DI
procedure ShareEnd,Near
DOSAssume CS,<DS>,"ShareEnd"
ASSUME ES:NOTHING
if installed
Call JShare + 2 * 4
else
Call MFTClose
endif
return
EndProc ShareEnd
break <ShareEnter - attempt to enter a node into the sharing set>
;
; ShareEnter - perform a retried entry of a nodde into the sharing set. If
; the max number of retries is exceeded, we notify the user via int 24.
;
; Inputs: ThisSFT points to the SFT
; WFP_Start points to the WFP
; Outputs: Carry clear => successful entry
; Carry set => failed system call
; Registers modified: all
Procedure ShareEnter,NEAR
DOSAssume CS,<DS>,"ShareEnter"
assume es:nothing
SaveReg <CX>
retry:
mov cx,RetryCount
attempt:
les di,ThisSFT ; grab sft
XOR AX,AX
MOV ES:[DI.sf_MFT],AX ; indicate free SFT
SaveReg <CX>
call Share_Check ; attempt to enter into the sharing set
RestoreReg <CX>
jnc done ; success, let the user see this
invoke Idle ; wait a while
loop attempt ; go back for another attempt
call Share_violation ; signal the problem to the user
jnc retry ; user said to retry, go do it
done:
RestoreReg <CX>
return
EndProc ShareEnter
CODE ENDS
END
|