Skip to content

Commit 23999e8

Browse files
cmarcelobradfitz
authored andcommitted
x/sys/unix: add support for O_TMPFILE in Linux
Since Linux 3.11, O_TMPFILE flag can be used in open syscall to create an unnamed file in a directory. The file occupies space in the filesystem, and can be given a name using linkat syscall. If the file is closed without being given a name, its contents are deleted. See the manpage open(2) in Linux for details. Exports O_TMPFILE for Linux in 386 and amd64 (other architectures already had it). Exports Linkat syscall and AT_SYMLINK_FOLLOW (used for giving a name to the file) for all Linux in all architectures. Fixes golang/go#7830. Change-Id: Ib82e44f405b227e227b9cbf317c2657b32e046f5 Reviewed-on: https://go-review.googlesource.com/21003 Reviewed-by: Brad Fitzpatrick <[email protected]>
1 parent 9d4e42a commit 23999e8

20 files changed

+24
-13
lines changed

unix/syscall_linux.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ func Creat(path string, mode uint32) (fd int, err error) {
3636
return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode)
3737
}
3838

39-
//sys linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error)
39+
//sys Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error)
4040

4141
func Link(oldpath string, newpath string) (err error) {
42-
return linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0)
42+
return Linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0)
4343
}
4444

4545
func Mkdir(path string, mode uint32) (err error) {

unix/types_linux.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ type EpollEvent C.struct_my_epoll_event
400400
const (
401401
AT_FDCWD = C.AT_FDCWD
402402
AT_REMOVEDIR = C.AT_REMOVEDIR
403+
AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW
403404
AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
404405
)
405406

unix/zerrors_linux_386.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,7 @@ const (
826826
O_RDWR = 0x2
827827
O_RSYNC = 0x101000
828828
O_SYNC = 0x101000
829+
O_TMPFILE = 0x410000
829830
O_TRUNC = 0x200
830831
O_WRONLY = 0x1
831832
PACKET_ADD_MEMBERSHIP = 0x1

unix/zerrors_linux_amd64.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,7 @@ const (
826826
O_RDWR = 0x2
827827
O_RSYNC = 0x101000
828828
O_SYNC = 0x101000
829+
O_TMPFILE = 0x410000
829830
O_TRUNC = 0x200
830831
O_WRONLY = 0x1
831832
PACKET_ADD_MEMBERSHIP = 0x1

unix/zsyscall_linux_386.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var _ syscall.Errno
1414

1515
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
1616

17-
func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
17+
func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
1818
var _p0 *byte
1919
_p0, err = BytePtrFromString(oldpath)
2020
if err != nil {

unix/zsyscall_linux_amd64.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var _ syscall.Errno
1414

1515
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
1616

17-
func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
17+
func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
1818
var _p0 *byte
1919
_p0, err = BytePtrFromString(oldpath)
2020
if err != nil {

unix/zsyscall_linux_arm.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var _ syscall.Errno
1414

1515
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
1616

17-
func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
17+
func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
1818
var _p0 *byte
1919
_p0, err = BytePtrFromString(oldpath)
2020
if err != nil {

unix/zsyscall_linux_arm64.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var _ syscall.Errno
1414

1515
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
1616

17-
func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
17+
func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
1818
var _p0 *byte
1919
_p0, err = BytePtrFromString(oldpath)
2020
if err != nil {

unix/zsyscall_linux_mips64.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var _ syscall.Errno
1414

1515
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
1616

17-
func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
17+
func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
1818
var _p0 *byte
1919
_p0, err = BytePtrFromString(oldpath)
2020
if err != nil {

unix/zsyscall_linux_mips64le.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var _ syscall.Errno
1414

1515
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
1616

17-
func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
17+
func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
1818
var _p0 *byte
1919
_p0, err = BytePtrFromString(oldpath)
2020
if err != nil {

unix/zsyscall_linux_ppc64.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var _ syscall.Errno
1414

1515
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
1616

17-
func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
17+
func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
1818
var _p0 *byte
1919
_p0, err = BytePtrFromString(oldpath)
2020
if err != nil {

unix/zsyscall_linux_ppc64le.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var _ syscall.Errno
1414

1515
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
1616

17-
func linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
17+
func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {
1818
var _p0 *byte
1919
_p0, err = BytePtrFromString(oldpath)
2020
if err != nil {

unix/ztypes_linux_386.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,8 +574,9 @@ type EpollEvent struct {
574574

575575
const (
576576
AT_FDCWD = -0x64
577-
AT_SYMLINK_NOFOLLOW = 0x100
578577
AT_REMOVEDIR = 0x200
578+
AT_SYMLINK_FOLLOW = 0x400
579+
AT_SYMLINK_NOFOLLOW = 0x100
579580
)
580581

581582
type Termios struct {

unix/ztypes_linux_amd64.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,8 +592,9 @@ type EpollEvent struct {
592592

593593
const (
594594
AT_FDCWD = -0x64
595-
AT_SYMLINK_NOFOLLOW = 0x100
596595
AT_REMOVEDIR = 0x200
596+
AT_SYMLINK_FOLLOW = 0x400
597+
AT_SYMLINK_NOFOLLOW = 0x100
597598
)
598599

599600
type Termios struct {

unix/ztypes_linux_arm.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,8 +563,9 @@ type EpollEvent struct {
563563

564564
const (
565565
AT_FDCWD = -0x64
566-
AT_SYMLINK_NOFOLLOW = 0x100
567566
AT_REMOVEDIR = 0x200
567+
AT_SYMLINK_FOLLOW = 0x400
568+
AT_SYMLINK_NOFOLLOW = 0x100
568569
)
569570

570571
type Termios struct {

unix/ztypes_linux_arm64.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,7 @@ type EpollEvent struct {
580580
const (
581581
AT_FDCWD = -0x64
582582
AT_REMOVEDIR = 0x200
583+
AT_SYMLINK_FOLLOW = 0x400
583584
AT_SYMLINK_NOFOLLOW = 0x100
584585
)
585586

unix/ztypes_linux_mips64.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,7 @@ type EpollEvent struct {
585585
const (
586586
AT_FDCWD = -0x64
587587
AT_REMOVEDIR = 0x200
588+
AT_SYMLINK_FOLLOW = 0x400
588589
AT_SYMLINK_NOFOLLOW = 0x100
589590
)
590591

unix/ztypes_linux_mips64le.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,7 @@ type EpollEvent struct {
585585
const (
586586
AT_FDCWD = -0x64
587587
AT_REMOVEDIR = 0x200
588+
AT_SYMLINK_FOLLOW = 0x400
588589
AT_SYMLINK_NOFOLLOW = 0x100
589590
)
590591

unix/ztypes_linux_ppc64.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,7 @@ type EpollEvent struct {
590590
const (
591591
AT_FDCWD = -0x64
592592
AT_REMOVEDIR = 0x200
593+
AT_SYMLINK_FOLLOW = 0x400
593594
AT_SYMLINK_NOFOLLOW = 0x100
594595
)
595596

unix/ztypes_linux_ppc64le.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,7 @@ type EpollEvent struct {
590590
const (
591591
AT_FDCWD = -0x64
592592
AT_REMOVEDIR = 0x200
593+
AT_SYMLINK_FOLLOW = 0x400
593594
AT_SYMLINK_NOFOLLOW = 0x100
594595
)
595596

0 commit comments

Comments
 (0)