/
link.go
92 lines (74 loc) · 2.42 KB
/
link.go
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
// Copyright 2022 The CubeFS Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied. See the License for the specific language governing
// permissions and limitations under the License.
package libfs
import (
. "github.com/cubefs/cubefs-for-android/lib/libfs/util"
zap "github.com/cubefs/cubefs-for-android/lib/log"
. "github.com/cubefs/cubefs-for-android/lib/proto"
)
// reads a soft link file and returns the target file name
func (mount *CfaMountInfo) Readlink(path string) (string, error) {
log := CloneLogger(mount.log)
if mount.checkMount(path, MountModeRead, log) != nil {
return "", E_POSIX_EACCES
}
resp, err := mount.proxyClient.Stat(path, log)
if err != nil || resp.Code != 0 {
log.Error("invoke Readlink fail,",
zap.String("path", path),
zap.Any("code", resp.Code),
zap.String("Message", resp.Message),
zap.Any("err", err))
return "", toErr(err, resp.Code)
}
return resp.Data.Target, nil
}
// create hard link
func (mount *CfaMountInfo) Link(path, linkPath string) error {
log := CloneLogger(mount.log)
if mount.checkMount(path, MountModeWrite, log) != nil {
return E_POSIX_EACCES
}
resp, err := mount.proxyClient.Link(path, linkPath, log)
if err != nil || resp.Code != 0 {
log.Error("Link fail,",
zap.String("old path", path),
zap.String("new path", linkPath),
zap.Any("code", resp.Code),
zap.String("Message", resp.Message),
zap.Any("err", err))
return toErr(err, resp.Code)
}
// clean cache.
mount.dentryCache.Remove(path)
return nil
}
// create soft link
func (mount *CfaMountInfo) Symlink(path, linkPath string) error {
log := CloneLogger(mount.log)
if mount.checkMount(path, MountModeWrite, log) != nil {
return E_POSIX_EACCES
}
resp, err := mount.proxyClient.SymLink(path, linkPath, log)
if err != nil || resp.Code != 0 {
log.Error("invoke SymLink fail,",
zap.String("path", path),
zap.String("link path", linkPath),
zap.Int("code", resp.Code),
zap.String("Message", resp.Message),
zap.Any("err", err))
return toErr(err, resp.Code)
}
return nil
}