Source file src/pkg/os/file_posix.go
1
2
3
4
5
6
7 package os
8
9 import (
10 "syscall"
11 "time"
12 )
13
14 func sigpipe()
15
16
17
18 func Link(oldname, newname string) error {
19 e := syscall.Link(oldname, newname)
20 if e != nil {
21 return &LinkError{"link", oldname, newname, e}
22 }
23 return nil
24 }
25
26
27
28 func Symlink(oldname, newname string) error {
29 e := syscall.Symlink(oldname, newname)
30 if e != nil {
31 return &LinkError{"symlink", oldname, newname, e}
32 }
33 return nil
34 }
35
36
37
38 func Readlink(name string) (string, error) {
39 for len := 128; ; len *= 2 {
40 b := make([]byte, len)
41 n, e := syscall.Readlink(name, b)
42 if e != nil {
43 return "", &PathError{"readlink", name, e}
44 }
45 if n < len {
46 return string(b[0:n]), nil
47 }
48 }
49 }
50
51
52 func Rename(oldname, newname string) error {
53 e := syscall.Rename(oldname, newname)
54 if e != nil {
55 return &LinkError{"rename", oldname, newname, e}
56 }
57 return nil
58 }
59
60
61 func syscallMode(i FileMode) (o uint32) {
62 o |= uint32(i.Perm())
63 if i&ModeSetuid != 0 {
64 o |= syscall.S_ISUID
65 }
66 if i&ModeSetgid != 0 {
67 o |= syscall.S_ISGID
68 }
69 if i&ModeSticky != 0 {
70 o |= syscall.S_ISVTX
71 }
72
73 return
74 }
75
76
77
78
79 func Chmod(name string, mode FileMode) error {
80 if e := syscall.Chmod(name, syscallMode(mode)); e != nil {
81 return &PathError{"chmod", name, e}
82 }
83 return nil
84 }
85
86
87
88 func (f *File) Chmod(mode FileMode) error {
89 if e := syscall.Fchmod(f.fd, syscallMode(mode)); e != nil {
90 return &PathError{"chmod", f.name, e}
91 }
92 return nil
93 }
94
95
96
97
98 func Chown(name string, uid, gid int) error {
99 if e := syscall.Chown(name, uid, gid); e != nil {
100 return &PathError{"chown", name, e}
101 }
102 return nil
103 }
104
105
106
107
108 func Lchown(name string, uid, gid int) error {
109 if e := syscall.Lchown(name, uid, gid); e != nil {
110 return &PathError{"lchown", name, e}
111 }
112 return nil
113 }
114
115
116
117 func (f *File) Chown(uid, gid int) error {
118 if e := syscall.Fchown(f.fd, uid, gid); e != nil {
119 return &PathError{"chown", f.name, e}
120 }
121 return nil
122 }
123
124
125
126
127 func (f *File) Truncate(size int64) error {
128 if e := syscall.Ftruncate(f.fd, size); e != nil {
129 return &PathError{"truncate", f.name, e}
130 }
131 return nil
132 }
133
134
135
136
137 func (f *File) Sync() (err error) {
138 if f == nil {
139 return syscall.EINVAL
140 }
141 if e := syscall.Fsync(f.fd); e != nil {
142 return NewSyscallError("fsync", e)
143 }
144 return nil
145 }
146
147
148
149
150
151
152
153 func Chtimes(name string, atime time.Time, mtime time.Time) error {
154 var utimes [2]syscall.Timespec
155 utimes[0] = syscall.NsecToTimespec(atime.UnixNano())
156 utimes[1] = syscall.NsecToTimespec(mtime.UnixNano())
157 if e := syscall.UtimesNano(name, utimes[0:]); e != nil {
158 return &PathError{"chtimes", name, e}
159 }
160 return nil
161 }
View as plain text