Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions common/platform/filesystem/file.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
//go:build !windows && !wasm

package filesystem

import (
"io"
"os"
"path/filepath"
"syscall"

"github.com/xtls/xray-core/common/buf"
"github.com/xtls/xray-core/common/platform"
Expand All @@ -16,6 +19,29 @@ var NewFileReader FileReaderFunc = func(path string) (io.ReadCloser, error) {
}

func ReadFile(path string) ([]byte, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()

stat, err := file.Stat()
if err != nil {
return nil, err
}

size := stat.Size()
if size == 0 {
return []byte{}, nil
}

// use mmap to save RAM
bs, err := syscall.Mmap(int(file.Fd()), 0, int(size), syscall.PROT_READ, syscall.MAP_SHARED)
if err == nil {
return bs, nil
}

// fallback
reader, err := NewFileReader(path)
if err != nil {
return nil, err
Expand Down
54 changes: 54 additions & 0 deletions common/platform/filesystem/file_other.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
//go:build windows || wasm

package filesystem

import (
"io"
"os"
"path/filepath"

"github.com/xtls/xray-core/common/buf"
"github.com/xtls/xray-core/common/platform"
)

type FileReaderFunc func(path string) (io.ReadCloser, error)

var NewFileReader FileReaderFunc = func(path string) (io.ReadCloser, error) {
return os.Open(path)
}

func ReadFile(path string) ([]byte, error) {
reader, err := NewFileReader(path)
if err != nil {
return nil, err
}
defer reader.Close()

return buf.ReadAllToBytes(reader)
}

func ReadAsset(file string) ([]byte, error) {
return ReadFile(platform.GetAssetLocation(file))
}

func ReadCert(file string) ([]byte, error) {
if filepath.IsAbs(file) {
return ReadFile(file)
}
return ReadFile(platform.GetCertLocation(file))
}

func CopyFile(dst string, src string) error {
bytes, err := ReadFile(src)
if err != nil {
return err
}
f, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY, 0o644)
if err != nil {
return err
}
defer f.Close()

_, err = f.Write(bytes)
return err
}
Loading