Skip to content

Instantly share code, notes, and snippets.

@rfjakob
Last active September 19, 2024 11:16
Show Gist options
  • Save rfjakob/d60f80ac67823442a997a33f7dc10aee to your computer and use it in GitHub Desktop.
Save rfjakob/d60f80ac67823442a997a33f7dc10aee to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"os"
"golang.org/x/sys/unix"
)
func main() {
path := os.Args[1]
fmt.Printf("Testing open() flags...")
for _, mode := range []int{
unix.O_DIRECTORY,
unix.O_PATH,
unix.O_NOFOLLOW,
unix.O_NOATIME,
unix.O_DIRECT,
unix.O_NONBLOCK,
} {
_, err := unix.Open(path, mode, 0755)
fmt.Printf("Open %#x: %v\n", mode, err)
}
fmt.Printf("Testing openat2() resolve modes...\n")
for _, how := range []unix.OpenHow{
{0, 0, 0},
{0, 0, unix.RESOLVE_BENEATH},
{0, 0, unix.RESOLVE_NO_MAGICLINKS},
{0, 0, unix.RESOLVE_NO_SYMLINKS},
{0, 0, unix.RESOLVE_NO_XDEV},
} {
_, err := unix.Openat2(unix.AT_FDCWD, path, &how)
fmt.Printf("Openat2 %#v: %v\n", how, err)
}
}
@rfjakob
Copy link
Author

rfjakob commented Sep 19, 2024

Results against go-fuse loopback:

0 jakob@brikett:~/code/go-fuse/example/loopback/b$ /home/jakob/code/go-fuse/opendir_flags/opendir_flags dir
Testing open() flags...13:15:42.044467 rx 650: LOOKUP n1 ["dir"] 4b p153412
13:15:42.044534 tx 650:     OK, {n9 g1 tE=1s tA=1s {M040755 SZ=4096 L=2 1026:1026 B8*4096 i0:4741747 A 1726743356.446455 M 1726743356.446455 C 1726743356.446455}}
13:15:42.044574 rx 652: OPENDIR n9 {LARGEFILE,DIRECTORY}  p153412
13:15:42.044599 tx 652:     OK, {Fh 3 }
Open 0x10000: <nil>
Open 0x200000: <nil>
13:15:42.044657 rx 654: OPENDIR n9 {LARGEFILE,0x20000}  p153412
13:15:42.044674 tx 654:     OK, {Fh 8 }
Open 0x20000: <nil>
13:15:42.044732 rx 656: OPENDIR n9 {LARGEFILE,NOATIME}  p153412
13:15:42.044786 tx 656:     OK, {Fh 7 }
Open 0x40000: <nil>
13:15:42.044903 rx 658: OPENDIR n9 {DIRECT,LARGEFILE}  p153412
13:15:42.044924 tx 658:     OK, {Fh 1 }
Open 0x4000: invalid argument
13:15:42.044969 rx 660: RELEASEDIR n9 {Fh 1 DIRECT,LARGEFILE  L0}  p0
13:15:42.045001 tx 660:     OK
13:15:42.045015 rx 662: OPENDIR n9 {NONBLOCK,LARGEFILE}  p153412
13:15:42.045035 tx 662:     OK, {Fh 1 }
Open 0x800: <nil>
Testing openat2() resolve modes...
13:15:42.045083 rx 664: OPENDIR n9 {LARGEFILE}  p153412
13:15:42.045096 tx 664:     OK, {Fh 5 }
Openat2 unix.OpenHow{Flags:0x0, Mode:0x0, Resolve:0x0}: <nil>
13:15:42.045134 rx 666: OPENDIR n9 {LARGEFILE}  p153412
13:15:42.045152 tx 666:     OK, {Fh 6 }
Openat2 unix.OpenHow{Flags:0x0, Mode:0x0, Resolve:0x8}: <nil>
13:15:42.045184 rx 668: OPENDIR n9 {LARGEFILE}  p153412
13:15:42.045200 tx 668:     OK, {Fh 2 }
Openat2 unix.OpenHow{Flags:0x0, Mode:0x0, Resolve:0x2}: <nil>
13:15:42.045242 rx 670: OPENDIR n9 {LARGEFILE}  p153412
13:15:42.045261 tx 670:     OK, {Fh 4 }
Openat2 unix.OpenHow{Flags:0x0, Mode:0x0, Resolve:0x4}: <nil>
13:15:42.045305 rx 672: OPENDIR n9 {LARGEFILE}  p153412
13:15:42.045328 tx 672:     OK, {Fh 9 }
Openat2 unix.OpenHow{Flags:0x0, Mode:0x0, Resolve:0x1}: <nil>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment