Skip to content

Commit 19e885d

Browse files
authored
Merge pull request #50 from jxsl13/fix-sticky-bit
fix copy dir sticky bit missing
2 parents a932a7b + 47a3eb2 commit 19e885d

1 file changed

Lines changed: 18 additions & 18 deletions

File tree

fs_utils.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func ignoreChtimesError(err error) error {
9292
}
9393
}
9494

95-
func copyDir(fs FS, name string, info fs.FileInfo) (err error) {
95+
func copyDir(fsys FS, name string, info fs.FileInfo) (err error) {
9696
defer func() {
9797
if err != nil {
9898
err = fmt.Errorf("%w: %s: %v", errCopyDirFailed, name, err)
@@ -115,21 +115,21 @@ func copyDir(fs FS, name string, info fs.FileInfo) (err error) {
115115
}
116116

117117
// try to create all dirs as somone might have tempered with the file system
118-
targetMode := info.Mode()
119-
err = fs.MkdirAll(name, targetMode.Perm())
118+
targetMode := info.Mode() & (fs.ModeSticky | fs.ModePerm)
119+
err = fsys.MkdirAll(name, targetMode)
120120
if err != nil {
121121
return err
122122
}
123123

124-
newDirInfo, err := fs.Lstat(name)
124+
newDirInfo, err := fsys.Lstat(name)
125125
if err != nil {
126126
return fmt.Errorf("%w: %v", errCopyDirFailed, err)
127127
}
128128

129129
currentMode := newDirInfo.Mode()
130130

131131
if !equalMode(currentMode, targetMode) {
132-
err = fs.Chmod(name, targetMode)
132+
err = fsys.Chmod(name, targetMode)
133133
if err != nil {
134134
// TODO: do we want to fail here?
135135
return err
@@ -139,23 +139,23 @@ func copyDir(fs FS, name string, info fs.FileInfo) (err error) {
139139
targetModTime := info.ModTime()
140140
currentModTime := newDirInfo.ModTime()
141141
if !currentModTime.Equal(targetModTime) {
142-
err = ignoreChtimesError(fs.Chtimes(name, targetModTime, targetModTime))
142+
err = ignoreChtimesError(fsys.Chtimes(name, targetModTime, targetModTime))
143143
if err != nil {
144144
return err
145145
}
146146
}
147147

148148
// https://pkg.go.dev/os#Chown
149149
// Windows & Plan9 not supported
150-
err = ignoreChownError(chown(info, name, fs))
150+
err = ignoreChownError(chown(info, name, fsys))
151151
if err != nil {
152152
return err
153153
}
154154

155155
return nil
156156
}
157157

158-
func copyFile(fs FS, name string, info fs.FileInfo, sourceFile File) (err error) {
158+
func copyFile(fsys FS, name string, info fs.FileInfo, sourceFile File) (err error) {
159159
defer func() {
160160
if err != nil {
161161
err = fmt.Errorf("%w: %s: %v", errCopyFileFailed, name, err)
@@ -168,19 +168,19 @@ func copyFile(fs FS, name string, info fs.FileInfo, sourceFile File) (err error)
168168
//
169169
targetMode := info.Mode()
170170

171-
err = writeFile(fs, name, targetMode.Perm(), sourceFile)
171+
err = writeFile(fsys, name, targetMode.Perm(), sourceFile)
172172
if err != nil {
173173
return err
174174
}
175175

176-
newFileInfo, err := fs.Lstat(name)
176+
newFileInfo, err := fsys.Lstat(name)
177177
if err != nil {
178178
return err
179179
}
180180

181181
if !equalMode(newFileInfo.Mode(), targetMode) {
182182
// not equal, update it
183-
err = fs.Chmod(name, targetMode)
183+
err = fsys.Chmod(name, targetMode)
184184
if err != nil {
185185
return err
186186
}
@@ -190,7 +190,7 @@ func copyFile(fs FS, name string, info fs.FileInfo, sourceFile File) (err error)
190190
currentModTime := newFileInfo.ModTime()
191191

192192
if !currentModTime.Equal(targetModTime) {
193-
err = ignoreChtimesError(fs.Chtimes(name, targetModTime, targetModTime))
193+
err = ignoreChtimesError(fsys.Chtimes(name, targetModTime, targetModTime))
194194
if err != nil {
195195
return err
196196
}
@@ -199,17 +199,17 @@ func copyFile(fs FS, name string, info fs.FileInfo, sourceFile File) (err error)
199199
// might cause a windows error that this function is not implemented by the OS
200200
// in a unix fassion
201201
// permission and not implemented errors are ignored
202-
err = ignoreChownError(chown(info, name, fs))
202+
err = ignoreChownError(chown(info, name, fsys))
203203
if err != nil {
204204
return err
205205
}
206206

207207
return nil
208208
}
209209

210-
func writeFile(fs FS, name string, perm fs.FileMode, content io.Reader) (err error) {
210+
func writeFile(fsys FS, name string, perm fs.FileMode, content io.Reader) (err error) {
211211
// same as create but with custom permissions
212-
file, err := fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, perm.Perm())
212+
file, err := fsys.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, perm.Perm())
213213
if err != nil {
214214
return err
215215
}
@@ -250,9 +250,9 @@ func copySymlink(source, target FS, name string, info fs.FileInfo) (err error) {
250250

251251
// Chown is an operating system dependent implementation.
252252
// only tries to change owner in cas ethat the owner differs
253-
func chown(from fs.FileInfo, toName string, fs FS) error {
253+
func chown(from fs.FileInfo, toName string, fsys FS) error {
254254

255-
oldOwnerFi, err := fs.Lstat(toName)
255+
oldOwnerFi, err := fsys.Lstat(toName)
256256
if err != nil {
257257
return fmt.Errorf("lstat for chown failed: %w", err)
258258
}
@@ -265,7 +265,7 @@ func chown(from fs.FileInfo, toName string, fs FS) error {
265265

266266
// only update when something changed
267267
if oldUid != newUid || oldGid != newGid {
268-
err = fs.Chown(toName, toUID(from), toGID(from))
268+
err = fsys.Chown(toName, toUID(from), toGID(from))
269269
if err != nil {
270270
return err
271271
}

0 commit comments

Comments
 (0)