1
2
3
4
5
6
7 package unix
8
9 import (
10 "syscall"
11 "unsafe"
12 )
13
14
15 const (
16
17
18
19
20 UTIME_OMIT = -0x2
21
22 AT_REMOVEDIR = 0x200
23 AT_SYMLINK_NOFOLLOW = 0x100
24 )
25
26 func Unlinkat(dirfd int, path string, flags int) error {
27 if flags&AT_REMOVEDIR == 0 {
28 return errnoErr(path_unlink_file(
29 int32(dirfd),
30 unsafe.StringData(path),
31 size(len(path)),
32 ))
33 } else {
34 return errnoErr(path_remove_directory(
35 int32(dirfd),
36 unsafe.StringData(path),
37 size(len(path)),
38 ))
39 }
40 }
41
42
43
44 func path_unlink_file(fd int32, path *byte, pathLen size) syscall.Errno
45
46
47
48 func path_remove_directory(fd int32, path *byte, pathLen size) syscall.Errno
49
50 func Openat(dirfd int, path string, flags int, perm uint32) (int, error) {
51 return syscall.Openat(dirfd, path, flags, perm)
52 }
53
54 func Fstatat(dirfd int, path string, stat *syscall.Stat_t, flags int) error {
55 var filestatFlags uint32
56 if flags&AT_SYMLINK_NOFOLLOW == 0 {
57 filestatFlags |= syscall.LOOKUP_SYMLINK_FOLLOW
58 }
59 return errnoErr(path_filestat_get(
60 int32(dirfd),
61 uint32(filestatFlags),
62 unsafe.StringData(path),
63 size(len(path)),
64 unsafe.Pointer(stat),
65 ))
66 }
67
68
69
70 func path_filestat_get(fd int32, flags uint32, path *byte, pathLen size, buf unsafe.Pointer) syscall.Errno
71
72 func Readlinkat(dirfd int, path string, buf []byte) (int, error) {
73 var nwritten size
74 errno := path_readlink(
75 int32(dirfd),
76 unsafe.StringData(path),
77 size(len(path)),
78 &buf[0],
79 size(len(buf)),
80 &nwritten)
81 return int(nwritten), errnoErr(errno)
82
83 }
84
85 type (
86 size = uint32
87 )
88
89
90
91 func path_readlink(fd int32, path *byte, pathLen size, buf *byte, bufLen size, nwritten *size) syscall.Errno
92
93 func Mkdirat(dirfd int, path string, mode uint32) error {
94 if path == "" {
95 return syscall.EINVAL
96 }
97 return errnoErr(path_create_directory(
98 int32(dirfd),
99 unsafe.StringData(path),
100 size(len(path)),
101 ))
102 }
103
104
105
106 func path_create_directory(fd int32, path *byte, pathLen size) syscall.Errno
107
108 func errnoErr(errno syscall.Errno) error {
109 if errno == 0 {
110 return nil
111 }
112 return errno
113 }
114
View as plain text