@@ -88,6 +88,9 @@ func (vfsOS) OpenFilename(name *Filename, flags OpenFlag) (File, OpenFlag, error
88
88
oflags |= os .O_RDWR
89
89
}
90
90
91
+ isCreate := flags & (OPEN_CREATE ) != 0
92
+ isJournl := flags & (OPEN_MAIN_JOURNAL | OPEN_SUPER_JOURNAL | OPEN_WAL ) != 0
93
+
91
94
var err error
92
95
var f * os.File
93
96
if name == nil {
@@ -102,6 +105,10 @@ func (vfsOS) OpenFilename(name *Filename, flags OpenFlag) (File, OpenFlag, error
102
105
if errors .Is (err , syscall .EISDIR ) {
103
106
return nil , flags , _CANTOPEN_ISDIR
104
107
}
108
+ if isCreate && isJournl && errors .Is (err , fs .ErrPermission ) &&
109
+ osAccess (name .String (), ACCESS_EXISTS ) != nil {
110
+ return nil , flags , _READONLY_DIRECTORY
111
+ }
105
112
return nil , flags , err
106
113
}
107
114
@@ -119,10 +126,8 @@ func (vfsOS) OpenFilename(name *Filename, flags OpenFlag) (File, OpenFlag, error
119
126
File : f ,
120
127
psow : true ,
121
128
readOnly : flags & OPEN_READONLY != 0 ,
122
- syncDir : canSyncDirs &&
123
- flags & (OPEN_MAIN_JOURNAL | OPEN_SUPER_JOURNAL | OPEN_WAL ) != 0 &&
124
- flags & (OPEN_CREATE ) != 0 ,
125
- shm : NewSharedMemory (name .String ()+ "-shm" , flags ),
129
+ syncDir : canSyncDirs && isCreate && isJournl ,
130
+ shm : NewSharedMemory (name .String ()+ "-shm" , flags ),
126
131
}
127
132
return & file , flags , nil
128
133
}
@@ -154,6 +159,14 @@ func (f *vfsFile) Close() error {
154
159
return f .File .Close ()
155
160
}
156
161
162
+ func (f * vfsFile ) ReadAt (p []byte , off int64 ) (n int , err error ) {
163
+ return osReadAt (f .File , p , off )
164
+ }
165
+
166
+ func (f * vfsFile ) WriteAt (p []byte , off int64 ) (n int , err error ) {
167
+ return osWriteAt (f .File , p , off )
168
+ }
169
+
157
170
func (f * vfsFile ) Sync (flags SyncFlag ) error {
158
171
dataonly := (flags & SYNC_DATAONLY ) != 0
159
172
fullsync := (flags & 0x0f ) == SYNC_FULL
0 commit comments