Преглед изворни кода

unix: add Renameat2 on Linux

Renameat2 is Linux-specific and allows to pass an additional flags
argument to the renameat syscall. Also add the corresponding RENAME_*
flag mask values.

Change-Id: Ib4baa46fdd0b07ccd0988ac624862ce69d5c3ad5
Reviewed-on: https://go-review.googlesource.com/127763
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Tobias Klauser пре 7 година
родитељ
комит
2be389f392

+ 1 - 0
unix/mkerrors.sh

@@ -441,6 +441,7 @@ ccflags="$@"
 		$2 ~ /^CGROUPSTATS_/ ||
 		$2 ~ /^GENL_/ ||
 		$2 ~ /^STATX_/ ||
+		$2 ~ /^RENAME/ ||
 		$2 ~ /^UTIME_/ ||
 		$2 ~ /^XATTR_(CREATE|REPLACE|NO(DEFAULT|FOLLOW|SECURITY)|SHOWCOMPRESSION)/ ||
 		$2 ~ /^ATTR_(BIT_MAP_COUNT|(CMN|VOL|FILE)_)/ ||

+ 1 - 0
unix/syscall_linux.go

@@ -1327,6 +1327,7 @@ func Getpgrp() (pid int) {
 //sys	read(fd int, p []byte) (n int, err error)
 //sys	Removexattr(path string, attr string) (err error)
 //sys	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
+//sys	Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error)
 //sys	RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error)
 //sys	Setdomainname(p []byte) (err error)
 //sys	Sethostname(p []byte) (err error)

+ 3 - 0
unix/zerrors_linux_386.go

@@ -1429,6 +1429,9 @@ const (
 	RAMFS_MAGIC                          = 0x858458f6
 	RDTGROUP_SUPER_MAGIC                 = 0x7655821
 	REISERFS_SUPER_MAGIC                 = 0x52654973
+	RENAME_EXCHANGE                      = 0x2
+	RENAME_NOREPLACE                     = 0x1
+	RENAME_WHITEOUT                      = 0x4
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0

+ 3 - 0
unix/zerrors_linux_amd64.go

@@ -1430,6 +1430,9 @@ const (
 	RAMFS_MAGIC                          = 0x858458f6
 	RDTGROUP_SUPER_MAGIC                 = 0x7655821
 	REISERFS_SUPER_MAGIC                 = 0x52654973
+	RENAME_EXCHANGE                      = 0x2
+	RENAME_NOREPLACE                     = 0x1
+	RENAME_WHITEOUT                      = 0x4
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0

+ 3 - 0
unix/zerrors_linux_arm.go

@@ -1436,6 +1436,9 @@ const (
 	RAMFS_MAGIC                          = 0x858458f6
 	RDTGROUP_SUPER_MAGIC                 = 0x7655821
 	REISERFS_SUPER_MAGIC                 = 0x52654973
+	RENAME_EXCHANGE                      = 0x2
+	RENAME_NOREPLACE                     = 0x1
+	RENAME_WHITEOUT                      = 0x4
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0

+ 3 - 0
unix/zerrors_linux_arm64.go

@@ -1420,6 +1420,9 @@ const (
 	RAMFS_MAGIC                          = 0x858458f6
 	RDTGROUP_SUPER_MAGIC                 = 0x7655821
 	REISERFS_SUPER_MAGIC                 = 0x52654973
+	RENAME_EXCHANGE                      = 0x2
+	RENAME_NOREPLACE                     = 0x1
+	RENAME_WHITEOUT                      = 0x4
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0

+ 3 - 0
unix/zerrors_linux_mips.go

@@ -1430,6 +1430,9 @@ const (
 	RAMFS_MAGIC                          = 0x858458f6
 	RDTGROUP_SUPER_MAGIC                 = 0x7655821
 	REISERFS_SUPER_MAGIC                 = 0x52654973
+	RENAME_EXCHANGE                      = 0x2
+	RENAME_NOREPLACE                     = 0x1
+	RENAME_WHITEOUT                      = 0x4
 	RLIMIT_AS                            = 0x6
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0

+ 3 - 0
unix/zerrors_linux_mips64.go

@@ -1430,6 +1430,9 @@ const (
 	RAMFS_MAGIC                          = 0x858458f6
 	RDTGROUP_SUPER_MAGIC                 = 0x7655821
 	REISERFS_SUPER_MAGIC                 = 0x52654973
+	RENAME_EXCHANGE                      = 0x2
+	RENAME_NOREPLACE                     = 0x1
+	RENAME_WHITEOUT                      = 0x4
 	RLIMIT_AS                            = 0x6
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0

+ 3 - 0
unix/zerrors_linux_mips64le.go

@@ -1430,6 +1430,9 @@ const (
 	RAMFS_MAGIC                          = 0x858458f6
 	RDTGROUP_SUPER_MAGIC                 = 0x7655821
 	REISERFS_SUPER_MAGIC                 = 0x52654973
+	RENAME_EXCHANGE                      = 0x2
+	RENAME_NOREPLACE                     = 0x1
+	RENAME_WHITEOUT                      = 0x4
 	RLIMIT_AS                            = 0x6
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0

+ 3 - 0
unix/zerrors_linux_mipsle.go

@@ -1430,6 +1430,9 @@ const (
 	RAMFS_MAGIC                          = 0x858458f6
 	RDTGROUP_SUPER_MAGIC                 = 0x7655821
 	REISERFS_SUPER_MAGIC                 = 0x52654973
+	RENAME_EXCHANGE                      = 0x2
+	RENAME_NOREPLACE                     = 0x1
+	RENAME_WHITEOUT                      = 0x4
 	RLIMIT_AS                            = 0x6
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0

+ 3 - 0
unix/zerrors_linux_ppc64.go

@@ -1486,6 +1486,9 @@ const (
 	RAMFS_MAGIC                          = 0x858458f6
 	RDTGROUP_SUPER_MAGIC                 = 0x7655821
 	REISERFS_SUPER_MAGIC                 = 0x52654973
+	RENAME_EXCHANGE                      = 0x2
+	RENAME_NOREPLACE                     = 0x1
+	RENAME_WHITEOUT                      = 0x4
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0

+ 3 - 0
unix/zerrors_linux_ppc64le.go

@@ -1486,6 +1486,9 @@ const (
 	RAMFS_MAGIC                          = 0x858458f6
 	RDTGROUP_SUPER_MAGIC                 = 0x7655821
 	REISERFS_SUPER_MAGIC                 = 0x52654973
+	RENAME_EXCHANGE                      = 0x2
+	RENAME_NOREPLACE                     = 0x1
+	RENAME_WHITEOUT                      = 0x4
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0

+ 3 - 0
unix/zerrors_linux_s390x.go

@@ -1490,6 +1490,9 @@ const (
 	RAMFS_MAGIC                          = 0x858458f6
 	RDTGROUP_SUPER_MAGIC                 = 0x7655821
 	REISERFS_SUPER_MAGIC                 = 0x52654973
+	RENAME_EXCHANGE                      = 0x2
+	RENAME_NOREPLACE                     = 0x1
+	RENAME_WHITEOUT                      = 0x4
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0

+ 20 - 0
unix/zsyscall_linux_386.go

@@ -1063,6 +1063,26 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(oldpath)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(newpath)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(keyType)

+ 20 - 0
unix/zsyscall_linux_amd64.go

@@ -1063,6 +1063,26 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(oldpath)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(newpath)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(keyType)

+ 20 - 0
unix/zsyscall_linux_arm.go

@@ -1063,6 +1063,26 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(oldpath)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(newpath)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(keyType)

+ 20 - 0
unix/zsyscall_linux_arm64.go

@@ -1063,6 +1063,26 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(oldpath)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(newpath)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(keyType)

+ 20 - 0
unix/zsyscall_linux_mips.go

@@ -1063,6 +1063,26 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(oldpath)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(newpath)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(keyType)

+ 20 - 0
unix/zsyscall_linux_mips64.go

@@ -1063,6 +1063,26 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(oldpath)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(newpath)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(keyType)

+ 20 - 0
unix/zsyscall_linux_mips64le.go

@@ -1063,6 +1063,26 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(oldpath)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(newpath)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(keyType)

+ 20 - 0
unix/zsyscall_linux_mipsle.go

@@ -1063,6 +1063,26 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(oldpath)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(newpath)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(keyType)

+ 20 - 0
unix/zsyscall_linux_ppc64.go

@@ -1063,6 +1063,26 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(oldpath)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(newpath)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(keyType)

+ 20 - 0
unix/zsyscall_linux_ppc64le.go

@@ -1063,6 +1063,26 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(oldpath)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(newpath)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(keyType)

+ 20 - 0
unix/zsyscall_linux_s390x.go

@@ -1063,6 +1063,26 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(oldpath)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(newpath)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(keyType)